general-library-union 2.4.49 → 2.4.50
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/README.md +27 -27
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.mjs +3 -3
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.mjs +3 -3
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.mjs +3 -3
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.mjs +6 -5
- package/esm2022/src/app/webcommon/popups/popup-reporte/popup-reporte.component.mjs +4 -3
- package/esm2022/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.mjs +3 -3
- package/fesm2022/general-library-union.mjs +16 -14
- package/fesm2022/general-library-union.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.d.ts +1 -1
|
@@ -191,6 +191,7 @@ export class DetalleTipoReporteComponent {
|
|
|
191
191
|
this.reporteService = reporteService;
|
|
192
192
|
}
|
|
193
193
|
ngOnInit() {
|
|
194
|
+
this.aplicacion = this.authService.getTokenKey('aplicacion');
|
|
194
195
|
this.llaveEmpresa = this.authService.getTokenKey('llaveEmpresa');
|
|
195
196
|
this.listaSiNo = this.generalPipe.LISTA_SINO;
|
|
196
197
|
this.listaTipoMarcadorColumnario = this.reporteColumnarioPipe.MAPA_TIPO_MARCADOR;
|
|
@@ -822,9 +823,9 @@ export class DetalleTipoReporteComponent {
|
|
|
822
823
|
}
|
|
823
824
|
descargarJasper() {
|
|
824
825
|
let propiedad = 'ruta_plantillas';
|
|
825
|
-
let aplicacion = this.aplicacion; //environment.codigoAplicacion;
|
|
826
826
|
//Ruta archivo
|
|
827
|
-
this.
|
|
827
|
+
this.aplicacion = this.authService.getTokenKey('aplicacion');
|
|
828
|
+
this.cargarArchivo.descargarArchivo(this.encriptadorArchivo.encriptar('reportes/' + this.reporteFuente.llave + '.jrxml'), propiedad, this.aplicacion).subscribe({
|
|
828
829
|
next: blob => {
|
|
829
830
|
const a = document.createElement('a');
|
|
830
831
|
const objectUrl = URL.createObjectURL(blob);
|
|
@@ -1433,11 +1434,11 @@ export class DetalleTipoReporteComponent {
|
|
|
1433
1434
|
return this.reporteFuente.origenFuente == tipo;
|
|
1434
1435
|
}
|
|
1435
1436
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ToastService }, { token: i3.GeneralService }, { token: i4.GeneralPipe }, { token: i5.AuthService }, { token: i6.ReporteFuentePipe }, { token: i7.ConfirmationService }, { token: i8.CargarArchivosService }, { token: i9.EncriptadoBasicoService }, { token: i10.UtilsService }, { token: i11.TranslateService }, { token: i12.FuentePipe }, { token: i13.ReporteColumnarioPipe }, { token: i14.EjecucionReporteService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1436
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: DetalleTipoReporteComponent, isStandalone: true, selector: "detalle-tipo-reporte", inputs: { llaveReporte: "llaveReporte", aplicacion: "aplicacion", listaFuentes: "listaFuentes" }, providers: [MessageService], ngImport: i0, template: "<p-tabView (onChange)=\"cambiarTab($event)\">\r\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\r\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\r\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\r\n </p>\r\n <div class=\"p-fluid p-formgrid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\r\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\r\n\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\r\n (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\r\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\r\n <ng-template let-excel pTemplate=\"item\">\r\n <div>\r\n <label>{{excel.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n\r\n <div class=\"mt-4\">\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\r\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\r\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-4 \">\r\n <form [formGroup]=\"formMarcadorExcel\" >\r\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'marcador' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\r\n <label>{{'valor' | translate }} *</label>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\r\n [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel)\"\r\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n </div>\r\n </form>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorExcel($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'descargardoc' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'generarpin' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'agruparpor' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\r\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\r\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-tabView >\r\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\r\n \r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\r\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\r\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\r\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\r\n <td>{{marcador.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\r\n <div class=\"Detallereporte mt-2\">\r\n <form [formGroup]=\"formMarcador\">\r\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\r\n maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipo\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\r\n <label>{{'marcador' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\r\n <label>{{'tabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\r\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'alto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"grupo1\"></textarea>\r\n <label>{{'grupo1' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"grupo2\"></textarea>\r\n <label>{{'grupo2' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"grupo3\"></textarea>\r\n <label>{{'grupo3' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\r\n <label>{{'finalgrupo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'texto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'sql' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"query\"></textarea>\r\n <label>{{'consulta' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"fuente\" optionLabel=\"descripcion\"\r\n optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'grafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\r\n <label>{{'marcadorgrafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\r\n <label>{{'titulo' | translate }} X</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\r\n <label>{{'titulo' | translate }} Y</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\r\n <label>{{'colordinamico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\r\n <label>{{'numerocategorias' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\r\n (click)=\"guardarMarcador()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcador($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\r\n [paginator]=\"listaCamposMarcador.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\r\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\r\n <th style=\"width: 10%;\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\r\n <td style=\"width: 10%;\">\r\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </td>\r\n <td style=\"width: 10%;\" >\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.columna}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\r\n {{'alto' | translate}}: {{campo.alto}}\r\n </div> \r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\r\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\r\n [paginator]=\"listaSoportes.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\r\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.descripcion}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.archivoIndividual}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'doblelinea' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'descripcion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n \r\n \r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \r\n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\r\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\r\n </button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\r\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\r\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\r\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-banda>\r\n <tr [pSelectableRow]=\"banda\">\r\n <td>{{banda.value}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\r\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\r\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\r\n <label>{{'total' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" >\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\r\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\r\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\r\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'etiqueta' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'ancho' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-dinamico>\r\n <tr [pSelectableRow]=\"dinamico\">\r\n <td>{{dinamico.banda}}</td>\r\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\r\n <td>{{dinamico.marcador}}</td>\r\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\r\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"flex justify-content-between align-items-center mb-2\"> \r\n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\r\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipocampo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoDato\" optionLabel=\"value\"\r\n optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipodato' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'orden' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\r\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'sintaxis' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\r\n <div class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" />\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"ancho\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'ancho' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'operacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n </form>\r\n \r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaDinamico($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n \r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\r\n maxlength=\"200\">\r\n <label>{{'nombrearchivo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'separador' | translate }}*</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-between lign-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\r\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\r\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.formato}}</td>\r\n <td>{{marctexto.alto}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\r\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('descripcion' | translate)+'*' }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\r\n <label>{{'ancho' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadoTexto($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'tabla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\r\n <label>{{'nombretabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-8\">\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\r\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\r\n <ng-template let-tabla pTemplate=\"item\">\r\n <div>\r\n <label>{{tabla.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\r\n <label>{{'tagencabezado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\r\n <label>{{'tagcierreencabezado' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\r\n <label>{{'tagregistro' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\r\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\r\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.descripcion}}</td>\r\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\r\n <label>{{'marcador' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'tabla' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\r\n <label>{{'formato' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\r\n <label>{{'texto' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\r\n <label>{{'estructuratabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorXML($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\r\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\" >\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.marcador}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n \r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'columnario' | translate }}\">\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\r\n <p-accordionTab [selected]=\"true\" >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'columnasbasicas'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\r\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\r\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.nombreColumna}}</td>\r\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\r\n <td>{{bean.orden}}</td>\r\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoReporteColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\r\n <label>{{'nombre' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'tipocolumna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionhorizontal' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- fila Operacion Vertical -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\r\n <label>{{'columnaoperacion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Operacion Verticial -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionvertical' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Orden -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\r\n <label>{{'orden' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Filas -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" \r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'ordenamiento' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Datos de la consulta -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaBasica($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'datosadicionales'|translate}}\r\n </ng-template>\r\n <p-fieldset class=\"fieldsintitulo\" >\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\r\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'filainiciocolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\r\n <label>{{'sintaxiscolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\r\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\r\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\r\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-columnaadicional>\r\n <tr [pSelectableRow]=\"columnaadicional\">\r\n <td>{{columnaadicional.nombre}}</td>\r\n <td>{{columnaadicional.orden}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\r\n <label>{{'alias' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\r\n <label>{{'sintaxis' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaAdicional($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'marcadores'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\r\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\r\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'tipomarcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.marcador}}</td>\r\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'marcador' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\r\n <label>{{'valor' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorColumnario($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n </p-tabPanel>\r\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i15.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i15.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i15.CellEditor, selector: "p-cellEditor" }, { kind: "directive", type: i15.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i15.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i15.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i15.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i16.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i16.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: InputHelperSeleccionPlantillaComponent, selector: "app-input-helper-seleccion-plantilla", inputs: ["value", "label", "labelrar", "labelarch", "extensiones", "readonly", "propiedad", "anexoPropiedad", "showDialog", "propiedadDeSistema", "mostraroblicargo", "mostrarX", "booleano", "mostrarLabelInput"], outputs: ["onSelected"] }, { kind: "pipe", type: ReporteColumnarioPipe, name: "reporteColumnarioPipe" }, { kind: "pipe", type: ReporteFuentePipe, name: "reporteFuentePipe" }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i17.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i18.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i19.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: PickListModule }, { kind: "component", type: i20.PickList, selector: "p-pickList", inputs: ["source", "target", "sourceHeader", "tabindex", "rightButtonAriaLabel", "leftButtonAriaLabel", "allRightButtonAriaLabel", "allLeftButtonAriaLabel", "upButtonAriaLabel", "downButtonAriaLabel", "topButtonAriaLabel", "bottomButtonAriaLabel", "targetHeader", "responsive", "filterBy", "filterLocale", "trackBy", "sourceTrackBy", "targetTrackBy", "showSourceFilter", "showTargetFilter", "metaKeySelection", "dragdrop", "style", "styleClass", "sourceStyle", "targetStyle", "showSourceControls", "showTargetControls", "sourceFilterPlaceholder", "targetFilterPlaceholder", "disabled", "ariaSourceFilterLabel", "ariaTargetFilterLabel", "filterMatchMode", "stripedRows", "keepSelection", "breakpoint"], outputs: ["onMoveToSource", "onMoveAllToSource", "onMoveAllToTarget", "onMoveToTarget", "onSourceReorder", "onTargetReorder", "onSourceSelect", "onTargetSelect", "onSourceFilter", "onTargetFilter", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FieldsetModule }, { kind: "component", type: i21.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i22.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i22.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i23.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i24.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: FloatLabelModule }, { kind: "component", type: i25.FloatLabel, selector: "p-floatLabel" }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i26.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }] });
|
|
1437
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: DetalleTipoReporteComponent, isStandalone: true, selector: "detalle-tipo-reporte", inputs: { llaveReporte: "llaveReporte", aplicacion: "aplicacion", listaFuentes: "listaFuentes" }, providers: [MessageService], ngImport: i0, template: "<p-tabView (onChange)=\"cambiarTab($event)\">\r\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\r\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\r\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\r\n </p>\r\n <div class=\"p-fluid p-formgrid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\r\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\r\n\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\r\n (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\r\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\r\n <ng-template let-excel pTemplate=\"item\">\r\n <div>\r\n <label>{{excel.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n\r\n <div class=\"mt-4\">\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\r\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\r\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-4 \">\r\n <form [formGroup]=\"formMarcadorExcel\" >\r\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'marcador' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'valor' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\r\n [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel)\"\r\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n </div>\r\n </form>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorExcel($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'descargardoc' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'generarpin' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'agruparpor' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\r\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\r\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-tabView >\r\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\r\n \r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\r\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\r\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\r\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\r\n <td>{{marcador.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\r\n <div class=\"Detallereporte mt-2\">\r\n <form [formGroup]=\"formMarcador\">\r\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\r\n maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipo\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\r\n <label>{{'marcador' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\r\n <label>{{'tabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\r\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'alto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\r\n <label>{{'grupo1' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\r\n <label>{{'grupo2' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\r\n <label>{{'grupo3' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\r\n <label>{{'finalgrupo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'texto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'sql' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'grafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\r\n <label>{{'consulta' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"fuente\" optionLabel=\"descripcion\"\r\n optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\r\n <label>{{'marcadorgrafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\r\n <label>{{'titulo' | translate }} X</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\r\n <label>{{'titulo' | translate }} Y</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\r\n <label>{{'colordinamico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\r\n <label>{{'numerocategorias' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\r\n (click)=\"guardarMarcador()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcador($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\r\n [paginator]=\"listaCamposMarcador.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\r\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\r\n <th style=\"width: 10%;\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\r\n <td style=\"width: 10%;\">\r\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </td>\r\n <td style=\"width: 10%;\" >\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.columna}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\r\n {{'alto' | translate}}: {{campo.alto}}\r\n </div> \r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\r\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\r\n [paginator]=\"listaSoportes.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\r\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.descripcion}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.archivoIndividual}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'doblelinea' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'descripcion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n \r\n \r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \r\n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\r\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\r\n </button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\r\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\r\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\r\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-banda>\r\n <tr [pSelectableRow]=\"banda\">\r\n <td>{{banda.value}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\r\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\r\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\r\n <label>{{'total' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" >\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\r\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\r\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\r\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'etiqueta' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'ancho' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-dinamico>\r\n <tr [pSelectableRow]=\"dinamico\">\r\n <td>{{dinamico.banda}}</td>\r\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\r\n <td>{{dinamico.marcador}}</td>\r\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\r\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"flex justify-content-between align-items-center mb-2\"> \r\n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\r\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipocampo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoDato\" optionLabel=\"value\"\r\n optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipodato' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'orden' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\r\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'sintaxis' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\r\n <div class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" />\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"ancho\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'ancho' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'operacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n </form>\r\n \r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaDinamico($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n \r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\r\n maxlength=\"200\">\r\n <label>{{'nombrearchivo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'separador' | translate }}*</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-between lign-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\r\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\r\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.formato}}</td>\r\n <td>{{marctexto.alto}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\r\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('descripcion' | translate)+'*' }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\r\n <label>{{'ancho' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadoTexto($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'tabla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\r\n <label>{{'nombretabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-8\">\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\r\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\r\n <ng-template let-tabla pTemplate=\"item\">\r\n <div>\r\n <label>{{tabla.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\r\n <label>{{'tagencabezado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\r\n <label>{{'tagcierreencabezado' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\r\n <label>{{'tagregistro' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\r\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\r\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.descripcion}}</td>\r\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\r\n <label>{{'marcador' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'tabla' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\r\n <label>{{'formato' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\r\n <label>{{'texto' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\r\n <label>{{'estructuratabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorXML($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\r\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\" >\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.marcador}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n \r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'columnario' | translate }}\">\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\r\n <p-accordionTab [selected]=\"true\" >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'columnasbasicas'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\r\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\r\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.nombreColumna}}</td>\r\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\r\n <td>{{bean.orden}}</td>\r\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoReporteColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\r\n <label>{{'nombre' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'tipocolumna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionhorizontal' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- fila Operacion Vertical -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\r\n <label>{{'columnaoperacion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Operacion Verticial -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionvertical' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Orden -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\r\n <label>{{'orden' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Filas -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'ordenamiento' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Datos de la consulta -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaBasica($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'datosadicionales'|translate}}\r\n </ng-template>\r\n <p-fieldset class=\"fieldsintitulo\" >\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\r\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'filainiciocolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\r\n <label>{{'sintaxiscolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\r\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\r\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\r\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-columnaadicional>\r\n <tr [pSelectableRow]=\"columnaadicional\">\r\n <td>{{columnaadicional.nombre}}</td>\r\n <td>{{columnaadicional.orden}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\r\n <label>{{'alias' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\r\n <label>{{'sintaxis' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaAdicional($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'marcadores'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\r\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\r\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'tipomarcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.marcador}}</td>\r\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'marcador' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\r\n <label>{{'valor' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorColumnario($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n </p-tabPanel>\r\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i15.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i15.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i15.CellEditor, selector: "p-cellEditor" }, { kind: "directive", type: i15.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i15.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i15.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i15.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i16.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i16.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: InputHelperSeleccionPlantillaComponent, selector: "app-input-helper-seleccion-plantilla", inputs: ["value", "label", "labelrar", "labelarch", "extensiones", "readonly", "propiedad", "anexoPropiedad", "showDialog", "propiedadDeSistema", "mostraroblicargo", "mostrarX", "booleano", "mostrarLabelInput"], outputs: ["onSelected"] }, { kind: "pipe", type: ReporteColumnarioPipe, name: "reporteColumnarioPipe" }, { kind: "pipe", type: ReporteFuentePipe, name: "reporteFuentePipe" }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i17.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i18.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i19.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: PickListModule }, { kind: "component", type: i20.PickList, selector: "p-pickList", inputs: ["source", "target", "sourceHeader", "tabindex", "rightButtonAriaLabel", "leftButtonAriaLabel", "allRightButtonAriaLabel", "allLeftButtonAriaLabel", "upButtonAriaLabel", "downButtonAriaLabel", "topButtonAriaLabel", "bottomButtonAriaLabel", "targetHeader", "responsive", "filterBy", "filterLocale", "trackBy", "sourceTrackBy", "targetTrackBy", "showSourceFilter", "showTargetFilter", "metaKeySelection", "dragdrop", "style", "styleClass", "sourceStyle", "targetStyle", "showSourceControls", "showTargetControls", "sourceFilterPlaceholder", "targetFilterPlaceholder", "disabled", "ariaSourceFilterLabel", "ariaTargetFilterLabel", "filterMatchMode", "stripedRows", "keepSelection", "breakpoint"], outputs: ["onMoveToSource", "onMoveAllToSource", "onMoveAllToTarget", "onMoveToTarget", "onSourceReorder", "onTargetReorder", "onSourceSelect", "onTargetSelect", "onSourceFilter", "onTargetFilter", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FieldsetModule }, { kind: "component", type: i21.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i22.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i22.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i23.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i24.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: FloatLabelModule }, { kind: "component", type: i25.FloatLabel, selector: "p-floatLabel" }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i26.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }] });
|
|
1437
1438
|
}
|
|
1438
1439
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, decorators: [{
|
|
1439
1440
|
type: Component,
|
|
1440
|
-
args: [{ selector: 'detalle-tipo-reporte', imports: [TranslateModule, TableModule, TabViewModule, InputHelperSeleccionPlantillaComponent, ReporteColumnarioPipe, ReporteFuentePipe, DropdownModule, FormsModule, ReactiveFormsModule, CommonModule, ButtonModule, PickListModule, FieldsetModule, AccordionModule, InputTextModule, InputTextareaModule, FloatLabelModule, InputNumberModule, FieldsetModule], standalone: true, providers: [MessageService], template: "<p-tabView (onChange)=\"cambiarTab($event)\">\r\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\r\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\r\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\r\n </p>\r\n <div class=\"p-fluid p-formgrid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\r\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\r\n\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\r\n (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\r\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\r\n <ng-template let-excel pTemplate=\"item\">\r\n <div>\r\n <label>{{excel.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n\r\n <div class=\"mt-4\">\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\r\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\r\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-4 \">\r\n <form [formGroup]=\"formMarcadorExcel\" >\r\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'marcador' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\r\n <label>{{'valor' | translate }} *</label>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\r\n [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel)\"\r\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n </div>\r\n </form>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorExcel($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'descargardoc' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'generarpin' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'agruparpor' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\r\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\r\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-tabView >\r\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\r\n \r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\r\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\r\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\r\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\r\n <td>{{marcador.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\r\n <div class=\"Detallereporte mt-2\">\r\n <form [formGroup]=\"formMarcador\">\r\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\r\n maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipo\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\r\n <label>{{'marcador' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\r\n <label>{{'tabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\r\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'alto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"grupo1\"></textarea>\r\n <label>{{'grupo1' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"grupo2\"></textarea>\r\n <label>{{'grupo2' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"grupo3\"></textarea>\r\n <label>{{'grupo3' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\r\n <label>{{'finalgrupo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'texto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'sql' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"query\"></textarea>\r\n <label>{{'consulta' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"fuente\" optionLabel=\"descripcion\"\r\n optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'grafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\r\n <label>{{'marcadorgrafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\r\n <label>{{'titulo' | translate }} X</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\r\n <label>{{'titulo' | translate }} Y</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\r\n <label>{{'colordinamico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\r\n <label>{{'numerocategorias' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\r\n (click)=\"guardarMarcador()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcador($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\r\n [paginator]=\"listaCamposMarcador.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\r\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\r\n <th style=\"width: 10%;\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\r\n <td style=\"width: 10%;\">\r\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </td>\r\n <td style=\"width: 10%;\" >\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.columna}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\r\n {{'alto' | translate}}: {{campo.alto}}\r\n </div> \r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\r\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\r\n [paginator]=\"listaSoportes.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\r\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.descripcion}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.archivoIndividual}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'doblelinea' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'descripcion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n \r\n \r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \r\n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\r\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\r\n </button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\r\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\r\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\r\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-banda>\r\n <tr [pSelectableRow]=\"banda\">\r\n <td>{{banda.value}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\r\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\r\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\r\n <label>{{'total' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" >\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\r\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\r\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\r\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'etiqueta' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'ancho' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-dinamico>\r\n <tr [pSelectableRow]=\"dinamico\">\r\n <td>{{dinamico.banda}}</td>\r\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\r\n <td>{{dinamico.marcador}}</td>\r\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\r\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"flex justify-content-between align-items-center mb-2\"> \r\n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\r\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipocampo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoDato\" optionLabel=\"value\"\r\n optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipodato' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'orden' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\r\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'sintaxis' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\r\n <div class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" />\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"ancho\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'ancho' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'operacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n </form>\r\n \r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaDinamico($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n \r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\r\n maxlength=\"200\">\r\n <label>{{'nombrearchivo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'separador' | translate }}*</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-between lign-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\r\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\r\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.formato}}</td>\r\n <td>{{marctexto.alto}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\r\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('descripcion' | translate)+'*' }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\r\n <label>{{'ancho' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadoTexto($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'tabla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\r\n <label>{{'nombretabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-8\">\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\r\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\r\n <ng-template let-tabla pTemplate=\"item\">\r\n <div>\r\n <label>{{tabla.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\r\n <label>{{'tagencabezado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\r\n <label>{{'tagcierreencabezado' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\r\n <label>{{'tagregistro' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\r\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\r\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.descripcion}}</td>\r\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\r\n <label>{{'marcador' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'tabla' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\r\n <label>{{'formato' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\r\n <label>{{'texto' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\r\n <label>{{'estructuratabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorXML($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\r\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\" >\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.marcador}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n \r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'columnario' | translate }}\">\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\r\n <p-accordionTab [selected]=\"true\" >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'columnasbasicas'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\r\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\r\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.nombreColumna}}</td>\r\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\r\n <td>{{bean.orden}}</td>\r\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoReporteColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\r\n <label>{{'nombre' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'tipocolumna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionhorizontal' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- fila Operacion Vertical -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\r\n <label>{{'columnaoperacion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Operacion Verticial -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionvertical' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Orden -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\r\n <label>{{'orden' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Filas -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" \r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'ordenamiento' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Datos de la consulta -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaBasica($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'datosadicionales'|translate}}\r\n </ng-template>\r\n <p-fieldset class=\"fieldsintitulo\" >\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\r\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'filainiciocolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\r\n <label>{{'sintaxiscolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\r\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\r\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\r\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-columnaadicional>\r\n <tr [pSelectableRow]=\"columnaadicional\">\r\n <td>{{columnaadicional.nombre}}</td>\r\n <td>{{columnaadicional.orden}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\r\n <label>{{'alias' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\r\n <label>{{'sintaxis' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaAdicional($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'marcadores'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\r\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\r\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'tipomarcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.marcador}}</td>\r\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'marcador' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\r\n <label>{{'valor' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorColumnario($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n </p-tabPanel>\r\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"] }]
|
|
1441
|
+
args: [{ selector: 'detalle-tipo-reporte', imports: [TranslateModule, TableModule, TabViewModule, InputHelperSeleccionPlantillaComponent, ReporteColumnarioPipe, ReporteFuentePipe, DropdownModule, FormsModule, ReactiveFormsModule, CommonModule, ButtonModule, PickListModule, FieldsetModule, AccordionModule, InputTextModule, InputTextareaModule, FloatLabelModule, InputNumberModule, FieldsetModule], standalone: true, providers: [MessageService], template: "<p-tabView (onChange)=\"cambiarTab($event)\">\r\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\r\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\r\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\r\n </p>\r\n <div class=\"p-fluid p-formgrid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\r\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\r\n\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\r\n (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\r\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\r\n <ng-template let-excel pTemplate=\"item\">\r\n <div>\r\n <label>{{excel.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n\r\n <div class=\"mt-4\">\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\r\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\r\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-4 \">\r\n <form [formGroup]=\"formMarcadorExcel\" >\r\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'marcador' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'valor' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\r\n [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel)\"\r\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n </div>\r\n </form>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorExcel($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'descargardoc' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'generarpin' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'agruparpor' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\r\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\r\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-tabView >\r\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\r\n \r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\r\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\r\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\r\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\r\n <td>{{marcador.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\r\n <div class=\"Detallereporte mt-2\">\r\n <form [formGroup]=\"formMarcador\">\r\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\r\n maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipo\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\r\n <label>{{'marcador' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\r\n <label>{{'tabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursos' | translate\"\r\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'alto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\r\n <label>{{'grupo1' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\r\n <label>{{'grupo2' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\r\n <label>{{'grupo3' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\r\n <label>{{'finalgrupo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'texto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'sql' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'grafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\r\n <label>{{'consulta' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"fuente\" optionLabel=\"descripcion\"\r\n optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\r\n <label>{{'marcadorgrafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\r\n <label>{{'titulo' | translate }} X</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\r\n <label>{{'titulo' | translate }} Y</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\r\n <label>{{'colordinamico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\r\n <label>{{'numerocategorias' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\r\n (click)=\"guardarMarcador()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcador($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\r\n [paginator]=\"listaCamposMarcador.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\r\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\r\n <th style=\"width: 10%;\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\r\n <td style=\"width: 10%;\">\r\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </td>\r\n <td style=\"width: 10%;\" >\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.columna}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\r\n {{'alto' | translate}}: {{campo.alto}}\r\n </div> \r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\r\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\r\n [paginator]=\"listaSoportes.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\r\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.descripcion}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo)\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.archivoIndividual}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'doblelinea' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'descripcion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n \r\n \r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \r\n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\r\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\r\n </button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\r\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\r\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\r\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-banda>\r\n <tr [pSelectableRow]=\"banda\">\r\n <td>{{banda.value}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\r\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\r\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\r\n <label>{{'total' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" >\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\r\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\r\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\r\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'etiqueta' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'ancho' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-dinamico>\r\n <tr [pSelectableRow]=\"dinamico\">\r\n <td>{{dinamico.banda}}</td>\r\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\r\n <td>{{dinamico.marcador}}</td>\r\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\r\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"flex justify-content-between align-items-center mb-2\"> \r\n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\r\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipocampo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoDato\" optionLabel=\"value\"\r\n optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipodato' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'orden' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\r\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'sintaxis' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\r\n <div class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" />\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"ancho\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'ancho' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'operacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n </form>\r\n \r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaDinamico($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n \r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\r\n maxlength=\"200\">\r\n <label>{{'nombrearchivo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'separador' | translate }}*</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-between lign-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\r\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\r\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.formato}}</td>\r\n <td>{{marctexto.alto}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\r\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('descripcion' | translate)+'*' }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\r\n <label>{{'ancho' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadoTexto($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'tabla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\r\n <label>{{'nombretabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-8\">\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\r\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\r\n <ng-template let-tabla pTemplate=\"item\">\r\n <div>\r\n <label>{{tabla.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\r\n <label>{{'tagencabezado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\r\n <label>{{'tagcierreencabezado' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\r\n <label>{{'tagregistro' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\r\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\r\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.descripcion}}</td>\r\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\r\n <label>{{'marcador' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'tabla' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\r\n <label>{{'formato' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\r\n <label>{{'texto' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\r\n <label>{{'estructuratabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorXML($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\r\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\" >\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.marcador}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n \r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'columnario' | translate }}\">\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\r\n <p-accordionTab [selected]=\"true\" >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'columnasbasicas'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\r\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\r\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.nombreColumna}}</td>\r\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\r\n <td>{{bean.orden}}</td>\r\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoReporteColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\r\n <label>{{'nombre' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'tipocolumna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionhorizontal' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- fila Operacion Vertical -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\r\n <label>{{'columnaoperacion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Operacion Verticial -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionvertical' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Orden -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\r\n <label>{{'orden' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Filas -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'ordenamiento' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Datos de la consulta -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaBasica($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'datosadicionales'|translate}}\r\n </ng-template>\r\n <p-fieldset class=\"fieldsintitulo\" >\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\r\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'filainiciocolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\r\n <label>{{'sintaxiscolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\r\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\r\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\r\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-columnaadicional>\r\n <tr [pSelectableRow]=\"columnaadicional\">\r\n <td>{{columnaadicional.nombre}}</td>\r\n <td>{{columnaadicional.orden}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\r\n <label>{{'alias' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\r\n <label>{{'sintaxis' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaAdicional($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'marcadores'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\r\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\r\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'tipomarcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.marcador}}</td>\r\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'marcador' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\r\n <label>{{'valor' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorColumnario($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n </p-accordion>\r\n </p-tabPanel>\r\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"] }]
|
|
1441
1442
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ToastService }, { type: i3.GeneralService }, { type: i4.GeneralPipe }, { type: i5.AuthService }, { type: i6.ReporteFuentePipe }, { type: i7.ConfirmationService }, { type: i8.CargarArchivosService }, { type: i9.EncriptadoBasicoService }, { type: i10.UtilsService }, { type: i11.TranslateService }, { type: i12.FuentePipe }, { type: i13.ReporteColumnarioPipe }, { type: i14.EjecucionReporteService }], propDecorators: { llaveReporte: [{
|
|
1442
1443
|
type: Input
|
|
1443
1444
|
}], aplicacion: [{
|
|
@@ -1445,4 +1446,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
|
|
|
1445
1446
|
}], listaFuentes: [{
|
|
1446
1447
|
type: Input
|
|
1447
1448
|
}] } });
|
|
1448
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFlLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRzFFLE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFr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QUNuQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztJQUNqRCxDQUFDO3VHQTU5Q1UsMkJBQTJCOzJGQUEzQiwyQkFBMkIscUtBSnpCLENBQUMsY0FBYyxDQUFDLDBCQzVDL0Isay82SUFtNURZLHNpSUR6MkRFLGVBQWUsNEZBQUUsV0FBVyxtb0ZBQUUsYUFBYSw4a0JBQUUsc0NBQXNDLHlUQUFFLHFCQUFxQix5REFBRSxpQkFBaUIseURBQUUsY0FBYyw0cUNBQUUsV0FBVyxzaENBQUUsbUJBQW1CLCtVQUFFLFlBQVksbUlBQUUsWUFBWSw2T0FBRSxjQUFjLDIvQkFBRSxjQUFjLDZQQUFFLGVBQWUsaWxCQUFFLGVBQWUseUhBQUUsbUJBQW1CLHNLQUFFLGdCQUFnQixxR0FBRSxpQkFBaUI7OzJGQU14VSwyQkFBMkI7a0JBUnZDLFNBQVM7K0JBQ0Usc0JBQXNCLFdBQ3JCLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsc0NBQXNDLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsY0FDdFYsSUFBSSxhQUNMLENBQUMsY0FBYyxDQUFDOzBlQXNIYixZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1csWUFBWTtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgR2VuZXJhbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9nZW5lcmFsLnBpcGUnO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2VuZXJhbE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvR2VuZXJhbE1vZGVsJztcclxuaW1wb3J0IHsgQ2FyZ2FyQXJjaGl2b3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9jYXJnYXItYXJjaGl2b3Muc2VydmljZSc7XHJcbmltcG9ydCB7IEVuY3JpcHRhZG9CYXNpY29TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9lbmNyaXB0YWRvLWJhc2ljby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9yZXBvcnRlLWZ1ZW50ZS5waXBlJztcclxuaW1wb3J0IHsgRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lamVjdWNpb25yZXBvcnRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRnVlbnRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2Z1ZW50ZS5waXBlJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvcmVwb3J0ZS1jb2x1bW5hcmlvLnBpcGUnO1xyXG5pbXBvcnQgeyBSZXBvcnRlQ29sdW1uYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmEnO1xyXG5pbXBvcnQgeyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVNYXJjYWRvcic7XHJcbmltcG9ydCB7IFJlcG9ydGVUYWJsYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZVRhYmxhJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hcmlvJztcclxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUZ1ZW50ZU1vZGVsJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvcic7XHJcbmltcG9ydCB7IFJlcG9ydGVCYW5kYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUJhbmRhJztcclxuaW1wb3J0IHsgUmVwb3J0ZVNvcG9ydGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVTb3BvcnRlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IFRhYlZpZXdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhYnZpZXcnO1xyXG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRlcy9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XHJcbmltcG9ydCB7IFBpY2tMaXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9waWNrbGlzdCc7XHJcbmltcG9ydCB7IEZpZWxkc2V0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9maWVsZHNldCc7XHJcbmltcG9ydCB7IEFjY29yZGlvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYWNjb3JkaW9uJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRhcmVhTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHRhcmVhJztcclxuaW1wb3J0IHsgRmxvYXRMYWJlbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmxvYXRsYWJlbCc7XHJcbmltcG9ydCB7IElucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RldGFsbGUtdGlwby1yZXBvcnRlJyxcclxuICAgIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIFRhYmxlTW9kdWxlLCBUYWJWaWV3TW9kdWxlLCBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCwgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlLCBSZXBvcnRlRnVlbnRlUGlwZSwgRHJvcGRvd25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgUGlja0xpc3RNb2R1bGUsIEZpZWxkc2V0TW9kdWxlLCBBY2NvcmRpb25Nb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgSW5wdXRUZXh0YXJlYU1vZHVsZSwgRmxvYXRMYWJlbE1vZHVsZSwgSW5wdXROdW1iZXJNb2R1bGUsIEZpZWxkc2V0TW9kdWxlXSwgXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFsbGUtdGlwby1yZXBvcnRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kZXRhbGxlLXRpcG8tcmVwb3J0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZXRhbGxlVGlwb1JlcG9ydGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBsaXN0YVRpcG9DaWZyYWRvOiBhbnlbXSA9IFtdO1xyXG4gIC8vdGFiIGV4Y2VsXHJcbiAgcHVibGljIGxpc3RhRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU5vRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xyXG4gIHB1YmxpYyBmb3JtTWFyY2Fkb3JFeGNlbDogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yRXhjZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZXNNYXJjYWRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBlc0ltYWdlbkZpamE6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy90YWIgcGxhbnRpbGxhc1xyXG4gIHB1YmxpYyBsaXN0YUNvbHVtbmFzOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yZXM6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3I7XHJcbiAgcHVibGljIGxpc3RhVGlwb0dyYWZpY29fSkZDO1xyXG4gIHB1YmxpYyBsaXN0YUdyYWZpY287XHJcbiAgcHVibGljIGxpc3RhQWxpbmVhY2lvbjtcclxuICBwdWJsaWMgbGlzdGFPcGVyYWNpb25lcztcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICBwdWJsaWMgZm9ybU1hcmNhZG9yOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIG9yaWdlbk1hcmNhZG9yOiBzdHJpbmcgPSBudWxsO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhQ2FtcG9zTWFyY2Fkb3I6IFJlcG9ydGVUYWJsYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY2FtcG9NYXJjYWRvckluc2VydGFyOiBSZXBvcnRlVGFibGFNb2RlbCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICBwdWJsaWMgbGlzdGFTb3BvcnRlczogUmVwb3J0ZVNvcG9ydGVNb2RlbFtdID0gW107XHJcbiAgcHVibGljIHNvcG9ydGVJbmdyZXNhcjogUmVwb3J0ZVNvcG9ydGVNb2RlbCA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvOiBib29sZWFuID0gZmFsc2VcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2bzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBoYWJpbGl0YUNhbXBvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcmVwb3J0ZSBkaW5hbWljb1xyXG4gIHB1YmxpYyBsaXN0YVRpcG9CYW5kYSA9IFtcclxuICAgIHtrZXk6ICdiYW5kYTEnLCB2YWx1ZTogJ0JhbmRhIDEnfSxcclxuICAgIHtrZXk6ICdiYW5kYTInLCB2YWx1ZTogJ0JhbmRhIDInfSxcclxuICAgIHtrZXk6ICdiYW5kYTMnLCB2YWx1ZTogJ0JhbmRhIDMnfSxcclxuICAgIHtrZXk6ICdiYW5kYTQnLCB2YWx1ZTogJ0JhbmRhIDQnfSxcclxuICAgIHtrZXk6ICdiYW5kYTUnLCB2YWx1ZTogJ0JhbmRhIDUnfSxcclxuICAgIHtrZXk6ICdkZXRhbGxlJywgdmFsdWU6ICdEZXRhbGxlJ30sXHJcbiAgICB7a2V5OiAnc3VtbWFyeScsIHZhbHVlOiAnUmVzdW1lbid9LFxyXG4gIF1cclxuICBwdWJsaWMgZXhpc3RlSmFzcGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGJhbmRhU2VsZWNjaW9uYWRhID0ge2tleTogbnVsbCwgdmFsdWU6IG51bGx9O1xyXG4gIHB1YmxpYyBudWV2YUJhbmRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlclRhYkJhbmRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY286IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY286IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xyXG4gIHB1YmxpYyByZXBvcnRlQmFuZGE6IFJlcG9ydGVCYW5kYU1vZGVsID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsO1xyXG4gIHB1YmxpYyBmb3JtUmVwb3J0ZURpbmFtaWNvOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGxpc3RhTWFyY2Fkb3JEaW5hbWljbzogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdXHJcbiAgcHVibGljIGxpc3RhVGlwb0NhbXBvSmFzcGVyRGluYW1pY28gPSBbXHJcbiAgICB7a2V5OiAnQycsIHZhbHVlOiAnQ2FsY3Vsbyd9LFxyXG4gICAge2tleTogJ1QnLCB2YWx1ZTogJ0NvbHVtbmEnfSxcclxuICBdXHJcbiAgcHVibGljIGxpc3RhVGlwb0RhdG9TaW50YXhpcyA9IFtcclxuICAgIHtrZXk6ICdGJywgdmFsdWU6ICdGZWNoYSd9LFxyXG4gICAge2tleTogJ04nLCB2YWx1ZTogJ051bWVybyd9LFxyXG4gICAge2tleTogJ1QnLCB2YWx1ZTogJ1RleHRvJ30sXHJcbiAgXVxyXG5cclxuICAvL3JlcG9ydGUgdGFibGFcclxuICBwdWJsaWMgbGlzdGFUYWJsYTogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcbiAgcHVibGljIGxpc3RhTm9UYWJsYTogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcbiAgXHJcblxyXG4gIC8vcmVwb3J0ZSB0ZXh0b1xyXG4gIHB1YmxpYyBsaXN0YVNlcGFyYWRvcmVzO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFNYXJjYWRvcmVzVGV4dG86IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgbWFyY2Fkb3JUZXh0bzogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKVxyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yVGV4dG86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JUZXh0bztcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0bzogYm9vbGVhbiA9IGZhbHNlXHJcblxyXG4gIC8vcmVwb3J0ZSBYTUxcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JYTUw7XHJcbiAgcHVibGljIGxpc3RhWE1MOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW11cclxuICBwdWJsaWMgbWFyY2Fkb3JYTUw6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsXHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlck51ZXZvTWFyY2Fkb3JYTUw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFDYW1wb3NNYXJjYWRvclhNTDogUmVwb3J0ZVRhYmxhTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUw6IFJlcG9ydGVUYWJsYU1vZGVsID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xyXG4gIHB1YmxpYyB2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy9yZXBvcnRlIGNvbHVtbmFyaW9cclxuICBwdWJsaWMgbGlzdGFSZXBvcnRlQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbFtdID0gW107XHJcbiAgcHVibGljIHZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY29sdW1uYUJhc2ljYTogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbDtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFUaXBvQ29sdW1uYXM7XHJcbiAgcHVibGljIGxpc3RhT3BlcmFjaW9uZXNDb2x1bW5hcmlvO1xyXG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvO1xyXG4gIHB1YmxpYyBsaXN0YU9yZGVuYW1pZW50bztcclxuXHJcbiAgcHVibGljIHZlck51ZXZvQ29sdW1uYUFkaWNpb25hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNvbHVtbmFzQWRpY2lvbmFsZXM6IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBjb2x1bW5hQWRpY2lvbmFsOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsO1xyXG5cclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JDb2x1bW5hcmlvO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbWFyY2Fkb3Jlc0NvbHVtbmFyaW86IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbFtdID0gW107XHJcbiAgcHVibGljIG1hcmNhZG9yQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsO1xyXG5cclxuICBwdWJsaWMgcmVwb3J0ZUZ1ZW50ZSA6IFJlcG9ydGVGdWVudGVNb2RlbCA9IG5ldyAgUmVwb3J0ZUZ1ZW50ZU1vZGVsKCk7XHJcbiAgcHVibGljIGxsYXZlRW1wcmVzYTogc3RyaW5nO1xyXG4gIHB1YmxpYyBsaXN0YVNpTm87XHJcbiAgQElucHV0KCkgcHVibGljIGxsYXZlUmVwb3J0ZSA6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgYXBsaWNhY2lvbiA6IHN0cmluZztcclxuICBASW5wdXQoKSAgcHVibGljIGxpc3RhRnVlbnRlczogYW55W10gPSBbXTtcclxuXHJcbiAgX3N1YnNjaXBydGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYWNpb25lc0J1c1NlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZ2VuZXJhbFNlcnZpY2U6IEdlbmVyYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsUGlwZTogR2VuZXJhbFBpcGUsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVwb3J0ZUZ1ZW50ZVBpcGU6IFJlcG9ydGVGdWVudGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjYXJnYXJBcmNoaXZvOiBDYXJnYXJBcmNoaXZvc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVuY3JpcHRhZG9yQXJjaGl2bzogRW5jcmlwdGFkb0Jhc2ljb1NlcnZpY2UsXHJcbiAgICBwdWJsaWMgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZ1ZW50ZVBpcGU6IEZ1ZW50ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogUmVwb3J0ZUNvbHVtbmFyaW9QaXBlLFxyXG4gICAgcHJpdmF0ZSByZXBvcnRlU2VydmljZTogRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UpIHtcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxsYXZlRW1wcmVzYSA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW5LZXkoJ2xsYXZlRW1wcmVzYScpO1xyXG4gICAgdGhpcy5saXN0YVNpTm8gPSB0aGlzLmdlbmVyYWxQaXBlLkxJU1RBX1NJTk87XHJcbiAgICB0aGlzLmxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpbyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfVElQT19NQVJDQURPUjtcclxuICAgIHRoaXMubGlzdGFUaXBvQ29sdW1uYXMgPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX1RJUE9fQ09MVU1OQVM7XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXNDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUEVSQUNJT05FU19DT0xVTU5BUklPO1xyXG4gICAgdGhpcy5saXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUEVSQUNJT05FU19DT0xVTU5BUklPX0VYQ0VMO1xyXG4gICAgdGhpcy5saXN0YU9yZGVuYW1pZW50byA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfT1JERU5BTUlFTlRPO1xyXG4gICAgdGhpcy5saXN0YVNlcGFyYWRvcmVzID0gIHRoaXMuZnVlbnRlUGlwZS5MSVNUQV9TRVBBUkFET1JFUztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX01BUkNBRE9SRVM7XHJcbiAgICB0aGlzLmxpc3RhVGlwb0dyYWZpY29fSkZDID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9USVBPX0dSQUZJQ09fSkZDO1xyXG4gICAgdGhpcy5saXN0YUdyYWZpY28gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX1JFQ1VSU09fR1JBRklDQTtcclxuICAgIHRoaXMubGlzdGFBbGluZWFjaW9uID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9BTElORUFDSU9OO1xyXG4gICAgdGhpcy5saXN0YU9wZXJhY2lvbmVzID0gdGhpcy5nZW5lcmFsUGlwZS5NQVBBT1BFUkFDSU9ORVM7XHJcbiAgICB0aGlzLmxpc3RhVGlwb01hcmNhZG9yVGV4dG8gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlRJUE9NQVJDQURPUkVTVEVYVE87XHJcbiAgICB0aGlzLmxpc3RhVGlwb01hcmNhZG9yWE1MID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9NQVJDQURPUkVTX1hNTDtcclxuICAgIHRoaXMuY2FyZ2FyKCk7XHJcbiAgICB0aGlzLmNhcmdhckZvcm1NYXJjYWRvckV4Y2VsKCk7XHJcbiAgICB0aGlzLmNhcmdhckZvcm1NYXJjYWRvcigpO1xyXG4gICAgdGhpcy5jYXJnYXJGb3JtRGluYW1pY28oKTtcclxuICAgIHRoaXMuYWdyZWdhclN1YnNjcmlwY2lvbmVzKCk7XHJcbiAgICAvL3RoaXMuY2FyZ2FyTGlzdGFzKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKXtcclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMuZm9yRWFjaCgoc3ViKSA9PiB7XHJcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZ3JlZ2FyU3Vic2NyaXBjaW9uZXMoKSB7XHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCB0ZXh0b1JlZ2lzdHJvQ29udHJvbCA9IHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0ZXh0b1JlZ2lzdHJvJyk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2VuQ29udHJvbCA9IHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdvcmlnZW4nKTtcclxuICAgICAgICBpZiAoIXZhbHVlKXtcclxuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IHRydWU7XHJcbiAgICAgICAgICBvcmlnZW5Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChbJ01BJ10uaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgICAgICB0aGlzLmVzSW1hZ2VuRmlqYSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5lc01hcmNhZG9yID0gdHJ1ZTtcclxuICAgICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICBvcmlnZW5Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoWydJRiddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5lc01hcmNhZG9yID0gZmFsc2U7XHJcbiAgICAgICAgICBvcmlnZW5Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgb3JpZ2VuQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZW50cmEgYSB0aXBvOiAnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKVxyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8gPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLk1BUkNBRE9SVEFCTEEpe1xyXG4gICAgICAgICAvLyB0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCA9ICdOJ1xyXG4gICAgICAgICAvLyB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpZW5lU3FsJykuc2V0VmFsdWUoJ04nKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdvcmlnZW4nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLm9yaWdlbiA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpZW5lU3FsJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZW50cmEgYSB0aWVuZVNxbDogJylcclxuICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG9HcmFmaWNvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljbyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnb3JpZ2VuJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAoWydVJ10uaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLm9yaWdlbiA9ICdVJ1xyXG4gICAgICAgIH0gZWxzZSBpZiAoWydDJ10uaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLm9yaWdlbiA9ICdDJyAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9DYW1wbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPSB2YWx1ZTtcclxuICAgICAgICBjb25zdCByZXN1bHRhZG9YQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3Jlc3VsdGFkb1gnKTtcclxuICAgICAgICBjb25zdCByZXN1bHRhZG9ZQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3Jlc3VsdGFkb1knKTsgIFxyXG4gICAgICAgIGlmICh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSAhPSAnZGV0YWxsZScpIHtcclxuICAgICAgICAgIHJlc3VsdGFkb1hDb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICByZXN1bHRhZG9ZQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHRhZG9YQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgIHJlc3VsdGFkb1lDb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgbWFyY2Fkb3JDb250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgnbWFyY2Fkb3InKTtcclxuICAgICAgICBjb25zdCBmaWx0cm9Db250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgnZmlsdHJvJyk7XHJcbiAgICAgICAgY29uc3QgdGlwb0RhdG9Db250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgndGlwb0RhdG8nKTtcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0gJ1QnKSB7XHJcbiAgICAgICAgICBtYXJjYWRvckNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIGZpbHRyb0NvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICB0aXBvRGF0b0NvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG1hcmNhZG9yQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgIGZpbHRyb0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIHRpcG9EYXRvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtYXJjYWRvckNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIGZpbHRyb0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHRpcG9EYXRvQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgIHJlc3VsdGFkb1hDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgndGlwb0RhdG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8gPSB2YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNhbWJpYXJUYWIoZXZlbnQpe1xyXG4gICAgc3dpdGNoIChldmVudC5pbmRleCkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgdGhpcy5jYXJnYXIoKTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3Rhc0V4Y2VsKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JlcygpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB0aGlzLnZhbGlkYXJFeGlzdGVKYXNwZXIoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSA0OlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzVGFibGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSA1OlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSA2OlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSA3OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXJnYXJMaXN0YXNUYWJsYSgpe1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge2J1c2Nhck9yZGVuVGFibGE6ICdTJywgb3JkZW5hclRhYmxhOiAnUycsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFUYWJsYSA9IGRhdGE7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge2J1c2Nhck9yZGVuVGFibGE6ICdOJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU5vVGFibGEgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhTWFyY2Fkb3Jlcygpe1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ1AnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JlcyA9IGRhdGE7XHJcbiAgICB9KSAgICBcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3Rhc0V4Y2VsKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7b3JkZW5FeGNlbDogJ1MnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtvcmRlbkV4Y2VsOiAnTicsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFOb0V4Y2VsID0gZGF0YTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnRScsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvckV4Y2VsID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJMaXN0YUNvbHVtbmFzKCl7XHJcbiAgICB0aGlzLmxpc3RhQ29sdW1uYXMgPSBbXTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhQ29sdW1uYXMgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3Rhcygpe1xyXG4gICAgdGhpcy5saXN0YVRpcG9DaWZyYWRvID0gW107XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdFbmNyaXBjaW9uQXJjaGl2b0RUTycsIG51bGwsIGZhbHNlLCB7fSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVRpcG9DaWZyYWRvID0gZGF0YTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmNhcmdhckxpc3RhQ29sdW1uYXMoKTtcclxuICB9XHJcblxyXG4gIGNhcmdhckZvcm1NYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGRlc2NyaXBjaW9uOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5kZXNjcmlwY2lvbiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldKSxcclxuICAgICAgbWFyY2Fkb3I6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLm1hcmNhZG9yLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSksXHJcbiAgICAgIHRpcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLnRpcG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHRleHRvUmVnaXN0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm8pLFxyXG4gICAgICBvcmlnZW46IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLm9yaWdlbiksXHJcbiAgICAgIC8vY2FtcG9zIGJkXHJcbiAgICAgIGxsYXZlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSksXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpLFxyXG4gICAgICB0aXBvUmVwb3J0ZTogbmV3IEZvcm1Db250cm9sKCdFJykgXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyRm9ybU1hcmNhZG9yKCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvciA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmRlc2NyaXBjaW9uLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0pLFxyXG4gICAgICB0aXBvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgbWFyY2Fkb3I6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5tYXJjYWRvciwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV0pLFxyXG4gICAgICB0YWJsYTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRhYmxhKSxcclxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3Iub3JpZ2VuKSxcclxuICAgICAgdGV4dG9SZWdpc3RybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRleHRvUmVnaXN0cm8pLFxyXG4gICAgICByZXBvcnRlQ29sdW1uYTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnJlcG9ydGVDb2x1bW5hKSxcclxuICAgICAgZm9ybWF0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZvcm1hdG8pLFxyXG4gICAgICBhbmNobzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmFuY2hvKSxcclxuICAgICAgYWx0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmFsdG8pLFxyXG4gICAgICBncnVwbzE6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5ncnVwbzEpLFxyXG4gICAgICBncnVwbzI6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5ncnVwbzIpLFxyXG4gICAgICBncnVwbzM6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5ncnVwbzMpLFxyXG4gICAgICBmaW5hbEdydXBvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZmluYWxHcnVwbyksXHJcbiAgICAgIHRpZW5lU3FsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpLFxyXG4gICAgICBxdWVyeTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnF1ZXJ5KSxcclxuICAgICAgZnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZnVlbnRlKSxcclxuICAgICAgdGlwb0dyYWZpY286IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljbyksXHJcbiAgICAgIG1hcmNhZG9yR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm1hcmNhZG9yR3JhZmljbyksXHJcbiAgICAgIHRpdHVsb3g6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXR1bG94KSxcclxuICAgICAgdGl0dWxveTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpdHVsb3kpLFxyXG4gICAgICBiYW5kYTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmJhbmRhKSxcclxuICAgICAgYW5jaG9KYXNwZXJMYWJlbDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmFuY2hvSmFzcGVyTGFiZWwpLFxyXG4gICAgICBmaWx0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5maWx0cm8pLFxyXG4gICAgICAvL2NhbXBvcyBiZFxyXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlKSxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSksXHJcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2woJ04nKSBcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJGb3JtRGluYW1pY28oKXtcclxuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljbyA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICB0aXBvQ2FtcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgdGlwb0RhdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvKSxcclxuICAgICAgZmlsdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5maWx0cm8pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IpLFxyXG4gICAgICBhbHRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5hbHRvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBmb3JtYXRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5mb3JtYXRvKSxcclxuICAgICAgZGVzY3JpcGNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmRlc2NyaXBjaW9uKSxcclxuICAgICAgYW5jaG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFuY2hvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBhbmNob0phc3BlckxhYmVsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5hbmNob0phc3BlckxhYmVsKSxcclxuICAgICAgcmVzdWx0YWRvWDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVzdWx0YWRvWCApLFxyXG4gICAgICByZXN1bHRhZG9ZOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXN1bHRhZG9ZICksXHJcbiAgICAgIHRpdHVsb3g6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpdHVsb3gpLFxyXG4gICAgICB0aXR1bG95OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXR1bG95KSxcclxuICAgICAgdGlwb1JlcG9ydGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9SZXBvcnRlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICB0aXBvR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0dyYWZpY28pLCAgICAgIFxyXG4gICAgICBvcGVyYWNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9wZXJhY2lvbiksICAgICAgXHJcbiAgICAgIC8vY2FtcG9zIHRhYmxhXHJcbiAgICAgIG9yaWdlbjogbmV3IEZvcm1Db250cm9sKCdEJyksXHJcbiAgICAgIGJhbmRhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkpLFxyXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcclxuICAgICAgbGxhdmU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlKSxcclxuXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyKCl7XHJcbiAgICB0aGlzLmV4aXN0ZUphc3BlciA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5sbGF2ZVJlcG9ydGUpe1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JPYmplY3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUZ1ZW50ZURUTycsIG51bGwsIGZhbHNlLCB7bGxhdmU6IHRoaXMubGxhdmVSZXBvcnRlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMucmVwb3J0ZUZ1ZW50ZSA9IGRhdGE7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3Rhc0V4Y2VsKCk7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhcygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhY3R1YWxpemFyKCl7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKXtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUZ1ZW50ZURUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVGdWVudGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuZ3VhcmRhclJlcG9ydGUodGhpcy5yZXBvcnRlRnVlbnRlKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlRnVlbnRlID0gZGF0YTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb2J0ZW5lckFyY2hpdm8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9Ub2RvID0gZXZlbnQuZGF0YVxyXG4gIH1cclxuXHJcbiAgb2J0ZW5lckFyY2hpdm9NYXJjYWRvckV4Y2VsKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRleHRvUmVnaXN0cm8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b01hcmNhZG9yKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRleHRvUmVnaXN0cm8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b1BsYW5pbGxhKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbCA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvU29wb3J0ZShldmVudCwgc29wb3J0ZSl7XHJcbiAgICBzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsID0gZXZlbnQuZGF0YVxyXG4gIH1cclxuXHJcbiAgb2J0ZW5lckFyY2hpdm9Db2x1bW5hcmlvKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvID0gZXZlbnQuZGF0YVxyXG4gIH1cclxuXHJcblxyXG4gIG1vdmVyQUFzb2NpYWRvKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhRXhjZWwsXHJcbiAgICAgIGV4Y2VsOiB0cnVlXHJcbiAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICBtb3ZlckFEZXNhc29jaWFkbyhldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFEZXNhc29jaWFkbzogdGhpcy5saXN0YU5vRXhjZWwsXHJcbiAgICAgIGV4Y2VsOiB0cnVlXHJcbiAgICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxyXG4gIH1cclxuXHJcbiAgbW92ZXJBQXNvY2lhZG9UYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFBc29jaWFkbzogdGhpcy5saXN0YVRhYmxhLFxyXG4gICAgICBleGNlbDogZmFsc2VcclxuICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIG1vdmVyQURlc2Fzb2NpYWRvVGFibGEoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XHJcbiAgICAgIGxpc3RhRGVzYXNvY2lhZG86IHRoaXMubGlzdGFOb1RhYmxhLFxyXG4gICAgICBleGNlbDogZmFsc2VcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICByZW9yZGVyVGFibGEoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XHJcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFUYWJsYSxcclxuICAgICAgZXhjZWw6IGZhbHNlXHJcbiAgICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxyXG4gIH1cclxuXHJcbiAgdmVyRGV0YWxsZU1hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbClcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3JFeGNlbCgpe1xyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSB0cnVlO1xyXG4gICAgdGhpcy5lc01hcmNhZG9yID0gZmFsc2U7XHJcbiAgICB0aGlzLmVzSW1hZ2VuRmlqYSA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwpXHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGlwbycpLnNldFZhbHVlKG51bGwpXHJcbiAgfVxyXG5cclxuICBndWFyZGFyTWFyY2Fkb3JFeGNlbCgpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbGlkKXtcclxuICAgICAgbGV0IGxsYXZlUmVnaXN0cm8gPSAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ2xsYXZlJykudmFsdWVcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3JlcG9ydGVGdWVudGUnKS5zZXRWYWx1ZSh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvUmVwb3J0ZScpLnNldFZhbHVlKCdFJylcclxuICAgICAgaWYgKGxsYXZlUmVnaXN0cm8pe1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdsbGF2ZScpLnNldFZhbHVlKHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpKVxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC52YWx1ZSkpLnN1YnNjcmliZSggZGF0YSA9PiB7ICBcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2UgICAgICBcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldChrZXkpLmVycm9ycykge1xyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoa2V5KS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IFxyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJNYXJjYWRvckV4Y2VsKGV2ZW50KXtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwpKS5zdWJzY3JpYmUoZGF0YSA9PntcclxuICAgICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucmVzZXQoKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXHJcbiAgICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnRScsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGFNYXJjYWRvckV4Y2VsID0gZGF0YTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIFxyXG4gIH1cclxuXHJcbiAgLy9wbGFudGlsbGFcclxuXHJcbiAgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvciA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yQXN5bmMoKSB7XHJcbiAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3IgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlfSkpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgdmVyRGV0YWxsZU1hcmNhZG9yKGV2ZW50KXtcclxuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IHRydWU7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvciA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yKVxyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykuc2V0VmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbylcclxuICAgIFxyXG4gICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3IoKXtcclxuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnJlc2V0KHt9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gdHJ1ZTtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yKVxyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvUmVwb3J0ZScpLnNldFZhbHVlKCdQJylcclxuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykuc2V0VmFsdWUobnVsbClcclxuICB9XHJcblxyXG4gIGd1YXJkYXJNYXJjYWRvcigpe1xyXG4gICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yLnZhbGlkKXtcclxuICAgICAgbGV0IGxsYXZlUmVnaXN0cm8gPSAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdsbGF2ZScpLnZhbHVlXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgncmVwb3J0ZUZ1ZW50ZScpLnNldFZhbHVlKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSlcclxuICAgICAgLy90aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ04nKVxyXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xyXG4gICAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnbGxhdmUnKS5zZXRWYWx1ZSh0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKSlcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHsgICAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xyXG4gICAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtTWFyY2Fkb3IuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1NYXJjYWRvci5nZXQoa2V5KS5lcnJvcnMpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yKGV2ZW50KXtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvcikpLnN1YnNjcmliZShkYXRhID0+e1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKVxyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyQ2FtcG9NYXJjYWRvcihldmVudCwgb2JqZXRvKXsgXHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBvYmpldG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9DYW1wb1RhYmxhKCl7XHJcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSB0cnVlO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlXHJcbiAgfVxyXG5cclxuICB2YWxpZGFyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY29sdW1uYSlcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9yLmNhbXBvRnVlbnRlKVxyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFncmVnYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3Ipe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY2FtcG9NYXJjYWRvci5yZXBvcnRlTWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvci5sbGF2ZTtcclxuICAgIGlmICgnSScgPT0gY2FtcG9NYXJjYWRvci50aXBvKXtcclxuICAgICAgaWYgKCFjYW1wb01hcmNhZG9yLmFuY2hvIHx8IGNhbXBvTWFyY2Fkb3IuYW5jaG8gPT0gMCl7XHJcbiAgICAgICAgY2FtcG9NYXJjYWRvci5hbmNobyA9IDEwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghY2FtcG9NYXJjYWRvci5hbHRvIHx8IGNhbXBvTWFyY2Fkb3IuYWx0byA9PSAwKXtcclxuICAgICAgICBjYW1wb01hcmNhZG9yLmFsdG8gPSAxMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKFsnRyddLmluY2x1ZGVzKGNhbXBvTWFyY2Fkb3IudGlwbykpe1xyXG4gICAgICBjYW1wb01hcmNhZG9yLmNvbHVtbmEgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhbXBvTWFyY2Fkb3IubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG9NYXJjYWRvcikpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvID0gZmFsc2U7XHJcbiAgICAgICAgY2FtcG9NYXJjYWRvciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FtcG9NYXJjYWRvci5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvTWFyY2Fkb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IGZhbHNlO1xyXG4gICAgICAgIGNhbXBvTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XHJcbiAgICAgICAgdGhpcy52ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKVxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXJnYXJMaXN0YVNvcG9ydGVzKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCB0aXBvOiAnUyd9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhU29wb3J0ZXMgPSBkYXRhO1xyXG4gICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2FyTGlzdGFTb3BvcnRlc0FzeW5jKCl7XHJcbiAgICB0aGlzLmxpc3RhU29wb3J0ZXMgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCB0aXBvOiAnUyd9KSkudG9Qcm9taXNlKClcclxuICB9XHJcblxyXG4gIG51ZXZvU29wb3J0ZSgpe1xyXG4gICAgdGhpcy5zb3BvcnRlSW5ncmVzYXIgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbCgpO1xyXG4gICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSB0cnVlO1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNhbmNlbGFyU29wb3J0ZSgpIHtcclxuICAgIHRoaXMuc29wb3J0ZUluZ3Jlc2FyID0gbmV3IFJlcG9ydGVTb3BvcnRlTW9kZWwoKTtcclxuICAgIHRoaXMudmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJTb3BvcnRlKHNvcG9ydGUpe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5kZXNjcmlwY2lvbilcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsKVxyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFncmVnYXJTb3BvcnRlKHNvcG9ydGUpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhclNvcG9ydGUoc29wb3J0ZSkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzb3BvcnRlLmxsYXZlVGFibGEpe1xyXG4gICAgICBzb3BvcnRlLnRpcG8gPSAnUydcclxuICAgICAgc29wb3J0ZS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICBzb3BvcnRlID0gbmV3IFJlcG9ydGVTb3BvcnRlTW9kZWw7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVNvcG9ydGVEVE8nLCBudWxsLCBmYWxzZSwgc29wb3J0ZSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSBmYWxzZTtcclxuICAgICAgICAgIHNvcG9ydGUgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJTb3BvcnRlKGV2ZW50LCBzb3BvcnRlKXtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4geyBcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGluaWNpYXJFZGljaW9uKCkge1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhbmNlbGFyRWRpY2lvbigpIHsgXHJcbiAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXNBc3luYygpOyAgIFxyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgICBcclxuICB9XHJcbiAgXHJcbiAgLy9SZXBvcnRlIERpbmFtaWNvXHJcblxyXG4gIGdlbmVyYXJKYXNwZXIoKXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuZ2VuZXJhckphc3Blcih0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsICdjb21wZW5zYWNpb24vUmVwb3J0ZXNCYXNlJykgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1NlIGhhIGdlbmVyYWRvIGVsIGphc3BlciBleGl0b3NhbWVudGUnKVxyXG4gICAgICAgIHRoaXMudmFsaWRhckV4aXN0ZUphc3BlcigpO1xyXG4gICAgICB9XHJcbiAgICB9KTsgICAgXHJcbiAgfVxyXG5cclxuXHJcbiAgZGVzY2FyZ2FySmFzcGVyKCkge1xyXG5cclxuICAgIGxldCBwcm9waWVkYWQgPSAncnV0YV9wbGFudGlsbGFzJztcclxuICAgIGxldCBhcGxpY2FjaW9uID0gdGhpcy5hcGxpY2FjaW9uLy9lbnZpcm9ubWVudC5jb2RpZ29BcGxpY2FjaW9uO1xyXG4gICAgLy9SdXRhIGFyY2hpdm9cclxuICAgIHRoaXMuY2FyZ2FyQXJjaGl2by5kZXNjYXJnYXJBcmNoaXZvKHRoaXMuZW5jcmlwdGFkb3JBcmNoaXZvLmVuY3JpcHRhcigncmVwb3J0ZXMvJyArIHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnKSwgcHJvcGllZGFkLCBhcGxpY2FjaW9uKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBibG9iID0+IHtcclxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxyXG4gICAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXHJcbiAgICAgIGEuaHJlZiA9IG9iamVjdFVybFxyXG4gICAgICBhLmRvd25sb2FkID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcgLy9kb2N1bWVudG8uYXJjaGl2b29yaWdlbjtcclxuICAgICAgYS5jbGljaygpO1xyXG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgfVxyXG5cclxuICBudWV2b01hcmNhZG9yRGluYW1pY28oKXtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWxcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3JpZ2VuID0gJ0QnXHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmVcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgPSB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleVxyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnJlc2V0KCk7XHJcbiAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28ucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKVxyXG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgdmVyTWFyY2Fkb3JEaW5hbWljbyhldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pXHJcbiAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdmVyQmFuZGEoZXZlbnQpe1xyXG4gICAgdGhpcy52ZXJUYWJCYW5kYSA9IGZhbHNlO1xyXG4gICAgdGhpcy5iYW5kYVNlbGVjY2lvbmFkYSA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xyXG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2U7XHJcbiAgICB0aGlzLm51ZXZhQmFuZGEgPSBmYWxzZTtcclxuICAgIGlmIChbJ2RldGFsbGUnLCdzdW1tYXJ5J10uaW5jbHVkZXModGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkpKXtcclxuICAgICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgYmFuZGE6IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5fSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAoIXRoaXMucmVwb3J0ZUJhbmRhKSB7XHJcbiAgICAgICAgdGhpcy5udWV2YUJhbmRhID0gdHJ1ZTtcclxuICAgICAgICBpZiAoWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5KSl7XHJcbiAgICAgICAgICB0aGlzLm51ZXZhQmFuZGEgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWw7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlQmFuZGEudG90YWxlcyA9ICdTJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zbGVlcCgyNSlcclxuICAgIHRoaXMudmVyVGFiQmFuZGEgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKCl7XHJcbiAgICB0aGlzLmxpc3RhTWFyY2Fkb3JEaW5hbWljbyA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7XHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgXHJcbiAgICAgIGJhbmRhOiB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSxcclxuICAgICAgb3JkZW5EaW5hbWljbzogJ1MnLFxyXG4gICAgICBvcmlnZW46ICdEJ1xyXG4gICAgfSkpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ3VhcmRhckNhcmFjdGVyaXN0aWNhQmFuZGEoKXtcclxuICAgIGlmKHRoaXMubnVldmFCYW5kYSkge1xyXG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYS5iYW5kYSA9IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5O1xyXG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYSA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlQmFuZGEpKS50b1Byb21pc2UoKTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUJhbmRhKSkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNsZWVwKDI1KVxyXG4gICAgdGhpcy5udWV2YUJhbmRhPWZhbHNlO1xyXG4gICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8oXCJTZSBhY3R1YWxpemFyb24gbGFzIGNhcmFjdGVyaXN0aWNhcyBkZSBcIit0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJDb2x1bW5hRGluYW1pY28oKXtcclxuICAgIGlmICghdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoa2V5KS5lcnJvcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28udmFsdWU7XHJcbiAgICBpZih0aGlzLnV0aWxzU2VydmljZS5pc0JsYW5rKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUpKXtcclxuICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9yaWdlbiA9ICdEJztcclxuICAgICAgaWYodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0gJ0MnKXtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm1hcmNhZG9yID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5maWx0cm87XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlQ29sdW1uYSA9IG51bGw7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHZhciBjb2x1bW5hID0gbmV3IFJlcG9ydGVDb2x1bW5hTW9kZWwoKTtcclxuICAgICAgICBjb2x1bW5hLmxsYXZlVGFibGEgPSB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm1hcmNhZG9yO1xyXG4gICAgICAgIGNvbHVtbmEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yT2JqZWN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIGNvbHVtbmEpKS50b1Byb21pc2UoKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm1hcmNhZG9yID0gY29sdW1uYS5ub21icmU7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlQ29sdW1uYSA9IGNvbHVtbmEubGxhdmVUYWJsYTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybyA9IGNvbHVtbmEuc2ludGF4aXM7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byA9IGNvbHVtbmEudGlwb0RhdG87XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKSkudG9Qcm9taXNlKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0gJ0MnKXtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm1hcmNhZG9yID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5maWx0cm87XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBudWxsO1xyXG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2U7XHJcbiAgICBhd2FpdCB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpXHJcbiAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbygnU2UgaGEgZ3VhcmRhZG8gZWwgY2FtYmlvJyk7XHJcbiAgfVxyXG5cclxuICByZWdyZXNhckJhbmRhU2VsZWNjaW9uYWRhKCl7XHJcbiAgICB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhID0ge2tleTogbnVsbCwgdmFsdWU6IG51bGx9XHJcbiAgfVxyXG5cclxuICBhc3luYyBlbGltaW5hckNvbHVtbmFEaW5hbWljbyhldmVudCkge1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6IGFzeW5jICgpID0+ICB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKVxyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKVxyXG4gICAgICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhbGlkYXJTZXBhcmFkb3IoKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMucmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3IpO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFjdHVhbGl6YXJTZXBhcmFkb3IoKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyU2VwYXJhZG9yKCkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3R1YWxpemFyKCk7XHJcbiAgfVxyXG5cclxuICBjYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpe1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtcclxuICAgICAgdGlwb1JlcG9ydGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVQT1JURUFSQ0hJVk9QTEFOTyxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLFxyXG4gICAgICBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJXHJcbiAgICB9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhTWFyY2Fkb3Jlc1RleHRvID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2ZXJNYXJjYWRvclRleHRvKGV2ZW50KXtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gdHJ1ZTtcclxuICAgIHRoaXMubWFyY2Fkb3JUZXh0byA9IGV2ZW50LmRhdGE7XHJcbiAgfVxyXG5cclxuICBudWV2b01hcmNhZG9yVGV4dG8oKXtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gdHJ1ZTtcclxuICAgIHRoaXMubWFyY2Fkb3JUZXh0byA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG5cdFx0dGhpcy5tYXJjYWRvclRleHRvLnRpcG9SZXBvcnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5SRVBPUlRFQVJDSElWT1BMQU5PO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhck1hcmNhZG9yVGV4dG8oKSA6IGJvb2xlYW57XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by5hbHRvKTtcclxuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLk1BUkNBRE9SVEVYVE9GSUpPID09IHRoaXMubWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyl7XHJcbiAgICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uZm9ybWF0byk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRFWFRPRElOQU1JQ08gPT0gdGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKXtcclxuICAgICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by5hbmNobyk7XHJcbiAgICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJNYXJjYWRvclRleHRvKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG8gPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJNYXJjYWRvclRleHRvKCkpIHtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG8gPSBmYWxzZTtcclxuICAgIHRoaXMubWFyY2Fkb3JUZXh0by5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgaWYgKHRoaXMubWFyY2Fkb3JUZXh0by5sbGF2ZSl7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yVGV4dG8pKS50b1Byb21pc2UoKTtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYXJjYWRvclRleHRvLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclRleHRvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKTtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9UZXh0byhldmVudCl7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogYXN5bmMgKCkgPT4gIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclRleHRvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFYTUwoKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7XHJcbiAgICAgIHRpcG9SZXBvcnRlOiAnWCcsXHJcbiAgICAgIG9yaWdlbjogJ1gnLFxyXG4gICAgICByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsXHJcbiAgICAgIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0lcclxuICAgIH0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFYTUwgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3JYTUwoKXtcclxuICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgIHRoaXMubWFyY2Fkb3JYTUwudGlwb1JlcG9ydGUgPSAnWCc7XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MLm9yaWdlbiA9ICdYJztcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2ZXJNYXJjYWRvclhNTChldmVudCl7XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IHRydWU7XHJcbiAgICBpZiAgKHRoaXMubWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInIHx8IHRoaXMubWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInKXtcclxuICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXJNYXJjYWRvclhNTCgpe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclhNTC5kZXNjcmlwY2lvbik7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclhNTC50aXBvKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3JcclxuICB9XHJcblxyXG4gIGd1YXJkYXJNYXJjYWRvclhNTCgpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclhNTCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yWE1MKCkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubWFyY2Fkb3JYTUwucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIGlmICh0aGlzLm1hcmNhZG9yWE1MLmxsYXZlKXtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclhNTCkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyTWFyY2Fkb3JYTUwoZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6IGFzeW5jICgpID0+ICB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS50b1Byb21pc2UoKTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b0NhbXBvVGFibGFYTUwoKXtcclxuICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTCA9IHRydWU7XHJcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwucmVwb3J0ZU1hcmNhZG9yID0gdGhpcy5tYXJjYWRvclhNTC5sbGF2ZVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yWE1MID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUxBc3luYygpIHtcclxuICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvclhNTCA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5tYXJjYWRvclhNTC5sbGF2ZX0pKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvTWFyY2Fkb3Ipe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5jYW1wb0Z1ZW50ZSk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5tYXJjYWRvcik7XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG86IFJlcG9ydGVUYWJsYU1vZGVsKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG8pKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChjYW1wby5sbGF2ZSl7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wbykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FtcG8uY29sdW1uYSA9IDA7XHJcbiAgICAgIGNhbXBvLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIGNhbXBvID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTCA9IGZhbHNlO1xyXG4gICAgdGhpcy52ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hckNhbXBvTWFyY2Fkb3JYTUwoZXZlbnQsIG9iamV0byl7IFxyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgb2JqZXRvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhbWJpYXJUYWJDb2x1bW5hcmlvKGV2ZW50KXtcclxuICAgIHN3aXRjaCAoZXZlbnQuaW5kZXgpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyRGF0b3NBZGljaW9uYWxlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLm1hcmNhZG9yZXNDb2x1bW5hcmlvID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgY2FyZ2FyRGF0b3NBZGljaW9uYWxlcygpIHtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIGZpbHRyb0NvbHVtbmFCYXNpY2E6ICdOJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuY29sdW1uYXNBZGljaW9uYWxlcyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIGZpbHRyb0NvbHVtbmFCYXNpY2E6ICdTJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFSZXBvcnRlQ29sdW1uYXJpbyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhckV4aXN0ZUphc3Blcigpe1xyXG4gICAgdGhpcy5jYXJnYXJBcmNoaXZvLmRlc2NhcmdhckFyY2hpdm8odGhpcy5lbmNyaXB0YWRvckFyY2hpdm8uZW5jcmlwdGFyKCdyZXBvcnRlcy8nICsgdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcpLCAncnV0YV9wbGFudGlsbGFzJywgdGhpcy5hcGxpY2FjaW9uKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5leGlzdGVKYXNwZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgKSBcclxuICB9XHJcblxyXG4gIHZlclJlcG9ydGVDb2x1bW5hcmlvKGV2ZW50KXtcclxuICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbnVldm9Db2x1bW5hQmFzaWNhKCl7XHJcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgdGhpcy5jb2x1bW5hQmFzaWNhLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhckNvbHVtbmFCYXNpY2EoKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eubm9tYnJlKTtcclxuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pO1xyXG4gICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpO1xyXG4gICAgaWYgKHZhbGlkYWRvcil7XHJcbiAgICAgIGlmICh0aGlzLmlzTW9zdHJhck9yZGVuKCkpe1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9yZGVuKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pc01vc3RyYXJPcmRlbkNvbnN1bHRhKCkpe1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NFTERBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKSB7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkE9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbykge1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWwpO1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKTtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWwpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fTEFCRUwgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlckJ5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIHZlcmlmaWNhckNvbHVtbmFzVmFsaWRhcyhyZXBvcnRlQ29sdW1uYXJpb0RUTyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdmFyIHRpcG89cmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbztcclxuXHRcdGlmKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSByZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvKXtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHR2YXIgZmlsdHJvPW5ldyAgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG5cdFx0ZmlsdHJvLnJlcG9ydGVGdWVudGUgPSByZXBvcnRlQ29sdW1uYXJpb0RUTy5yZXBvcnRlRnVlbnRlO1xyXG5cdFx0ZmlsdHJvLmRpZmVyZW50ZUNvbHVtbmFyaW8gPSByZXBvcnRlQ29sdW1uYXJpb0RUTy5sbGF2ZVRhYmxhO1xyXG5cdFx0ZmlsdHJvLnRpcG8gPSB0aXBvO1xyXG5cdFx0dmFyIGNhbnRpZGFkPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNhbnRpZGFkUmVnaXN0cm9zKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIGZpbHRybykpLnRvUHJvbWlzZSgpO1xyXG5cdFx0aWYoY2FudGlkYWQ9PTApe1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQSA9PSByZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvKXtcclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93V2FybmluZyhcIkVsIHJlcG9ydGUgc29sbyBwdWVkZSBjb250ZW5lciAxIHJlZ2lzdHJvIGNvbiB0aXBvIFwiK3RoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQV9ERVNDKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblx0XHR9ZWxzZSBpZih0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NFTERBID09IHJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG8pe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93V2FybmluZyhcIkVsIHJlcG9ydGUgc29sbyBwdWVkZSBjb250ZW5lciAxIHJlZ2lzdHJvIGNvbiB0aXBvIFwiK3RoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ0VMREFfREVTQyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ3VhcmRhckNvbHVtbmFCYXNpY2EoKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDb2x1bW5hQmFzaWNhKCkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKGF3YWl0IHRoaXMudmVyaWZpY2FyQ29sdW1uYXNWYWxpZGFzKHRoaXMuY29sdW1uYUJhc2ljYSkpe1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW5hQmFzaWNhLmxsYXZlVGFibGEpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFCYXNpY2EpKS50b1Byb21pc2UoKTtcclxuICAgICAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQmFzaWNhKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbGltaW5hckNvbHVtbmFCYXNpY2EoZXZlbnQpeyBcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQmFzaWNhKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldmFDb2x1bW5hQWRpY2lvbmFsKCkge1xyXG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbC5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsLnRpcG8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0FESUNJT05BTDtcclxuICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZlckRldGFsbGVBZGljaW9uYWwoZXZlbnQpIHtcclxuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyQ29sdW1uYUFkaWNpb25hbCgpIHtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5ub21icmUpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5zaW50YXhpcyk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVuKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwub3JkZXJCeSk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJDb2x1bW5hQWRpY2lvbmFsKCkge1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyQ29sdW1uYUFkaWNpb25hbCgpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEpIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFBZGljaW9uYWwpKS50b1Byb21pc2UoKTtcclxuICAgICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyQ29sdW1uYUFkaWNpb25hbChldmVudCkge1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFBZGljaW9uYWwpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvckNvbHVtbmFyaW8oKSB7XHJcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcclxuICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZlckRldGFsbGVNYXJjYWRvckNvbHVtbmFyaW8oZXZlbnQpIHtcclxuICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhck1hcmNhZG9yQ29sdW1uYXJpbygpIHtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby50aXBvKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvbik7XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbygpIHtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKCkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8pKS50b1Byb21pc2UoKTtcclxuICAgICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8pKS50b1Byb21pc2UoKTtcclxuICAgICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgIHRoaXMuY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKTtcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyTWFyY2Fkb3JDb2x1bW5hcmlvKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG5cdCAqIFBlcm1pdGUgY29ub2NlciBzaSBzZSBkZWJlIHByZXNlbnRhciBlbiBsYSBpbnRlcmZheiBsb3MgY2FtcG9zIHJlZmVyZW50ZXMgYSBvcmRlbiBjb25zdWx0YVxyXG5cdCAqIEByZXR1cm4gU2kgc2UgZGViZSBtb3N0cmFyIHNlIHJldG9ybmFyYSB0cnVlLCBkZSBsbyBjb250cmFyaW8gZmFsc2VcclxuXHQgKi9cclxuXHRpc01vc3RyYXJPcmRlbkNvbnN1bHRhKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xyXG5cdH1cclxuXHRcclxuXHJcblx0aXNNb3N0cmFyT3JkZW4oKXtcclxuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG98fFxyXG5cdFx0XHRcdHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwb3x8dGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19MQUJFTCA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcclxuXHR9XHJcblxyXG5cdGlzVGlwb0NvbHVtbmEoKXtcclxuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHJcblx0fVxyXG5cdFxyXG5cclxuXHRpc1RpcG9GaWxhKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1x0XHJcblx0fVxyXG5cclxuXHRpc1RpcG9MYWJlbCgpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fTEFCRUwgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHRcclxuXHR9XHJcblxyXG4gIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRnVlbnRlKCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmZpbHRyb09yaWdlbkZ1ZW50ZSh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkZVRU5URSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdHJvT3JpZ2VuRnVlbnRlKHRpcG86c3RyaW5nKTpib29sZWFue1xyXG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZUZ1ZW50ZS5vcmlnZW5GdWVudGUgPT0gdGlwbztcclxuICB9XHJcbn0iLCI8cC10YWJWaWV3IChvbkNoYW5nZSk9XCJjYW1iaWFyVGFiKCRldmVudClcIj5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2V4Y2VsJyB8IHRyYW5zbGF0ZSB9fVwiIFtzZWxlY3RlZF09XCJ0cnVlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eydkZWJlJyB8IHRyYW5zbGF0ZX19IHt7J2luZGljYXInIHwgdHJhbnNsYXRlfX0ge3sncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZX19IHt7J3knIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICB7eydob2phJyB8IHRyYW5zbGF0ZX19IHt7J3BhcmEnIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VzdGEnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICB7eydvcGNpb24nIHwgdHJhbnNsYXRlfX0ge3snc2UnIHwgdHJhbnNsYXRlfX0ge3snYWN0aXZlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlcG9ydGVGdWVudGUuYXJjaGl2b1RvZG8gPyByZXBvcnRlRnVlbnRlLmFyY2hpdm9Ub2RvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uZXNdPVwiJ3hsczt4bHN4J1wiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIiBbbGFiZWxyYXJdPVwiJ3BsYW50aWxsYScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm8oJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuaG9qYUV4Y2VsXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmUnIHwgdHJhbnNsYXRlIH19IHt7J2RlJyB8IHRyYW5zbGF0ZSB9fSB7eydsYScgfCB0cmFuc2xhdGUgfX0ge3snaG9qYScgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb0V4Y2VsXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCIgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxwLXBpY2tMaXN0IFtzb3VyY2VdPVwibGlzdGFFeGNlbFwiIFt0YXJnZXRdPVwibGlzdGFOb0V4Y2VsXCIgc291cmNlSGVhZGVyPVwiQXNvY2lhZG9cIiBzb3VyY2VGaWx0ZXJQbGFjZWhvbGRlcj1cIkFzb2NpYWRvXCJcclxuICAgICAgICAgICAgdGFyZ2V0SGVhZGVyPVwiRGVzYXNvY2lhZG9cIiBbZHJhZ2Ryb3BdPVwidHJ1ZVwiIFtyZXNwb25zaXZlXT1cInRydWVcIiB0YXJnZXRGaWx0ZXJQbGFjZWhvbGRlcj1cIkRlc2Fzb2NpYWRvXCJcclxuICAgICAgICAgICAgZmlsdGVyQnk9XCJzaW50YXhpc1wiIChvblNvdXJjZVJlb3JkZXIpPVwibW92ZXJBQXNvY2lhZG8oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbk1vdmVBbGxUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkbygkZXZlbnQpXCIgKG9uTW92ZUFsbFRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25Nb3ZlVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG8oJGV2ZW50KVwiIChvbk1vdmVUb1NvdXJjZSk9XCJtb3ZlckFBc29jaWFkbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZXhjZWwgcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3tleGNlbC5ub21icmV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtcGlja0xpc3Q+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQteGxcIj57eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19PC9oMT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JFeGNlbCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3JFeGNlbFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFtzZWxlY3Rpb25dPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWxcIiBbcm93c109XCIxMFwiXHJcbiAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3JFeGNlbC5sZW5ndGhcIiBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3JFeGNlbC5sZW5ndGggPiAxMFwiXHJcbiAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yRXhjZWwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckV4Y2VsKCRldmVudClcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY2Fkb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5kZXNjcmlwY2lvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm10LTNcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ib29rXCI+PC9pPnt7J2RldGFsbGUnIHwgdHJhbnNsYXRlfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTQgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtTWFyY2Fkb3JFeGNlbFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCI0MDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdJbWFnZW4gRmlqYScsIHZhbHVlOiAnSUYnfSwge2xhYmVsOiAnTWFyY2Fkb3InLCB2YWx1ZTogJ01BJ31dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1wiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiBbaGlkZGVuXT1cImVzSW1hZ2VuRmlqYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd2YWxvcicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MFwiICBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cImVzTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiW3tsYWJlbDogJ1VuaWNhJywgdmFsdWU6ICdVJ30sIHtsYWJlbDogJ0NhZGEgRW1wcmVzYScsIHZhbHVlOiAnQyd9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cIm9yaWdlblwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yaWdlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJlc01hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm86ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiAgW2xhYmVscmFyXT1cIigncmVjdXJzb3MnIHwgdHJhbnNsYXRlKVwiIFtsYWJlbGFyY2hdPVwiJ3JlY3Vyc28nIHwgdHJhbnNsYXRlXCIgW21vc3RyYXJYXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9zdHJhcm9ibGljYXJnb109XCIhKCF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5leG9Qcm9waWVkYWRdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID09J0MnID8gbGxhdmVFbXByZXNhOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWREZVNpc3RlbWFdPVwidHJ1ZVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiAgcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JFeGNlbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd1bmljbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmRlc2NhcmdhckZ1ZW50ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NhcmdhcmRvYycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmdlbmVyYXJQaW5cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydnZW5lcmFycGluJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNhbXBvQWdydXBhY2lvblBsYW5pbGxhXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhZ3J1cGFycG9yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ub21icmVBZ3J1cGFjaW9uUGxhbmlsbGFcIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm9hZ3J1cGFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvUGxhbmlsbGFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbCA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b0luZGl2aWR1YWw6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbHJhcl09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm9QbGFuaWxsYSgkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cC10YWJWaWV3ID5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZCBtYi0yXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvcigpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yZXNcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3NlbGVjdGlvbl09XCJyZXBvcnRlTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yZXMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3Jlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3IoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5kZXNjcmlwY2lvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9EYXRvTWFyY2Fkb3Jlcyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvID09ICdJRicgPyBtYXJjYWRvci50ZXh0b1JlZ2lzdHJvIDogbWFyY2Fkb3Iubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybU1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eydpbmRpcXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VuJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2Rlc2VhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydhcGFyZXpjYScgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydpbmZvcm1hY2lvbicgfCB0cmFuc2xhdGV9fS4ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3sncHJpbWVyYScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2VzJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IDEuPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNQScsJ0lNJywnTVInLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YWJsYVwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnSUYnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdVbmljYScsIHZhbHVlOiAnVSd9LCB7bGFiZWw6ICdDYWRhIEVtcHJlc2EnLCB2YWx1ZTogJ0MnfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwib3JpZ2VuXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmlnZW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdJRicgfHwgIXJlcG9ydGVNYXJjYWRvci5vcmlnZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiBbbGFiZWxyYXJdPVwiJ3JlY3Vyc29zJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuZXhvUHJvcGllZGFkXT1cInJlcG9ydGVNYXJjYWRvci5vcmlnZW4gPT0nQycgPyBsbGF2ZUVtcHJlc2E6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGllZGFkRGVTaXN0ZW1hXT1cInRydWVcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnTUEnLCdJTScsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIGZvcm1Db250cm9sTmFtZT1cInJlcG9ydGVDb2x1bW5hXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNQSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybWF0b1wiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0lNJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGZvcm1Db250cm9sTmFtZT1cImFuY2hvXCIgW21heGxlbmd0aF09XCI1XCI+IDwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnSU0nLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgZm9ybUNvbnRyb2xOYW1lPVwiYWx0b1wiIFttYXhsZW5ndGhdPVwiNVwiPiA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWx0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvMVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8xJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvMlwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8zXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncnVwbzMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbEdydXBvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaW5hbGdydXBvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwidGV4dG9SZWdpc3Ryb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGV4dG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ01SJywnVEInXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIGZvcm1Db250cm9sTmFtZT1cInRpZW5lU3FsXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc3FsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydTJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwicXVlcnlcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbnN1bHRhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydOJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUZ1ZW50ZXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJkZXNjcmlwY2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmdWVudGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0dyYWZpY29fSkZDXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9HcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dyYWZpY2EnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JHcmFmaWNvXCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3JncmFmaWNhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydBJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG94XCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fSBYPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0EnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3lcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19IFk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiIXJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJiYW5kYVwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbG9yZGluYW1pY28nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9KYXNwZXJMYWJlbFwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J251bWVyb2NhdGVnb3JpYXMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydOJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWx0cm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3IubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJyB9fVwiIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3IubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3IgJiYgcmVwb3J0ZU1hcmNhZG9yLmxsYXZlICE9IG51bGwgJiYgKHJlcG9ydGVNYXJjYWRvci50aXBvID09ICdNUicgfHwgcmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9DYW1wb1RhYmxhKClcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YUNhbXBvc01hcmNhZG9yXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3IubGVuZ3RoXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFDYW1wb3NNYXJjYWRvci5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlPVwicm93XCIgZGF0YUtleT1cImxsYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snY2FtcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+e3snbWVkaWRhcycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmNhbXBvRnVlbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5mb3JtYXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUdyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLnRpcG9cIiBhcHBlbmRUbz1cImJvZHlcIiBbYXV0b1pJbmRleF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIudGlwbyA9PSdJJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmFuY2hvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmFsdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWx0bycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3IoY2FtcG9NYXJjYWRvckluc2VydGFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZSA9IGZhbHNlXCIgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1jYW1wbyBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiY2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jb2x1bW5hXCIgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmNvbHVtbmF9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNhbXBvRnVlbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY2FtcG9GdWVudGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmZvcm1hdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5mb3JtYXRvfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNhbXBvLnRpcG9cIiBhcHBlbmRUbz1cImJvZHlcIiBbYXV0b1pJbmRleF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6J2xpc3RhUmVjdXJzb0dyYWZpY2EnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wby50aXBvID09J0knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uYW5jaG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmFsdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wby50aXBvID09J0knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19OiB7e2NhbXBvLmFuY2hvfX0gPGJyLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYWx0bycgfCB0cmFuc2xhdGV9fToge3tjYW1wby5hbHRvfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENIRUNLIEdVQVJEQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JBc3luYygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDYW1wb01hcmNhZG9yKCRldmVudCxjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snc29wb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3snYXJjaGl2bycgfCB0cmFuc2xhdGUgfX1zXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b1NvcG9ydGUoKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFTb3BvcnRlc1wiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhU29wb3J0ZXMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhU29wb3J0ZXMubGVuZ3RoID4gMTBcIiBcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQ1JVwiPnt7J2FyY2hpdm8nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJVwiPiA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbCA/IHNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbDogJydcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyTGFiZWxJbnB1dF09XCJmYWxzZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cIiEoIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuYXJjaGl2b0luZGl2aWR1YWwpICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGVJbmdyZXNhcilcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJTb3BvcnRlKHNvcG9ydGVJbmdyZXNhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhclNvcG9ydGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtc29wb3J0ZSBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJzb3BvcnRlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNvcG9ydGUuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvcG9ydGUuZGVzY3JpcGNpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsID8gc29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyTGFiZWxJbnB1dF09XCJmYWxzZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cIiEoIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2bylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGUpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJTb3BvcnRlKHNvcG9ydGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhckVkaWNpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiAoY2xpY2spPVwiaW5pY2lhckVkaWNpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJTb3BvcnRlKCRldmVudCwgc29wb3J0ZSlcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3JlcG9ydGUnIHwgdHJhbnNsYXRlIH19IHt7J2RpbmFtaWNvJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5kb2JsZUxpbmVhXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZG9ibGVsaW5lYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRpdHVsb1BhcmFtZXRyb1wiIHNpemU9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9KYXNwZXJcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWQgYmFja2dyb3VuZC0xMDBcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlc3RhcnRcIiAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZ2VuZXJhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJnZW5lcmFySmFzcGVyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCIgKm5nSWY9XCJleGlzdGVKYXNwZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZGVzY2FyZ2FyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImRlc2Nhcmdhckphc3BlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cImJhbmRhU2VsZWNjaW9uYWRhLmtleVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInJlZ3Jlc2FyQmFuZGFTZWxlY2Npb25hZGEoKVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snYmFuZGFzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVRpcG9CYW5kYVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3Jvd3NdPVwiMTBcIlxyXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImxpc3RhVGlwb0JhbmRhLmxlbmd0aFwiIFtwYWdpbmF0b3JdPVwibGlzdGFUaXBvQmFuZGEubGVuZ3RoID4gMTBcIlxyXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyQmFuZGEoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckJhbmRhKCRldmVudClcIiAqbmdJZj1cIiFiYW5kYVNlbGVjY2lvbmFkYS5rZXlcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydiYW5kYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtYmFuZGE+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImJhbmRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmFuZGEudmFsdWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgPHAtdGFiVmlldyAqbmdJZj1cImJhbmRhU2VsZWNjaW9uYWRhLmtleSAmJiB2ZXJUYWJCYW5kYVwiPlxyXG4gICAgICAgICAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydjYXJhY3RlcmlzdGljYXMnIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKGJhbmRhU2VsZWNjaW9uYWRhLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVCYW5kYS50b3RhbGVzXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RvdGFsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUJhbmRhLnRpdHVsb1wiIG1heGxlbmd0aD1cIjIwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtZmxvcHB5LXNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImd1YXJkYXJDYXJhY3RlcmlzdGljYUJhbmRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7YmFuZGFTZWxlY2Npb25hZGEudmFsdWV9fVwiICpuZ0lmPVwiIW51ZXZhQmFuZGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9NYXJjYWRvckRpbmFtaWNvKClcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiICpuZ0lmPVwiIW51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljb1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yRGluYW1pY28ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljby5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIW51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJNYXJjYWRvckRpbmFtaWNvKCRldmVudClcIiAgKG9uUm93VW5zZWxlY3QpPVwidmVyTWFyY2Fkb3JEaW5hbWljbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snYmFuZGEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydldGlxdWV0YScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1kaW5hbWljbz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJkaW5hbWljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLmFsdG8gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5kZXNjcmlwY2lvbiA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5mb3JtYXRvIDogJyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tbJ2RldGFsbGUnXS5pbmNsdWRlcyhkaW5hbWljby5iYW5kYSkgPyBkaW5hbWljby5hbmNobyA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5vcGVyYWNpb24gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyICBtYi0yXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtdC0zXCI+e3snaW5kaXF1ZScgfCB0cmFuc2xhdGV9fSB7eydlbicgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYScgfCB0cmFuc2xhdGV9fSB7eydkZXNlYScgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snYXBhcmV6Y2EnIHwgdHJhbnNsYXRlfX0ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3snaW5mb3JtYWNpb24nIHwgdHJhbnNsYXRlfX0uIHt7J2xhJyB8IHRyYW5zbGF0ZX19IHt7J3ByaW1lcmEnIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYScgfCB0cmFuc2xhdGV9fSB7eydlcycgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSAxLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7e2JhbmRhU2VsZWNjaW9uYWRhLnZhbHVlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCIgKm5nSWY9XCJudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVJlcG9ydGVEaW5hbWljb1wiIGNsYXNzPVwicC1mbHVpZCBncmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2FtcG9KYXNwZXJEaW5hbWljb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwidmFsdWVcIiBvcHRpb25WYWx1ZT1cImtleVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2FtcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0RhdG9TaW50YXhpc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0RhdG9cIiBvcHRpb25MYWJlbD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImtleVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvZGF0bycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IGZvcm1Db250cm9sTmFtZT1cImFsdG9cIiBtYXhsZW5ndGg9XCI1XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgJiYgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvclwiIHNpemU9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSAmJiByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImZpbHRyb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2ludGF4aXMnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiICBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBncmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNiBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgdGV4dC1iYXNlIG1sLTFcIj57eydyZXN1bHRhZG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09J0MnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNiBtYi0wXCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHRleHQtYmFzZSBtbC0xXCIgPnt7J2xhYmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImZvcm1hdG9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgPT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9KYXNwZXJMYWJlbFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCInZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVzdWx0YWRvWFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd4JyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd4JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cIidkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXN1bHRhZG9ZXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3knIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQycgJiYgJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG95XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3knIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFBbGluZWFjaW9uXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvUmVwb3J0ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaW5lYWNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQWxpbmVhY2lvblwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaW5lYWNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8gPT0gJ04nICYmIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcGVyYWNpb25cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZpZWxkc2V0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e3JlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhckNvbHVtbmFEaW5hbWljbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hRGluYW1pY28oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgPC9wLXRhYlZpZXc+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydyZXBvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd0ZXh0bycgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVGV4dG9cIiBzaXplPVwiNTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjIwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2VwYXJhZG9yZXNcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuc2VwYXJhZG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhyZXBvcnRlRnVlbnRlLnNlcGFyYWRvcikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2VwYXJhZG9yJyB8IHRyYW5zbGF0ZSB9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvVGV4dG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphclNlcGFyYWRvcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JUZXh0bygpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFxyXG4gICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yZXNUZXh0by5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJNYXJjYWRvclRleHRvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvclRleHRvKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY3RleHRvPlxyXG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjdGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8udGlwb0dyYWZpY28gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9NYXJjYWRvcmVzVGV4dG8nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5ub21icmVDb2x1bW5hfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5mb3JtYXRvfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5hbHRvfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclRleHRvXCI+ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm10LTNcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclRleHRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28gPT0gJ0QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5yZXBvcnRlQ29sdW1uYVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5mb3JtYXRvXCIgbWF4bGVuZ3RoPVwiNTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uZm9ybWF0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmZvcm1hdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e21hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28gPT0gJ0QnID8gKCdmb3JtYXRvJyB8IHRyYW5zbGF0ZSkrJyonIDogKCdkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUpKycqJyB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8uYW5jaG9cIiBtYXhsZW5ndGg9XCIyMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFuY2hvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uYW5jaG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmFsdG9cIiBtYXhsZW5ndGg9XCIyMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFsdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbHRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yVGV4dG8ubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e21hcmNhZG9yVGV4dG8ubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvclRleHRvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWFyY2Fkb3JUZXh0by5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb1RleHRvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLm5vbWJyZVRhYmxhXCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZXRhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHAtcGlja0xpc3QgW3NvdXJjZV09XCJsaXN0YVRhYmxhXCIgW3RhcmdldF09XCJsaXN0YU5vVGFibGFcIiBzb3VyY2VIZWFkZXI9XCJBc29jaWFkb1wiIHNvdXJjZUZpbHRlclBsYWNlaG9sZGVyPVwiQXNvY2lhZG9cIlxyXG4gICAgICAgICAgICB0YXJnZXRIZWFkZXI9XCJEZXNhc29jaWFkb1wiIFtkcmFnZHJvcF09XCJ0cnVlXCIgW3Jlc3BvbnNpdmVdPVwidHJ1ZVwiIHRhcmdldEZpbHRlclBsYWNlaG9sZGVyPVwiRGVzYXNvY2lhZG9cIlxyXG4gICAgICAgICAgICBmaWx0ZXJCeT1cIm5vbWJyZVwiICpuZ0lmPVwiaXNGdWVudGUoKVwiIChvblNvdXJjZVJlb3JkZXIpPVwicmVvcmRlclRhYmxhKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25Nb3ZlQWxsVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG9UYWJsYSgkZXZlbnQpXCIgKG9uTW92ZUFsbFRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvVGFibGEoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbk1vdmVUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkb1RhYmxhKCRldmVudClcIiAob25Nb3ZlVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG9UYWJsYSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtdGFibGEgcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3t0YWJsYS5ub21icmV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtcGlja0xpc3Q+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydhcmNoaXZveG1sJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MFwiICBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGFnRW5jYWJlemFkb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFnZW5jYWJlemFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50YWdDaWVycmVFbmNhYmV6YWRvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWdjaWVycmVlbmNhYmV6YWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5lc3RydWN0dXJhUmVnaXN0cm9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhZ3JlZ2lzdHJvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9YbWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JYTUwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JYTUxcIj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUxcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MID0gZmFsc2U7XCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVhNTFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxyXG4gICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFYTUwubGVuZ3RoXCJcclxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVhNTC5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JYTUxcIlxyXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yWE1MKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmN0ZXh0bz5cclxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY3RleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLmRlc2NyaXBjaW9ufX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by50aXBvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvRGF0b01hcmNhZG9yZXMnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5ub21icmVDb2x1bW5hfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5tYXJjYWRvcn19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG10LTNcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUxcIj4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibXQtM1wiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPnt7J2RldGFsbGUnIHwgdHJhbnNsYXRlfX08L2g1PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZGVzY3JpcGNpb25cIiBtYXhsZW5ndGg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclhNTFwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwudGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNQScsJ01SJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwubWFyY2Fkb3JcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLm1hcmNhZG9yXCIgbWF4bGVuZ3RoPVwiNVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWJsYScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTUEnXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01BJ1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5mb3JtYXRvXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC50ZXh0b1JlZ2lzdHJvXCIgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGV4dG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01SJywnVEInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFGdWVudGVzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJkZXNjcmlwY2lvblwiIG9wdGlvblZhbHVlPVwibGxhdmVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01SJywnVEInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZmlsdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWx0cm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZXN0cnVjdHVyYVRhYmxhWE1MXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydlc3RydWN0dXJhdGFibGEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7bWFyY2Fkb3JYTUwubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e21hcmNhZG9yWE1MLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JYTUwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtYXJjYWRvclhNTC5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MICYmIG1hcmNhZG9yWE1MLmxsYXZlICE9IG51bGwgJiYgKG1hcmNhZG9yWE1MLnRpcG8gPT0gJ01SJyB8fCBtYXJjYWRvclhNTC50aXBvID09ICdUQicpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9DYW1wb1RhYmxhWE1MKClcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YUNhbXBvc01hcmNhZG9yWE1MXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTC5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTC5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J2NhbXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCVcIj4gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIlRhYmxhTnVldm9SZWdpc3Ryb1wiICpuZ0lmPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5jYW1wb0Z1ZW50ZVwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwubWFyY2Fkb3JcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmZvcm1hdG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY2FtcG8gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNhbXBvRnVlbnRlXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY2FtcG9GdWVudGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5tYXJjYWRvclwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLm1hcmNhZG9yfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uZm9ybWF0b1wiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5mb3JtYXRvfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MQXN5bmMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFTElNSU5BUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDYW1wb01hcmNhZG9yWE1MKCRldmVudCxjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPHAtYWNjb3JkaW9uIChvbk9wZW4pPVwiY2FtYmlhclRhYkNvbHVtbmFyaW8oJGV2ZW50KVwiID5cclxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtzZWxlY3RlZF09XCJ0cnVlXCIgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J2NvbHVtbmFzYmFzaWNhcyd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9Db2x1bW5hQmFzaWNhKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlOyBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYXNiYXNpY2FzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhUmVwb3J0ZUNvbHVtbmFyaW9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlclJlcG9ydGVDb2x1bW5hcmlvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJSZXBvcnRlQ29sdW1uYXJpbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iZWFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImJlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5ub21icmVDb2x1bW5hfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi50aXBvIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFUaXBvQ29sdW1uYSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLm9yZGVufX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5vcGVyYWNpb24gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YU9wZXJhY2lvbid9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgICpuZ0lmPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eubm9tYnJlXCIgbWF4bGVuZ3RoPVwiMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLnRpcG8pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS50aXBvKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImNvbHVtbmFCYXNpY2EudGlwbyA9PSAnRCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb25ob3Jpem9udGFsJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgZmlsYSBPcGVyYWNpb24gVmVydGljYWwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc1RpcG9Db2x1bW5hKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWxcIiBtYXhsZW5ndGg9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmFvcGVyYWNpb24nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3BlcmFjaW9uIFZlcnRpY2lhbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uVmVydGljYWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9udmVydGljYWwnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNNb3N0cmFyT3JkZW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9yZGVuXCIgbWF4bGVuZ3RoPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuYW1pZW50byBGaWxhcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0xhYmVsKCkgfHwgaXNUaXBvRmlsYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3JkZW5hbWllbnRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlckJ5XCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbmFtaWVudG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmRlbmFtaWVudG8gRGF0b3MgZGUgbGEgY29uc3VsdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc01vc3RyYXJPcmRlbkNvbnN1bHRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhXCIgbWF4bGVuZ3RoPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbmNvbnN1bHRhJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tjb2x1bW5hQmFzaWNhLmxsYXZlVGFibGEgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7Y29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYUJhc2ljYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQmFzaWNhKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cclxuICAgICAgICA8L3AtYWNjb3JkaW9uPlxyXG4gICAgICAgIDxwLWFjY29yZGlvbiAob25PcGVuKT1cImNhbWJpYXJUYWJDb2x1bW5hcmlvKCRldmVudClcIj5cclxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eydkYXRvc2FkaWNpb25hbGVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uZXNdPVwiJ3hsczt4bHN4O3hsc20nXCIgW21vc3RyYXJvYmxpY2FyZ29dPVwidHJ1ZVwiIFtsYWJlbHJhcl09XCIncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuaG9qYUV4Y2VsXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX0ge3snZGUnIHwgdHJhbnNsYXRlIH19IHt7J2xhJyB8IHRyYW5zbGF0ZSB9fSB7eydob2phJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5maWxhSW5pY2lvQ29sdW1uYXJpb1wiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmlsYWluaWNpb2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvQ29sdW1uYXJpb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnNpbnRheGlzQ29sdW1uYXJpb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpc2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZhQ29sdW1uYUFkaWNpb25hbCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTsgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJjb2x1bW5hc0FkaWNpb25hbGVzXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY29sdW1uYWFkaWNpb25hbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJjb2x1bW5hYWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tjb2x1bW5hYWRpY2lvbmFsLm5vbWJyZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2NvbHVtbmFhZGljaW9uYWwub3JkZW59fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5ub21icmVcIiBtYXhsZW5ndGg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5ub21icmUpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpYXMnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5vcmRlblwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbikgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcmRlbmFtaWVudG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZXJCeVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5hbWllbnRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YVwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5jb25zdWx0YScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5zaW50YXhpc1wiIG1heGxlbmd0aD1cIjQwMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5zaW50YXhpcykgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXMpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2ludGF4aXMnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e2NvbHVtbmFBZGljaW9uYWwubGxhdmVUYWJsYSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJDb2x1bW5hQWRpY2lvbmFsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hckNvbHVtbmFBZGljaW9uYWwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9wLWZpZWxkc2V0PlxyXG4gICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxyXG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J21hcmNhZG9yZXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yQ29sdW1uYXJpbygpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcicgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJtYXJjYWRvcmVzQ29sdW1uYXJpb1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiAgXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cIm1hcmNhZG9yZXNDb2x1bW5hcmlvLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJtYXJjYWRvcmVzQ29sdW1uYXJpby5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yQ29sdW1uYXJpbygkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yQ29sdW1uYXJpbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydub21icmUnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY2Fkb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IudGlwbyB8IHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogJ2xpc3RhVGlwb01hcmNhZG9yJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiAgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb25cIiBtYXhsZW5ndGg9XCI0MDAwXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8ubWFyY2Fkb3JcIiBtYXhsZW5ndGg9XCI1MFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50aXBvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm9cIiBtYXhsZW5ndGg9XCI0MDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3ZhbG9yJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3ttYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9yQ29sdW1uYXJpbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3AtZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XHJcbiAgICAgICAgPC9wLWFjY29yZGlvbj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuPC9wLXRhYlZpZXc+Il19
|
|
1449
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFlLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRzFFLE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDekcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFJbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sNEdBQTRHLENBQUM7QUFDcEssT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVXhELE1BQU0sT0FBTywyQkFBMkI7SUF3SGxCO0lBQ1Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUFuSUgsZ0JBQWdCLEdBQVUsRUFBRSxDQUFDO0lBQ3BDLFdBQVc7SUFDSixVQUFVLEdBQTBCLEVBQUUsQ0FBQztJQUN2QyxZQUFZLEdBQTBCLEVBQUUsQ0FBQztJQUN6QyxrQkFBa0IsR0FBMkIsRUFBRSxDQUFDO0lBQ2hELG9CQUFvQixHQUF5QixJQUFJLG9CQUFvQixDQUFDO0lBQ3RFLGlCQUFpQixDQUFZO0lBQzdCLHFCQUFxQixHQUFZLEtBQUssQ0FBQztJQUN2QyxVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLFlBQVksR0FBWSxLQUFLLENBQUM7SUFFckMsZ0JBQWdCO0lBQ1QsYUFBYSxHQUFVLEVBQUUsQ0FBQztJQUMxQixlQUFlLEdBQTJCLEVBQUUsQ0FBQztJQUM3QyxpQkFBaUIsQ0FBQztJQUNsQixvQkFBb0IsQ0FBQztJQUNyQixZQUFZLENBQUM7SUFDYixlQUFlLENBQUM7SUFDaEIsZ0JBQWdCLENBQUM7SUFDakIsZUFBZSxHQUF5QixJQUFJLG9CQUFvQixDQUFDO0lBQ2pFLFlBQVksQ0FBWTtJQUN4QixjQUFjLEdBQVcsSUFBSSxDQUFDO0lBQzlCLGdCQUFnQixHQUFZLEtBQUssQ0FBQztJQUNsQyxtQkFBbUIsR0FBd0IsRUFBRSxDQUFDO0lBQzlDLHFCQUFxQixHQUFzQixJQUFJLGlCQUFpQixDQUFDO0lBQ2pFLGFBQWEsR0FBMEIsRUFBRSxDQUFDO0lBQzFDLGVBQWUsR0FBd0IsSUFBSSxtQkFBbUIsQ0FBQztJQUMvRCx5QkFBeUIsR0FBWSxLQUFLLENBQUE7SUFDMUMseUJBQXlCLEdBQVksS0FBSyxDQUFDO0lBQzNDLHlCQUF5QixHQUFZLEtBQUssQ0FBQztJQUMzQyx3QkFBd0IsR0FBWSxLQUFLLENBQUM7SUFDMUMsMEJBQTBCLEdBQVksS0FBSyxDQUFDO0lBQzVDLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFdEMsa0JBQWtCO0lBQ1gsY0FBYyxHQUFHO1FBQ3RCLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO1FBQ2pDLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO1FBQ2pDLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO1FBQ2pDLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO1FBQ2pDLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO1FBQ2pDLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO1FBQ2xDLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDO0tBQ25DLENBQUE7SUFDTSxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLGlCQUFpQixHQUFHLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDN0MsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUM1QixXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzdCLDRCQUE0QixHQUFZLEtBQUssQ0FBQztJQUM5Qyx1QkFBdUIsR0FBeUIsSUFBSSxvQkFBb0IsQ0FBQztJQUN6RSxZQUFZLEdBQXNCLElBQUksaUJBQWlCLENBQUM7SUFDeEQsbUJBQW1CLENBQVk7SUFDL0IscUJBQXFCLEdBQTJCLEVBQUUsQ0FBQTtJQUNsRCw0QkFBNEIsR0FBRztRQUNwQyxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztRQUM1QixFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztLQUM3QixDQUFBO0lBQ00scUJBQXFCLEdBQUc7UUFDN0IsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7UUFDMUIsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUM7UUFDM0IsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7S0FDM0IsQ0FBQTtJQUVELGVBQWU7SUFDUixVQUFVLEdBQTBCLEVBQUUsQ0FBQztJQUN2QyxZQUFZLEdBQTBCLEVBQUUsQ0FBQztJQUdoRCxlQUFlO0lBQ1IsZ0JBQWdCLENBQUM7SUFDakIsd0JBQXdCLEdBQVksS0FBSyxDQUFDO0lBQzFDLG9CQUFvQixHQUEyQixFQUFFLENBQUM7SUFDbEQsYUFBYSxHQUF5QixJQUFJLG9CQUFvQixFQUFFLENBQUE7SUFDaEUscUJBQXFCLEdBQVksS0FBSyxDQUFDO0lBQ3ZDLHNCQUFzQixDQUFDO0lBQ3ZCLHlCQUF5QixHQUFZLEtBQUssQ0FBQTtJQUVqRCxhQUFhO0lBQ04sb0JBQW9CLENBQUM7SUFDckIsUUFBUSxHQUEyQixFQUFFLENBQUE7SUFDckMsV0FBVyxHQUF5QixJQUFJLG9CQUFvQixDQUFBO0lBQzVELHVCQUF1QixHQUFZLEtBQUssQ0FBQztJQUN6QyxtQkFBbUIsR0FBWSxLQUFLLENBQUM7SUFDckMsc0JBQXNCLEdBQXdCLEVBQUUsQ0FBQztJQUNqRCx3QkFBd0IsR0FBc0IsSUFBSSxpQkFBaUIsQ0FBQztJQUNwRSw0QkFBNEIsR0FBWSxLQUFLLENBQUM7SUFDOUMsNEJBQTRCLEdBQVksS0FBSyxDQUFDO0lBRXJELG9CQUFvQjtJQUNiLHNCQUFzQixHQUE2QixFQUFFLENBQUM7SUFDdEQseUJBQXlCLEdBQVksS0FBSyxDQUFDO0lBQzNDLGFBQWEsQ0FBeUI7SUFDdEMsNkJBQTZCLEdBQVksS0FBSyxDQUFDO0lBQy9DLGlCQUFpQixDQUFDO0lBQ2xCLDBCQUEwQixDQUFDO0lBQzNCLCtCQUErQixDQUFDO0lBQ2hDLGlCQUFpQixDQUFDO0lBRWxCLHdCQUF3QixHQUFZLEtBQUssQ0FBQztJQUMxQyw0QkFBNEIsR0FBWSxLQUFLLENBQUM7SUFDOUMsbUJBQW1CLEdBQTZCLEVBQUUsQ0FBQztJQUNuRCxnQkFBZ0IsQ0FBeUI7SUFFekMsMkJBQTJCLENBQUM7SUFDNUIsMEJBQTBCLEdBQVksS0FBSyxDQUFDO0lBQzVDLDhCQUE4QixHQUFZLEtBQUssQ0FBQztJQUNoRCxvQkFBb0IsR0FBcUMsRUFBRSxDQUFDO0lBQzVELGtCQUFrQixDQUFpQztJQUVuRCxhQUFhLEdBQXdCLElBQUssa0JBQWtCLEVBQUUsQ0FBQztJQUMvRCxZQUFZLENBQVM7SUFDckIsU0FBUyxDQUFDO0lBQ0QsWUFBWSxDQUFVO0lBQ3RCLFVBQVUsQ0FBVTtJQUNuQixZQUFZLEdBQVUsRUFBRSxDQUFDO0lBRTFDLGNBQWMsR0FBbUIsRUFBRSxDQUFDO0lBRXBDLFlBQW9CLFdBQXdCLEVBQ2xDLHdCQUFzQyxFQUN0QyxjQUE4QixFQUM5QixXQUF3QixFQUN4QixXQUF3QixFQUN4QixpQkFBb0MsRUFDcEMsbUJBQXdDLEVBQ3hDLGFBQW9DLEVBQ3BDLGtCQUEyQyxFQUM1QyxZQUEwQixFQUN6QixnQkFBa0MsRUFDbEMsVUFBc0IsRUFDdEIscUJBQTRDLEVBQzVDLGNBQXVDO1FBYjdCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ2xDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBYztRQUN0QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUNwQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXlCO1FBQzVDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3pCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtJQUMvQyxDQUFDO0lBRUgsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQzdDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUM7UUFDakYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQztRQUN2RSxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDO1FBQ3pGLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUNBQWlDLENBQUM7UUFDcEcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztRQUMzRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDO1FBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUM7UUFDMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUM7UUFDakUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQ3pELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7UUFDekUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUN4RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixzQkFBc0I7SUFFeEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2xDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQztnQkFDVixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEMsb0JBQW9CLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekMsQ0FBQztpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDeEQsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRCxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxvQkFBb0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzlDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzdELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBQyxDQUFDO2dCQUN0RSxzQ0FBc0M7Z0JBQ3RDLGtEQUFrRDtZQUNuRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqRSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUE7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtZQUN4QyxDQUFDO2lCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUE7WUFDeEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDL0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQzVDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JELGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN0QyxDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNsRCxlQUFlLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkQsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNoQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDbEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pELGVBQWUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2QyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN4QyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7UUFDL0MsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBSztRQUNkLFFBQVEsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BCLEtBQUssQ0FBQztnQkFDSixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFDLENBQUM7b0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUM3QixDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQ2xDLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU07WUFFUjtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6TCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0SyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdE0sSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoSyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEssSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0TSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM5QyxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JILFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUcsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsYUFBYSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7WUFDdkUsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7WUFDekQsV0FBVztZQUNYLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ3ZELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUN4RCxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDO1NBQ2xDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN6QyxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoSCxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkUsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsYUFBYSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO1lBQ2xFLGNBQWMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQztZQUNwRSxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7WUFDdEQsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ2xELElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztZQUNoRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7WUFDNUQsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQ3hELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO1lBQzlELGVBQWUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztZQUN0RSxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7WUFDdEQsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxnQkFBZ0IsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQ3hFLE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxXQUFXO1lBQ1gsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ2xELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUN4RCxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDO1NBQ2xDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2hELFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pGLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDO1lBQ2hFLE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1lBQzVELFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDO1lBQ2hFLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDO1lBQzlELFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDO1lBQ3RFLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pGLGdCQUFnQixFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNoRixVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBRTtZQUNyRSxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBRTtZQUNyRSxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQztZQUM5RCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQztZQUM5RCxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RixXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQztZQUN0RSxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQztZQUNsRSxjQUFjO1lBQ2QsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztZQUNsRCxhQUFhLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDeEQsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7U0FFM0QsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDTCxDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQy9FLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM5RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQTtJQUM3QyxDQUFDO0lBRUQsMkJBQTJCLENBQUMsS0FBSztRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQ2pELENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFLO1FBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUE7SUFDakQsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQUs7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQ25ELENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsT0FBTztRQUNsQyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQTtJQUN4QyxDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBSztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUE7SUFDeEQsQ0FBQztJQUdELGNBQWMsQ0FBQyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQUM7WUFDaEQsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzlCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQUs7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNuQyxLQUFLLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0lBQzdHLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQUM7WUFDaEQsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzlCLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQUs7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNuQyxLQUFLLEVBQUUsS0FBSztTQUNaLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0lBQzdHLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLDZCQUE2QixDQUFDO1lBQ2hELGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUM5QixLQUFLLEVBQUUsS0FBSztTQUNaLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0lBQzdHLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFLO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBQyxDQUFDO1lBQ2hDLElBQUksYUFBYSxHQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFBO1lBQzlELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDOUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdkQsSUFBSSxhQUFhLEVBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQzlILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdE0sSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDakMsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBRSxJQUFJLENBQUMsRUFBRTtvQkFDckksSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtvQkFDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUM1RSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdE0sSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDakMsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtZQUNyRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQUs7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztZQUMvQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsT0FBTyxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCO1lBQ3JELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ2xELE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO29CQUNuQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO29CQUN2RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtvQkFDekUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3RNLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUVKLENBQUM7SUFFRCxXQUFXO0lBRVgsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xKLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QjtRQUNqQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xMLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLO1FBQ3RCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFakUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWE7UUFDWCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xELDhDQUE4QztJQUNoRCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUMsQ0FBQztZQUMzQixJQUFJLGFBQWEsR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUE7WUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDekUsb0RBQW9EO1lBQ3BELElBQUksYUFBYSxFQUFDLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBRSxJQUFJLENBQUMsRUFBRTtvQkFDekgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQy9FLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBQyxDQUFDO3dCQUMxQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDN0IsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO2dCQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2hJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDNUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFDLENBQUM7d0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUM3QixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1lBQ3JFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1lBQy9CLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixPQUFPLEVBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEI7WUFDckQsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUNyQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDbEQsTUFBTSxFQUFFLEdBQUcsRUFBRTtnQkFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDckgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUE7b0JBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO29CQUNsRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQUssRUFBRSxNQUFNO1FBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3BHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQTtJQUN6RSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsYUFBYTtRQUNoQyxJQUFJLFNBQVMsR0FBWSxJQUFJLENBQUM7UUFDOUIsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6RixTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzdGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxhQUFhO1FBQ2hDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUN0RSxPQUFPO1FBQ1QsQ0FBQztRQUNELGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksRUFBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFDLENBQUM7Z0JBQ3BELGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBQyxDQUFDO2dCQUNsRCxhQUFhLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUM7WUFDdEMsYUFBYSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksYUFBYSxDQUFDLEtBQUssRUFBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUMvRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO2dCQUN2QyxhQUFhLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLGFBQWEsR0FBRyxJQUFJLGlCQUFpQixDQUFDO2dCQUN0QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO2dCQUN2QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFBO2dCQUNwRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUosSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QjtRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ25MLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFPO1FBQ3BCLElBQUksU0FBUyxHQUFZLElBQUksQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3ZGLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUM3RixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQU87UUFDcEIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtZQUNyRSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFDLENBQUM7WUFDdkIsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUE7WUFDbEIsT0FBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQTtZQUNoRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM5RyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixDQUFDO2dCQUNsQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQTtRQUNGLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO2dCQUN4QyxPQUFPLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3ZHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ25CLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRTdCLENBQUM7SUFFRCxrQkFBa0I7SUFFbEIsYUFBYTtRQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLDJCQUEyQixDQUFDLENBQUUsU0FBUyxDQUFDO1lBQ2xHLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtnQkFDbEYsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxlQUFlO1FBRWIsSUFBSSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7UUFDbEMsY0FBYztRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5SixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2IsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDckMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDM0MsQ0FBQyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUE7Z0JBQ2xCLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFBLENBQUMsMEJBQTBCO2dCQUMzRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1YsR0FBRyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQTtRQUN2RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtRQUN6QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFBO1FBQ3JFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQTtRQUMvRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUNqRSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFBO0lBQzFDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLG9CQUFvQixDQUFDO1FBQ3hELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUM7WUFDOUQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsU0FBUyxFQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQztvQkFDOUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGlCQUFpQixDQUFDO2dCQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUE7WUFDakMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7WUFDMUMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQywyQkFBMkI7UUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUN0SCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRztZQUNqQyxhQUFhLEVBQUUsR0FBRztZQUNsQixNQUFNLEVBQUUsR0FBRztTQUNaLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLLENBQUMsMEJBQTBCO1FBQzlCLElBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7WUFDckQsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0ksQ0FBQzthQUFLLENBQUM7WUFDTCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEgsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFDLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLHlDQUF5QyxHQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQzlELElBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQzFDLElBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsSUFBSSxHQUFHLEVBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO2dCQUM1RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUNyRCxDQUFDO2lCQUFJLENBQUM7Z0JBQ0osSUFBSSxPQUFPLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUM7Z0JBQzNELE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFFNUgsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQzNELENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6SSxDQUFDO2FBQUksQ0FBQztZQUNKLElBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsSUFBSSxHQUFHLEVBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1lBQzlFLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsSSxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDeEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLO1FBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtnQkFDekUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQTtnQkFDekQsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztnQkFDMUMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtZQUMxQyxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksU0FBUyxHQUFZLElBQUksQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1lBQ3JFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUNuRixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQjtZQUN2RCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3ZDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7U0FDbkMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDO0lBQzVFLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDO1FBQzlCLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25HLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVGLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFDLENBQUM7WUFDOUUsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFDLENBQUM7WUFDbEYsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0YsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3RFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUM1RCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFDLENBQUM7WUFDNUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzlFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFLO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEgsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUMzRSxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ25GLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztZQUN2QyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1NBQ25DLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQzlCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUksRUFBQyxDQUFDO1lBQ25FLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksU0FBUyxHQUFZLElBQUksQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRyxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3RFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDeEgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQUs7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztZQUMvQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsT0FBTyxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCO1lBQ3JELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ2xELE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDakIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQTtJQUN4RSxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlJLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdDQUFnQztRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pMLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxhQUFhO1FBQ25DLElBQUksU0FBUyxHQUFZLElBQUksQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlGLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0YsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQXdCO1FBQzlDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtZQUNyRSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEtBQUssRUFBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3hELElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNsQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN6RSxLQUFLLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQUssRUFBRSxNQUFNO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3BHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztnQkFDckMsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQUs7UUFDeEIsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUM5QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUNsQyxNQUFNO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsOEJBQThCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUosSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFHRCxzQkFBc0I7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVLLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1SyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQ3JLLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQUs7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUM1RCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDO1FBQzlCLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9GLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdGLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksU0FBUyxFQUFDLENBQUM7WUFDYixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBQyxDQUFDO2dCQUN6QixTQUFTLEdBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBQyxDQUFDO2dCQUNqQyxTQUFTLEdBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JFLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BHLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxJQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzdFLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQzVHLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzFHLFNBQVMsR0FBSSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDbkgsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUUsU0FBUyxHQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEcsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQjtRQUNqRCxJQUFJLElBQUksR0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFDckMsSUFBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBQyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUNELElBQUksTUFBTSxHQUFDLElBQUssc0JBQXNCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsYUFBYSxHQUFHLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztRQUMxRCxNQUFNLENBQUMsbUJBQW1CLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDO1FBQzdELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksUUFBUSxHQUFFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckksSUFBRyxRQUFRLElBQUUsQ0FBQyxFQUFDLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxxREFBcUQsR0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMxSSxPQUFPLEtBQUssQ0FBQztRQUNuQixDQUFDO2FBQUssSUFBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMscURBQXFELEdBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVJLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3RFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQztZQUMzRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDeEgsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQy9ILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUNELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxLQUFLLENBQUM7WUFDM0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNySCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztvQkFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7b0JBQ2xELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsQ0FBQTtZQUVKLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUM7UUFDdkUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBSztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDO1FBQzlCLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakcsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRyxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hHLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEcsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUN0RSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztZQUN0QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5RSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztZQUN0QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQUs7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztZQUMvQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsT0FBTyxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCO1lBQ3JELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ2xELE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDeEgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLDhCQUE4QixFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUNqRSxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxLQUFLO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7SUFDekMsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixJQUFJLFNBQVMsR0FBWSxJQUFJLENBQUM7UUFDOUIsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRyxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pHLFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUcsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLHlCQUF5QjtRQUM3QixJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUN0RSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsOEJBQThCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLDhCQUE4QixFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5RSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsOEJBQThCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLDhCQUE4QixFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUM7UUFDNUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELDBCQUEwQixDQUFDLEtBQUs7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztZQUMvQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsT0FBTyxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCO1lBQ3JELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ2xELE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsOEJBQThCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbEksSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLDhCQUE4QixFQUFFLENBQUM7b0JBQy9ELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUNwQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7OztTQUdFO0lBQ0gsc0JBQXNCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUN4RSxDQUFDO0lBR0QsY0FBYztRQUNiLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7WUFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksSUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ3hJLENBQUM7SUFFRCxhQUFhO1FBQ1osT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQzNFLENBQUM7SUFHRCxVQUFVO1FBQ1QsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ3pFLENBQUM7SUFFQSxLQUFLLENBQUMsRUFBVTtRQUNkLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBVztRQUNuQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztJQUNqRCxDQUFDO3VHQTc5Q1UsMkJBQTJCOzJGQUEzQiwyQkFBMkIscUtBSnpCLENBQUMsY0FBYyxDQUFDLDBCQzVDL0IsdXo3SUFxNURZLHNpSUQzMkRFLGVBQWUsNEZBQUUsV0FBVyxtb0ZBQUUsYUFBYSw4a0JBQUUsc0NBQXNDLHlUQUFFLHFCQUFxQix5REFBRSxpQkFBaUIseURBQUUsY0FBYyw0cUNBQUUsV0FBVyxzaENBQUUsbUJBQW1CLCtVQUFFLFlBQVksbUlBQUUsWUFBWSw2T0FBRSxjQUFjLDIvQkFBRSxjQUFjLDZQQUFFLGVBQWUsaWxCQUFFLGVBQWUseUhBQUUsbUJBQW1CLHNLQUFFLGdCQUFnQixxR0FBRSxpQkFBaUI7OzJGQU14VSwyQkFBMkI7a0JBUnZDLFNBQVM7K0JBQ0Usc0JBQXNCLFdBQ3JCLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsc0NBQXNDLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsY0FDdFYsSUFBSSxhQUNMLENBQUMsY0FBYyxDQUFDOzBlQXNIYixZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1csWUFBWTtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgR2VuZXJhbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9nZW5lcmFsLnBpcGUnO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2VuZXJhbE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvR2VuZXJhbE1vZGVsJztcclxuaW1wb3J0IHsgQ2FyZ2FyQXJjaGl2b3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9jYXJnYXItYXJjaGl2b3Muc2VydmljZSc7XHJcbmltcG9ydCB7IEVuY3JpcHRhZG9CYXNpY29TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9lbmNyaXB0YWRvLWJhc2ljby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9yZXBvcnRlLWZ1ZW50ZS5waXBlJztcclxuaW1wb3J0IHsgRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lamVjdWNpb25yZXBvcnRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRnVlbnRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2Z1ZW50ZS5waXBlJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvcmVwb3J0ZS1jb2x1bW5hcmlvLnBpcGUnO1xyXG5pbXBvcnQgeyBSZXBvcnRlQ29sdW1uYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmEnO1xyXG5pbXBvcnQgeyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVNYXJjYWRvcic7XHJcbmltcG9ydCB7IFJlcG9ydGVUYWJsYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZVRhYmxhJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hcmlvJztcclxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUZ1ZW50ZU1vZGVsJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvcic7XHJcbmltcG9ydCB7IFJlcG9ydGVCYW5kYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUJhbmRhJztcclxuaW1wb3J0IHsgUmVwb3J0ZVNvcG9ydGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVTb3BvcnRlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IFRhYlZpZXdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhYnZpZXcnO1xyXG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRlcy9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XHJcbmltcG9ydCB7IFBpY2tMaXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9waWNrbGlzdCc7XHJcbmltcG9ydCB7IEZpZWxkc2V0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9maWVsZHNldCc7XHJcbmltcG9ydCB7IEFjY29yZGlvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYWNjb3JkaW9uJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRhcmVhTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHRhcmVhJztcclxuaW1wb3J0IHsgRmxvYXRMYWJlbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmxvYXRsYWJlbCc7XHJcbmltcG9ydCB7IElucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RldGFsbGUtdGlwby1yZXBvcnRlJyxcclxuICAgIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIFRhYmxlTW9kdWxlLCBUYWJWaWV3TW9kdWxlLCBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCwgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlLCBSZXBvcnRlRnVlbnRlUGlwZSwgRHJvcGRvd25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgUGlja0xpc3RNb2R1bGUsIEZpZWxkc2V0TW9kdWxlLCBBY2NvcmRpb25Nb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgSW5wdXRUZXh0YXJlYU1vZHVsZSwgRmxvYXRMYWJlbE1vZHVsZSwgSW5wdXROdW1iZXJNb2R1bGUsIEZpZWxkc2V0TW9kdWxlXSwgXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFsbGUtdGlwby1yZXBvcnRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kZXRhbGxlLXRpcG8tcmVwb3J0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZXRhbGxlVGlwb1JlcG9ydGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBsaXN0YVRpcG9DaWZyYWRvOiBhbnlbXSA9IFtdO1xyXG4gIC8vdGFiIGV4Y2VsXHJcbiAgcHVibGljIGxpc3RhRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU5vRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xyXG4gIHB1YmxpYyBmb3JtTWFyY2Fkb3JFeGNlbDogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yRXhjZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZXNNYXJjYWRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBlc0ltYWdlbkZpamE6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy90YWIgcGxhbnRpbGxhc1xyXG4gIHB1YmxpYyBsaXN0YUNvbHVtbmFzOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yZXM6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3I7XHJcbiAgcHVibGljIGxpc3RhVGlwb0dyYWZpY29fSkZDO1xyXG4gIHB1YmxpYyBsaXN0YUdyYWZpY287XHJcbiAgcHVibGljIGxpc3RhQWxpbmVhY2lvbjtcclxuICBwdWJsaWMgbGlzdGFPcGVyYWNpb25lcztcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICBwdWJsaWMgZm9ybU1hcmNhZG9yOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIG9yaWdlbk1hcmNhZG9yOiBzdHJpbmcgPSBudWxsO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhQ2FtcG9zTWFyY2Fkb3I6IFJlcG9ydGVUYWJsYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY2FtcG9NYXJjYWRvckluc2VydGFyOiBSZXBvcnRlVGFibGFNb2RlbCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICBwdWJsaWMgbGlzdGFTb3BvcnRlczogUmVwb3J0ZVNvcG9ydGVNb2RlbFtdID0gW107XHJcbiAgcHVibGljIHNvcG9ydGVJbmdyZXNhcjogUmVwb3J0ZVNvcG9ydGVNb2RlbCA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvOiBib29sZWFuID0gZmFsc2VcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2bzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBoYWJpbGl0YUNhbXBvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcmVwb3J0ZSBkaW5hbWljb1xyXG4gIHB1YmxpYyBsaXN0YVRpcG9CYW5kYSA9IFtcclxuICAgIHtrZXk6ICdiYW5kYTEnLCB2YWx1ZTogJ0JhbmRhIDEnfSxcclxuICAgIHtrZXk6ICdiYW5kYTInLCB2YWx1ZTogJ0JhbmRhIDInfSxcclxuICAgIHtrZXk6ICdiYW5kYTMnLCB2YWx1ZTogJ0JhbmRhIDMnfSxcclxuICAgIHtrZXk6ICdiYW5kYTQnLCB2YWx1ZTogJ0JhbmRhIDQnfSxcclxuICAgIHtrZXk6ICdiYW5kYTUnLCB2YWx1ZTogJ0JhbmRhIDUnfSxcclxuICAgIHtrZXk6ICdkZXRhbGxlJywgdmFsdWU6ICdEZXRhbGxlJ30sXHJcbiAgICB7a2V5OiAnc3VtbWFyeScsIHZhbHVlOiAnUmVzdW1lbid9LFxyXG4gIF1cclxuICBwdWJsaWMgZXhpc3RlSmFzcGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGJhbmRhU2VsZWNjaW9uYWRhID0ge2tleTogbnVsbCwgdmFsdWU6IG51bGx9O1xyXG4gIHB1YmxpYyBudWV2YUJhbmRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlclRhYkJhbmRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY286IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY286IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xyXG4gIHB1YmxpYyByZXBvcnRlQmFuZGE6IFJlcG9ydGVCYW5kYU1vZGVsID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsO1xyXG4gIHB1YmxpYyBmb3JtUmVwb3J0ZURpbmFtaWNvOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGxpc3RhTWFyY2Fkb3JEaW5hbWljbzogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdXHJcbiAgcHVibGljIGxpc3RhVGlwb0NhbXBvSmFzcGVyRGluYW1pY28gPSBbXHJcbiAgICB7a2V5OiAnQycsIHZhbHVlOiAnQ2FsY3Vsbyd9LFxyXG4gICAge2tleTogJ1QnLCB2YWx1ZTogJ0NvbHVtbmEnfSxcclxuICBdXHJcbiAgcHVibGljIGxpc3RhVGlwb0RhdG9TaW50YXhpcyA9IFtcclxuICAgIHtrZXk6ICdGJywgdmFsdWU6ICdGZWNoYSd9LFxyXG4gICAge2tleTogJ04nLCB2YWx1ZTogJ051bWVybyd9LFxyXG4gICAge2tleTogJ1QnLCB2YWx1ZTogJ1RleHRvJ30sXHJcbiAgXVxyXG5cclxuICAvL3JlcG9ydGUgdGFibGFcclxuICBwdWJsaWMgbGlzdGFUYWJsYTogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcbiAgcHVibGljIGxpc3RhTm9UYWJsYTogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcbiAgXHJcblxyXG4gIC8vcmVwb3J0ZSB0ZXh0b1xyXG4gIHB1YmxpYyBsaXN0YVNlcGFyYWRvcmVzO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFNYXJjYWRvcmVzVGV4dG86IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgbWFyY2Fkb3JUZXh0bzogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKVxyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yVGV4dG86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JUZXh0bztcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0bzogYm9vbGVhbiA9IGZhbHNlXHJcblxyXG4gIC8vcmVwb3J0ZSBYTUxcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JYTUw7XHJcbiAgcHVibGljIGxpc3RhWE1MOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW11cclxuICBwdWJsaWMgbWFyY2Fkb3JYTUw6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsXHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlck51ZXZvTWFyY2Fkb3JYTUw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFDYW1wb3NNYXJjYWRvclhNTDogUmVwb3J0ZVRhYmxhTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUw6IFJlcG9ydGVUYWJsYU1vZGVsID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xyXG4gIHB1YmxpYyB2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy9yZXBvcnRlIGNvbHVtbmFyaW9cclxuICBwdWJsaWMgbGlzdGFSZXBvcnRlQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbFtdID0gW107XHJcbiAgcHVibGljIHZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY29sdW1uYUJhc2ljYTogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbDtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGlzdGFUaXBvQ29sdW1uYXM7XHJcbiAgcHVibGljIGxpc3RhT3BlcmFjaW9uZXNDb2x1bW5hcmlvO1xyXG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvO1xyXG4gIHB1YmxpYyBsaXN0YU9yZGVuYW1pZW50bztcclxuXHJcbiAgcHVibGljIHZlck51ZXZvQ29sdW1uYUFkaWNpb25hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNvbHVtbmFzQWRpY2lvbmFsZXM6IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBjb2x1bW5hQWRpY2lvbmFsOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsO1xyXG5cclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3JDb2x1bW5hcmlvO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbWFyY2Fkb3Jlc0NvbHVtbmFyaW86IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbFtdID0gW107XHJcbiAgcHVibGljIG1hcmNhZG9yQ29sdW1uYXJpbzogUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsO1xyXG5cclxuICBwdWJsaWMgcmVwb3J0ZUZ1ZW50ZSA6IFJlcG9ydGVGdWVudGVNb2RlbCA9IG5ldyAgUmVwb3J0ZUZ1ZW50ZU1vZGVsKCk7XHJcbiAgcHVibGljIGxsYXZlRW1wcmVzYTogc3RyaW5nO1xyXG4gIHB1YmxpYyBsaXN0YVNpTm87XHJcbiAgQElucHV0KCkgcHVibGljIGxsYXZlUmVwb3J0ZSA6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgYXBsaWNhY2lvbiA6IHN0cmluZztcclxuICBASW5wdXQoKSAgcHVibGljIGxpc3RhRnVlbnRlczogYW55W10gPSBbXTtcclxuXHJcbiAgX3N1YnNjaXBydGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYWNpb25lc0J1c1NlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZ2VuZXJhbFNlcnZpY2U6IEdlbmVyYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsUGlwZTogR2VuZXJhbFBpcGUsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVwb3J0ZUZ1ZW50ZVBpcGU6IFJlcG9ydGVGdWVudGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjYXJnYXJBcmNoaXZvOiBDYXJnYXJBcmNoaXZvc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVuY3JpcHRhZG9yQXJjaGl2bzogRW5jcmlwdGFkb0Jhc2ljb1NlcnZpY2UsXHJcbiAgICBwdWJsaWMgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZ1ZW50ZVBpcGU6IEZ1ZW50ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogUmVwb3J0ZUNvbHVtbmFyaW9QaXBlLFxyXG4gICAgcHJpdmF0ZSByZXBvcnRlU2VydmljZTogRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UpIHtcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwbGljYWNpb24gPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuS2V5KCdhcGxpY2FjaW9uJylcclxuICAgIHRoaXMubGxhdmVFbXByZXNhID0gdGhpcy5hdXRoU2VydmljZS5nZXRUb2tlbktleSgnbGxhdmVFbXByZXNhJyk7XHJcbiAgICB0aGlzLmxpc3RhU2lObyA9IHRoaXMuZ2VuZXJhbFBpcGUuTElTVEFfU0lOTztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9USVBPX01BUkNBRE9SO1xyXG4gICAgdGhpcy5saXN0YVRpcG9Db2x1bW5hcyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfVElQT19DT0xVTU5BUztcclxuICAgIHRoaXMubGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU87XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU9fRVhDRUw7XHJcbiAgICB0aGlzLmxpc3RhT3JkZW5hbWllbnRvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUkRFTkFNSUVOVE87XHJcbiAgICB0aGlzLmxpc3RhU2VwYXJhZG9yZXMgPSAgdGhpcy5mdWVudGVQaXBlLkxJU1RBX1NFUEFSQURPUkVTO1xyXG4gICAgdGhpcy5saXN0YVRpcG9NYXJjYWRvciA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfTUFSQ0FET1JFUztcclxuICAgIHRoaXMubGlzdGFUaXBvR3JhZmljb19KRkMgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX1RJUE9fR1JBRklDT19KRkM7XHJcbiAgICB0aGlzLmxpc3RhR3JhZmljbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfUkVDVVJTT19HUkFGSUNBO1xyXG4gICAgdGhpcy5saXN0YUFsaW5lYWNpb24gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX0FMSU5FQUNJT047XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXMgPSB0aGlzLmdlbmVyYWxQaXBlLk1BUEFPUEVSQUNJT05FUztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JUZXh0byA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuVElQT01BUkNBRE9SRVNURVhUTztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JYTUwgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX01BUkNBRE9SRVNfWE1MO1xyXG4gICAgdGhpcy5jYXJnYXIoKTtcclxuICAgIHRoaXMuY2FyZ2FyRm9ybU1hcmNhZG9yRXhjZWwoKTtcclxuICAgIHRoaXMuY2FyZ2FyRm9ybU1hcmNhZG9yKCk7XHJcbiAgICB0aGlzLmNhcmdhckZvcm1EaW5hbWljbygpO1xyXG4gICAgdGhpcy5hZ3JlZ2FyU3Vic2NyaXBjaW9uZXMoKTtcclxuICAgIC8vdGhpcy5jYXJnYXJMaXN0YXMoKTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpe1xyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5mb3JFYWNoKChzdWIpID0+IHtcclxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFncmVnYXJTdWJzY3JpcGNpb25lcygpIHtcclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RpcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRleHRvUmVnaXN0cm9Db250cm9sID0gdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RleHRvUmVnaXN0cm8nKTtcclxuICAgICAgICBjb25zdCBvcmlnZW5Db250cm9sID0gdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ29yaWdlbicpO1xyXG4gICAgICAgIGlmICghdmFsdWUpe1xyXG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5lc01hcmNhZG9yID0gdHJ1ZTtcclxuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFsnTUEnXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSB0cnVlO1xyXG4gICAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChbJ0lGJ10uaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgICAgICB0aGlzLmVzSW1hZ2VuRmlqYSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgICAgICAgIG9yaWdlbkNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICBvcmlnZW5Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlbnRyYSBhIHRpcG86ICcpXHJcbiAgICAgICAgY29uc29sZS5sb2codmFsdWUpXHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbyA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvID09IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTUFSQ0FET1JUQUJMQSl7XHJcbiAgICAgICAgIC8vIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsID0gJ04nXHJcbiAgICAgICAgIC8vIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGllbmVTcWwnKS5zZXRWYWx1ZSgnTicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ29yaWdlbicpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3Iub3JpZ2VuID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGllbmVTcWwnKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlbnRyYSBhIHRpZW5lU3FsOiAnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKVxyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwb0dyYWZpY28nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCdvcmlnZW4nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmIChbJ1UnXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID0gJ1UnXHJcbiAgICAgICAgfSBlbHNlIGlmIChbJ0MnXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID0gJ0MnICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgndGlwb0NhbXBvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9IHZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdGFkb1hDb250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgncmVzdWx0YWRvWCcpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdGFkb1lDb250cm9sID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldCgncmVzdWx0YWRvWScpOyAgXHJcbiAgICAgICAgaWYgKHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5ICE9ICdkZXRhbGxlJykge1xyXG4gICAgICAgICAgcmVzdWx0YWRvWENvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIHJlc3VsdGFkb1lDb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdGFkb1hDb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBtYXJjYWRvckNvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdtYXJjYWRvcicpO1xyXG4gICAgICAgIGNvbnN0IGZpbHRyb0NvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdmaWx0cm8nKTtcclxuICAgICAgICBjb25zdCB0aXBvRGF0b0NvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCd0aXBvRGF0bycpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSAnVCcpIHtcclxuICAgICAgICAgIG1hcmNhZG9yQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgZmlsdHJvQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgIHRpcG9EYXRvQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWFyY2Fkb3JDb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgZmlsdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgdGlwb0RhdG9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1hcmNhZG9yQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgZmlsdHJvQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgdGlwb0RhdG9Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgcmVzdWx0YWRvWENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICByZXN1bHRhZG9ZQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCd0aXBvRGF0bycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byA9IHZhbHVlXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FtYmlhclRhYihldmVudCl7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmluZGV4KSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmNhcmdhcigpO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzRXhjZWwoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nKXtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHRoaXMudmFsaWRhckV4aXN0ZUphc3BlcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YXNUYWJsYSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDU6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDY6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDc6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICBcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3Rhc1RhYmxhKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ1MnLCBvcmRlbmFyVGFibGE6ICdTJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVRhYmxhID0gZGF0YTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ04nLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhTm9UYWJsYSA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnUCcsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvcmVzID0gZGF0YTtcclxuICAgIH0pICAgIFxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFzRXhjZWwoKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtvcmRlbkV4Y2VsOiAnUycsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFFeGNlbCA9IGRhdGE7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge29yZGVuRXhjZWw6ICdOJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU5vRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhQ29sdW1uYXMoKXtcclxuICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IFtdO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFzKCl7XHJcbiAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBbXTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ0VuY3JpcGNpb25BcmNoaXZvRFRPJywgbnVsbCwgZmFsc2UsIHt9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuY2FyZ2FyTGlzdGFDb2x1bW5hcygpO1xyXG4gIH1cclxuXHJcbiAgY2FyZ2FyRm9ybU1hcmNhZG9yRXhjZWwoKXtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZGVzY3JpcGNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLmRlc2NyaXBjaW9uLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwubWFyY2Fkb3IsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldKSxcclxuICAgICAgdGlwbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGlwbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgdGV4dG9SZWdpc3RybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybyksXHJcbiAgICAgIG9yaWdlbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuKSxcclxuICAgICAgLy9jYW1wb3MgYmRcclxuICAgICAgbGxhdmU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlKSxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSksXHJcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2woJ0UnKSBcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJGb3JtTWFyY2Fkb3IoKXtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGRlc2NyaXBjaW9uOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZGVzY3JpcGNpb24sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXSksXHJcbiAgICAgIHRpcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm1hcmNhZG9yLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSksXHJcbiAgICAgIHRhYmxhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGFibGEpLFxyXG4gICAgICBvcmlnZW46IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5vcmlnZW4pLFxyXG4gICAgICB0ZXh0b1JlZ2lzdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyksXHJcbiAgICAgIHJlcG9ydGVDb2x1bW5hOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucmVwb3J0ZUNvbHVtbmEpLFxyXG4gICAgICBmb3JtYXRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZm9ybWF0byksXHJcbiAgICAgIGFuY2hvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG8pLFxyXG4gICAgICBhbHRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYWx0byksXHJcbiAgICAgIGdydXBvMTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMSksXHJcbiAgICAgIGdydXBvMjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMiksXHJcbiAgICAgIGdydXBvMzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMyksXHJcbiAgICAgIGZpbmFsR3J1cG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5maW5hbEdydXBvKSxcclxuICAgICAgdGllbmVTcWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCksXHJcbiAgICAgIHF1ZXJ5OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucXVlcnkpLFxyXG4gICAgICBmdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5mdWVudGUpLFxyXG4gICAgICB0aXBvR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKSxcclxuICAgICAgbWFyY2Fkb3JHcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubWFyY2Fkb3JHcmFmaWNvKSxcclxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpdHVsb3gpLFxyXG4gICAgICB0aXR1bG95OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGl0dWxveSksXHJcbiAgICAgIGJhbmRhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYmFuZGEpLFxyXG4gICAgICBhbmNob0phc3BlckxhYmVsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG9KYXNwZXJMYWJlbCksXHJcbiAgICAgIGZpbHRybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZpbHRybyksXHJcbiAgICAgIC8vY2FtcG9zIGJkXHJcbiAgICAgIGxsYXZlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmUpLFxyXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcclxuICAgICAgdGlwb1JlcG9ydGU6IG5ldyBGb3JtQ29udHJvbCgnTicpIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckZvcm1EaW5hbWljbygpe1xyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHRpcG9DYW1wbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICB0aXBvRGF0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8pLFxyXG4gICAgICBmaWx0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybyksXHJcbiAgICAgIG1hcmNhZG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciksXHJcbiAgICAgIGFsdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFsdG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGZvcm1hdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZvcm1hdG8pLFxyXG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZGVzY3JpcGNpb24pLFxyXG4gICAgICBhbmNobzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYW5jaG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGFuY2hvSmFzcGVyTGFiZWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFuY2hvSmFzcGVyTGFiZWwpLFxyXG4gICAgICByZXN1bHRhZG9YOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXN1bHRhZG9YICksXHJcbiAgICAgIHJlc3VsdGFkb1k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlc3VsdGFkb1kgKSxcclxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGl0dWxveCksXHJcbiAgICAgIHRpdHVsb3k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpdHVsb3kpLFxyXG4gICAgICB0aXBvUmVwb3J0ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb1JlcG9ydGUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHRpcG9HcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvR3JhZmljbyksICAgICAgXHJcbiAgICAgIG9wZXJhY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3BlcmFjaW9uKSwgICAgICBcclxuICAgICAgLy9jYW1wb3MgdGFibGFcclxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2woJ0QnKSxcclxuICAgICAgYmFuZGE6IG5ldyBGb3JtQ29udHJvbCh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSksXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpLFxyXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUpLFxyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXIoKXtcclxuICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmxsYXZlUmVwb3J0ZSl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHtsbGF2ZTogdGhpcy5sbGF2ZVJlcG9ydGV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlRnVlbnRlID0gZGF0YTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzRXhjZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdHVhbGl6YXIoKXtcclxuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUZ1ZW50ZSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nKXtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXBvcnRlU2VydmljZS5ndWFyZGFyUmVwb3J0ZSh0aGlzLnJlcG9ydGVGdWVudGUpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVGdWVudGUgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2byhldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVGdWVudGUuYXJjaGl2b1RvZG8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b01hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvUGxhbmlsbGEoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9JbmRpdmlkdWFsID0gZXZlbnQuZGF0YVxyXG4gIH1cclxuXHJcbiAgb2J0ZW5lckFyY2hpdm9Tb3BvcnRlKGV2ZW50LCBzb3BvcnRlKXtcclxuICAgIHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuXHJcbiAgbW92ZXJBQXNvY2lhZG8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XHJcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFFeGNlbCxcclxuICAgICAgZXhjZWw6IHRydWVcclxuICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIG1vdmVyQURlc2Fzb2NpYWRvKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YURlc2Fzb2NpYWRvOiB0aGlzLmxpc3RhTm9FeGNlbCxcclxuICAgICAgZXhjZWw6IHRydWVcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICBtb3ZlckFBc29jaWFkb1RhYmxhKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhVGFibGEsXHJcbiAgICAgIGV4Y2VsOiBmYWxzZVxyXG4gICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxyXG4gIH1cclxuXHJcbiAgbW92ZXJBRGVzYXNvY2lhZG9UYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFEZXNhc29jaWFkbzogdGhpcy5saXN0YU5vVGFibGEsXHJcbiAgICAgIGV4Y2VsOiBmYWxzZVxyXG4gICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIHJlb3JkZXJUYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFBc29jaWFkbzogdGhpcy5saXN0YVRhYmxhLFxyXG4gICAgICBleGNlbDogZmFsc2VcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbChldmVudCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsKVxyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XHJcbiAgICB0aGlzLmVzTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgIHRoaXMuZXNJbWFnZW5GaWphID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbClcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvJykuc2V0VmFsdWUobnVsbClcclxuICB9XHJcblxyXG4gIGd1YXJkYXJNYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWwgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsaWQpe1xyXG4gICAgICBsZXQgbGxhdmVSZWdpc3RybyA9ICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnbGxhdmUnKS52YWx1ZVxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgncmVwb3J0ZUZ1ZW50ZScpLnNldFZhbHVlKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSlcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ0UnKVxyXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ2xsYXZlJykuc2V0VmFsdWUodGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCkpXHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHsgIFxyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZSAgICAgIFxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KGtleSkuZXJyb3JzKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCkpLnN1YnNjcmliZShkYXRhID0+e1xyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvL3BsYW50aWxsYVxyXG5cclxuICBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JBc3luYygpIHtcclxuICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvciA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmV9KSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gdHJ1ZTtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IpXHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS5zZXRWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvKVxyXG4gICAgXHJcbiAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvcigpe1xyXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoe30sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IpXHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ1AnKVxyXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS5zZXRWYWx1ZShudWxsKVxyXG4gIH1cclxuXHJcbiAgZ3VhcmRhck1hcmNhZG9yKCl7XHJcbiAgICBpZiAodGhpcy5mb3JtTWFyY2Fkb3IudmFsaWQpe1xyXG4gICAgICBsZXQgbGxhdmVSZWdpc3RybyA9ICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ2xsYXZlJykudmFsdWVcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdyZXBvcnRlRnVlbnRlJykuc2V0VmFsdWUodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKVxyXG4gICAgICAvL3RoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwb1JlcG9ydGUnKS5zZXRWYWx1ZSgnTicpXHJcbiAgICAgIGlmIChsbGF2ZVJlZ2lzdHJvKXtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3IudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XHJcbiAgICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdsbGF2ZScpLnNldFZhbHVlKHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpKVxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3IudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4geyAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XHJcbiAgICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1NYXJjYWRvci5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yLmdldChrZXkpLmVycm9ycykge1xyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KGtleSkubWFya0FzRGlydHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHsgXHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yKSkuc3Vic2NyaWJlKGRhdGEgPT57XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXHJcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvciA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDYW1wb01hcmNhZG9yKGV2ZW50LCBvYmpldG8peyBcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIG9iamV0bykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b0NhbXBvVGFibGEoKXtcclxuICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZSA9IHRydWU7XHJcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIucmVwb3J0ZU1hcmNhZG9yID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmVcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3Ipe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5jb2x1bW5hKVxyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY2FtcG9GdWVudGUpXHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhckNhbXBvTWFyY2Fkb3IoY2FtcG9NYXJjYWRvcil7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG8gPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3IpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjYW1wb01hcmNhZG9yLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlO1xyXG4gICAgaWYgKCdJJyA9PSBjYW1wb01hcmNhZG9yLnRpcG8pe1xyXG4gICAgICBpZiAoIWNhbXBvTWFyY2Fkb3IuYW5jaG8gfHwgY2FtcG9NYXJjYWRvci5hbmNobyA9PSAwKXtcclxuICAgICAgICBjYW1wb01hcmNhZG9yLmFuY2hvID0gMTA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFjYW1wb01hcmNhZG9yLmFsdG8gfHwgY2FtcG9NYXJjYWRvci5hbHRvID09IDApe1xyXG4gICAgICAgIGNhbXBvTWFyY2Fkb3IuYWx0byA9IDEwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoWydHJ10uaW5jbHVkZXMoY2FtcG9NYXJjYWRvci50aXBvKSl7XHJcbiAgICAgIGNhbXBvTWFyY2Fkb3IuY29sdW1uYSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoY2FtcG9NYXJjYWRvci5sbGF2ZSl7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wb01hcmNhZG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG8gPSBmYWxzZTtcclxuICAgICAgICBjYW1wb01hcmNhZG9yID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYW1wb01hcmNhZG9yLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG9NYXJjYWRvcikpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvID0gZmFsc2U7XHJcbiAgICAgICAgY2FtcG9NYXJjYWRvciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICAgICAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpXHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhU29wb3J0ZXMoKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRpcG86ICdTJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFTb3BvcnRlcyA9IGRhdGE7XHJcbiAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YVNvcG9ydGVzQXN5bmMoKXtcclxuICAgIHRoaXMubGlzdGFTb3BvcnRlcyA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRpcG86ICdTJ30pKS50b1Byb21pc2UoKVxyXG4gIH1cclxuXHJcbiAgbnVldm9Tb3BvcnRlKCl7XHJcbiAgICB0aGlzLnNvcG9ydGVJbmdyZXNhciA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsKCk7XHJcbiAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IHRydWU7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsYXJTb3BvcnRlKCkge1xyXG4gICAgdGhpcy5zb3BvcnRlSW5ncmVzYXIgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbCgpO1xyXG4gICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhclNvcG9ydGUoc29wb3J0ZSl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKVxyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwpXHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhclNvcG9ydGUoc29wb3J0ZSl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyU29wb3J0ZShzb3BvcnRlKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXNvcG9ydGUubGxhdmVUYWJsYSl7XHJcbiAgICAgIHNvcG9ydGUudGlwbyA9ICdTJ1xyXG4gICAgICBzb3BvcnRlLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmVcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIHNvcG9ydGUgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IGZhbHNlO1xyXG4gICAgICAgICAgc29wb3J0ZSA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hclNvcG9ydGUoZXZlbnQsIHNvcG9ydGUpe1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgaW5pY2lhckVkaWNpb24oKSB7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuY2VsYXJFZGljaW9uKCkgeyBcclxuICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlc0FzeW5jKCk7ICAgXHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICAgIFxyXG4gIH1cclxuICBcclxuICAvL1JlcG9ydGUgRGluYW1pY29cclxuXHJcbiAgZ2VuZXJhckphc3Blcigpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5nZW5lcmFySmFzcGVyKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgJ2NvbXBlbnNhY2lvbi9SZXBvcnRlc0Jhc2UnKSAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2VzcygnU2UgaGEgZ2VuZXJhZG8gZWwgamFzcGVyIGV4aXRvc2FtZW50ZScpXHJcbiAgICAgICAgdGhpcy52YWxpZGFyRXhpc3RlSmFzcGVyKCk7XHJcbiAgICAgIH1cclxuICAgIH0pOyAgICBcclxuICB9XHJcblxyXG5cclxuICBkZXNjYXJnYXJKYXNwZXIoKSB7XHJcblxyXG4gICAgbGV0IHByb3BpZWRhZCA9ICdydXRhX3BsYW50aWxsYXMnO1xyXG4gICAgLy9SdXRhIGFyY2hpdm9cclxuICAgIHRoaXMuYXBsaWNhY2lvbiA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW5LZXkoJ2FwbGljYWNpb24nKVxyXG4gICAgdGhpcy5jYXJnYXJBcmNoaXZvLmRlc2NhcmdhckFyY2hpdm8odGhpcy5lbmNyaXB0YWRvckFyY2hpdm8uZW5jcmlwdGFyKCdyZXBvcnRlcy8nICsgdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcpLCBwcm9waWVkYWQsIHRoaXMuYXBsaWNhY2lvbikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYmxvYiA9PiB7XHJcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxyXG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmxcclxuICAgICAgYS5kb3dubG9hZCA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnIC8vZG9jdW1lbnRvLmFyY2hpdm9vcmlnZW47XHJcbiAgICAgIGEuY2xpY2soKTtcclxuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvckRpbmFtaWNvKCl7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsXHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9yaWdlbiA9ICdEJ1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhID0gdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXlcclxuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5yZXNldCgpO1xyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbylcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IHRydWVcclxuICB9XHJcblxyXG4gIHZlck1hcmNhZG9yRGluYW1pY28oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28ucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKVxyXG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHZlckJhbmRhKGV2ZW50KXtcclxuICAgIHRoaXMudmVyVGFiQmFuZGEgPSBmYWxzZTtcclxuICAgIHRoaXMuYmFuZGFTZWxlY2Npb25hZGEgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xyXG4gICAgdGhpcy5udWV2YUJhbmRhID0gZmFsc2U7XHJcbiAgICBpZiAoWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5KSl7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYSA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JPYmplY3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIGJhbmRhOiB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleX0pKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKCF0aGlzLnJlcG9ydGVCYW5kYSkge1xyXG4gICAgICAgIHRoaXMubnVldmFCYW5kYSA9IHRydWU7XHJcbiAgICAgICAgaWYgKFsnZGV0YWxsZScsJ3N1bW1hcnknXS5pbmNsdWRlcyh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSkpe1xyXG4gICAgICAgICAgdGhpcy5udWV2YUJhbmRhID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVwb3J0ZUJhbmRhID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZUJhbmRhLnRvdGFsZXMgPSAnUydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2xlZXAoMjUpXHJcbiAgICB0aGlzLnZlclRhYkJhbmRhID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpe1xyXG4gICAgdGhpcy5saXN0YU1hcmNhZG9yRGluYW1pY28gPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xyXG4gICAgICByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIFxyXG4gICAgICBiYW5kYTogdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXksXHJcbiAgICAgIG9yZGVuRGluYW1pY286ICdTJyxcclxuICAgICAgb3JpZ2VuOiAnRCdcclxuICAgIH0pKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJDYXJhY3RlcmlzdGljYUJhbmRhKCl7XHJcbiAgICBpZih0aGlzLm51ZXZhQmFuZGEpIHtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEuYmFuZGEgPSB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleTtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUJhbmRhKSkudG9Qcm9taXNlKCk7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVCYW5kYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zbGVlcCgyNSlcclxuICAgIHRoaXMubnVldmFCYW5kYT1mYWxzZTtcclxuICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKFwiU2UgYWN0dWFsaXphcm9uIGxhcyBjYXJhY3RlcmlzdGljYXMgZGUgXCIrdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyQ29sdW1uYURpbmFtaWNvKCl7XHJcbiAgICBpZiAoIXRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby52YWxpZCkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KGtleSkuZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoa2V5KS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnZhbHVlO1xyXG4gICAgaWYodGhpcy51dGlsc1NlcnZpY2UuaXNCbGFuayh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlKSl7XHJcbiAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcclxuICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5vcmlnZW4gPSAnRCc7XHJcbiAgICAgIGlmKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdDJyl7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUNvbHVtbmEgPSBudWxsO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB2YXIgY29sdW1uYSA9IG5ldyBSZXBvcnRlQ29sdW1uYU1vZGVsKCk7XHJcbiAgICAgICAgY29sdW1uYS5sbGF2ZVRhYmxhID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvcjtcclxuICAgICAgICBjb2x1bW5hID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCBjb2x1bW5hKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IGNvbHVtbmEubm9tYnJlO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUNvbHVtbmEgPSBjb2x1bW5hLmxsYXZlVGFibGE7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5maWx0cm8gPSBjb2x1bW5hLnNpbnRheGlzO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8gPSBjb2x1bW5hLnRpcG9EYXRvO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbykpLnRvUHJvbWlzZSgpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGlmKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdDJyl7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKSkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbnVsbDtcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxyXG4gICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8oJ1NlIGhhIGd1YXJkYWRvIGVsIGNhbWJpbycpO1xyXG4gIH1cclxuXHJcbiAgcmVncmVzYXJCYW5kYVNlbGVjY2lvbmFkYSgpe1xyXG4gICAgdGhpcy5iYW5kYVNlbGVjY2lvbmFkYSA9IHtrZXk6IG51bGwsIHZhbHVlOiBudWxsfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZWxpbWluYXJDb2x1bW5hRGluYW1pY28oZXZlbnQpIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvICkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKClcclxuICAgICAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YWxpZGFyU2VwYXJhZG9yKCl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLnJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhY3R1YWxpemFyU2VwYXJhZG9yKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhclJlcG9ydGVUZXh0byA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhclNlcGFyYWRvcigpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0dWFsaXphcigpO1xyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7XHJcbiAgICAgIHRpcG9SZXBvcnRlOiB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlJFUE9SVEVBUkNISVZPUExBTk8sXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSxcclxuICAgICAgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSVxyXG4gICAgfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yZXNUZXh0byA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmVyTWFyY2Fkb3JUZXh0byhldmVudCl7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IHRydWU7XHJcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBldmVudC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvclRleHRvKCl7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IHRydWU7XHJcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuXHRcdHRoaXMubWFyY2Fkb3JUZXh0by50aXBvUmVwb3J0ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVQT1JURUFSQ0hJVk9QTEFOTztcclxuICB9XHJcblxyXG4gIHZhbGlkYXJNYXJjYWRvclRleHRvKCkgOiBib29sZWFue1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uYWx0byk7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRFWFRPRklKTyA9PSB0aGlzLm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pe1xyXG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLmZvcm1hdG8pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTUFSQ0FET1JURVhUT0RJTkFNSUNPID09IHRoaXMubWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyl7XHJcbiAgICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uYW5jaG8pO1xyXG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyTWFyY2Fkb3JUZXh0bygpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyTWFyY2Fkb3JUZXh0bygpKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gZmFsc2U7XHJcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIGlmICh0aGlzLm1hcmNhZG9yVGV4dG8ubGxhdmUpe1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclRleHRvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JUZXh0by5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJNYXJjYWRvVGV4dG8oZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6IGFzeW5jICgpID0+ICB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tYXJjYWRvclRleHRvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhWE1MKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xyXG4gICAgICB0aXBvUmVwb3J0ZTogJ1gnLFxyXG4gICAgICBvcmlnZW46ICdYJyxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLFxyXG4gICAgICBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJXHJcbiAgICB9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhWE1MID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b01hcmNhZG9yWE1MKCl7XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MLnRpcG9SZXBvcnRlID0gJ1gnO1xyXG4gICAgdGhpcy5tYXJjYWRvclhNTC5vcmlnZW4gPSAnWCc7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmVyTWFyY2Fkb3JYTUwoZXZlbnQpe1xyXG4gICAgdGhpcy5tYXJjYWRvclhNTCA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSB0cnVlO1xyXG4gICAgaWYgICh0aGlzLm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01SJyB8fCB0aGlzLm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJyl7XHJcbiAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyTWFyY2Fkb3JYTUwoKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JYTUwuZGVzY3JpcGNpb24pO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JYTUwudGlwbyk7XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yXHJcbiAgfVxyXG5cclxuICBndWFyZGFyTWFyY2Fkb3JYTUwoKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJNYXJjYWRvclhNTCgpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICBpZiAodGhpcy5tYXJjYWRvclhNTC5sbGF2ZSl7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYXJjYWRvclhNTC5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yWE1MKGV2ZW50KXtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9DYW1wb1RhYmxhWE1MKCl7XHJcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSB0cnVlO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMubWFyY2Fkb3JYTUwubGxhdmVcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpIHtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5tYXJjYWRvclhNTC5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvclhNTCA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MQXN5bmMoKSB7XHJcbiAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMubWFyY2Fkb3JYTUwubGxhdmV9KSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyQ2FtcG9NYXJjYWRvclhNTChjYW1wb01hcmNhZG9yKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY2FtcG9GdWVudGUpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IubWFyY2Fkb3IpO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFncmVnYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvOiBSZXBvcnRlVGFibGFNb2RlbCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUwgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoY2FtcG8ubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNhbXBvLmNvbHVtbmEgPSAwO1xyXG4gICAgICBjYW1wby5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICBjYW1wbyA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUwgPSBmYWxzZTtcclxuICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDYW1wb01hcmNhZG9yWE1MKGV2ZW50LCBvYmpldG8peyBcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIG9iamV0bykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYW1iaWFyVGFiQ29sdW1uYXJpbyhldmVudCl7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmluZGV4KSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5tYXJjYWRvcmVzQ29sdW1uYXJpbyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIGNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBmaWx0cm9Db2x1bW5hQmFzaWNhOiAnTid9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmNvbHVtbmFzQWRpY2lvbmFsZXMgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBmaWx0cm9Db2x1bW5hQmFzaWNhOiAnUyd9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhUmVwb3J0ZUNvbHVtbmFyaW8gPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhbGlkYXJFeGlzdGVKYXNwZXIoKXtcclxuICAgIHRoaXMuY2FyZ2FyQXJjaGl2by5kZXNjYXJnYXJBcmNoaXZvKHRoaXMuZW5jcmlwdGFkb3JBcmNoaXZvLmVuY3JpcHRhcigncmVwb3J0ZXMvJyArIHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnKSwgJ3J1dGFfcGxhbnRpbGxhcycsIHRoaXMuYXBsaWNhY2lvbikuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmV4aXN0ZUphc3BlciA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICkgXHJcbiAgfVxyXG5cclxuICB2ZXJSZXBvcnRlQ29sdW1uYXJpbyhldmVudCl7XHJcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG51ZXZvQ29sdW1uYUJhc2ljYSgpe1xyXG4gICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgIHRoaXMuY29sdW1uYUJhc2ljYS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDb2x1bW5hQmFzaWNhKCl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm5vbWJyZSk7XHJcbiAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKTtcclxuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hKTtcclxuICAgIGlmICh2YWxpZGFkb3Ipe1xyXG4gICAgICBpZiAodGhpcy5pc01vc3RyYXJPcmRlbigpKXtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlbik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXNNb3N0cmFyT3JkZW5Db25zdWx0YSgpKXtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbykge1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsKTtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCk7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKSB7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3JkZXJCeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyB2ZXJpZmljYXJDb2x1bW5hc1ZhbGlkYXMocmVwb3J0ZUNvbHVtbmFyaW9EVE8pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHZhciB0aXBvPXJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG87XHJcblx0XHRpZih0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0dmFyIGZpbHRybz1uZXcgIFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuXHRcdGZpbHRyby5yZXBvcnRlRnVlbnRlID0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8ucmVwb3J0ZUZ1ZW50ZTtcclxuXHRcdGZpbHRyby5kaWZlcmVudGVDb2x1bW5hcmlvID0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8ubGxhdmVUYWJsYTtcclxuXHRcdGZpbHRyby50aXBvID0gdGlwbztcclxuXHRcdHZhciBjYW50aWRhZD0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jYW50aWRhZFJlZ2lzdHJvcyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCBmaWx0cm8pKS50b1Byb21pc2UoKTtcclxuXHRcdGlmKGNhbnRpZGFkPT0wKXtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRpZih0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1dhcm5pbmcoXCJFbCByZXBvcnRlIHNvbG8gcHVlZGUgY29udGVuZXIgMSByZWdpc3RybyBjb24gdGlwbyBcIit0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkFfREVTQyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cdFx0fWVsc2UgaWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQSA9PSByZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1dhcm5pbmcoXCJFbCByZXBvcnRlIHNvbG8gcHVlZGUgY29udGVuZXIgMSByZWdpc3RybyBjb24gdGlwbyBcIit0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NFTERBX0RFU0MpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJDb2x1bW5hQmFzaWNhKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyQ29sdW1uYUJhc2ljYSgpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChhd2FpdCB0aGlzLnZlcmlmaWNhckNvbHVtbmFzVmFsaWRhcyh0aGlzLmNvbHVtbmFCYXNpY2EpKXtcclxuICAgICAgaWYgKHRoaXMuY29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQmFzaWNhKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDb2x1bW5hQmFzaWNhKGV2ZW50KXsgXHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG51ZXZhQ29sdW1uYUFkaWNpb25hbCgpIHtcclxuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbC50aXBvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19BRElDSU9OQUw7XHJcbiAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlQWRpY2lvbmFsKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhckNvbHVtbmFBZGljaW9uYWwoKSB7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwubm9tYnJlKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXMpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlbik7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVyQnkpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlbkNvbnN1bHRhKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyQ29sdW1uYUFkaWNpb25hbCgpIHtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhckNvbHVtbmFBZGljaW9uYWwoKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUFkaWNpb25hbCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hckNvbHVtbmFBZGljaW9uYWwoZXZlbnQpIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvKCkge1xyXG4gICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3JDb2x1bW5hcmlvKGV2ZW50KSB7XHJcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSB7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcik7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8udGlwbyk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3Rybyk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb24pO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSB7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yQ29sdW1uYXJpbygpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yQ29sdW1uYXJpbyhldmVudCkge1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuXHQgKiBQZXJtaXRlIGNvbm9jZXIgc2kgc2UgZGViZSBwcmVzZW50YXIgZW4gbGEgaW50ZXJmYXogbG9zIGNhbXBvcyByZWZlcmVudGVzIGEgb3JkZW4gY29uc3VsdGFcclxuXHQgKiBAcmV0dXJuIFNpIHNlIGRlYmUgbW9zdHJhciBzZSByZXRvcm5hcmEgdHJ1ZSwgZGUgbG8gY29udHJhcmlvIGZhbHNlXHJcblx0ICovXHJcblx0aXNNb3N0cmFyT3JkZW5Db25zdWx0YSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcclxuXHR9XHJcblx0XHJcblxyXG5cdGlzTW9zdHJhck9yZGVuKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvfHxcclxuXHRcdFx0XHR0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG98fHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fTEFCRUwgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHJcblx0fVxyXG5cclxuXHRpc1RpcG9Db2x1bW5hKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xyXG5cdH1cclxuXHRcclxuXHJcblx0aXNUaXBvRmlsYSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcdFxyXG5cdH1cclxuXHJcblx0aXNUaXBvTGFiZWwoKXtcclxuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1x0XHJcblx0fVxyXG5cclxuICBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Z1ZW50ZSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5maWx0cm9PcmlnZW5GdWVudGUodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5GVUVOVEUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRyb09yaWdlbkZ1ZW50ZSh0aXBvOnN0cmluZyk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLnJlcG9ydGVGdWVudGUub3JpZ2VuRnVlbnRlID09IHRpcG87XHJcbiAgfVxyXG59IiwiPHAtdGFiVmlldyAob25DaGFuZ2UpPVwiY2FtYmlhclRhYigkZXZlbnQpXCI+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydleGNlbCcgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3snZGViZScgfCB0cmFuc2xhdGV9fSB7eydpbmRpY2FyJyB8IHRyYW5zbGF0ZX19IHt7J3BsYW50aWxsYScgfCB0cmFuc2xhdGV9fSB7eyd5JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAge3snaG9qYScgfCB0cmFuc2xhdGV9fSB7eydwYXJhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydlc3RhJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAge3snb3BjaW9uJyB8IHRyYW5zbGF0ZX19IHt7J3NlJyB8IHRyYW5zbGF0ZX19IHt7J2FjdGl2ZScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9Ub2RvID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVG9kbzogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIid4bHM7eGxzeCdcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2xhYmVscmFyXT1cIidwbGFudGlsbGEnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvKCRldmVudClcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmhvamFFeGNlbFwiIHNpemU9XCIyNVwiIG1heGxlbmd0aD1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fSB7eydkZScgfCB0cmFuc2xhdGUgfX0ge3snbGEnIHwgdHJhbnNsYXRlIH19IHt7J2hvamEnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9FeGNlbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cC1waWNrTGlzdCBbc291cmNlXT1cImxpc3RhRXhjZWxcIiBbdGFyZ2V0XT1cImxpc3RhTm9FeGNlbFwiIHNvdXJjZUhlYWRlcj1cIkFzb2NpYWRvXCIgc291cmNlRmlsdGVyUGxhY2Vob2xkZXI9XCJBc29jaWFkb1wiXHJcbiAgICAgICAgICAgIHRhcmdldEhlYWRlcj1cIkRlc2Fzb2NpYWRvXCIgW2RyYWdkcm9wXT1cInRydWVcIiBbcmVzcG9uc2l2ZV09XCJ0cnVlXCIgdGFyZ2V0RmlsdGVyUGxhY2Vob2xkZXI9XCJEZXNhc29jaWFkb1wiXHJcbiAgICAgICAgICAgIGZpbHRlckJ5PVwic2ludGF4aXNcIiAob25Tb3VyY2VSZW9yZGVyKT1cIm1vdmVyQUFzb2NpYWRvKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25Nb3ZlQWxsVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG8oJGV2ZW50KVwiIChvbk1vdmVBbGxUb1NvdXJjZSk9XCJtb3ZlckFBc29jaWFkbygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW92ZVRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvKCRldmVudClcIiAob25Nb3ZlVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWV4Y2VsIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ZXhjZWwubm9tYnJlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXBpY2tMaXN0PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yRXhjZWwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yRXhjZWxcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiBbc2VsZWN0aW9uXT1cInJlcG9ydGVNYXJjYWRvckV4Y2VsXCIgW3Jvd3NdPVwiMTBcIlxyXG4gICAgICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yRXhjZWwubGVuZ3RoXCIgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yRXhjZWwubGVuZ3RoID4gMTBcIlxyXG4gICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckV4Y2VsKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IuZGVzY3JpcGNpb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYm9va1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC00IFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybU1hcmNhZG9yRXhjZWxcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwY2lvblwiIHNpemU9XCIyNVwiIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbe2xhYmVsOiAnSW1hZ2VuIEZpamEnLCB2YWx1ZTogJ0lGJ30sIHtsYWJlbDogJ01hcmNhZG9yJywgdmFsdWU6ICdNQSd9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cInRpcG9cIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgW2hpZGRlbl09XCJlc0ltYWdlbkZpamFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiICBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3ZhbG9yJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cImVzTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiW3tsYWJlbDogJ1VuaWNhJywgdmFsdWU6ICdVJ30sIHtsYWJlbDogJ0NhZGEgRW1wcmVzYScsIHZhbHVlOiAnQyd9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cIm9yaWdlblwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yaWdlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJlc01hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm86ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiAgW2xhYmVscmFyXT1cIigncmVjdXJzb3MnIHwgdHJhbnNsYXRlKVwiIFtsYWJlbGFyY2hdPVwiJ3JlY3Vyc28nIHwgdHJhbnNsYXRlXCIgW21vc3RyYXJYXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9zdHJhcm9ibGljYXJnb109XCIhKCF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5leG9Qcm9waWVkYWRdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID09J0MnID8gbGxhdmVFbXByZXNhOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWREZVNpc3RlbWFdPVwidHJ1ZVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiAgcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JFeGNlbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd1bmljbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmRlc2NhcmdhckZ1ZW50ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NhcmdhcmRvYycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmdlbmVyYXJQaW5cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydnZW5lcmFycGluJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNhbXBvQWdydXBhY2lvblBsYW5pbGxhXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhZ3J1cGFycG9yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ub21icmVBZ3J1cGFjaW9uUGxhbmlsbGFcIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm9hZ3J1cGFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvUGxhbmlsbGFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbCA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b0luZGl2aWR1YWw6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbHJhcl09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm9QbGFuaWxsYSgkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cC10YWJWaWV3ID5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZCBtYi0yXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvcigpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yZXNcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3NlbGVjdGlvbl09XCJyZXBvcnRlTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yZXMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3Jlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3IoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5kZXNjcmlwY2lvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9EYXRvTWFyY2Fkb3Jlcyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvID09ICdJRicgPyBtYXJjYWRvci50ZXh0b1JlZ2lzdHJvIDogbWFyY2Fkb3Iubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybU1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eydpbmRpcXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VuJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2Rlc2VhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydhcGFyZXpjYScgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydpbmZvcm1hY2lvbicgfCB0cmFuc2xhdGV9fS4ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3sncHJpbWVyYScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2VzJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IDEuPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNQScsJ0lNJywnTVInLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YWJsYVwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnSUYnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdVbmljYScsIHZhbHVlOiAnVSd9LCB7bGFiZWw6ICdDYWRhIEVtcHJlc2EnLCB2YWx1ZTogJ0MnfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwib3JpZ2VuXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmlnZW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdJRicgfHwgIXJlcG9ydGVNYXJjYWRvci5vcmlnZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiBbbGFiZWxyYXJdPVwiJ3JlY3Vyc29zJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuZXhvUHJvcGllZGFkXT1cInJlcG9ydGVNYXJjYWRvci5vcmlnZW4gPT0nQycgPyBsbGF2ZUVtcHJlc2E6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGllZGFkRGVTaXN0ZW1hXT1cInRydWVcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnTUEnLCdJTScsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIGZvcm1Db250cm9sTmFtZT1cInJlcG9ydGVDb2x1bW5hXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNQSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybWF0b1wiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0lNJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGZvcm1Db250cm9sTmFtZT1cImFuY2hvXCIgW21heGxlbmd0aF09XCI1XCI+IDwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnSU0nLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgZm9ybUNvbnRyb2xOYW1lPVwiYWx0b1wiIFttYXhsZW5ndGhdPVwiNVwiPiA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWx0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJncnVwbzFcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dydXBvMScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8yXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncnVwbzInIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8zXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncnVwbzMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZmluYWxHcnVwb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmluYWxncnVwbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0ZXh0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgZm9ybUNvbnRyb2xOYW1lPVwidGllbmVTcWxcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzcWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0dyYWZpY29fSkZDXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9HcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dyYWZpY2EnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydTJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cInF1ZXJ5XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb25zdWx0YScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIShbJ01SJywnVEInXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbykgJiYgKFsnTiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCkpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFGdWVudGVzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZ1ZW50ZVwiIG9wdGlvbkxhYmVsPVwiZGVzY3JpcGNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCIhcmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yR3JhZmljb1wiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yZ3JhZmljYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnQSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveFwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX0gWDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydBJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG95XCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fSBZPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYmFuZGFcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2xvcmRpbmFtaWNvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCIhcmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImFuY2hvSmFzcGVyTGFiZWxcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydudW1lcm9jYXRlZ29yaWFzJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIShbJ01SJywnVEInXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbykgJiYgKFsnTiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCkpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaWx0cm9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2ZpbHRybycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyB7e3JlcG9ydGVNYXJjYWRvci5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnIH19XCIgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvci5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3IoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3IoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvciAmJiByZXBvcnRlTWFyY2Fkb3IubGxhdmUgIT0gbnVsbCAmJiAocmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ01SJyB8fCByZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b0NhbXBvVGFibGEoKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFDYW1wb3NNYXJjYWRvci5sZW5ndGhcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YUNhbXBvc01hcmNhZG9yLmxlbmd0aCA+IDEwXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydjYW1wbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCIqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj57eydtZWRpZGFzJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj4gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY2FtcG9GdWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmZvcm1hdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIudGlwb1wiIGFwcGVuZFRvPVwiYm9keVwiIFthdXRvWkluZGV4XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci50aXBvID09J0knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuYW5jaG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuYWx0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9ySW5zZXJ0YXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlID0gZmFsc2VcIiBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNhbXBvIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCAgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNvbHVtbmFcIiBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY29sdW1uYX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uY2FtcG9GdWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5jYW1wb0Z1ZW50ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uZm9ybWF0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmZvcm1hdG99fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFHcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FtcG8udGlwb1wiIGFwcGVuZFRvPVwiYm9keVwiIFthdXRvWkluZGV4XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8udGlwbyB8IHJlcG9ydGVGdWVudGVQaXBlIDonbGlzdGFSZWN1cnNvR3JhZmljYSd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvLnRpcG8gPT0nSSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5hbmNob1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uYWx0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvLnRpcG8gPT0nSSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYW5jaG8nIHwgdHJhbnNsYXRlfX06IHt7Y2FtcG8uYW5jaG99fSA8YnIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydhbHRvJyB8IHRyYW5zbGF0ZX19OiB7e2NhbXBvLmFsdG99fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDYW1wb01hcmNhZG9yKGNhbXBvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvckFzeW5jKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc2Vjb25kYXJ5IG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIChjbGljayk9XCJlbGltaW5hckNhbXBvTWFyY2Fkb3IoJGV2ZW50LGNhbXBvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgICAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eydhcmNoaXZvJyB8IHRyYW5zbGF0ZSB9fXNcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTidcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvU29wb3J0ZSgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVNvcG9ydGVzXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFTb3BvcnRlcy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFTb3BvcnRlcy5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0NSVcIj57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snYXJjaGl2bycgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIlRhYmxhTnVldm9SZWdpc3Ryb1wiICpuZ0lmPVwidmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNvcG9ydGVJbmdyZXNhci5kZXNjcmlwY2lvblwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwic29wb3J0ZUluZ3Jlc2FyLmFyY2hpdm9JbmRpdmlkdWFsID8gc29wb3J0ZUluZ3Jlc2FyLmFyY2hpdm9JbmRpdmlkdWFsOiAnJ1wiIFtsYWJlbGFyY2hdPVwiJ2FyY2hpdm8nIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vc3RyYXJMYWJlbElucHV0XT1cImZhbHNlXCIgW21vc3RyYXJvYmxpY2FyZ29dPVwiISghdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbCkgJiYgY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm9Tb3BvcnRlKCRldmVudCwgc29wb3J0ZUluZ3Jlc2FyKVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhclNvcG9ydGUoc29wb3J0ZUluZ3Jlc2FyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbGFyU29wb3J0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1zb3BvcnRlIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cInNvcG9ydGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic29wb3J0ZS5kZXNjcmlwY2lvblwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c29wb3J0ZS5kZXNjcmlwY2lvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPyBzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vc3RyYXJMYWJlbElucHV0XT1cImZhbHNlXCIgW21vc3RyYXJvYmxpY2FyZ29dPVwiISghdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwpICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm9Tb3BvcnRlKCRldmVudCwgc29wb3J0ZSlcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENIRUNLIEdVQVJEQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhclNvcG9ydGUoc29wb3J0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDQU5DRUxBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbGFyRWRpY2lvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIChjbGljayk9XCJpbmljaWFyRWRpY2lvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc2Vjb25kYXJ5IG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFTElNSU5BUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIChjbGljayk9XCJlbGltaW5hclNvcG9ydGUoJGV2ZW50LCBzb3BvcnRlKVwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgIDwvcC10YWJWaWV3PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncmVwb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3snZGluYW1pY28nIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmRvYmxlTGluZWFcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkb2JsZWxpbmVhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGl0dWxvUGFyYW1ldHJvXCIgc2l6ZT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb0phc3BlclwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZCBiYWNrZ3JvdW5kLTEwMFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVzdGFydFwiICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19nZW5lcmFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImdlbmVyYXJKYXNwZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwicGkgcGktZG93bmxvYWRcIiAqbmdJZj1cImV4aXN0ZUphc3BlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19kZXNjYXJnYXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZGVzY2FyZ2FySmFzcGVyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwiYmFuZGFTZWxlY2Npb25hZGEua2V5XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwicmVncmVzYXJCYW5kYVNlbGVjY2lvbmFkYSgpXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydiYW5kYXMnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhVGlwb0JhbmRhXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiBbcm93c109XCIxMFwiXHJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwibGlzdGFUaXBvQmFuZGEubGVuZ3RoXCIgW3BhZ2luYXRvcl09XCJsaXN0YVRpcG9CYW5kYS5sZW5ndGggPiAxMFwiXHJcbiAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJCYW5kYSgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyQmFuZGEoJGV2ZW50KVwiICpuZ0lmPVwiIWJhbmRhU2VsZWNjaW9uYWRhLmtleVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2JhbmRhJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iYW5kYT5cclxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiYmFuZGFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiYW5kYS52YWx1ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICA8cC10YWJWaWV3ICpuZ0lmPVwiYmFuZGFTZWxlY2Npb25hZGEua2V5ICYmIHZlclRhYkJhbmRhXCI+XHJcbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2NhcmFjdGVyaXN0aWNhcycgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFbJ2RldGFsbGUnLCdzdW1tYXJ5J10uaW5jbHVkZXMoYmFuZGFTZWxlY2Npb25hZGEua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUJhbmRhLnRvdGFsZXNcIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndG90YWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlQmFuZGEudGl0dWxvXCIgbWF4bGVuZ3RoPVwiMjAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1mbG9wcHktc2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZ3VhcmRhckNhcmFjdGVyaXN0aWNhQmFuZGEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3tiYW5kYVNlbGVjY2lvbmFkYS52YWx1ZX19XCIgKm5nSWY9XCIhbnVldmFCYW5kYVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b01hcmNhZG9yRGluYW1pY28oKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCIgKm5nSWY9XCIhbnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFNYXJjYWRvckRpbmFtaWNvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljby5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFNYXJjYWRvckRpbmFtaWNvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhbnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlck1hcmNhZG9yRGluYW1pY28oJGV2ZW50KVwiICAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvckRpbmFtaWNvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydiYW5kYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2V0aXF1ZXRhJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWRpbmFtaWNvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImRpbmFtaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLmJhbmRhID8gZGluYW1pY28uYWx0byA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28ubWFyY2Fkb3J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLmRlc2NyaXBjaW9uIDogJyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLmZvcm1hdG8gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e1snZGV0YWxsZSddLmluY2x1ZGVzKGRpbmFtaWNvLmJhbmRhKSA/IGRpbmFtaWNvLmFuY2hvIDogJyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLm9wZXJhY2lvbiA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgIG1iLTJcIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkIG10LTNcIj57eydpbmRpcXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VuJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2Rlc2VhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydhcGFyZXpjYScgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydpbmZvcm1hY2lvbicgfCB0cmFuc2xhdGV9fS4ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3sncHJpbWVyYScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2VzJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IDEuPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7YmFuZGFTZWxlY2Npb25hZGEudmFsdWV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIiAqbmdJZj1cIm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtUmVwb3J0ZURpbmFtaWNvXCIgY2xhc3M9XCJwLWZsdWlkIGdyaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DYW1wb0phc3BlckRpbmFtaWNvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cInRpcG9DYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJ2YWx1ZVwiIG9wdGlvblZhbHVlPVwia2V5XCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jYW1wbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvRGF0b1NpbnRheGlzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvRGF0b1wiIG9wdGlvbkxhYmVsPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwia2V5XCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9kYXRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgZm9ybUNvbnRyb2xOYW1lPVwiYWx0b1wiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvclwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSAmJiByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlICYmIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImZpbHRyb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2ludGF4aXMnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiICBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBncmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNiBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgdGV4dC1iYXNlIG1sLTFcIj57eydyZXN1bHRhZG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09J0MnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNiBtYi0wXCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHRleHQtYmFzZSBtbC0xXCIgPnt7J2xhYmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImZvcm1hdG9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgPT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9KYXNwZXJMYWJlbFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCInZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVzdWx0YWRvWFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd4JyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd4JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cIidkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXN1bHRhZG9ZXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3knIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQycgJiYgJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG95XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3knIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFBbGluZWFjaW9uXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvUmVwb3J0ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaW5lYWNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQWxpbmVhY2lvblwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaW5lYWNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8gPT0gJ04nICYmIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcGVyYWNpb25cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZpZWxkc2V0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e3JlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhckNvbHVtbmFEaW5hbWljbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hRGluYW1pY28oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgPC9wLXRhYlZpZXc+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydyZXBvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd0ZXh0bycgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVGV4dG9cIiBzaXplPVwiNTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjIwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2VwYXJhZG9yZXNcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuc2VwYXJhZG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhyZXBvcnRlRnVlbnRlLnNlcGFyYWRvcikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2VwYXJhZG9yJyB8IHRyYW5zbGF0ZSB9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvVGV4dG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphclNlcGFyYWRvcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JUZXh0bygpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFxyXG4gICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yZXNUZXh0by5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJNYXJjYWRvclRleHRvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvclRleHRvKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY3RleHRvPlxyXG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjdGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8udGlwb0dyYWZpY28gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9NYXJjYWRvcmVzVGV4dG8nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5ub21icmVDb2x1bW5hfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5mb3JtYXRvfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5hbHRvfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclRleHRvXCI+ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm10LTNcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclRleHRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28gPT0gJ0QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5yZXBvcnRlQ29sdW1uYVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5mb3JtYXRvXCIgbWF4bGVuZ3RoPVwiNTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uZm9ybWF0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmZvcm1hdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e21hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28gPT0gJ0QnID8gKCdmb3JtYXRvJyB8IHRyYW5zbGF0ZSkrJyonIDogKCdkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUpKycqJyB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8uYW5jaG9cIiBtYXhsZW5ndGg9XCIyMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFuY2hvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uYW5jaG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmFsdG9cIiBtYXhsZW5ndGg9XCIyMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFsdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbHRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yVGV4dG8ubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e21hcmNhZG9yVGV4dG8ubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvclRleHRvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWFyY2Fkb3JUZXh0by5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb1RleHRvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLm5vbWJyZVRhYmxhXCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZXRhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHAtcGlja0xpc3QgW3NvdXJjZV09XCJsaXN0YVRhYmxhXCIgW3RhcmdldF09XCJsaXN0YU5vVGFibGFcIiBzb3VyY2VIZWFkZXI9XCJBc29jaWFkb1wiIHNvdXJjZUZpbHRlclBsYWNlaG9sZGVyPVwiQXNvY2lhZG9cIlxyXG4gICAgICAgICAgICB0YXJnZXRIZWFkZXI9XCJEZXNhc29jaWFkb1wiIFtkcmFnZHJvcF09XCJ0cnVlXCIgW3Jlc3BvbnNpdmVdPVwidHJ1ZVwiIHRhcmdldEZpbHRlclBsYWNlaG9sZGVyPVwiRGVzYXNvY2lhZG9cIlxyXG4gICAgICAgICAgICBmaWx0ZXJCeT1cIm5vbWJyZVwiICpuZ0lmPVwiaXNGdWVudGUoKVwiIChvblNvdXJjZVJlb3JkZXIpPVwicmVvcmRlclRhYmxhKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25Nb3ZlQWxsVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG9UYWJsYSgkZXZlbnQpXCIgKG9uTW92ZUFsbFRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvVGFibGEoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbk1vdmVUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkb1RhYmxhKCRldmVudClcIiAob25Nb3ZlVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG9UYWJsYSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtdGFibGEgcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3t0YWJsYS5ub21icmV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtcGlja0xpc3Q+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydhcmNoaXZveG1sJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRhZ0VuY2FiZXphZG9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhZ2VuY2FiZXphZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRhZ0NpZXJyZUVuY2FiZXphZG9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhZ2NpZXJyZWVuY2FiZXphZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5lc3RydWN0dXJhUmVnaXN0cm9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhZ3JlZ2lzdHJvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9YbWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JYTUwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JYTUxcIj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUxcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MID0gZmFsc2U7XCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVhNTFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxyXG4gICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFYTUwubGVuZ3RoXCJcclxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVhNTC5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JYTUxcIlxyXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yWE1MKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmN0ZXh0bz5cclxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY3RleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLmRlc2NyaXBjaW9ufX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by50aXBvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvRGF0b01hcmNhZG9yZXMnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5ub21icmVDb2x1bW5hfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5tYXJjYWRvcn19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG10LTNcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUxcIj4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibXQtM1wiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPnt7J2RldGFsbGUnIHwgdHJhbnNsYXRlfX08L2g1PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZGVzY3JpcGNpb25cIiBtYXhsZW5ndGg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclhNTFwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwudGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNQScsJ01SJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwubWFyY2Fkb3JcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLm1hcmNhZG9yXCIgbWF4bGVuZ3RoPVwiNVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWJsYScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTUEnXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01BJ1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5mb3JtYXRvXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwudGV4dG9SZWdpc3Ryb1wiID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RleHRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNUicsJ1RCJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhRnVlbnRlc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmZ1ZW50ZVwiIG9wdGlvbkxhYmVsPVwiZGVzY3JpcGNpb25cIiBvcHRpb25WYWx1ZT1cImxsYXZlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Z1ZW50ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiWydNUicsJ1RCJ10uaW5jbHVkZXMobWFyY2Fkb3JYTUwudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5maWx0cm9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2ZpbHRybycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZXN0cnVjdHVyYVRhYmxhWE1MXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydlc3RydWN0dXJhdGFibGEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7bWFyY2Fkb3JYTUwubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e21hcmNhZG9yWE1MLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JYTUwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtYXJjYWRvclhNTC5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MICYmIG1hcmNhZG9yWE1MLmxsYXZlICE9IG51bGwgJiYgKG1hcmNhZG9yWE1MLnRpcG8gPT0gJ01SJyB8fCBtYXJjYWRvclhNTC50aXBvID09ICdUQicpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9DYW1wb1RhYmxhWE1MKClcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YUNhbXBvc01hcmNhZG9yWE1MXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTC5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTC5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J2NhbXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCVcIj4gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIlRhYmxhTnVldm9SZWdpc3Ryb1wiICpuZ0lmPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5jYW1wb0Z1ZW50ZVwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwubWFyY2Fkb3JcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmZvcm1hdG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY2FtcG8gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNhbXBvRnVlbnRlXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY2FtcG9GdWVudGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5tYXJjYWRvclwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLm1hcmNhZG9yfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uZm9ybWF0b1wiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5mb3JtYXRvfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MQXN5bmMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFTElNSU5BUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDYW1wb01hcmNhZG9yWE1MKCRldmVudCxjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPHAtYWNjb3JkaW9uIChvbk9wZW4pPVwiY2FtYmlhclRhYkNvbHVtbmFyaW8oJGV2ZW50KVwiID5cclxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtzZWxlY3RlZF09XCJ0cnVlXCIgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J2NvbHVtbmFzYmFzaWNhcyd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9Db2x1bW5hQmFzaWNhKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlOyBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYXNiYXNpY2FzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhUmVwb3J0ZUNvbHVtbmFyaW9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlclJlcG9ydGVDb2x1bW5hcmlvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJSZXBvcnRlQ29sdW1uYXJpbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iZWFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImJlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5ub21icmVDb2x1bW5hfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi50aXBvIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFUaXBvQ29sdW1uYSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLm9yZGVufX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5vcGVyYWNpb24gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YU9wZXJhY2lvbid9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgICpuZ0lmPVwidmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eubm9tYnJlXCIgbWF4bGVuZ3RoPVwiMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLnRpcG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EudGlwbykgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLnRpcG8pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiY29sdW1uYUJhc2ljYS50aXBvID09ICdEJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9wZXJhY2lvbmVzQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcGVyYWNpb25cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc1RpcG9Db2x1bW5hKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29wZXJhY2lvbmhvcml6b250YWwnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICBmaWxhIE9wZXJhY2lvbiBWZXJ0aWNhbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbFwiIG1heGxlbmd0aD1cIjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYW9wZXJhY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcGVyYWNpb24gVmVydGljaWFsIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uVmVydGljYWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uVmVydGljYWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb252ZXJ0aWNhbCcgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JkZW4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc01vc3RyYXJPcmRlbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3JkZW5cIiBtYXhsZW5ndGg9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZW4pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JkZW5hbWllbnRvIEZpbGFzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvTGFiZWwoKSB8fCBpc1RpcG9GaWxhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcmRlbmFtaWVudG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9yZGVyQnlcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuYW1pZW50bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuYW1pZW50byBEYXRvcyBkZSBsYSBjb25zdWx0YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzTW9zdHJhck9yZGVuQ29uc3VsdGEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGFcIiBtYXhsZW5ndGg9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZW5Db25zdWx0YSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuY29uc3VsdGEnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e2NvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tjb2x1bW5hQmFzaWNhLmxsYXZlVGFibGEgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJDb2x1bW5hQmFzaWNhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hckNvbHVtbmFCYXNpY2EoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9wLWZpZWxkc2V0PlxyXG4gICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxyXG4gICAgICAgIDwvcC1hY2NvcmRpb24+XHJcbiAgICAgICAgPHAtYWNjb3JkaW9uIChvbk9wZW4pPVwiY2FtYmlhclRhYkNvbHVtbmFyaW8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J2RhdG9zYWRpY2lvbmFsZXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW8gPyByZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW86ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCIneGxzO3hsc3g7eGxzbSdcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2xhYmVscmFyXT1cIidwbGFudGlsbGEnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvQ29sdW1uYXJpbygkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ob2phRXhjZWxcIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fSB7eydkZScgfCB0cmFuc2xhdGUgfX0ge3snbGEnIHwgdHJhbnNsYXRlIH19IHt7J2hvamEnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmZpbGFJbmljaW9Db2x1bW5hcmlvXCIgbWF4bGVuZ3RoPVwiNVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWxhaW5pY2lvY29sdW1uYXJpbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9Db2x1bW5hcmlvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnNpbnRheGlzQ29sdW1uYXJpb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpc2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZhQ29sdW1uYUFkaWNpb25hbCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTsgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJjb2x1bW5hc0FkaWNpb25hbGVzXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY29sdW1uYWFkaWNpb25hbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJjb2x1bW5hYWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tjb2x1bW5hYWRpY2lvbmFsLm5vbWJyZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2NvbHVtbmFhZGljaW9uYWwub3JkZW59fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5ub21icmVcIiBtYXhsZW5ndGg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5ub21icmUpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpYXMnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5vcmRlblwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbikgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcmRlbmFtaWVudG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZXJCeVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5hbWllbnRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YVwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5jb25zdWx0YScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXNcIiBtYXhsZW5ndGg9XCI0MDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXMpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7Y29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYUFkaWNpb25hbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbmFBZGljaW9uYWwubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQWRpY2lvbmFsKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cclxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eydtYXJjYWRvcmVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvckNvbHVtbmFyaW8oKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJtYXJjYWRvcmVzQ29sdW1uYXJpby5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW8ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckNvbHVtbmFyaW8oJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckNvbHVtbmFyaW8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwb21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5tYXJjYWRvcn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YVRpcG9NYXJjYWRvcid9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uXCIgbWF4bGVuZ3RoPVwiNDAwMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yXCIgbWF4bGVuZ3RoPVwiNTBcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvckNvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yQ29sdW1uYXJpby50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3Ryb1wiIG1heGxlbmd0aD1cIjQwMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndmFsb3InIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e21hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWFyY2Fkb3JDb2x1bW5hcmlvLmxsYXZlVGFibGEgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cclxuICAgICAgICA8L3AtYWNjb3JkaW9uPlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG48L3AtdGFiVmlldz4iXX0=
|