1 Introducción

La informalidad laboral constituye una de las principales problemáticas del mercado laboral en Colombia, debido a sus efectos negativos sobre la estabilidad económica de los trabajadores y su acceso limitado a sistemas de protección social, como la seguridad social en pensiones. De acuerdo con organismos internacionales como la Organización Internacional del Trabajo (OIT), la informalidad laboral continúa siendo una característica predominante en las economías en desarrollo, donde una proporción considerable de la población ocupada trabaja bajo condiciones de vulnerabilidad y sin cobertura adecuada. De acuerdo con diversas estadísticas nacionales, una proporción significativa de la población ocupada se encuentra en condiciones de informalidad, lo que refleja desigualdades estructurales asociadas a factores socioeconómicos y demográficos. Para 2024 cerca del 48% de las personas ocupadas en Colombia cotizaban a pensión, lo que representa una mejora gradual frente a años anteriores, como en 2017 siendo del 35%, aunque aún persisten amplias brechas en términos de formalidad laboral. E 2021 y 2024 la cobertura pensional en la población ocupada aumentó aproximadamente cinco puntos porcentuales, pasando de 43% a 48%, impulsada principalmente por la recuperación del empleo asalariado formal tras la pandemia y por políticas como el Programa de Empleo Formal (PAEF) y la reforma pensional en discusión (DANE, 2025; OIT, 2025).
En este contexto, resulta relevante analizar los determinantes que inciden en la probabilidad de que un individuo se desempeñe en un empleo formal o informal. La clasificación de los trabajadores en estas categorías permite comprender mejor la dinámica del mercado laboral colombiano y aporta evidencia empírica útil para el diseño de políticas públicas orientadas a la formalización del empleo. Adicionalmente, entender qué características sociodemográficas y laborales favorecen la cotización pensional ayuda a focalizar los esfuerzos del Estado en poblaciones específicas, como los jóvenes, las mujeres, los trabajadores independientes o quienes habitan en zonas rurales del país.
El presente estudio se desarrolla a partir de la base de datos de la Gran Encuesta Integrada de Hogares (GEIH) 2025 del DANE, considerando una muestra de individuos mayores de edad en el territorio colombiano. Se define como variable dependiente el tipo de empleo, clasificado de forma binaria en formal e informal, utilizando como criterio la cotización al sistema de pensiones: los individuos que cotizan se consideran empleados formales, mientras que aquellos que no lo hacen se clasifican como informales. Como variables explicativas se incluyen características sociodemográficas y económicas tales como la edad, el nivel educativo, el estrato socioeconómico, la ocupación, el ingreso, la zona de residencia (urbana o rural) y el sexo. Estas variables han sido ampliamente reconocidas como factores determinantes en la inserción laboral y la calidad del empleo.
El análisis se enmarca dentro del aprendizaje supervisado, el cual, según James et al. (2021), consiste en modelar la relación entre una o más variables predictoras X Y una variable respuesta y, utilizando un conjunto de datos etiquetados para predecir el comportamiento de nuevos datos. Este enfoque permite estimar la probabilidad de pertenencia a cada categoría de la variable dependiente (formal o informal). De esta forma, el aprendizaje supervisado facilita la identificación de patrones y la construcción de modelos predictivos con aplicaciones en el mercado laboral colombiano.
Desde el punto de vista metodológico, se emplean técnicas de aprendizaje supervisado para la clasificación de los individuos, específicamente los modelos K-Nearest Neighbors (KNN) y regresión logística (Logit). El objetivo es comparar el desempeño de ambos modelos en términos de su capacidad predictiva y determinar cuál resulta más adecuado para explicar la formalidad laboral en el contexto analizado.

2 Metodología

2.1 Fuente de datos

Para el desarrollo del presente estudio se utilizó la base de datos de la Gran Encuesta Integrada de Hogares (GEIH) 2025, elaborada por el DANE. Esta encuesta recopila información sociodemográfica y laboral de los hogares colombianos, permitiendo analizar las condiciones de empleo de la población.
La muestra analizada está compuesta por individuos mayores de edad registrados en la GEIH 2025, seleccionados para el desarrollo del presente estudio. A partir de esta información, se construyó una base depurada enfocada en el análisis de la formalidad laboral en Colombia.

2.2 Definición de variables

La variable dependiente del estudio corresponde a la cotización a pensión de las personas, definida de manera binaria, donde 1 representa empleo formal y 0 empleo informal. Esta clasificación se construyó a partir de la variable “cotiza pensión”, considerando como trabajadores formales a aquellos individuos que realizan aportes al sistema pensional, mientras que quienes no cotizan fueron clasificados como trabajadores informales. Este criterio se utiliza como aproximación a la formalidad laboral debido a su relación con el acceso a la seguridad social y el cumplimiento de las condiciones laborales formales.
Como variables independientes se incluyeron la edad, el sexo, la zona de residencia, el estrato socioeconómico, el nivel educativo, la antigüedad laboral, tipo de empleo y los ingresos. Estas variables fueron seleccionadas debido a su relevancia en el análisis del mercado laboral, ya que permiten capturar características sociodemográficas y económicas que pueden influir en la probabilidad de que un individuo pertenezca al sector formal o informal de la economía.

2.3 Preprocesamiento y limpieza de datos

Inicialmente, la información proveniente de distintos archivos de la GEIH fue organizada y consolidada utilizando ciclos for en R, lo que permitió seleccionar y unificar las variables necesarias para el análisis.Posteriormente, se realizó un proceso de depuración de la base de datos mediante la identificación y eliminación de registros con valores faltantes utilizando funciones como is.na(). Esto permitió trabajar únicamente con observaciones completas y garantizar una mayor consistencia en la estimación de los modelos.
Adicionalmente, se construyó una matriz de correlación con el fin de analizar la relación existente entre algunas variables explicativas y evaluar posibles problemas de multicolinealidad dentro del modelo. Finalmente, se tomó una muestra aleatoria de 10.000 observaciones para la construcción de la base de análisis, debido a que la base depurada contaba con aproximadamente 200.000 registros. Esta reducción se realizó con el propósito de mejorar la eficiencia computacional y facilitar el procesamiento de los modelos de clasificación. Posteriormente, la muestra fue dividida en un conjunto de entrenamiento de 7500 observaciones y un conjunto de prueba de 2500 observaciones.

2.4 Modelo de regresión logística (Logit)

El primer modelo implementado es el modelo de regresión logística (Logit), ampliamente utilizado en problemas donde la variable dependiente es de naturaleza binaria. En este caso, el modelo permite estimar la probabilidad de que un individuo pertenezca a la categoría de empleo formal a partir de un conjunto de variables sociodemográficas y económicas. La regresión logística modela la relación entre las variables explicativas y la probabilidad de ocurrencia del evento de interés mediante una función logística, expresada de la siguiente manera:
\[ P(Y = 1) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \dots + \beta_n X_n)}} \]
Donde P(Y=1) representa la probabilidad de que un individuo tenga un empleo formal y n los coeficientes asociados a las variables explicativas del modelo.El modelo fue estimado utilizando la muestra de entrenamiento y posteriormente evaluado sobre la muestra de prueba.

2.5 Modelo K-Nearest Neighbors (KNN)

Como segundo método de clasificación se implementó K-Nearest Neighbors (KNN), un algoritmo de aprendizaje supervisado utilizado para problemas de clasificación. Este método clasifica cada observación de acuerdo con la categoría predominante entre sus vecinos más cercanos, utilizando medidas de distancia entre individuos con características similares. Para la implementación del modelo se utilizó un valor de K=3 y además se buscó el mejor valor K, tomando como referencia el código guía proporcionado para el desarrollo de la actividad. El modelo fue estimado utilizando la muestra de entrenamiento y posteriormente evaluado sobre la muestra de prueba.

2.6 Evaluación del desempeño

El desempeño de los modelos KNN y Logit fue evaluado utilizando la muestra de prueba, con el fin de comparar su capacidad de clasificación sobre observaciones no utilizadas durante el entrenamiento. Para ello, se analizaron las predicciones obtenidas y la capacidad de los modelos para identificar correctamente los tipos de empleo.
library(dplyr)
library(tidyverse)
library(gt)
library(scales)
library(caret)
library(pROC)
library(broom)
library(class)
library(ROCR)
library(corrplot)
library(DT)
library(ggplot2)
library(sf)
library(plotly)
ruta_base <- "~/ESTUDIO/Semestres/2026-1/GESTION DE DATOS/Taller 2/Base taller 2/"

mis_variables <- c("DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR", "AREA", "CLASE",
                   "P6040", "P6220", "P6050", "P6430", "P6426", "P3271", "P6920",
                   "P6500", "P3042")

leer_y_filtrar <- function(ruta_archivo) {
  df <- read_csv2(ruta_archivo, col_types = cols(.default = "c"), show_col_types = FALSE)
  df_limpio <- df %>% select(any_of(mis_variables))
  return(df_limpio)
}

meses_nombres <- c("Enero 2025", "Febrero 2025", "Marzo 2025", "Abril 2025", 
                   "Mayo 2025", "Junio 2025", "Julio 2025", "Agosto 2025", 
                   "Septiembre 2025", "Octubre 2025", "Noviembre 2025", "Diciembre 2025")

lista_anual <- list()

for (mes in meses_nombres) {
  ruta_completa <- paste0(ruta_base, mes)
  archivos <- list.files(path = ruta_completa, pattern = "\\.csv$", full.names = TRUE, ignore.case = TRUE)
  
  if (length(archivos) > 0) {
    message(paste("Leyendo:", mes))
  
    base_mes <- archivos %>% 
      map(leer_y_filtrar) %>% 
      reduce(full_join, by = intersect(names(.), c("DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR"))) %>% 
      mutate(MES_ETIQUETA = mes)
    
    lista_anual[[mes]] <- base_mes
    rm(base_mes)
    gc()
  } else {
    message(paste("No se encontraron archivos en:", mes))
  }
}

base_final_2025 <- bind_rows(lista_anual)

base_final_2025 <- base_final_2025 %>% 
  rename(
    Cotizando_Pension = P6920,
    Tipo_de_empleo = P6430,
    Cuanto_lleva_trabajando = P6426,
    Ingresos_recibidos = P6500,
    Edad = P6040,
    Nivel_educativo = P3042,
    Estrato_socioeconomico = P6050,
    Zona = CLASE,
    Area_metropolitana = AREA,
    Sexo = P3271,
    Mes = MES_ETIQUETA
  ) %>% 
  select(-DIRECTORIO, -SECUENCIA_P) %>% 
  relocate(Mes, .before = 1)

base_final_2025 <- base_final_2025 %>%
  mutate(
    Edad = as.numeric(Edad),
    Cotizando_Pension = as.numeric(Cotizando_Pension),
    Tipo_de_empleo = as.numeric(Tipo_de_empleo),
    Cuanto_lleva_trabajando = as.numeric(Cuanto_lleva_trabajando),
    Ingresos_recibidos = as.numeric(Ingresos_recibidos),
    Nivel_educativo = as.numeric(Nivel_educativo),
    Estrato_socioeconomico = as.numeric(Estrato_socioeconomico),
    Zona = as.numeric(Zona),
    Area_metropolitana = as.numeric(Area_metropolitana),
    Sexo = as.numeric(Sexo)
  )
base_final_2025 <- base_final_2025 %>%
  mutate(Cotizando_Pension = ifelse(Cotizando_Pension == 1, 1, 0))

base_final_2025 <- base_final_2025 %>%
  filter(rowSums(is.na(.)) <= 0)

write_csv(base_final_2025, "base_final_2025.csv")

base_muestra <- read_csv("base_muestra.csv")
write_csv(base_muestra, "base_muestra.csv")
base_muestra %>%
  slice_head(n = 1000) %>%
  mutate(
    Mes_num = match(str_extract(Mes, "^[^ ]+"), 
                    c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", 
                      "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"))
  ) %>%
  arrange(Mes_num) %>%
  select(-Mes_num) %>%
  mutate(
    Sexo = ifelse(Sexo == 1, "Masculino", ifelse(Sexo == 2, "Femenino", "ND")),
    Zona = ifelse(Zona == 1, "Urbano", ifelse(Zona == 2, "Rural", "ND")),
    Cotizando_Pension = ifelse(Cotizando_Pension == 1, "Si cotiza", ifelse(Cotizando_Pension == 0, "No cotiza", "ND")),
    Tipo_de_empleo = case_when(
      Tipo_de_empleo == 1 ~ "Obrero/empleado particular",
      Tipo_de_empleo == 2 ~ "Obrero/empleado gobierno",
      Tipo_de_empleo == 3 ~ "Empleado domestico",
      Tipo_de_empleo == 4 ~ "Trabajador familiar",
      Tipo_de_empleo == 5 ~ "Trabajador cuenta propia",
      Tipo_de_empleo == 6 ~ "Patron/empleador",
      Tipo_de_empleo == 7 ~ "Trabajador sin remuneracion",
      TRUE ~ "ND"
    ),
    Ingresos_recibidos = ifelse(is.na(Ingresos_recibidos), "ND", 
                                paste0("$", format(Ingresos_recibidos, big.mark = ".", decimal.mark = ","))),
    Nivel_educativo = case_when(
      Nivel_educativo == 1 ~ "Ninguno",
      Nivel_educativo == 2 ~ "Preescolar",
      Nivel_educativo == 3 ~ "Primaria",
      Nivel_educativo == 4 ~ "Secundaria",
      Nivel_educativo == 5 ~ "Media academica",
      Nivel_educativo == 6 ~ "Media tecnica",
      Nivel_educativo == 7 ~ "Normalista",
      Nivel_educativo == 8 ~ "Tecnica profesional",
      Nivel_educativo == 9 ~ "Tecnologica",
      Nivel_educativo == 10 ~ "Universitaria",
      Nivel_educativo == 11 ~ "Especializacion",
      Nivel_educativo == 12 ~ "Maestria",
      Nivel_educativo == 13 ~ "Doctorado",
      TRUE ~ "ND"
    )
  ) %>%
  select(Mes, Edad, Sexo, Zona, Nivel_educativo, Tipo_de_empleo, Ingresos_recibidos, Cotizando_Pension) %>%
  gt() %>%
  tab_header(
    title = md("**Base de Datos GEIH 2025**"),
    subtitle = md("Gran Encuesta Integrada de Hogares - DANE - Primeros 1,000 registros")
  ) %>%
  cols_label(
    Mes = "Mes",
    Edad = "Edad",
    Sexo = "Sexo",
    Zona = "Zona",
    Nivel_educativo = "Nivel educativo",
    Tipo_de_empleo = "Tipo de empleo",
    Ingresos_recibidos = "Ingresos",
    Cotizando_Pension = "Cotiza pension"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  opt_row_striping() %>%
  tab_options(
    table.width = pct(100),
    table.font.size = "small",
    heading.title.font.size = "large",
    heading.subtitle.font.size = "small",
    table.border.top.color = "#4A3F55",
    table.border.bottom.color = "#4A3F55"
  ) %>%
  tab_source_note("Fuente: DANE - Gran Encuesta Integrada de Hogares (GEIH) 2025. Calculos grupo 2") %>%
  htmltools::div(style = "max-height: 500px; overflow-y: auto;")
Base de Datos GEIH 2025
Gran Encuesta Integrada de Hogares - DANE - Primeros 1,000 registros
Mes Edad Sexo Zona Nivel educativo Tipo de empleo Ingresos Cotiza pension
Enero 2025 47 Masculino Urbano Especializacion Obrero/empleado gobierno $ 4.500.000 Si cotiza
Enero 2025 63 Masculino Rural Secundaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 24 Femenino Urbano Media academica Obrero/empleado particular $ 4.000.000 No cotiza
Enero 2025 50 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 No cotiza
Enero 2025 57 Femenino Urbano Primaria Obrero/empleado particular $ 900.000 No cotiza
Enero 2025 50 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Enero 2025 31 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Enero 2025 50 Femenino Urbano Media academica Obrero/empleado particular $ 480.000 No cotiza
Enero 2025 35 Masculino Urbano Media academica Obrero/empleado particular $ 8.000.000 Si cotiza
Enero 2025 34 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 25 Femenino Urbano Media academica Empleado domestico $ 450.000 No cotiza
Enero 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 1.800.000 Si cotiza
Enero 2025 36 Masculino Rural Primaria Obrero/empleado particular $ 1.300.000 No cotiza
Enero 2025 27 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.560.000 Si cotiza
Enero 2025 39 Femenino Rural Primaria Obrero/empleado particular $ 300.000 No cotiza
Enero 2025 29 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 20 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Enero 2025 40 Femenino Urbano Media academica Obrero/empleado particular $ 1.420.000 Si cotiza
Enero 2025 39 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 44 Masculino Urbano Primaria Trabajador sin remuneracion $ 960.000 No cotiza
Enero 2025 22 Femenino Urbano Universitaria Obrero/empleado particular $ 1.000.000 Si cotiza
Enero 2025 31 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.000 Si cotiza
Enero 2025 23 Femenino Urbano Secundaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 40 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.462.000 No cotiza
Enero 2025 34 Masculino Urbano Universitaria Obrero/empleado particular $ 2.500.000 No cotiza
Enero 2025 58 Masculino Urbano Secundaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 54 Masculino Urbano Normalista Obrero/empleado gobierno $ 2.600.000 Si cotiza
Enero 2025 32 Femenino Urbano Especializacion Obrero/empleado particular $ 2.000.000 Si cotiza
Enero 2025 28 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 21 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 45 Masculino Urbano Secundaria Obrero/empleado particular $ 1.000.000 No cotiza
Enero 2025 41 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.200.000 No cotiza
Enero 2025 24 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 21 Femenino Urbano Universitaria Obrero/empleado gobierno $ 650.000 Si cotiza
Enero 2025 45 Femenino Urbano Primaria Empleado domestico $ 400.000 No cotiza
Enero 2025 23 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.900.000 Si cotiza
Enero 2025 45 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 3.500.000 Si cotiza
Enero 2025 21 Femenino Urbano Universitaria Obrero/empleado particular $ 1.500.000 No cotiza
Enero 2025 23 Femenino Urbano Media academica Empleado domestico $ 400.000 No cotiza
Enero 2025 19 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.500.000 Si cotiza
Enero 2025 43 Femenino Urbano Secundaria Obrero/empleado particular $ 120.000 No cotiza
Enero 2025 56 Masculino Urbano Media academica Obrero/empleado gobierno $ 3.993.410 Si cotiza
Enero 2025 25 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.700.000 Si cotiza
Enero 2025 44 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Enero 2025 49 Masculino Rural Primaria Trabajador sin remuneracion $ 1.423.000 No cotiza
Enero 2025 21 Masculino Urbano Secundaria Obrero/empleado particular $ 800.000 No cotiza
Enero 2025 35 Masculino Urbano Universitaria Obrero/empleado particular $ 3.900.000 Si cotiza
Enero 2025 29 Femenino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Enero 2025 29 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 47 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 54 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Enero 2025 22 Femenino Urbano Universitaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 48 Masculino Urbano Secundaria Obrero/empleado particular $ 1.400.000 Si cotiza
Enero 2025 51 Femenino Urbano Secundaria Empleado domestico $ 600.000 No cotiza
Enero 2025 29 Masculino Urbano Universitaria Obrero/empleado particular $ 2.000.000 No cotiza
Enero 2025 45 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 900.000 No cotiza
Enero 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 30 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 21 Masculino Urbano Universitaria Obrero/empleado particular $ 240.000 No cotiza
Enero 2025 54 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Enero 2025 23 Femenino Urbano Secundaria Obrero/empleado particular $ 600.000 No cotiza
Enero 2025 26 Masculino Urbano Secundaria Obrero/empleado particular $ 800.000 No cotiza
Enero 2025 23 Femenino Urbano Secundaria Obrero/empleado particular $ 1.200.000 No cotiza
Enero 2025 24 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 37 Masculino Urbano Media academica Obrero/empleado gobierno $ 3.300.000 Si cotiza
Enero 2025 25 Femenino Urbano Media academica Obrero/empleado particular $ 2.000.000 No cotiza
Enero 2025 41 Femenino Urbano Universitaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 24 Masculino Urbano Universitaria Obrero/empleado particular $ 1.000.000 No cotiza
Enero 2025 33 Femenino Urbano Maestria Obrero/empleado gobierno $ 3.600.000 Si cotiza
Enero 2025 23 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.450.000 Si cotiza
Enero 2025 19 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Enero 2025 58 Femenino Rural Maestria Obrero/empleado gobierno $ 6.000.000 Si cotiza
Enero 2025 19 Femenino Rural Media academica Obrero/empleado particular $ 1.520.000 No cotiza
Enero 2025 28 Masculino Rural Media academica Trabajador sin remuneracion $ 1.200.000 No cotiza
Enero 2025 57 Femenino Urbano Primaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 29 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Enero 2025 55 Masculino Rural Primaria Trabajador sin remuneracion $ 1.200.000 No cotiza
Enero 2025 32 Femenino Urbano Especializacion Obrero/empleado particular $ 3.000.000 Si cotiza
Enero 2025 50 Masculino Urbano Primaria Trabajador sin remuneracion $ 850.000 No cotiza
Enero 2025 49 Masculino Urbano Secundaria Obrero/empleado particular $ 1.300.000 Si cotiza
Enero 2025 38 Masculino Urbano Tecnologica Obrero/empleado particular $ 3.000.000 Si cotiza
Enero 2025 49 Femenino Urbano Primaria Obrero/empleado particular $ 300.000 No cotiza
Febrero 2025 31 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 45 Masculino Urbano Universitaria Obrero/empleado particular $ 2.900.000 Si cotiza
Febrero 2025 18 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.000 Si cotiza
Febrero 2025 45 Femenino Urbano Media academica Empleado domestico $ 1.200.000 No cotiza
Febrero 2025 54 Femenino Urbano Maestria Obrero/empleado gobierno $ 4.000.000 Si cotiza
Febrero 2025 40 Masculino Rural Primaria Obrero/empleado particular $ 500.000 No cotiza
Febrero 2025 25 Femenino Urbano Universitaria Obrero/empleado particular $ 2.400.000 Si cotiza
Febrero 2025 50 Femenino Urbano Media academica Empleado domestico $ 1.650.000 Si cotiza
Febrero 2025 24 Masculino Urbano Universitaria Obrero/empleado particular $ 1.500.000 Si cotiza
Febrero 2025 50 Masculino Urbano Primaria Obrero/empleado particular $ 1.350.000 Si cotiza
Febrero 2025 30 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.600.000 Si cotiza
Febrero 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 2.800.000 No cotiza
Febrero 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 42 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 65 Masculino Rural Secundaria Empleado domestico $ 900.000 No cotiza
Febrero 2025 23 Femenino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Febrero 2025 37 Femenino Urbano Tecnologica Obrero/empleado particular $ 840.000 No cotiza
Febrero 2025 23 Masculino Rural Primaria Obrero/empleado particular $ 600.000 No cotiza
Febrero 2025 36 Femenino Urbano Especializacion Obrero/empleado particular $ 5.000.000 Si cotiza
Febrero 2025 26 Masculino Urbano Universitaria Obrero/empleado particular $ 2.900.000 Si cotiza
Febrero 2025 38 Femenino Urbano Universitaria Obrero/empleado particular $ 4.500.000 Si cotiza
Febrero 2025 52 Femenino Urbano Universitaria Obrero/empleado particular $ 4.000.000 Si cotiza
Febrero 2025 22 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.400.000 Si cotiza
Febrero 2025 35 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Febrero 2025 57 Masculino Urbano Especializacion Obrero/empleado gobierno $ 7.000.000 Si cotiza
Febrero 2025 47 Femenino Urbano Secundaria Empleado domestico $ 300.000 No cotiza
Febrero 2025 51 Femenino Urbano Universitaria Obrero/empleado particular $ 1.200.000 No cotiza
Febrero 2025 23 Femenino Urbano Tecnica profesional Empleado domestico $ 500.000 No cotiza
Febrero 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Febrero 2025 56 Femenino Urbano Universitaria Obrero/empleado gobierno $ 6.000.000 Si cotiza
Febrero 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Febrero 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.720.000 Si cotiza
Febrero 2025 45 Femenino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 44 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.600.000 Si cotiza
Febrero 2025 60 Masculino Urbano Normalista Obrero/empleado gobierno $ 3.000.000 Si cotiza
Febrero 2025 50 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 2.800.000 Si cotiza
Febrero 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Febrero 2025 60 Femenino Urbano Especializacion Obrero/empleado gobierno $ 6.500.000 Si cotiza
Febrero 2025 39 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.800.000 Si cotiza
Febrero 2025 41 Masculino Urbano Universitaria Obrero/empleado particular $ 2.200.000 Si cotiza
Febrero 2025 69 Femenino Urbano Media academica Obrero/empleado gobierno $ 1.420.000 Si cotiza
Febrero 2025 33 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 51 Femenino Urbano Primaria Obrero/empleado particular $ 1.000.000 No cotiza
Febrero 2025 61 Masculino Urbano Primaria Obrero/empleado particular $ 1.500.000 No cotiza
Febrero 2025 30 Masculino Rural Secundaria Obrero/empleado particular $ 1.500.000 No cotiza
Febrero 2025 38 Femenino Urbano Secundaria Obrero/empleado particular $ 1.000.000 No cotiza
Febrero 2025 59 Masculino Urbano Primaria Obrero/empleado particular $ 1.600.000 Si cotiza
Febrero 2025 37 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.950.000 Si cotiza
Febrero 2025 35 Masculino Urbano Secundaria Obrero/empleado particular $ 1.400.000 Si cotiza
Febrero 2025 24 Femenino Urbano Tecnologica Obrero/empleado particular $ 2.200.000 Si cotiza
Febrero 2025 33 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.700.000 Si cotiza
Febrero 2025 77 Femenino Urbano Primaria Empleado domestico $ 600.000 No cotiza
Febrero 2025 31 Masculino Urbano Secundaria Obrero/empleado particular $ 300.000 No cotiza
Febrero 2025 20 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Febrero 2025 73 Masculino Urbano Primaria Obrero/empleado particular $ 1.200.000 No cotiza
Febrero 2025 35 Femenino Urbano Universitaria Obrero/empleado particular $ 3.700.000 Si cotiza
Febrero 2025 53 Femenino Urbano Tecnologica Empleado domestico $ 600.000 No cotiza
Febrero 2025 27 Femenino Urbano Especializacion Obrero/empleado particular $ 4.270.500 Si cotiza
Febrero 2025 36 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 58 Femenino Urbano Universitaria Obrero/empleado gobierno $ 2.259.000 Si cotiza
Febrero 2025 47 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 26 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 26 Femenino Urbano Tecnica profesional Empleado domestico $ 1.000.000 No cotiza
Febrero 2025 43 Masculino Urbano Media academica Obrero/empleado particular $ 600.000 No cotiza
Febrero 2025 23 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 54 Femenino Urbano Universitaria Obrero/empleado particular $ 4.000.000 Si cotiza
Febrero 2025 27 Femenino Urbano Especializacion Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 34 Masculino Urbano Universitaria Obrero/empleado gobierno $ 3.500.000 Si cotiza
Febrero 2025 30 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.800.000 Si cotiza
Febrero 2025 35 Masculino Urbano Especializacion Obrero/empleado particular $ 2.200.000 Si cotiza
Febrero 2025 30 Masculino Rural Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 46 Masculino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Febrero 2025 36 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 20 Masculino Rural Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 46 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 50 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Febrero 2025 43 Femenino Urbano Especializacion Obrero/empleado particular $ 4.000.000 Si cotiza
Febrero 2025 52 Masculino Urbano Media academica Obrero/empleado particular $ 3.500.000 Si cotiza
Febrero 2025 54 Masculino Urbano Primaria Trabajador sin remuneracion $ 1.300.000 No cotiza
Febrero 2025 46 Femenino Urbano Primaria Empleado domestico $ 400.000 No cotiza
Febrero 2025 35 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 39 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 40 Femenino Urbano Media academica Obrero/empleado particular $ 1.630.500 Si cotiza
Marzo 2025 42 Masculino Urbano Secundaria Obrero/empleado particular $ 900.000 No cotiza
Marzo 2025 63 Femenino Urbano Universitaria Obrero/empleado particular $10.000.000 No cotiza
Marzo 2025 34 Masculino Urbano Secundaria Obrero/empleado particular $ 1.600.000 Si cotiza
Marzo 2025 38 Masculino Urbano Especializacion Obrero/empleado gobierno $10.000.000 Si cotiza
Marzo 2025 47 Femenino Rural Primaria Trabajador sin remuneracion $ 600.000 No cotiza
Marzo 2025 38 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 No cotiza
Marzo 2025 39 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 54 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.500.000 Si cotiza
Marzo 2025 31 Masculino Urbano Universitaria Obrero/empleado particular $ 2.750.000 Si cotiza
Marzo 2025 63 Masculino Urbano Secundaria Obrero/empleado particular $ 1.600.000 No cotiza
Marzo 2025 26 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.990.000 Si cotiza
Marzo 2025 32 Femenino Urbano Media academica Obrero/empleado particular $ 900.000 No cotiza
Marzo 2025 21 Femenino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Marzo 2025 57 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.800.000 Si cotiza
Marzo 2025 46 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Marzo 2025 19 Femenino Urbano Tecnica profesional Obrero/empleado gobierno $ 996.500 Si cotiza
Marzo 2025 49 Femenino Urbano Media academica Obrero/empleado particular $ 1.450.000 Si cotiza
Marzo 2025 31 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 69 Masculino Urbano Maestria Obrero/empleado gobierno $ 6.000.000 No cotiza
Marzo 2025 27 Masculino Urbano Universitaria Obrero/empleado particular $ 1.450.000 Si cotiza
Marzo 2025 29 Masculino Urbano Especializacion Obrero/empleado particular $ 8.000.000 Si cotiza
Marzo 2025 69 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 2.050.000 No cotiza
Marzo 2025 53 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.800.000 Si cotiza
Marzo 2025 45 Femenino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Marzo 2025 27 Femenino Rural Secundaria Obrero/empleado particular $ 600.000 No cotiza
Marzo 2025 29 Femenino Urbano Universitaria Obrero/empleado particular $ 4.000.000 Si cotiza
Marzo 2025 30 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 4.200.000 Si cotiza
Marzo 2025 48 Masculino Urbano Primaria Obrero/empleado particular $ 2.500.000 Si cotiza
Marzo 2025 58 Masculino Urbano Secundaria Obrero/empleado particular $ 2.200.000 Si cotiza
Marzo 2025 38 Masculino Urbano Secundaria Obrero/empleado particular $ 1.800.000 Si cotiza
Marzo 2025 34 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 53 Femenino Urbano Maestria Obrero/empleado gobierno $ 4.000.000 Si cotiza
Marzo 2025 44 Masculino Urbano Media academica Obrero/empleado particular $ 1.625.000 Si cotiza
Marzo 2025 38 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 27 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Marzo 2025 73 Femenino Rural Primaria Obrero/empleado particular $ 280.000 No cotiza
Marzo 2025 35 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Marzo 2025 62 Masculino Urbano Universitaria Obrero/empleado particular $ 1.500.000 No cotiza
Marzo 2025 62 Femenino Urbano Universitaria Obrero/empleado gobierno $ 2.500.000 Si cotiza
Marzo 2025 46 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 41 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.000 Si cotiza
Marzo 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Marzo 2025 31 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 51 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.000 Si cotiza
Marzo 2025 21 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Marzo 2025 30 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Marzo 2025 38 Femenino Rural Media academica Obrero/empleado particular $ 1.423.000 Si cotiza
Marzo 2025 60 Masculino Urbano Universitaria Obrero/empleado particular $ 2.500.000 Si cotiza
Marzo 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 1.450.000 Si cotiza
Marzo 2025 53 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Marzo 2025 56 Masculino Urbano Universitaria Obrero/empleado gobierno $ 3.200.000 Si cotiza
Marzo 2025 33 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.000 Si cotiza
Marzo 2025 42 Femenino Urbano Secundaria Empleado domestico $ 600.000 No cotiza
Marzo 2025 32 Femenino Urbano Universitaria Obrero/empleado gobierno $ 2.800.000 Si cotiza
Marzo 2025 32 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 53 Femenino Urbano Primaria Empleado domestico $ 320.000 No cotiza
Marzo 2025 45 Masculino Urbano Especializacion Obrero/empleado particular $ 3.000.000 Si cotiza
Marzo 2025 42 Masculino Urbano Especializacion Obrero/empleado particular $ 4.000.000 Si cotiza
Marzo 2025 45 Femenino Urbano Universitaria Obrero/empleado particular $ 2.400.000 Si cotiza
Marzo 2025 59 Masculino Urbano Media academica Obrero/empleado particular $ 2.500.000 No cotiza
Marzo 2025 20 Femenino Urbano Media academica Obrero/empleado particular $ 400.000 No cotiza
Marzo 2025 55 Masculino Urbano Primaria Obrero/empleado particular $ 1.400.000 No cotiza
Marzo 2025 22 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 42 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.700.000 Si cotiza
Marzo 2025 65 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.300.000 No cotiza
Marzo 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 46 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 2.200.000 Si cotiza
Marzo 2025 33 Masculino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Marzo 2025 22 Femenino Rural Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Marzo 2025 55 Femenino Urbano Secundaria Empleado domestico $ 1.100.000 No cotiza
Marzo 2025 40 Femenino Urbano Media academica Empleado domestico $ 15.000 No cotiza
Marzo 2025 53 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Marzo 2025 17 Masculino Urbano Media academica Obrero/empleado particular $ 800.000 No cotiza
Marzo 2025 46 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.000 No cotiza
Marzo 2025 35 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 53 Femenino Urbano Primaria Empleado domestico $ 1.423.500 Si cotiza
Marzo 2025 43 Femenino Urbano Secundaria Empleado domestico $ 1.585.000 Si cotiza
Marzo 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 29 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 Si cotiza
Marzo 2025 18 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Marzo 2025 55 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 3.300.000 Si cotiza
Marzo 2025 39 Masculino Urbano Media academica Obrero/empleado particular $ 2.600.000 Si cotiza
Marzo 2025 43 Femenino Urbano Primaria Empleado domestico $ 170.000 No cotiza
Marzo 2025 59 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Marzo 2025 29 Masculino Urbano Universitaria Obrero/empleado particular $ 2.600.000 Si cotiza
Abril 2025 48 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.900.000 Si cotiza
Abril 2025 69 Masculino Urbano Universitaria Obrero/empleado gobierno $ 5.000.000 Si cotiza
Abril 2025 55 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 53 Masculino Urbano Maestria Obrero/empleado particular $ 3.500.000 Si cotiza
Abril 2025 30 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.700.000 Si cotiza
Abril 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Abril 2025 56 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 30 Femenino Urbano Secundaria Obrero/empleado particular $ 360.000 No cotiza
Abril 2025 57 Femenino Urbano Secundaria Empleado domestico $ 800.000 No cotiza
Abril 2025 54 Masculino Urbano Secundaria Obrero/empleado particular $ 1.456.300 Si cotiza
Abril 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 52 Masculino Urbano Secundaria Obrero/empleado particular $ 800.000 Si cotiza
Abril 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 63 Femenino Rural Primaria Empleado domestico $ 600.000 No cotiza
Abril 2025 35 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 27 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 No cotiza
Abril 2025 59 Femenino Urbano Primaria Empleado domestico $ 150.000 No cotiza
Abril 2025 57 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 59 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Abril 2025 23 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 29 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.000.000 No cotiza
Abril 2025 40 Femenino Urbano Media tecnica Obrero/empleado particular $ 840.000 No cotiza
Abril 2025 41 Masculino Rural Primaria Empleado domestico $ 1.000.000 Si cotiza
Abril 2025 50 Masculino Rural Primaria Obrero/empleado particular $ 1.500.000 Si cotiza
Abril 2025 41 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 4.762.000 Si cotiza
Abril 2025 33 Femenino Urbano Media academica Empleado domestico $ 700.000 No cotiza
Abril 2025 30 Masculino Rural Media academica Trabajador sin remuneracion $ 1.423.500 No cotiza
Abril 2025 57 Masculino Urbano Media academica Obrero/empleado particular $ 3.200.000 Si cotiza
Abril 2025 31 Femenino Urbano Especializacion Obrero/empleado particular $ 5.000.000 Si cotiza
Abril 2025 26 Masculino Urbano Universitaria Obrero/empleado particular $12.000.000 Si cotiza
Abril 2025 39 Femenino Urbano Especializacion Obrero/empleado particular $ 3.200.000 Si cotiza
Abril 2025 20 Masculino Urbano Secundaria Obrero/empleado particular $ 1.200.000 No cotiza
Abril 2025 47 Masculino Urbano Maestria Obrero/empleado gobierno $ 7.000.000 Si cotiza
Abril 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Abril 2025 59 Femenino Urbano Media academica Obrero/empleado particular $ 2.800.000 No cotiza
Abril 2025 34 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 750.000 No cotiza
Abril 2025 52 Masculino Urbano Universitaria Obrero/empleado gobierno $ 2.500.000 Si cotiza
Abril 2025 61 Masculino Urbano Tecnologica Obrero/empleado gobierno $ 2.850.000 Si cotiza
Abril 2025 21 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.000 Si cotiza
Abril 2025 41 Masculino Urbano Especializacion Obrero/empleado gobierno $ 4.400.000 Si cotiza
Abril 2025 76 Femenino Urbano Ninguno Empleado domestico $ 800.000 No cotiza
Abril 2025 54 Femenino Urbano Media academica Obrero/empleado particular $ 2.500.000 Si cotiza
Abril 2025 51 Masculino Urbano Secundaria Obrero/empleado particular $ 1.500.000 Si cotiza
Abril 2025 23 Femenino Urbano Normalista Obrero/empleado particular $ 1.450.000 Si cotiza
Abril 2025 52 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 Si cotiza
Abril 2025 42 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 Si cotiza
Abril 2025 42 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.409.000 Si cotiza
Abril 2025 44 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Abril 2025 40 Masculino Urbano Universitaria Obrero/empleado particular $ 6.500.000 Si cotiza
Abril 2025 24 Masculino Rural Primaria Trabajador sin remuneracion $ 1.423.500 Si cotiza
Abril 2025 41 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 28 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 2.000.000 Si cotiza
Abril 2025 64 Femenino Urbano Universitaria Obrero/empleado gobierno $ 4.000.000 Si cotiza
Abril 2025 27 Masculino Urbano Secundaria Obrero/empleado particular $ 1.650.000 No cotiza
Abril 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 55 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 35 Femenino Urbano Media tecnica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 50 Femenino Urbano Tecnologica Obrero/empleado particular $ 2.400.000 Si cotiza
Abril 2025 23 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 51 Femenino Urbano Media academica Empleado domestico $ 700.000 No cotiza
Abril 2025 51 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 Si cotiza
Abril 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Abril 2025 31 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 28 Femenino Urbano Secundaria Empleado domestico $ 1.200.000 No cotiza
Abril 2025 21 Femenino Urbano Media academica Obrero/empleado particular $ 840.000 No cotiza
Abril 2025 66 Masculino Urbano Primaria Obrero/empleado particular $ 1.300.000 No cotiza
Abril 2025 64 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Abril 2025 40 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.400.000 Si cotiza
Abril 2025 30 Femenino Urbano Media academica Obrero/empleado particular $ 600.000 No cotiza
Abril 2025 62 Masculino Urbano Primaria Obrero/empleado particular $ 240.000 No cotiza
Abril 2025 20 Masculino Rural Media academica Obrero/empleado particular $ 1.423.500 No cotiza
Abril 2025 39 Femenino Urbano Media academica Empleado domestico $ 600.000 No cotiza
Abril 2025 40 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 50 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Abril 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Abril 2025 44 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 Si cotiza
Abril 2025 55 Masculino Urbano Secundaria Obrero/empleado particular $ 2.500.000 Si cotiza
Abril 2025 55 Femenino Urbano Universitaria Obrero/empleado gobierno $12.000.000 Si cotiza
Abril 2025 55 Femenino Urbano Especializacion Obrero/empleado gobierno $ 5.337.285 Si cotiza
Abril 2025 57 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.900.000 No cotiza
Abril 2025 23 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.623.500 Si cotiza
Abril 2025 39 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 3.200.000 Si cotiza
Mayo 2025 52 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Mayo 2025 76 Masculino Urbano Primaria Obrero/empleado particular $ 600.000 No cotiza
Mayo 2025 66 Masculino Urbano Universitaria Obrero/empleado gobierno $ 2.500.000 Si cotiza
Mayo 2025 32 Femenino Urbano Universitaria Obrero/empleado particular $ 1.600.000 Si cotiza
Mayo 2025 21 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 Si cotiza
Mayo 2025 36 Femenino Urbano Universitaria Obrero/empleado particular $ 1.200.000 No cotiza
Mayo 2025 36 Femenino Urbano Secundaria Empleado domestico $ 700.000 No cotiza
Mayo 2025 49 Masculino Urbano Especializacion Obrero/empleado particular $10.000.000 Si cotiza
Mayo 2025 53 Femenino Urbano Secundaria Empleado domestico $ 240.000 No cotiza
Mayo 2025 27 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.900.000 Si cotiza
Mayo 2025 25 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Mayo 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Mayo 2025 25 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.500.000 No cotiza
Mayo 2025 43 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Mayo 2025 18 Femenino Urbano Media academica Empleado domestico $ 500.000 No cotiza
Mayo 2025 34 Femenino Urbano Especializacion Obrero/empleado particular $ 2.847.000 Si cotiza
Mayo 2025 39 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 38 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.000.000 Si cotiza
Mayo 2025 22 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 48 Masculino Urbano Universitaria Obrero/empleado gobierno $ 3.400.000 Si cotiza
Mayo 2025 74 Masculino Urbano Doctorado Obrero/empleado particular $10.000.000 No cotiza
Mayo 2025 35 Femenino Urbano Tecnologica Obrero/empleado particular $ 2.800.000 Si cotiza
Mayo 2025 34 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 2.600.000 Si cotiza
Mayo 2025 39 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 42 Masculino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 Si cotiza
Mayo 2025 54 Masculino Urbano Especializacion Obrero/empleado particular $35.000.000 Si cotiza
Mayo 2025 20 Femenino Urbano Media academica Obrero/empleado particular $ 600.000 No cotiza
Mayo 2025 24 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.000 Si cotiza
Mayo 2025 59 Femenino Urbano Maestria Obrero/empleado gobierno $ 6.000.000 No cotiza
Mayo 2025 52 Masculino Urbano Maestria Obrero/empleado gobierno $ 6.400.000 Si cotiza
Mayo 2025 35 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Mayo 2025 44 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.450.000 Si cotiza
Mayo 2025 28 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 29 Masculino Urbano Secundaria Obrero/empleado particular $ 2.500.000 No cotiza
Mayo 2025 52 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 40 Femenino Urbano Maestria Obrero/empleado gobierno $ 6.458.000 Si cotiza
Mayo 2025 43 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 21 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 51 Masculino Rural Ninguno Trabajador sin remuneracion $ 600.000 No cotiza
Mayo 2025 26 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 32 Femenino Urbano Universitaria Obrero/empleado particular $ 1.400.000 Si cotiza
Mayo 2025 48 Femenino Urbano Primaria Obrero/empleado particular $ 650.000 No cotiza
Mayo 2025 51 Masculino Rural Primaria Obrero/empleado particular $ 1.200.000 No cotiza
Mayo 2025 33 Masculino Urbano Media academica Obrero/empleado particular $ 2.500.000 No cotiza
Mayo 2025 49 Femenino Rural Especializacion Obrero/empleado particular $ 5.694.000 Si cotiza
Mayo 2025 52 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.800.000 Si cotiza
Mayo 2025 42 Masculino Urbano Universitaria Obrero/empleado particular $ 2.500.000 Si cotiza
Mayo 2025 23 Masculino Urbano Universitaria Obrero/empleado particular $ 2.100.000 Si cotiza
Mayo 2025 20 Masculino Urbano Universitaria Obrero/empleado particular $ 280.000 No cotiza
Mayo 2025 51 Masculino Urbano Tecnologica Obrero/empleado particular $ 2.000.000 Si cotiza
Mayo 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Mayo 2025 50 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 3.000.000 Si cotiza
Mayo 2025 19 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 600.000 No cotiza
Mayo 2025 54 Masculino Urbano Maestria Obrero/empleado gobierno $ 5.000.000 Si cotiza
Mayo 2025 24 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 27 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 71 Masculino Urbano Primaria Obrero/empleado particular $ 300.000 No cotiza
Mayo 2025 21 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 62 Masculino Urbano Primaria Obrero/empleado particular $ 1.780.000 Si cotiza
Mayo 2025 53 Masculino Urbano Secundaria Obrero/empleado particular $ 1.500.000 No cotiza
Mayo 2025 59 Femenino Urbano Media academica Empleado domestico $ 100.000 Si cotiza
Mayo 2025 56 Femenino Urbano Tecnologica Obrero/empleado particular $ 2.400.000 Si cotiza
Mayo 2025 32 Masculino Urbano Secundaria Obrero/empleado particular $ 1.500.000 No cotiza
Mayo 2025 22 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.800.000 Si cotiza
Mayo 2025 61 Masculino Urbano Secundaria Obrero/empleado particular $ 728.000 No cotiza
Mayo 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 1.600.000 Si cotiza
Mayo 2025 53 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 2.773.000 Si cotiza
Mayo 2025 37 Masculino Rural Media academica Trabajador sin remuneracion $ 600.000 No cotiza
Mayo 2025 36 Masculino Rural Primaria Trabajador sin remuneracion $ 1.300.000 No cotiza
Mayo 2025 52 Masculino Urbano Maestria Obrero/empleado gobierno $ 5.000.000 Si cotiza
Mayo 2025 38 Femenino Urbano Universitaria Obrero/empleado gobierno $ 1.800.000 Si cotiza
Mayo 2025 27 Masculino Urbano Secundaria Obrero/empleado particular $ 960.000 No cotiza
Mayo 2025 22 Masculino Urbano Universitaria Obrero/empleado particular $ 1.200.000 No cotiza
Mayo 2025 36 Femenino Urbano Media academica Empleado domestico $ 700.000 No cotiza
Mayo 2025 26 Masculino Urbano Media academica Obrero/empleado particular $ 2.100.000 Si cotiza
Mayo 2025 51 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Mayo 2025 33 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 25 Masculino Urbano Universitaria Obrero/empleado particular $ 2.847.000 Si cotiza
Mayo 2025 25 Masculino Urbano Tecnologica Obrero/empleado particular $ 2.500.000 Si cotiza
Mayo 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 51 Masculino Urbano Secundaria Obrero/empleado particular $ 1.500.000 No cotiza
Mayo 2025 28 Masculino Rural Secundaria Obrero/empleado particular $ 1.700.000 No cotiza
Mayo 2025 29 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 32 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Mayo 2025 38 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 Si cotiza
Mayo 2025 39 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Junio 2025 27 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.500.000 Si cotiza
Junio 2025 37 Masculino Urbano Media tecnica Obrero/empleado particular $ 900.000 No cotiza
Junio 2025 22 Masculino Urbano Universitaria Obrero/empleado particular $ 800.000 No cotiza
Junio 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 2.100.000 Si cotiza
Junio 2025 43 Masculino Urbano Secundaria Obrero/empleado particular $ 1.400.000 No cotiza
Junio 2025 36 Femenino Urbano Primaria Empleado domestico $ 450.000 No cotiza
Junio 2025 53 Masculino Urbano Universitaria Obrero/empleado gobierno $ 2.400.000 Si cotiza
Junio 2025 25 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Junio 2025 53 Femenino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 55 Masculino Urbano Primaria Obrero/empleado particular $ 1.400.000 Si cotiza
Junio 2025 38 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.300.000 Si cotiza
Junio 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Junio 2025 62 Masculino Urbano Primaria Trabajador sin remuneracion $ 1.200.000 No cotiza
Junio 2025 45 Femenino Urbano Primaria Empleado domestico $ 900.000 No cotiza
Junio 2025 59 Femenino Urbano Secundaria Empleado domestico $ 1.423.500 Si cotiza
Junio 2025 45 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.000 Si cotiza
Junio 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Junio 2025 27 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.500.000 No cotiza
Junio 2025 22 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Junio 2025 51 Masculino Rural Secundaria Trabajador sin remuneracion $ 640.000 No cotiza
Junio 2025 35 Masculino Urbano Primaria Obrero/empleado particular $ 1.500.000 No cotiza
Junio 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Junio 2025 24 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 24 Masculino Urbano Tecnologica Obrero/empleado particular $ 2.000.000 Si cotiza
Junio 2025 34 Masculino Urbano Tecnologica Obrero/empleado particular $ 2.600.000 Si cotiza
Junio 2025 37 Masculino Urbano Especializacion Obrero/empleado gobierno $ 3.800.000 Si cotiza
Junio 2025 31 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 39 Femenino Urbano Secundaria Obrero/empleado particular $ 1.400.000 No cotiza
Junio 2025 49 Femenino Urbano Universitaria Obrero/empleado particular $ 3.500.000 Si cotiza
Junio 2025 40 Femenino Urbano Primaria Obrero/empleado particular $ 1.700.000 No cotiza
Junio 2025 64 Masculino Urbano Primaria Obrero/empleado particular $ 1.400.000 No cotiza
Junio 2025 43 Femenino Urbano Especializacion Obrero/empleado particular $ 4.000.000 Si cotiza
Junio 2025 29 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Junio 2025 40 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.426.000 Si cotiza
Junio 2025 53 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.400.000 No cotiza
Junio 2025 51 Femenino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Junio 2025 40 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Junio 2025 61 Femenino Urbano Media tecnica Obrero/empleado particular $ 1.000.000 No cotiza
Junio 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.000 Si cotiza
Junio 2025 43 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 34 Femenino Urbano Especializacion Obrero/empleado particular $ 4.000.000 Si cotiza
Junio 2025 29 Femenino Urbano Media academica Obrero/empleado particular $ 300.000 No cotiza
Junio 2025 22 Masculino Urbano Universitaria Obrero/empleado particular $ 1.900.000 Si cotiza
Junio 2025 35 Masculino Urbano Maestria Obrero/empleado gobierno $ 7.000.000 Si cotiza
Junio 2025 17 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 680.000 No cotiza
Junio 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 320.000 No cotiza
Junio 2025 21 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Junio 2025 29 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 24 Femenino Urbano Ninguno Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 22 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 36 Masculino Urbano Secundaria Obrero/empleado particular $ 1.500.000 No cotiza
Junio 2025 53 Femenino Urbano Universitaria Obrero/empleado gobierno $ 2.700.000 Si cotiza
Junio 2025 50 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Junio 2025 15 Femenino Urbano Secundaria Obrero/empleado particular $ 980.000 No cotiza
Junio 2025 64 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.000 No cotiza
Junio 2025 35 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 22 Femenino Urbano Universitaria Obrero/empleado particular $ 1.000.000 No cotiza
Junio 2025 39 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.950.000 Si cotiza
Junio 2025 20 Masculino Rural Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 67 Femenino Urbano Ninguno Empleado domestico $ 400.000 No cotiza
Junio 2025 52 Femenino Urbano Media academica Empleado domestico $ 450.000 No cotiza
Junio 2025 42 Masculino Urbano Primaria Obrero/empleado particular $ 1.200.000 No cotiza
Junio 2025 39 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 No cotiza
Junio 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Junio 2025 36 Femenino Urbano Maestria Obrero/empleado particular $ 5.000.000 Si cotiza
Junio 2025 36 Femenino Urbano Media academica Obrero/empleado particular $ 480.000 No cotiza
Junio 2025 21 Masculino Urbano Universitaria Obrero/empleado particular $ 1.500.000 Si cotiza
Junio 2025 19 Masculino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Junio 2025 49 Masculino Urbano Media academica Obrero/empleado gobierno $ 2.100.000 Si cotiza
Junio 2025 39 Femenino Urbano Especializacion Obrero/empleado particular $ 2.600.000 Si cotiza
Junio 2025 50 Masculino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Junio 2025 19 Masculino Urbano Media academica Obrero/empleado particular $ 528.000 No cotiza
Junio 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Julio 2025 52 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 24 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 20 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 25 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 19 Femenino Urbano Media tecnica Empleado domestico $ 1.450.000 No cotiza
Julio 2025 40 Masculino Urbano Media academica Obrero/empleado particular $ 3.000.000 Si cotiza
Julio 2025 26 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 66 Masculino Urbano Universitaria Obrero/empleado particular $ 750.000 No cotiza
Julio 2025 19 Femenino Urbano Media academica Obrero/empleado particular $ 2.000.000 No cotiza
Julio 2025 37 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 17 Masculino Urbano Secundaria Obrero/empleado particular $ 500.000 No cotiza
Julio 2025 56 Masculino Urbano Primaria Obrero/empleado particular $ 2.450.000 Si cotiza
Julio 2025 25 Femenino Urbano Media academica Empleado domestico $ 600.000 No cotiza
Julio 2025 31 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Julio 2025 26 Femenino Urbano Media academica Obrero/empleado particular $ 300.000 No cotiza
Julio 2025 50 Femenino Urbano Primaria Obrero/empleado particular $ 900.000 No cotiza
Julio 2025 43 Femenino Urbano Maestria Obrero/empleado particular $25.000.000 Si cotiza
Julio 2025 67 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 No cotiza
Julio 2025 17 Masculino Rural Secundaria Obrero/empleado particular $ 600.000 No cotiza
Julio 2025 35 Femenino Urbano Universitaria Obrero/empleado gobierno $ 2.000.000 Si cotiza
Julio 2025 41 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 32 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 No cotiza
Julio 2025 30 Masculino Urbano Universitaria Obrero/empleado gobierno $ 6.000.000 Si cotiza
Julio 2025 33 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 71 Masculino Urbano Tecnologica Obrero/empleado particular $ 600.000 No cotiza
Julio 2025 40 Femenino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Julio 2025 40 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.000 Si cotiza
Julio 2025 20 Masculino Rural Tecnica profesional Obrero/empleado gobierno $ 1.800.000 Si cotiza
Julio 2025 27 Femenino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Julio 2025 61 Masculino Urbano Media academica Obrero/empleado particular $ 2.500.000 Si cotiza
Julio 2025 29 Femenino Urbano Especializacion Obrero/empleado particular $ 4.500.000 Si cotiza
Julio 2025 42 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.460.000 Si cotiza
Julio 2025 28 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.500.000 Si cotiza
Julio 2025 50 Femenino Urbano Universitaria Obrero/empleado particular $ 8.000.000 Si cotiza
Julio 2025 25 Masculino Rural Media academica Trabajador sin remuneracion $ 1.423.500 Si cotiza
Julio 2025 53 Masculino Urbano Universitaria Obrero/empleado gobierno $15.000.000 Si cotiza
Julio 2025 23 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 19 Femenino Urbano Media academica Obrero/empleado particular $ 160.000 No cotiza
Julio 2025 59 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 23 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.400.000 Si cotiza
Julio 2025 54 Masculino Urbano Universitaria Obrero/empleado particular $ 1.425.000 Si cotiza
Julio 2025 31 Femenino Urbano Especializacion Obrero/empleado particular $ 3.600.000 Si cotiza
Julio 2025 62 Femenino Urbano Primaria Obrero/empleado particular $ 1.423.500 No cotiza
Julio 2025 37 Masculino Urbano Media academica Obrero/empleado particular $ 3.200.000 Si cotiza
Julio 2025 26 Femenino Urbano Universitaria Obrero/empleado particular $ 1.400.000 Si cotiza
Julio 2025 63 Femenino Urbano Media academica Obrero/empleado particular $ 2.300.000 No cotiza
Julio 2025 62 Masculino Rural Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 43 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.400.000 No cotiza
Julio 2025 33 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 Si cotiza
Julio 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 67 Femenino Urbano Especializacion Obrero/empleado gobierno $69.800.000 No cotiza
Julio 2025 34 Femenino Urbano Universitaria Obrero/empleado particular $ 2.400.000 Si cotiza
Julio 2025 44 Femenino Urbano Secundaria Obrero/empleado particular $ 700.000 No cotiza
Julio 2025 56 Femenino Urbano Primaria Obrero/empleado particular $ 711.750 Si cotiza
Julio 2025 21 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 No cotiza
Julio 2025 38 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 60 Femenino Urbano Media academica Empleado domestico $ 400.000 No cotiza
Julio 2025 44 Masculino Urbano Especializacion Obrero/empleado gobierno $ 6.000.000 Si cotiza
Julio 2025 62 Masculino Urbano Secundaria Obrero/empleado particular $ 1.400.000 No cotiza
Julio 2025 33 Femenino Urbano Doctorado Obrero/empleado particular $ 1.860.000 Si cotiza
Julio 2025 23 Femenino Urbano Universitaria Obrero/empleado particular $ 500.000 No cotiza
Julio 2025 51 Femenino Urbano Media tecnica Obrero/empleado particular $ 1.800.000 Si cotiza
Julio 2025 22 Femenino Urbano Media academica Obrero/empleado particular $ 600.000 No cotiza
Julio 2025 40 Femenino Urbano Universitaria Obrero/empleado particular $ 3.150.000 Si cotiza
Julio 2025 82 Masculino Rural Ninguno Trabajador sin remuneracion $ 600.000 No cotiza
Julio 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Julio 2025 31 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Julio 2025 21 Masculino Rural Media academica Trabajador sin remuneracion $ 1.400.000 No cotiza
Julio 2025 36 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Julio 2025 38 Femenino Urbano Secundaria Empleado domestico $ 300.000 No cotiza
Julio 2025 61 Femenino Urbano Secundaria Empleado domestico $ 860.000 No cotiza
Julio 2025 21 Masculino Urbano Media tecnica Obrero/empleado particular $ 2.000.000 No cotiza
Julio 2025 35 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Julio 2025 38 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 900.000 No cotiza
Julio 2025 51 Femenino Urbano Primaria Obrero/empleado particular $ 1.623.500 Si cotiza
Julio 2025 65 Masculino Urbano Secundaria Obrero/empleado particular $ 600.000 No cotiza
Julio 2025 26 Femenino Urbano Universitaria Obrero/empleado particular $ 120.000 No cotiza
Julio 2025 41 Masculino Rural Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Julio 2025 33 Masculino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Julio 2025 42 Masculino Urbano Universitaria Obrero/empleado particular $ 800.000 No cotiza
Julio 2025 56 Masculino Urbano Media academica Obrero/empleado particular $ 1.309.600 Si cotiza
Agosto 2025 55 Masculino Urbano Universitaria Obrero/empleado particular $10.500.000 Si cotiza
Agosto 2025 31 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 47 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 Si cotiza
Agosto 2025 43 Masculino Urbano Tecnologica Obrero/empleado gobierno $ 2.000.000 Si cotiza
Agosto 2025 67 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.000.000 No cotiza
Agosto 2025 37 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Agosto 2025 41 Masculino Urbano Primaria Obrero/empleado particular $ 1.050.000 No cotiza
Agosto 2025 42 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Agosto 2025 42 Masculino Urbano Media academica Obrero/empleado particular $ 3.000.000 No cotiza
Agosto 2025 26 Femenino Urbano Universitaria Obrero/empleado particular $ 2.200.000 Si cotiza
Agosto 2025 41 Femenino Urbano Media academica Obrero/empleado particular $ 1.766.900 Si cotiza
Agosto 2025 25 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.500.000 Si cotiza
Agosto 2025 35 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 3.000.000 Si cotiza
Agosto 2025 52 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 46 Masculino Urbano Universitaria Obrero/empleado particular $ 4.000.000 Si cotiza
Agosto 2025 58 Masculino Urbano Especializacion Obrero/empleado gobierno $ 4.500.000 No cotiza
Agosto 2025 39 Femenino Urbano Universitaria Obrero/empleado particular $ 2.500.000 Si cotiza
Agosto 2025 64 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.500.000 Si cotiza
Agosto 2025 43 Femenino Urbano Secundaria Obrero/empleado particular $ 1.200.000 No cotiza
Agosto 2025 27 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.613.000 Si cotiza
Agosto 2025 34 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.300.000 Si cotiza
Agosto 2025 45 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.650.000 No cotiza
Agosto 2025 40 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 No cotiza
Agosto 2025 42 Femenino Urbano Universitaria Obrero/empleado particular $ 1.700.000 Si cotiza
Agosto 2025 50 Femenino Urbano Media academica Obrero/empleado particular $ 360.000 No cotiza
Agosto 2025 30 Masculino Rural Secundaria Empleado domestico $ 1.423.500 Si cotiza
Agosto 2025 29 Masculino Urbano Universitaria Obrero/empleado particular $ 1.623.000 No cotiza
Agosto 2025 19 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 No cotiza
Agosto 2025 28 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 No cotiza
Agosto 2025 46 Masculino Urbano Primaria Obrero/empleado particular $ 1.800.000 No cotiza
Agosto 2025 43 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Agosto 2025 39 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.700.000 Si cotiza
Agosto 2025 41 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Agosto 2025 42 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Agosto 2025 57 Masculino Urbano Tecnologica Obrero/empleado particular $ 2.600.000 Si cotiza
Agosto 2025 50 Masculino Rural Ninguno Trabajador sin remuneracion $ 1.000.000 No cotiza
Agosto 2025 36 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.500.000 Si cotiza
Agosto 2025 32 Femenino Urbano Tecnologica Obrero/empleado particular $ 2.200.000 Si cotiza
Agosto 2025 35 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 43 Femenino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Agosto 2025 56 Masculino Urbano Primaria Trabajador sin remuneracion $ 820.000 No cotiza
Agosto 2025 32 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 21 Femenino Rural Universitaria Obrero/empleado particular $ 1.600.000 Si cotiza
Agosto 2025 36 Femenino Urbano Especializacion Obrero/empleado particular $ 2.800.000 Si cotiza
Agosto 2025 61 Masculino Rural Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 39 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Agosto 2025 29 Masculino Rural Universitaria Obrero/empleado particular $ 2.900.000 Si cotiza
Agosto 2025 27 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.700.000 Si cotiza
Agosto 2025 44 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.000 Si cotiza
Agosto 2025 41 Femenino Urbano Maestria Obrero/empleado gobierno $ 8.075.000 Si cotiza
Agosto 2025 53 Femenino Urbano Media academica Obrero/empleado particular $ 400.000 No cotiza
Agosto 2025 33 Femenino Rural Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 No cotiza
Agosto 2025 34 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.650.000 Si cotiza
Agosto 2025 52 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 800.000 No cotiza
Agosto 2025 41 Femenino Urbano Media academica Obrero/empleado particular $ 720.000 Si cotiza
Agosto 2025 35 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 61 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Agosto 2025 55 Masculino Urbano Primaria Obrero/empleado particular $ 1.000.000 No cotiza
Agosto 2025 24 Masculino Urbano Tecnologica Obrero/empleado particular $ 3.500.000 Si cotiza
Agosto 2025 63 Femenino Urbano Especializacion Obrero/empleado gobierno $ 6.000.000 No cotiza
Agosto 2025 28 Masculino Rural Secundaria Trabajador sin remuneracion $ 1.423.500 Si cotiza
Agosto 2025 52 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.969.092 Si cotiza
Agosto 2025 33 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 34 Femenino Urbano Media academica Obrero/empleado particular $ 800.000 No cotiza
Agosto 2025 68 Masculino Urbano Especializacion Obrero/empleado gobierno $ 5.500.000 Si cotiza
Agosto 2025 44 Femenino Urbano Maestria Obrero/empleado gobierno $ 5.300.000 Si cotiza
Agosto 2025 34 Masculino Urbano Media academica Obrero/empleado particular $ 2.400.000 Si cotiza
Agosto 2025 58 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 No cotiza
Agosto 2025 31 Masculino Urbano Media tecnica Obrero/empleado gobierno $ 2.500.000 Si cotiza
Agosto 2025 50 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.800.000 Si cotiza
Agosto 2025 47 Masculino Urbano Tecnologica Obrero/empleado particular $ 2.414.000 Si cotiza
Agosto 2025 41 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 30 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 400.000 No cotiza
Agosto 2025 27 Femenino Rural Secundaria Obrero/empleado particular $ 1.600.000 Si cotiza
Agosto 2025 39 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Agosto 2025 19 Masculino Rural Secundaria Trabajador sin remuneracion $ 600.000 No cotiza
Agosto 2025 33 Femenino Urbano Universitaria Obrero/empleado particular $ 2.200.000 Si cotiza
Agosto 2025 47 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 43 Masculino Rural Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Septiembre 2025 55 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.000 Si cotiza
Septiembre 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 55 Femenino Urbano Primaria Obrero/empleado particular $ 1.500.000 No cotiza
Septiembre 2025 30 Masculino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Septiembre 2025 51 Masculino Urbano Primaria Obrero/empleado particular $ 1.560.000 Si cotiza
Septiembre 2025 33 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Septiembre 2025 48 Femenino Urbano Media academica Obrero/empleado particular $ 1.800.000 No cotiza
Septiembre 2025 49 Femenino Urbano Especializacion Obrero/empleado gobierno $ 2.896.000 Si cotiza
Septiembre 2025 75 Masculino Urbano Secundaria Obrero/empleado particular $ 2.000.000 Si cotiza
Septiembre 2025 17 Femenino Urbano Media academica Obrero/empleado particular $ 680.000 No cotiza
Septiembre 2025 44 Femenino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Septiembre 2025 17 Femenino Urbano Media academica Obrero/empleado particular $ 720.000 No cotiza
Septiembre 2025 36 Masculino Rural Primaria Obrero/empleado particular $ 1.423.500 No cotiza
Septiembre 2025 23 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 No cotiza
Septiembre 2025 21 Femenino Urbano Universitaria Obrero/empleado particular $ 1.900.000 Si cotiza
Septiembre 2025 74 Femenino Urbano Primaria Empleado domestico $ 1.423.000 No cotiza
Septiembre 2025 68 Femenino Urbano Especializacion Obrero/empleado gobierno $ 7.000.000 No cotiza
Septiembre 2025 35 Masculino Urbano Especializacion Obrero/empleado particular $ 7.000.000 Si cotiza
Septiembre 2025 51 Femenino Urbano Tecnica profesional Empleado domestico $ 1.423.500 Si cotiza
Septiembre 2025 41 Femenino Urbano Primaria Obrero/empleado particular $ 800.000 No cotiza
Septiembre 2025 21 Femenino Urbano Universitaria Obrero/empleado particular $ 711.000 Si cotiza
Septiembre 2025 44 Masculino Urbano Universitaria Obrero/empleado particular $ 2.600.000 Si cotiza
Septiembre 2025 29 Femenino Urbano Especializacion Obrero/empleado particular $ 2.100.000 Si cotiza
Septiembre 2025 33 Masculino Urbano Especializacion Obrero/empleado gobierno $ 2.500.000 Si cotiza
Septiembre 2025 44 Masculino Urbano Primaria Obrero/empleado particular $ 1.624.500 Si cotiza
Septiembre 2025 43 Femenino Rural Primaria Empleado domestico $ 1.700.000 Si cotiza
Septiembre 2025 55 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 No cotiza
Septiembre 2025 61 Masculino Urbano Secundaria Obrero/empleado particular $ 500.000 No cotiza
Septiembre 2025 57 Femenino Urbano Especializacion Obrero/empleado gobierno $ 6.300.000 Si cotiza
Septiembre 2025 34 Masculino Urbano Tecnologica Obrero/empleado particular $ 5.000.000 Si cotiza
Septiembre 2025 37 Femenino Rural Media tecnica Obrero/empleado particular $ 1.400.000 Si cotiza
Septiembre 2025 19 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 41 Femenino Urbano Media academica Obrero/empleado particular $ 1.700.000 Si cotiza
Septiembre 2025 42 Masculino Urbano Primaria Obrero/empleado particular $ 1.120.000 No cotiza
Septiembre 2025 24 Femenino Urbano Universitaria Obrero/empleado gobierno $ 1.900.000 Si cotiza
Septiembre 2025 22 Masculino Urbano Media academica Obrero/empleado gobierno $ 1.423.500 Si cotiza
Septiembre 2025 47 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 55 Masculino Urbano Media academica Obrero/empleado particular $ 2.500.000 Si cotiza
Septiembre 2025 41 Femenino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 56 Femenino Rural Tecnica profesional Obrero/empleado particular $ 2.860.000 Si cotiza
Septiembre 2025 27 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.500.000 Si cotiza
Septiembre 2025 58 Masculino Urbano Media academica Obrero/empleado particular $ 1.300.000 No cotiza
Septiembre 2025 44 Femenino Urbano Universitaria Obrero/empleado particular $ 2.400.000 Si cotiza
Septiembre 2025 24 Masculino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Septiembre 2025 35 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 2.500.000 Si cotiza
Septiembre 2025 42 Femenino Urbano Media academica Obrero/empleado particular $ 1.300.000 Si cotiza
Septiembre 2025 48 Femenino Rural Primaria Trabajador sin remuneracion $ 500.000 No cotiza
Septiembre 2025 57 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Septiembre 2025 62 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 37 Masculino Rural Primaria Trabajador sin remuneracion $ 1.450.000 No cotiza
Septiembre 2025 24 Femenino Urbano Media academica Obrero/empleado particular $ 2.500.000 Si cotiza
Septiembre 2025 65 Femenino Urbano Media academica Empleado domestico $ 1.500.000 No cotiza
Septiembre 2025 25 Masculino Rural Secundaria Trabajador sin remuneracion $ 1.423.500 Si cotiza
Septiembre 2025 59 Femenino Urbano Secundaria Obrero/empleado particular $ 1.800.000 Si cotiza
Septiembre 2025 54 Masculino Urbano Universitaria Obrero/empleado particular $ 3.800.000 Si cotiza
Septiembre 2025 58 Femenino Urbano Primaria Obrero/empleado particular $ 600.000 No cotiza
Septiembre 2025 33 Masculino Urbano Maestria Obrero/empleado gobierno $ 5.000.000 Si cotiza
Septiembre 2025 73 Masculino Rural Primaria Empleado domestico $ 1.423.500 Si cotiza
Septiembre 2025 57 Masculino Urbano Media academica Obrero/empleado gobierno $ 6.000.000 Si cotiza
Septiembre 2025 58 Masculino Urbano Media tecnica Obrero/empleado particular $ 5.600.000 Si cotiza
Septiembre 2025 20 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 20 Masculino Urbano Media academica Obrero/empleado particular $ 2.500.000 Si cotiza
Septiembre 2025 42 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.600.000 Si cotiza
Septiembre 2025 25 Masculino Rural Primaria Obrero/empleado particular $ 900.000 No cotiza
Septiembre 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 33 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.300.000 No cotiza
Septiembre 2025 71 Masculino Rural Ninguno Trabajador sin remuneracion $ 600.000 No cotiza
Septiembre 2025 41 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 40 Masculino Urbano Universitaria Obrero/empleado particular $ 1.200.000 No cotiza
Septiembre 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Septiembre 2025 19 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 45 Masculino Urbano Maestria Obrero/empleado gobierno $ 8.541.000 Si cotiza
Septiembre 2025 20 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 24 Femenino Urbano Media academica Empleado domestico $ 120.000 No cotiza
Septiembre 2025 42 Masculino Urbano Primaria Trabajador sin remuneracion $ 1.600.000 No cotiza
Septiembre 2025 27 Masculino Urbano Media academica Obrero/empleado particular $ 1.700.000 Si cotiza
Septiembre 2025 70 Femenino Urbano Primaria Empleado domestico $ 900.000 No cotiza
Septiembre 2025 38 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Septiembre 2025 49 Femenino Urbano Ninguno Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 38 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Septiembre 2025 26 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 2.300.000 Si cotiza
Octubre 2025 54 Femenino Urbano Universitaria Obrero/empleado gobierno $ 3.200.000 Si cotiza
Octubre 2025 45 Masculino Rural Primaria Obrero/empleado particular $ 1.400.000 Si cotiza
Octubre 2025 54 Femenino Urbano Media academica Obrero/empleado particular $ 1.300.000 No cotiza
Octubre 2025 20 Femenino Urbano Tecnologica Obrero/empleado particular $ 800.000 No cotiza
Octubre 2025 28 Masculino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Octubre 2025 26 Masculino Urbano Universitaria Obrero/empleado particular $ 1.400.000 Si cotiza
Octubre 2025 27 Femenino Urbano Universitaria Obrero/empleado particular $ 3.700.000 Si cotiza
Octubre 2025 39 Femenino Urbano Doctorado Obrero/empleado gobierno $25.000.000 Si cotiza
Octubre 2025 56 Femenino Urbano Universitaria Obrero/empleado gobierno $ 4.500.000 Si cotiza
Octubre 2025 59 Masculino Rural Secundaria Obrero/empleado particular $ 1.500.000 No cotiza
Octubre 2025 49 Femenino Urbano Primaria Obrero/empleado particular $ 600.000 No cotiza
Octubre 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Octubre 2025 43 Masculino Urbano Primaria Trabajador sin remuneracion $ 1.200.000 No cotiza
Octubre 2025 27 Masculino Rural Tecnologica Obrero/empleado gobierno $ 1.800.000 Si cotiza
Octubre 2025 39 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 32 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 21 Femenino Urbano Secundaria Obrero/empleado particular $ 250.000 No cotiza
Octubre 2025 42 Masculino Urbano Tecnologica Obrero/empleado particular $ 5.000.000 Si cotiza
Octubre 2025 68 Masculino Urbano Especializacion Obrero/empleado particular $11.000.000 Si cotiza
Octubre 2025 31 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 41 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Octubre 2025 35 Masculino Urbano Media academica Obrero/empleado particular $30.000.000 Si cotiza
Octubre 2025 51 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 67 Femenino Urbano Maestria Obrero/empleado gobierno $ 7.000.000 Si cotiza
Octubre 2025 26 Femenino Urbano Secundaria Obrero/empleado particular $ 1.423.500 No cotiza
Octubre 2025 46 Masculino Urbano Primaria Obrero/empleado particular $ 1.200.000 No cotiza
Octubre 2025 38 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.000 Si cotiza
Octubre 2025 47 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 79 Masculino Urbano Primaria Obrero/empleado particular $ 500.000 No cotiza
Octubre 2025 38 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Octubre 2025 55 Femenino Urbano Media academica Obrero/empleado particular $ 950.000 No cotiza
Octubre 2025 65 Femenino Urbano Universitaria Obrero/empleado gobierno $ 6.200.000 No cotiza
Octubre 2025 21 Masculino Urbano Media academica Obrero/empleado particular $ 1.800.000 No cotiza
Octubre 2025 53 Masculino Rural Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 33 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.300.000 Si cotiza
Octubre 2025 40 Masculino Rural Ninguno Trabajador sin remuneracion $ 800.000 No cotiza
Octubre 2025 45 Masculino Urbano Secundaria Obrero/empleado particular $ 1.200.000 No cotiza
Octubre 2025 36 Femenino Urbano Universitaria Obrero/empleado particular $ 2.310.000 Si cotiza
Octubre 2025 48 Masculino Urbano Primaria Obrero/empleado particular $ 1.500.000 Si cotiza
Octubre 2025 41 Masculino Urbano Media academica Empleado domestico $ 0 No cotiza
Octubre 2025 16 Femenino Urbano Media academica Obrero/empleado particular $ 600.000 No cotiza
Octubre 2025 35 Masculino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Octubre 2025 27 Femenino Urbano Especializacion Obrero/empleado particular $ 2.500.000 Si cotiza
Octubre 2025 57 Femenino Urbano Media academica Empleado domestico $ 400.000 No cotiza
Octubre 2025 30 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 30 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Octubre 2025 31 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 31 Femenino Urbano Universitaria Obrero/empleado particular $ 5.800.000 Si cotiza
Octubre 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Octubre 2025 35 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.700.000 Si cotiza
Octubre 2025 41 Masculino Urbano Primaria Obrero/empleado particular $ 1.600.000 No cotiza
Octubre 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.426.000 Si cotiza
Octubre 2025 44 Masculino Urbano Tecnologica Obrero/empleado particular $ 4.000.000 Si cotiza
Octubre 2025 19 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.200.000 No cotiza
Octubre 2025 21 Femenino Urbano Media academica Obrero/empleado particular $ 900.000 No cotiza
Octubre 2025 43 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 Si cotiza
Octubre 2025 62 Masculino Urbano Primaria Obrero/empleado particular $ 1.000.000 No cotiza
Octubre 2025 40 Femenino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Octubre 2025 28 Masculino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Octubre 2025 22 Femenino Urbano Tecnologica Obrero/empleado particular $ 1.420.000 Si cotiza
Octubre 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Octubre 2025 66 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 No cotiza
Octubre 2025 39 Masculino Urbano Tecnologica Obrero/empleado particular $17.000.000 Si cotiza
Octubre 2025 30 Femenino Urbano Universitaria Obrero/empleado particular $ 4.500.000 Si cotiza
Octubre 2025 27 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 30 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 2.500.000 Si cotiza
Octubre 2025 64 Femenino Urbano Especializacion Obrero/empleado gobierno $ 3.000.000 No cotiza
Octubre 2025 29 Masculino Rural Tecnologica Obrero/empleado particular $ 700.000 No cotiza
Octubre 2025 49 Femenino Urbano Media academica Empleado domestico $ 1.800.000 Si cotiza
Octubre 2025 64 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Octubre 2025 58 Masculino Urbano Primaria Trabajador sin remuneracion $ 630.000 No cotiza
Octubre 2025 42 Masculino Rural Secundaria Obrero/empleado particular $ 1.423.500 No cotiza
Octubre 2025 18 Femenino Urbano Media academica Obrero/empleado particular $ 960.000 No cotiza
Octubre 2025 37 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.400.000 Si cotiza
Octubre 2025 54 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 24 Femenino Urbano Universitaria Obrero/empleado particular $ 1.450.000 Si cotiza
Octubre 2025 68 Femenino Urbano Especializacion Obrero/empleado gobierno $ 5.000.000 No cotiza
Octubre 2025 35 Masculino Urbano Media academica Obrero/empleado particular $ 1.000.000 Si cotiza
Octubre 2025 28 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Octubre 2025 37 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.000.000 Si cotiza
Octubre 2025 45 Femenino Urbano Especializacion Obrero/empleado gobierno $ 8.500.000 Si cotiza
Octubre 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Octubre 2025 36 Masculino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 52 Masculino Urbano Primaria Obrero/empleado particular $ 1.600.000 Si cotiza
Octubre 2025 48 Femenino Urbano Primaria Obrero/empleado particular $ 1.000.000 No cotiza
Octubre 2025 61 Femenino Urbano Tecnica profesional Obrero/empleado gobierno $ 3.110.000 Si cotiza
Octubre 2025 41 Femenino Urbano Maestria Obrero/empleado gobierno $ 2.500.000 Si cotiza
Octubre 2025 41 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 32 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 28 Masculino Urbano Universitaria Obrero/empleado gobierno $ 4.400.000 Si cotiza
Octubre 2025 56 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 41 Masculino Urbano Universitaria Obrero/empleado particular $ 7.939.000 No cotiza
Octubre 2025 26 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Octubre 2025 28 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 600.000 No cotiza
Octubre 2025 54 Masculino Urbano Primaria Obrero/empleado particular $ 980.000 Si cotiza
Octubre 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 54 Masculino Rural Ninguno Trabajador sin remuneracion $ 400.000 No cotiza
Octubre 2025 34 Femenino Urbano Maestria Obrero/empleado gobierno $ 2.800.000 Si cotiza
Octubre 2025 38 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 27 Masculino Urbano Primaria Obrero/empleado particular $ 500.000 No cotiza
Octubre 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 800.000 No cotiza
Octubre 2025 27 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 46 Masculino Rural Secundaria Obrero/empleado particular $ 1.600.000 Si cotiza
Octubre 2025 56 Femenino Urbano Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 52 Masculino Rural Secundaria Obrero/empleado particular $ 1.423.500 Si cotiza
Octubre 2025 63 Masculino Urbano Primaria Obrero/empleado particular $ 560.000 No cotiza
Octubre 2025 39 Femenino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Octubre 2025 25 Femenino Rural Primaria Empleado domestico $ 400.000 No cotiza
Noviembre 2025 32 Femenino Urbano Universitaria Obrero/empleado particular $ 5.600.000 Si cotiza
Noviembre 2025 30 Masculino Urbano Universitaria Obrero/empleado particular $ 3.100.000 Si cotiza
Noviembre 2025 25 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 26 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.400.000 Si cotiza
Noviembre 2025 21 Femenino Urbano Media academica Obrero/empleado particular $ 1.800.000 Si cotiza
Noviembre 2025 32 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.600.000 No cotiza
Noviembre 2025 55 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 2.847.000 Si cotiza
Noviembre 2025 27 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 63 Masculino Rural Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 30 Masculino Urbano Secundaria Trabajador sin remuneracion $ 1.800.000 No cotiza
Noviembre 2025 63 Femenino Urbano Primaria Empleado domestico $ 320.000 No cotiza
Noviembre 2025 37 Femenino Urbano Media academica Empleado domestico $ 800.000 No cotiza
Noviembre 2025 31 Masculino Rural Secundaria Trabajador sin remuneracion $ 1.600.000 Si cotiza
Noviembre 2025 24 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 55 Masculino Rural Primaria Obrero/empleado particular $ 1.600.000 No cotiza
Noviembre 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Noviembre 2025 30 Masculino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Noviembre 2025 47 Masculino Urbano Universitaria Obrero/empleado particular $ 2.800.000 Si cotiza
Noviembre 2025 18 Femenino Urbano Normalista Empleado domestico $ 350.000 No cotiza
Noviembre 2025 33 Masculino Rural Primaria Obrero/empleado particular $ 2.500.000 No cotiza
Noviembre 2025 42 Masculino Rural Media academica Obrero/empleado particular $ 800.000 Si cotiza
Noviembre 2025 66 Femenino Urbano Primaria Obrero/empleado particular $ 1.875.000 No cotiza
Noviembre 2025 27 Femenino Urbano Universitaria Obrero/empleado particular $ 3.500.000 Si cotiza
Noviembre 2025 22 Masculino Urbano Universitaria Obrero/empleado particular $ 400.000 No cotiza
Noviembre 2025 24 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 37 Masculino Urbano Media academica Obrero/empleado particular $ 2.450.000 Si cotiza
Noviembre 2025 52 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.300.000 Si cotiza
Noviembre 2025 38 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 26 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Noviembre 2025 30 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 33 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 55 Femenino Urbano Especializacion Obrero/empleado gobierno $ 4.500.000 Si cotiza
Noviembre 2025 45 Masculino Urbano Universitaria Obrero/empleado gobierno $ 5.000.000 Si cotiza
Noviembre 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 2.400.000 Si cotiza
Noviembre 2025 23 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 46 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 63 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 3.500.000 Si cotiza
Noviembre 2025 56 Masculino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Noviembre 2025 28 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.420.000 Si cotiza
Noviembre 2025 36 Masculino Urbano Media academica Obrero/empleado particular $ 2.100.000 Si cotiza
Noviembre 2025 32 Femenino Urbano Media tecnica Obrero/empleado particular $ 1.650.000 Si cotiza
Noviembre 2025 38 Femenino Urbano Universitaria Obrero/empleado particular $ 3.200.000 Si cotiza
Noviembre 2025 52 Femenino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Noviembre 2025 19 Masculino Rural Primaria Obrero/empleado particular $ 1.200.000 No cotiza
Noviembre 2025 30 Masculino Urbano Tecnologica Obrero/empleado particular $ 1.623.000 Si cotiza
Noviembre 2025 26 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 25 Femenino Urbano Universitaria Obrero/empleado particular $ 6.500.000 Si cotiza
Noviembre 2025 48 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Noviembre 2025 59 Femenino Urbano Universitaria Obrero/empleado particular $ 1.500.000 Si cotiza
Noviembre 2025 64 Masculino Urbano Primaria Empleado domestico $ 1.400.000 No cotiza
Noviembre 2025 37 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Noviembre 2025 46 Femenino Urbano Especializacion Obrero/empleado gobierno $ 8.000.000 Si cotiza
Noviembre 2025 48 Femenino Urbano Secundaria Empleado domestico $ 200.000 No cotiza
Noviembre 2025 28 Femenino Urbano Universitaria Obrero/empleado particular $ 1.500.000 Si cotiza
Noviembre 2025 35 Masculino Urbano Media academica Obrero/empleado particular $ 1.623.500 Si cotiza
Noviembre 2025 35 Masculino Urbano Primaria Obrero/empleado particular $ 500.000 No cotiza
Noviembre 2025 44 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.000 Si cotiza
Noviembre 2025 49 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Noviembre 2025 48 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 No cotiza
Noviembre 2025 26 Femenino Urbano Universitaria Obrero/empleado particular $ 4.061.000 Si cotiza
Noviembre 2025 48 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 38 Femenino Urbano Tecnica profesional Obrero/empleado gobierno $ 3.400.000 Si cotiza
Noviembre 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.100.000 No cotiza
Noviembre 2025 23 Masculino Urbano Primaria Obrero/empleado particular $ 1.100.000 No cotiza
Noviembre 2025 26 Masculino Urbano Media academica Trabajador sin remuneracion $ 1.400.000 No cotiza
Noviembre 2025 19 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 650.000 No cotiza
Noviembre 2025 36 Femenino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Noviembre 2025 53 Masculino Urbano Media academica Obrero/empleado particular $ 1.400.000 No cotiza
Noviembre 2025 25 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 38 Femenino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 40 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 800.000 No cotiza
Noviembre 2025 39 Masculino Urbano Universitaria Obrero/empleado particular $ 1.800.000 Si cotiza
Noviembre 2025 24 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 50 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.423.500 Si cotiza
Noviembre 2025 65 Masculino Urbano Primaria Obrero/empleado particular $ 1.200.000 No cotiza
Noviembre 2025 34 Femenino Urbano Maestria Obrero/empleado gobierno $ 2.400.000 Si cotiza
Noviembre 2025 46 Masculino Rural Primaria Trabajador sin remuneracion $ 1.000.000 No cotiza
Noviembre 2025 42 Masculino Urbano Universitaria Obrero/empleado particular $ 4.500.000 Si cotiza
Diciembre 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Diciembre 2025 53 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 2.600.000 Si cotiza
Diciembre 2025 20 Femenino Urbano Media tecnica Obrero/empleado particular $ 740.000 No cotiza
Diciembre 2025 52 Femenino Urbano Maestria Obrero/empleado gobierno $ 4.270.500 Si cotiza
Diciembre 2025 42 Masculino Urbano Universitaria Obrero/empleado particular $ 2.500.000 Si cotiza
Diciembre 2025 22 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 5.500.000 No cotiza
Diciembre 2025 26 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 39 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 16 Femenino Urbano Secundaria Empleado domestico $ 250.000 No cotiza
Diciembre 2025 22 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 30 Femenino Urbano Normalista Obrero/empleado particular $ 2.900.000 Si cotiza
Diciembre 2025 28 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 40 Masculino Urbano Universitaria Obrero/empleado particular $ 4.000.000 Si cotiza
Diciembre 2025 40 Femenino Urbano Universitaria Obrero/empleado particular $ 1.800.000 Si cotiza
Diciembre 2025 56 Femenino Urbano Maestria Obrero/empleado gobierno $ 4.000.000 Si cotiza
Diciembre 2025 68 Femenino Urbano Media academica Obrero/empleado gobierno $ 1.423.500 Si cotiza
Diciembre 2025 32 Masculino Urbano Secundaria Obrero/empleado particular $ 1.200.000 No cotiza
Diciembre 2025 42 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 Si cotiza
Diciembre 2025 46 Masculino Urbano Especializacion Obrero/empleado gobierno $ 6.000.000 Si cotiza
Diciembre 2025 47 Femenino Urbano Media academica Obrero/empleado particular $ 1.400.000 Si cotiza
Diciembre 2025 20 Femenino Urbano Universitaria Obrero/empleado particular $ 2.026.000 Si cotiza
Diciembre 2025 66 Masculino Urbano Especializacion Obrero/empleado gobierno $ 6.700.000 Si cotiza
Diciembre 2025 29 Masculino Urbano Media tecnica Obrero/empleado particular $ 2.100.000 Si cotiza
Diciembre 2025 35 Masculino Urbano Tecnica profesional Obrero/empleado particular $ 1.700.000 No cotiza
Diciembre 2025 33 Masculino Urbano Media academica Obrero/empleado particular $ 2.846.000 Si cotiza
Diciembre 2025 35 Femenino Urbano Media academica Obrero/empleado particular $ 700.000 No cotiza
Diciembre 2025 46 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 320.000 No cotiza
Diciembre 2025 47 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.600.000 Si cotiza
Diciembre 2025 23 Masculino Urbano Media academica Obrero/empleado particular $ 900.000 No cotiza
Diciembre 2025 56 Masculino Urbano Media academica Obrero/empleado particular $ 1.200.000 No cotiza
Diciembre 2025 59 Femenino Urbano Media academica Obrero/empleado particular $ 800.000 No cotiza
Diciembre 2025 57 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 No cotiza
Diciembre 2025 59 Masculino Rural Primaria Obrero/empleado particular $ 1.400.000 No cotiza
Diciembre 2025 35 Masculino Rural Secundaria Obrero/empleado particular $ 1.000.000 Si cotiza
Diciembre 2025 55 Femenino Urbano Tecnologica Obrero/empleado particular $ 2.300.000 Si cotiza
Diciembre 2025 36 Femenino Urbano Universitaria Obrero/empleado particular $ 2.000.000 Si cotiza
Diciembre 2025 27 Masculino Urbano Media academica Obrero/empleado particular $ 1.520.000 No cotiza
Diciembre 2025 31 Masculino Urbano Universitaria Obrero/empleado particular $ 1.800.000 Si cotiza
Diciembre 2025 40 Femenino Urbano Universitaria Obrero/empleado particular $ 1.200.000 Si cotiza
Diciembre 2025 22 Femenino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 26 Masculino Urbano Universitaria Obrero/empleado particular $ 1.510.000 Si cotiza
Diciembre 2025 23 Femenino Urbano Universitaria Obrero/empleado particular $ 2.500.000 Si cotiza
Diciembre 2025 26 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Diciembre 2025 27 Masculino Urbano Tecnica profesional Empleado domestico $ 400.000 No cotiza
Diciembre 2025 20 Masculino Urbano Media tecnica Obrero/empleado particular $ 1.600.000 Si cotiza
Diciembre 2025 40 Masculino Urbano Tecnica profesional Obrero/empleado gobierno $ 3.700.000 Si cotiza
Diciembre 2025 27 Masculino Urbano Secundaria Obrero/empleado particular $ 1.200.000 No cotiza
Diciembre 2025 29 Masculino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 24 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.625.000 Si cotiza
Diciembre 2025 34 Masculino Urbano Universitaria Obrero/empleado particular $ 2.200.000 Si cotiza
Diciembre 2025 17 Femenino Urbano Media academica Obrero/empleado particular $ 1.000.000 No cotiza
Diciembre 2025 43 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 Si cotiza
Diciembre 2025 31 Masculino Urbano Universitaria Obrero/empleado particular $ 3.000.000 Si cotiza
Diciembre 2025 22 Masculino Urbano Universitaria Obrero/empleado particular $ 300.000 No cotiza
Diciembre 2025 31 Femenino Rural Tecnica profesional Obrero/empleado particular $ 400.000 No cotiza
Diciembre 2025 45 Femenino Urbano Universitaria Obrero/empleado gobierno $15.000.000 Si cotiza
Diciembre 2025 47 Masculino Urbano Primaria Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 28 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 51 Femenino Urbano Especializacion Obrero/empleado gobierno $11.000.000 Si cotiza
Diciembre 2025 42 Masculino Urbano Secundaria Trabajador sin remuneracion $ 1.423.500 Si cotiza
Diciembre 2025 47 Masculino Urbano Universitaria Obrero/empleado particular $ 1.500.000 No cotiza
Diciembre 2025 26 Masculino Urbano Media academica Obrero/empleado particular $ 1.600.000 No cotiza
Diciembre 2025 22 Femenino Urbano Media academica Empleado domestico $ 800.000 No cotiza
Diciembre 2025 49 Femenino Urbano Media academica Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 27 Masculino Urbano Media academica Obrero/empleado particular $ 1.500.000 No cotiza
Diciembre 2025 31 Masculino Urbano Media academica Obrero/empleado particular $ 2.000.000 No cotiza
Diciembre 2025 52 Femenino Urbano Primaria Empleado domestico $ 500.000 No cotiza
Diciembre 2025 42 Femenino Urbano Media academica Empleado domestico $ 500.000 No cotiza
Diciembre 2025 45 Femenino Urbano Tecnica profesional Obrero/empleado particular $ 1.200.000 Si cotiza
Diciembre 2025 49 Femenino Urbano Secundaria Empleado domestico $ 800.000 No cotiza
Diciembre 2025 70 Masculino Urbano Maestria Obrero/empleado gobierno $ 8.000.000 Si cotiza
Diciembre 2025 28 Masculino Urbano Universitaria Obrero/empleado particular $ 2.500.000 Si cotiza
Diciembre 2025 32 Masculino Urbano Universitaria Obrero/empleado particular $ 1.423.500 Si cotiza
Diciembre 2025 80 Masculino Rural Secundaria Empleado domestico $ 1.300.000 No cotiza
Fuente: DANE - Gran Encuesta Integrada de Hogares (GEIH) 2025. Calculos grupo 2

3 Análisis descriptivo

paleta <- list(
  primary   = "#4A3F55",
  secondary = "#7C6A9C",
  light     = "#D6CDEA",
  dark      = "#2C1F3E",
  bg        = "#F9F9F9",
  accent    = "#F0EDF5"
)

colores_corr <- colorRampPalette(c(paleta$secondary, "#FFFFFF", paleta$primary))(100)
library(tidyverse)

datos_cor <- base_muestra %>%
  select(Edad, Sexo, Zona, Tipo_de_empleo, 
         Nivel_educativo,
         Ingresos_recibidos, Cotizando_Pension)

matriz_cor <- cor(datos_cor, use = "complete.obs")

colnames(matriz_cor) <- c("Edad", "Sexo", "Zona", "Trabajo", 
                          "Nivel educ.",
                          "Ingresos", "Cotiza pensión")
rownames(matriz_cor) <- c("Edad", "Sexo", "Zona","Trabajo", 
                          "Nivel educ.",
                          "Ingresos", "Cotiza pensión")

corrplot(matriz_cor, method = "color", type = "lower",
         diag = FALSE, addCoef.col = paleta$dark, number.cex = 0.75,
         tl.col = paleta$dark, tl.srt = 35, tl.cex = 0.75,          
         col = colores_corr, cl.pos = "b", cl.cex = 0.7, cl.length = 5,
         mar = c(2, 0, 1, 0), bg = "white")

mtext("Fuente: DANE - Gran Encuesta Integrada de Hogares (GEIH) 2025", 
      side = 1, line = 4, cex = 0.7, col = paleta$secondary)

El resultado arroja que ninguna de las variables presenta correlaciones excesivamente altas, lo que indica ausencia de problemas fuertes de multicolinealidad dentro del modelo. Según James et al. (2021), mantener relaciones moderadas entre variables explicativas favorece una mejor interpretación y estabilidad en los modelos predictivos.

3.1 Distribución de la pensión

base_muestra %>%
  filter(!is.na(Cotizando_Pension), Cotizando_Pension %in% c(0, 1)) %>%
  mutate(Cotizacion = ifelse(Cotizando_Pension == 1, "Si cotiza", "No cotiza")) %>%
  ggplot(aes(x = Cotizacion, fill = Cotizacion)) +
  geom_bar(width = 0.6) +
  geom_text(stat = "count", aes(label = after_stat(count)), 
            vjust = -0.5, color = "#4A3F55", fontface = "bold", size = 5) +
  scale_fill_manual(values = c("Si cotiza" = "#7C6A9C", "No cotiza" = "#D6CDEA")) +
  labs(
    title = "Distribucion de Cotizacion a Pension",
    subtitle = "Poblacion ocupada que cotiza o no al sistema pensional",
    x = "", 
    y = "Cantidad de Personas",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#D6CDEA", linetype = "dashed"),
    axis.text = element_text(size = 11)
  )

La gráfica de cotización a pensión permite dimensionar el nivel de informalidad laboral presente en la muestra analizada. Al diferenciar entre quienes cotizan y quienes no cotizan al sistema pensional, se evidencia la proporción de trabajadores vinculados al empleo formal frente a aquellos asociados a condiciones de informalidad.
En la muestra de 10.000 observaciones analizadas, el 35,38% de las personas ocupadas no cotiza al sistema pensional, lo que representa una condición de informalidad laboral baja, por otro lado el 64,62% sí realiza aportes a pensión, reflejando una mayor participación de trabajadores asociados al empleo formal dentro de la muestra
La relevancia de esta variable radica en que la cotización a pensión se utiliza como proxy de formalidad laboral, convirtiéndose en la variable objetivo del modelo. En este sentido, variables como ingresos, nivel educativo o zona de residencia buscan explicar la probabilidad de que un individuo pertenezca a una u otra categoría.
url_colombia <- "https://geodata.ucdavis.edu/gadm/gadm4.1/json/gadm41_COL_1.json"
colombia_dept <- st_read(url_colombia, quiet = TRUE)

datos_mapa <- base_final_2025%>%
  mutate(Area_metropolitana = as.character(Area_metropolitana)) %>%
  filter(!is.na(Cotizando_Pension)) %>%
  group_by(COD_DEPTO = Area_metropolitana) %>%
  summarise(
    total_personas = n(),
    cotizantes = sum(Cotizando_Pension == 1, na.rm = TRUE),
    pct_cotiza = (cotizantes / total_personas) * 100
  ) %>%
  ungroup() %>%
  mutate(NAME_1 = case_when(
    COD_DEPTO == "5"  ~ "Antioquia",
    COD_DEPTO == "8"  ~ "Atlántico",
    COD_DEPTO == "11" ~ "BogotáD.C.",
    COD_DEPTO == "13" ~ "Bolívar",
    COD_DEPTO == "15" ~ "Boyacá",
    COD_DEPTO == "17" ~ "Caldas",
    COD_DEPTO == "18" ~ "Caquetá",
    COD_DEPTO == "19" ~ "Cauca",
    COD_DEPTO == "20" ~ "Cesar",
    COD_DEPTO == "23" ~ "Córdoba",
    COD_DEPTO == "27" ~ "Chocó",
    COD_DEPTO == "41" ~ "Huila",
    COD_DEPTO == "44" ~ "LaGuajira",
    COD_DEPTO == "47" ~ "Magdalena",
    COD_DEPTO == "50" ~ "Meta",
    COD_DEPTO == "52" ~ "Nariño",
    COD_DEPTO == "54" ~ "NortedeSantander",
    COD_DEPTO == "63" ~ "Quindío",
    COD_DEPTO == "66" ~ "Risaralda",
    COD_DEPTO == "68" ~ "Santander",
    COD_DEPTO == "70" ~ "Sucre",
    COD_DEPTO == "73" ~ "Tolima",
    COD_DEPTO == "76" ~ "ValledelCauca",
    COD_DEPTO == "81" ~ "Arauca",
    COD_DEPTO == "85" ~ "Casanare",
    COD_DEPTO == "86" ~ "Putumayo",
    COD_DEPTO == "88" ~ "SanAndrésyProvidencia",
    COD_DEPTO == "91" ~ "Amazonas",
    COD_DEPTO == "94" ~ "Guainía",
    COD_DEPTO == "95" ~ "Guaviare",
    COD_DEPTO == "97" ~ "Vaupés",
    COD_DEPTO == "99" ~ "Vichada",
    TRUE ~ NA_character_
  )) %>%
  filter(!is.na(NAME_1))

datos_mapa <- datos_mapa %>%
  bind_rows(
    datos_mapa %>% 
      filter(NAME_1 == "BogotáD.C.") %>% 
      mutate(NAME_1 = "Cundinamarca")
  )
mapa_final <- colombia_dept %>%
  left_join(datos_mapa, by = "NAME_1")

mapa_gg <- ggplot() +
  geom_sf(data = mapa_final, 
          aes(fill = pct_cotiza, 
              text = paste0(NAME_1, ": ", round(pct_cotiza, 1), "%")), 
          color = "white", linewidth = 0.2) +
  scale_fill_gradientn(
    colors = c("white", "#7C6A9C", "#4A3F55", "#2C1F3E"),
    name = "% Cotiza\nPensión",
    na.value = "gray90",
    limits = c(0, 100),
    breaks = seq(0, 100, by = 25)
  ) +
  labs(
    title = "Concentración de Población que Cotiza a Pensión por Departamento",
    subtitle = "Proporción de cotizantes en cada departamento - GEIH 2025",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    axis.title = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    plot.title = element_text(color = "#2C1F3E", size = 14, face = "bold"),
    plot.subtitle = element_text(color = "#4A3F55", size = 10),
    plot.caption = element_text(color = "#7C6A9C", size = 8, hjust = 0)
  )

ggplotly(mapa_gg, tooltip = "text")
Se observa que departamentos con menor desarrollo industrial absoluto como el Amazonas o Putumayo presentan tasas de cotización más altas que los grandes centros urbanos.Este fenómeno responde a la estructura del empleo capturada por la GEIH. En regiones de baja densidad poblacional y economía de enclave, el mercado laboral formal está dominado casi exclusivamente por el empleo público como lo es docentes, fuerzas militares, administrativo. Por el contrario, en Antioquia, Valle o Cundinamarca (Cundinamarca refleja los datos del área metropolitana de Bogotá D.C.), que a pesar de ser las regiones más desarrolladas la muestra es heterogénea e incluye una mayor proporción de trabajadores independientes, informales y de servicios privados, donde la cobertura pensional es significativamente menor.Por ende la tasa de cotización no mide la riqueza generada (PIB), sino la proporción de trabajadores formales dentro de la población ocupada, que resulta estructuralmente más alta en economías dependientes del sector público.

3.2 Distribución de la edad

mediana_edad <- median(base_muestra$Edad, na.rm = TRUE)

p <- ggplot(base_muestra, aes(x = Edad)) +
  geom_histogram(bins = 40, fill = "#7C6A9C", color = "#4A3F55", alpha = 0.8) +
  geom_vline(xintercept = mediana_edad, color = "#4A3F55", size = 1.2, linetype = "dashed") +
  scale_y_continuous(labels = label_comma(big.mark = ".")) + 
  labs(
    title = paste("Distribución de la Edad | Mediana =", mediana_edad, "años"),
    subtitle = "Población encuestada por grupos de edad",
    x = "Edad (Años)",
    y = "Cantidad de Personas",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    panel.grid.major = element_line(color = "#D6CDEA", linetype = "dashed")
  )

ggplotly(p, tooltip = c("x", "count")) %>%
  config(displayModeBar = FALSE) %>%
  layout(hoverlabel = list(bgcolor = "#4A3F55", font = list(color = "white")))
La mayor participación de individuos en edades económicamente activas refleja que la muestra está compuesta principalmente por personas vinculadas al mercado laboral, con una clara concentración en el rango de 25 a 40 años, que corresponde a la etapa de mayor productividad y estabilidad laboral, en relación con la informalidad laboral, la edad puede influir en las condiciones de empleo y en el acceso a mecanismos de protección social. Grupos de edades pueden presentar mayores dificultades para acceder a empleos formales, especialmente en etapas tempranas (menor a 20 años) o avanzadas de la vida laboral (60 años).

3.3 Distibución del sexo

base_muestra %>%
  filter(Sexo %in% c(1, 2)) %>%
  mutate(Sexo = ifelse(Sexo == 1, "Masculino", "Femenino")) %>%
  ggplot(aes(x = Sexo, fill = Sexo)) +
  geom_bar(width = 0.6) +
  geom_text(stat = "count", aes(label = after_stat(count)), 
            vjust = -0.5, color = "#4A3F55", fontface = "bold") +
  scale_fill_manual(values = c("Masculino" = "#7C6A9C", "Femenino" = "#D6CDEA")) +
  labs(
    title = "Distribucion por Sexo",
    subtitle = "Comparacion hombres-mujeres",
    x = "", 
    y = "Personas",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none", 
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8)
  )

La muestra presenta una distribución equilibrada entre hombres y mujeres, con una ligera ventaja masculina cercana al 52% y una participación femenina del 48%, lo que refleja adecuadamente la estructura poblacional colombiana y evita sesgos de género en los análisis posteriores, la OIT ha documentado que, más que una cuestión de preferencias, existen barreras estructurales que afectan la inserción laboral femenina, así para 2025, la tasa de participación de las mujeres en la fuerza laboral de América Latina fue del 51,4%, mientras que la de los hombres alcanzó el 74,6% (OIT, 2025). Esta brecha refleja desigualdades en el acceso al empleo formal en cuanto a sexo de la persona, aspecto que incide directamente en la menor probabilidad de cotización pensional de las mujeres en comparación con los hombres.

3.4 Distribución del nivel educativo

base_muestra %>%
  filter(!is.na(Nivel_educativo), Nivel_educativo %in% 1:13) %>%
  mutate(Educacion = case_when(
    Nivel_educativo == 1 ~ "Ninguno",
    Nivel_educativo == 2 ~ "Preescolar",
    Nivel_educativo == 3 ~ "Primaria",
    Nivel_educativo == 4 ~ "Secundaria",
    Nivel_educativo == 5 ~ "Media académica",
    Nivel_educativo == 6 ~ "Media técnica",
    Nivel_educativo == 7 ~ "Normalista",
    Nivel_educativo == 8 ~ "Técnica profesional",
    Nivel_educativo == 9 ~ "Tecnológica",
    Nivel_educativo == 10 ~ "Universitaria",
    Nivel_educativo == 11 ~ "Especialización",
    Nivel_educativo == 12 ~ "Maestría",
    Nivel_educativo == 13 ~ "Doctorado"
  )) %>%
  mutate(Educacion = factor(Educacion, levels = c(
    "Ninguno", "Preescolar", "Primaria", "Secundaria", 
    "Media académica", "Media técnica", "Normalista", 
    "Técnica profesional", "Tecnológica", "Universitaria",
    "Especialización", "Maestría", "Doctorado"
  ))) %>%
  ggplot(aes(x = Educacion, fill = Educacion)) +
  geom_bar(width = 0.7) +
  geom_text(stat = "count", aes(label = after_stat(count)), 
            vjust = -0.2, color = "#4A3F55", fontface = "bold", size = 3) +
  scale_fill_manual(values = c(
    "Ninguno" = "#D6CDEA",
    "Preescolar" = "#D6CDEA",
    "Primaria" = "#D6CDEA",
    "Secundaria" = "#D6CDEA",
    "Media académica" = "#7C6A9C",
    "Media técnica" = "#7C6A9C",
    "Normalista" = "#7C6A9C",
    "Técnica profesional" = "#7C6A9C",
    "Tecnológica" = "#7C6A9C",
    "Universitaria" = "#4A3F55",
    "Especialización" = "#2C1F3E",
    "Maestría" = "#2C1F3E",
    "Doctorado" = "#2C1F3E"
  )) +
  labs(
    title = "Nivel Educativo",
    subtitle = "Distribución de la población por nivel educativo alcanzado",
    x = "", 
    y = "Cantidad de Personas",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#D6CDEA", linetype = "dashed")
  )

Se puede observar una mayor participación de personas con niveles educativos básicos y medios técnicos, representando alrededor del 52% de la muestra, mientras que los niveles superiores presentan menor frecuencia, sin embargo la titulación universitaria cuenta también con un valor relativameente alto, lo cual refleja la estructura educativa del país, para el año 2019 se reportaba que cerca del 35% de la población contaba con educación secundaria completa y media técnica (DANE, 2019), y hacia 2025 se proyectó que esta proporción siga una tendencia al alza, con una mayor participación relativa de los niveles medios y superiores en la fuerza laboral (DANE, 2025).
En términos de informalidad laboral, el nivel educativo es una variable importante debido a que influye directamente en el acceso a oportunidades laborales formales. Las personas con mayor formación académica suelen tener mejores condiciones de empleo, mayor estabilidad y mayor acceso a mecanismos de protección social, como la cotización a pensión.

3.5 Distribución del empleo

base_muestra %>%
  filter(!is.na(Tipo_de_empleo), Tipo_de_empleo %in% 1:7) %>%
  mutate(Empleo = case_when(
    Tipo_de_empleo == 1 ~ "Trabajador",
    Tipo_de_empleo == 2 ~ "Trabajador gobierno",
    Tipo_de_empleo == 3 ~ "Empleado domestico",
    Tipo_de_empleo == 4 ~ "Trabajador familiar",
    Tipo_de_empleo == 5 ~ "Trabajador cuenta propia",
    Tipo_de_empleo == 6 ~ "Patron/empleador",
    Tipo_de_empleo == 7 ~ "Trabajador sin remuneracion"
  )) %>%
  mutate(Empleo = factor(Empleo, levels = c(
    "Trabajador",
    "Trabajador gobierno",
    "Empleado domestico",
    "Trabajador familiar",
    "Trabajador cuenta propia",
    "Patron/empleador",
    "Trabajador sin remuneracion"
  ))) %>%
  ggplot(aes(x = Empleo, fill = Empleo)) +
  geom_bar(width = 0.7) +
  geom_text(stat = "count", aes(label = after_stat(count)), 
            vjust = -0.2, color = "#4A3F55", fontface = "bold", size = 3) +
  scale_fill_manual(values = c(
    "Trabajador" = "#7C6A9C",
    "Trabajador gobierno" = "#7C6A9C",
    "Empleado domestico" = "#D6CDEA",
    "Trabajador familiar" = "#D6CDEA",
    "Trabajador cuenta propia" = "#D6CDEA",
    "Patron/empleador" = "#4A3F55",
    "Trabajador sin remuneracion" = "#D6CDEA"
  )) +
  labs(
    title = "Tipo de Empleo",
    subtitle = "Distribución de la población por tipo de ocupación laboral",
    x = "", 
    y = "Cantidad de Personas",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#D6CDEA", linetype = "dashed")
  )

Se observa que la mayor parte de la población ocupada de la muestra corresponde a trabajadores particulares al rededor de casi el 80% de personas, siendo la categoría laboral con mayor participación. En menor proporción se encuentran los empleados domésticos y trabajadores sin remuneración. Estos resultados evidencian una mayor presencia de trabajadores vinculados a ocupaciones con mayor posibilidad de acceso a mecanismos de protección social y afiliación al sistema de seguridad social. las diferencias en los tipos de ocupación pueden influir en las condiciones laborales y en la probabilidad de cotización al sistema pensional (DANE, 2025).

3.6 Distribución de los ingresos

p <- base_muestra %>%
  filter(Ingresos_recibidos > 0, Ingresos_recibidos < 15000000) %>%
  mutate(Cotiza = ifelse(Cotizando_Pension == 1, "Si cotiza", "No cotiza")) %>%
  ggplot(aes(x = Ingresos_recibidos, fill = Cotiza)) +
  geom_density(alpha = 0.6) +
  scale_fill_manual(values = c("Si cotiza" = "#7C6A9C", "No cotiza" = "#D6CDEA")) +
  scale_x_continuous(labels = scales::label_comma(big.mark = "."), 
                     limits = c(0, 10000000),
                     breaks = seq(0, 10000000, 2000000)) +
  labs(
    title = "Distribucion de ingresos segun cotizacion a pension",
    x = "Ingresos (Pesos Colombianos)",
    y = "Densidad",
    caption = "Fuente: DANE - GEIH 2025") +
  theme_minimal() +
  theme(
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.caption = element_text(color = "#7C6A9C", hjust = 1, size = 8, face = "italic"),
    legend.title = element_blank(),
    legend.position = "bottom")

ggplotly(p, tooltip = c("x", "y", "fill")) %>%
  config(displayModeBar = FALSE) %>%
  layout(
    hoverlabel = list(bgcolor = "#4A3F55", font = list(color = "white")),
    legend = list(title = list(text = "")),
    annotations = list(
      text = "Fuente: DANE - GEIH 2025",
      x = 1, y = 0, xref = "paper", yref = "paper",
      xanchor = "right", yanchor = "bottom",
      showarrow = FALSE, font = list(size = 10, color = "#7C6A9C")))
Los ingresos de la población analizada presentan una distribución desigual, donde la mayoría de las personas se concentra en niveles bajos y medios, principalmente inferiores a los 3 millones de pesos colombianos, mientras que solo una pequeña proporción alcanza ingresos altos. Esto refleja la presencia de una gran cantidad de trabajadores con ingresos limitados dentro del mercado laboral colombiano, de igual manera se observa que las personas que cotizan al sistema pensional tienden a ubicarse en niveles de ingreso más altos, mientras que quienes no cotizan se concentran principalmente en ingresos bajos, evidenciando una relación entre ingresos y formalidad laboral, ya que los trabajadores con mayores ingresos suelen tener mayor acceso a empleos estables y mecanismos de protección social (DANE, 2025).
Por ello, el ingreso se convierte en una variable relevante dentro del modelo predictivo, ya que permite diferenciar con mayor precisión a los individuos según su probabilidad de cotizar o no al sistema pensional.
mediana_ingresos <- median(base_muestra$Ingresos_recibidos[
  base_muestra$Ingresos_recibidos > 0 & 
  base_muestra$Ingresos_recibidos < 10000000], na.rm = TRUE)

p_ingresos <- base_muestra %>%
  filter(Ingresos_recibidos > 0, Ingresos_recibidos < 10000000) %>%
  ggplot(aes(x = Ingresos_recibidos)) +
  geom_histogram(bins = 40, fill = "#7C6A9C", color = "#4A3F55", alpha = 0.7) +
  geom_vline(xintercept = mediana_ingresos, 
             color = "#2C1F3E", linetype = "dashed", linewidth = 1) +
  annotate("text", 
           x = mediana_ingresos + 400000, 
           y = Inf, 
           label = paste0("Mediana: $", format(mediana_ingresos, big.mark = ".")),
           color = "#2C1F3E", fontface = "bold", size = 3.5, vjust = 2) +
  scale_x_continuous(labels = label_comma(big.mark = ".")) +
  scale_y_continuous(labels = label_comma(big.mark = ".")) +
  labs(
    title = "Distribución de Ingresos",
    subtitle = "Población ocupada con ingresos reportados",
    x = "Pesos Colombianos", 
    y = "Frecuencia",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    panel.grid.major = element_line(color = "#D6CDEA", linetype = "dashed"))
ggplotly(p_ingresos) %>%
  config(displayModeBar = FALSE) %>%
  layout(
    annotations = list(
      list(
        text = "Fuente: DANE - Gran Encuesta Integrada de Hogares (GEIH) 2025",
        x = 0, y = -0.12,
        xref = "paper", yref = "paper",
        showarrow = FALSE,
        font = list(size = 9, color = "#7C6A9C"),
        xanchor = "left")))
la distribución de ingresos revela que la mayoría de los encuestados se concentra en el rango de un millón quinientos mil pesos, representando cerca del 36% de la población analizada evidenciando que gran parte de los colombianos vive con ingresos justos para cubrir sus necesidades básicas, reflejando una marcada asimetría hacia la derecha en la que muy pocas personas logran superar los tres millones de pesos. Esta distribución muestra una profunda desigualdad económica dentro del mercado laboral colombiano, de igual manera se observa que las personas que cotizan al sistema pensional tienden a ubicarse en niveles de ingreso más altos,donde muy pocas personas superan los tres millones de pesos, reflejando una profunda desigualdad económica.

3.7 Distribución de la zona

base_muestra %>%
  filter(!is.na(Zona), Zona %in% c(1, 2)) %>%
  mutate(Zona_texto = ifelse(Zona == 1, "Urbano", "Rural")) %>%
  ggplot(aes(x = Zona_texto, fill = Zona_texto)) +
  geom_bar(width = 0.6) +
  geom_text(stat = "count", aes(label = after_stat(count)), 
            vjust = -0.5, color = "#4A3F55", fontface = "bold", size = 5) +
  scale_fill_manual(values = c("Urbano" = "#7C6A9C", "Rural" = "#D6CDEA")) +
  labs(
    title = "Distribucion por Zona",
    subtitle = "Poblacion ocupada segun zona geografica (Urbana/Rural)",
    x = "", 
    y = "Cantidad de Personas",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#D6CDEA", linetype = "dashed"),
    axis.text = element_text(size = 11)
  )

la población ocupada se concentra mayoritariamente en la zona urbana con 9,038 personas, frente a solo 962 en la zona rural, lo que representa que aproximadamente el 90.38% de los ocupados reside en áreas urbanas. Esta marcada brecha evidenciada (DANE, 2025) refleja la estructura urbanizada del mercado laboral colombiano y tiene importantes implicaciones para el diseño de políticas diferenciadas de empleo y protección social entre el campo y la ciudad.

4 Resultados modelos predictivos

4.1 Modelo de regresión logística

base_muestra$cotiza_f <- factor(base_muestra$Cotizando_Pension,
                                   levels = c(0, 1),
                                   labels = c("No", "Si"))
set.seed(28)
idx <- createDataPartition(y = base_muestra$cotiza_f, p = 0.75, list = FALSE)
train <- base_muestra[idx, ]
test  <- base_muestra[-idx, ]
fit_logit <- glm(cotiza_f ~ Edad + Sexo + Zona + Nivel_educativo + Ingresos_recibidos, 
                 data = train, family = binomial())

tidy(fit_logit) %>%
  mutate(
    signif = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ ""
    ),
    odds_ratio = exp(estimate),
    odds_ratio = round(odds_ratio, 3)
  ) %>%
  select(term, estimate, odds_ratio, p.value, signif) %>%
  gt() %>%
  tab_header(
    title = md("**Regresion Logistica - Coeficientes**"),
    subtitle = md("Variable respuesta: cotiza_f (Si/No)")
  ) %>%
  cols_label(
    term = "Variable",
    estimate = "Coeficiente",
    odds_ratio = "Odds Ratio",
    p.value = "p-valor",
    signif = "Sig."
  ) %>%
  fmt_number(decimals = 4) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  data_color(
    columns = p.value,
    colors = scales::col_numeric(
      palette = c("#D6CDEA", "#7C6A9C", "#4A3F55"),
      domain = c(0, 0.05)
    )
  ) %>%
  tab_source_note("*** p < 0.001; ** p < 0.01; * p < 0.05") %>%
  tab_options(table.width = pct(100))
Regresion Logistica - Coeficientes
Variable respuesta: cotiza_f (Si/No)
Variable Coeficiente Odds Ratio p-valor Sig.
(Intercept) −1.8620 0.1550 0.0000 ***
Edad −0.0021 0.9980 0.3475
Sexo −0.1475 0.8630 0.0128 *
Zona −0.5107 0.6000 0.0000 ***
Nivel_educativo 0.1981 1.2190 0.0000 ***
Ingresos_recibidos 0.0000 1.0000 0.0000 ***
*** p < 0.001; ** p < 0.01; * p < 0.05
Los resultados de la regresión logística muestran que variables como el nivel educativo, la zona de residencia y los ingresos recibidos presentan una relación estadísticamente significativa con la probabilidad de pertenecer al empleo formal. En contraste, la variable edad no presentó significancia estadística dentro del modelo, lo que sugiere una menor capacidad explicativa frente a las demás variables analizadas.
El nivel educativo fue una de las variables más relevantes dentro del modelo, presentando un odds ratio de 1.219, lo que indica que a medida el nivel educativo de la persona aumenta en una unidad, aumenta en un 21% la probabilidad de pertenecer al empleo formal. A su vez, este resultado refleja que las personas con mayores niveles educativos tienen mayores oportunidades de contar con empleos estables y acceso a mecanismos de protección social siendo este comportamiento una representación de la realidad frecuente del mercado laboral colombiano, donde la educación suele ser un factor determinante para acceder a mejores condiciones laborales. Lo anterior coincide con lo planteado por James et al. (2021), las variables con mayor capacidad predictiva permiten identificar patrones relevantes asociados al comportamiento de la variable objetivo.
p_hat <- predict(fit_logit, newdata = test, type = "response")
pred_clase <- factor(ifelse(p_hat >= 0.5, "Si", "No"), levels = c("Si", "No"))
roc_o <- roc(response = test$cotiza_f, predictor = p_hat, levels = c("No", "Si"))
umbral <- as.numeric(coords(roc_o, x = "best", best.method = "youden", ret = "threshold"))

pred_clase_opt <- factor(ifelse(p_hat >= umbral, "Si", "No"), levels = c("Si", "No"))
cm_opt <- confusionMatrix(pred_clase_opt, test$cotiza_f, positive = "Si")

data.frame(
  Metrica = c("Accuracy", "Sensibilidad", "Especificidad", 
              "Valor Predictivo Positivo", "Valor Predictivo Negativo",
              "Aciertos", "Total", "Error"),
  Valor = c(
    paste0(round(cm_opt$overall["Accuracy"] * 100, 2), "%"),
    paste0(round(cm_opt$byClass["Sensitivity"] * 100, 2), "%"),
    paste0(round(cm_opt$byClass["Specificity"] * 100, 2), "%"),
    paste0(round(cm_opt$byClass["Pos Pred Value"] * 100, 2), "%"),
    paste0(round(cm_opt$byClass["Neg Pred Value"] * 100, 2), "%"),
    format(sum(diag(cm_opt$table)), big.mark = "."),
    format(sum(cm_opt$table), big.mark = "."),
    paste0(round((1 - cm_opt$overall["Accuracy"]) * 100, 2), "%")
  )
) %>%
  gt() %>%
  tab_header(
    title = md("**Metricas de Desempeno - Regresion Logistica**"),
    subtitle = md(paste("Umbral Optimo =", round(umbral, 3)))
  ) %>%
  cols_label(
    Metrica = "Indicador",
    Valor = "Resultado"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  opt_row_striping() %>%
  tab_options(table.width = pct(70))
Metricas de Desempeno - Regresion Logistica
Umbral Optimo = 0.542
Indicador Resultado
Accuracy 82.99%
Sensibilidad 90.77%
Especificidad 68.78%
Valor Predictivo Positivo 84.16%
Valor Predictivo Negativo 80.32%
Aciertos 2.074
Total 2.499
Error 17.01%
El modelo fue estimado a partir de una muestra de 10.000 observaciones, utilizando una partición del 75% para entrenamiento y 25% para prueba, permitiendo evaluar el desempeño predictivo sobre datos no utilizados durante el proceso de entrenamiento La regresión logística presentó una exactitud del 82.99%, lo que evidencia una gran capacidad para clasificar correctamente a las personas pertenecientes al empleo formal e informal, el modelo registró un error del 17.1%, indicando que la proporción de clasificaciones incorrectas fue relativamente baja frente al total de observaciones analizadas, reflejando un desempeño predictivo adecuado, de igual manera la sensibilidad alcanzó un 90.77%, evidenciando que el modelo identifica correctamente a gran parte de las personas vinculadas al empleo formal.
La regresión logística presentó una exactitud del 82.99%, lo que evidencia una gran capacidad para clasificar correctamente a las personas pertenecientes al empleo formal e informal y que a comparación del 17.1% de error donde clasificó mal siendo este muy bajo . Asimismo, la sensibilidad alcanzó un 90.77%, evidenciando que el modelo identifica adecuadamente a gran parte de las personas vinculadas al empleo formal.
Por otro lado, la especificidad fue menor en comparación con la sensibilidad, lo que sugiere una mayor dificultad para identificar correctamente algunos casos asociados a informalidad laboral. Esto puede relacionarse con la complejidad del mercado laboral colombiano, donde existen trabajadores con condiciones laborales intermedias o inestables que hace que dificulte diferenciar completamente entre formalidad e informalidad. Según James et al. (2021), el desempeño de los modelos predictivos pueden presentar limitaciones cuando existen patrones sociales y económicos complejos dentro de los datos analizados.
as.data.frame(cm_opt$table) %>%
  gt() %>%
  tab_header(
    title = md("**Matriz de Confusion**"),
    subtitle = md(paste("Umbral Optimo =", round(umbral, 3)))
  ) %>%
  cols_label(
    Prediction = "Prediccion",
    Reference = "Realidad",
    Freq = "Frecuencia"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  data_color(
    columns = "Freq",
    colors = scales::col_numeric(palette = c("#D6CDEA", "#7C6A9C", "#4A3F55"), domain = NULL)
  ) %>%
  tab_options(table.width = pct(50))
Matriz de Confusion
Umbral Optimo = 0.542
Prediccion Realidad Frecuencia
No No 608
Si No 276
No Si 149
Si Si 1466
Los resultados muestran una alta cantidad de aciertos en la clasificación de personas pertenecientes al empleo formal, con 1.466 casos correctamente identificados por el modelo, siendo al rededor de casi el 59% de los datos, evidenciando una importante capacidad predictiva para reconocer individuos que presentan características asociadas a condiciones de empleo formal, como mayores niveles educativos, mejores ingresos o acceso a mecanismos de protección social, asimismo, el modelo logró identificar adecuadamente 608 casos correspondientes a empleo informal estimado el 24% de los datos, permitiendo diferenciar una parte significativa de trabajadores con menores niveles de formalidad laboral
auc_val <- auc(roc_o)

roc_df <- data.frame(
  Sensitivity = roc_o$sensitivities,
  Specificity = roc_o$specificities,
  FPR = 1 - roc_o$specificities
)

umbral_point <- coords(roc_o, x = umbral, ret = c("sensitivity", "specificity"), input = "threshold")
umbral_df <- data.frame(
  FPR = 1 - as.numeric(umbral_point["specificity"]),
  Sensitivity = as.numeric(umbral_point["sensitivity"])
)

ggplot(roc_df, aes(x = FPR, y = Sensitivity)) +
  geom_line(color = "#7C6A9C", size = 1.2) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "#D6CDEA", size = 0.8) +
  geom_point(data = umbral_df, aes(x = FPR, y = Sensitivity), 
             color = "#4A3F55", size = 4, shape = 16) +
  annotate("text", x = umbral_df$FPR + 0.1, y = umbral_df$Sensitivity - 0.05,
           label = paste("Umbral =", round(umbral, 3)), 
           color = "#4A3F55", size = 4, fontface = "bold") +
  labs(
    title = "Curva ROC - Regresion Logistica",
    subtitle = paste("AUC =", round(auc_val, 3)),
    x = "Tasa de Falsos Positivos (1 - Especificidad)",
    y = "Tasa de Verdaderos Positivos (Sensibilidad)",
    caption = "Fuente: DANE - GEIH 2025"
  ) +
  scale_x_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) +
  theme_minimal() +
  theme(
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 12),
    plot.caption = element_text(color = "#7C6A9C", hjust = 0, size = 8),
    panel.grid.major = element_line(color = "#D6CDEA", linetype = "dashed"),
    panel.grid.minor = element_blank(),
    axis.title = element_text(color = "#4A3F55", face = "bold", size = 11),
    axis.text = element_text(color = "#4A3F55", size = 9),
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA)
  )

El modelo obtuvo un área bajo la curva (AUC) de 0.867, lo que indica una alta capacidad para diferenciar correctamente entre ambas categorías, representando un valor cercano a 1 que da una mejor capacidad de clasificación. Asimismo, el umbral óptimo de clasificación se ubicó en 0.542, permitiendo alcanzar un equilibrio adecuado entre sensibilidad y especificidad. Esto sugiere que el modelo logra identificar correctamente una gran proporción de individuos asociados al empleo formal, manteniendo un nivel razonable de errores de clasificación. Según James et al. (2021), la curva ROC y el AUC son herramientas fundamentales para evaluar el desempeño de modelos supervisados, ya que permiten medir su capacidad discriminatoria frente a distintos puntos de clasificación.

4.2 Modelo K-Nearest Neighbors (KNN)

El modelo K-Nearest Neighbors (KNN) fue implementado con el objetivo de clasificar a los individuos entre empleo formal e informal a partir de sus características sociodemográficas y económicas. Para determinar el valor óptimo de k, se evaluaron distintos números de vecinos utilizando la muestra de entrenamiento.
base_knn <- base_muestra %>%
  filter(!is.na(Edad), !is.na(Sexo), !is.na(Zona), 
         !is.na(Nivel_educativo), !is.na(Ingresos_recibidos),
         !is.na(cotiza_f))

base_knn_escalada <- base_knn %>%
  mutate(
    Edad_esc = scale(Edad),
    Sexo_esc = scale(Sexo),
    Zona_esc = scale(Zona),
    Nivel_educativo_esc = scale(Nivel_educativo),
    Ingresos_esc = scale(Ingresos_recibidos)
  )
set.seed(28)

total_filas <- nrow(base_knn_escalada)
index_muestra <- sample(total_filas, 10000)

index_entrena <- sample(index_muestra, 7500)
index_test <- index_muestra[!index_muestra %in% index_entrena]

knn_entrena <- base_knn_escalada[index_entrena, ]
knn_test <- base_knn_escalada[index_test, ]
knn_entrena_input <- knn_entrena[, c("Edad_esc", "Sexo_esc", "Zona_esc", 
                                     "Nivel_educativo_esc", "Ingresos_esc")]
knn_entrena_output <- knn_entrena$cotiza_f

knn_test_input <- knn_test[, c("Edad_esc", "Sexo_esc", "Zona_esc", 
                               "Nivel_educativo_esc", "Ingresos_esc")]
knn_test_output <- knn_test$cotiza_f
knn_test_pred_k3 <- knn(train = knn_entrena_input, 
                        cl = knn_entrena_output, 
                        test = knn_test_input, 
                        k = 3)

KnnBonito <- data.frame(Prediccion = knn_test_pred_k3, Realidad = knn_test_output)

KnnBonito %>%
  gt() %>%
  tab_header(
    title = md("**Predicciones KNN (k=3)**"),
    subtitle = md("Comparacion entre prediccion y realidad")
  ) %>%
  cols_label(
    Prediccion = "Prediccion",
    Realidad = "Realidad"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  opt_row_striping() %>%
  tab_options(
    table.width = pct(100),
    container.height = pct(100)
  ) %>%
  htmltools::div(style = "height: 400px; overflow-y: auto;", .)
Predicciones KNN (k=3)
Comparacion entre prediccion y realidad
Prediccion Realidad
Si Si
No No
No Si
No Si
No Si
Si Si
Si Si
No Si
Si Si
No Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No Si
Si Si
Si Si
No Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si Si
No No
No No
Si No
Si Si
Si No
Si Si
No No
Si No
No Si
Si No
Si Si
Si Si
No No
Si Si
No Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
Si Si
No No
Si Si
No No
Si No
Si No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si No
Si Si
Si Si
Si No
No Si
No No
No No
Si Si
Si Si
Si Si
No No
Si Si
No No
No No
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si No
No No
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
Si Si
Si No
No No
No Si
No No
No Si
Si No
Si Si
Si Si
No No
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
Si Si
Si No
Si Si
No No
Si No
Si Si
Si No
No No
No No
No No
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
No Si
Si Si
Si Si
No No
No Si
Si Si
Si No
No No
Si Si
Si No
Si Si
Si Si
No Si
No No
Si No
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No Si
Si No
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No Si
Si Si
Si Si
No Si
No Si
Si Si
Si No
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
Si Si
Si No
No No
Si Si
Si No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
No No
No No
Si Si
No No
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si No
No Si
No No
No No
Si No
Si Si
Si Si
No Si
No Si
Si No
No No
Si Si
No No
Si Si
Si Si
No Si
No No
No No
No No
Si Si
Si No
Si No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No No
Si No
Si Si
No No
Si Si
Si Si
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si Si
No No
No No
No No
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
No No
No No
No No
Si Si
Si Si
Si Si
Si No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si No
No No
Si Si
Si Si
No No
Si Si
Si Si
No No
No No
Si Si
Si No
Si Si
Si Si
Si Si
No Si
Si No
No No
Si Si
Si Si
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si No
Si Si
Si No
No No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
No No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
No Si
Si No
No No
Si Si
Si No
No No
Si Si
Si Si
No No
Si Si
Si No
Si Si
No No
No No
Si Si
Si Si
No No
No No
No No
Si Si
No Si
Si Si
Si Si
Si No
No Si
Si No
No No
Si Si
Si No
Si No
No No
No No
No No
No No
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
No No
Si Si
No Si
Si Si
Si Si
No Si
Si No
Si No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
No Si
No No
Si Si
Si Si
Si Si
No No
No No
Si No
Si Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No No
No No
No No
No No
Si No
Si Si
Si Si
Si Si
Si Si
Si No
Si No
Si No
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
No No
Si Si
Si Si
No No
No No
No Si
Si Si
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
No No
No Si
No No
Si Si
Si Si
Si No
Si Si
Si No
Si No
No No
Si Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si Si
Si Si
Si No
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
No No
Si No
No No
No Si
Si Si
No No
Si Si
No No
Si Si
No No
No No
Si Si
Si No
Si Si
No No
Si Si
Si Si
No No
Si No
No Si
Si No
Si Si
No No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
No Si
No Si
No No
Si Si
Si No
No No
No No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si No
No Si
Si Si
Si Si
Si Si
No No
No No
No No
Si Si
Si No
Si Si
Si Si
No Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
No No
No No
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
No No
No No
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
No No
No No
Si Si
Si Si
No No
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
Si No
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
No No
Si No
Si Si
Si Si
No No
No No
Si No
Si Si
No No
Si Si
Si Si
No Si
No No
Si Si
No No
No Si
Si Si
Si No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
No No
Si No
Si Si
Si Si
No Si
No Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
No No
Si Si
No Si
Si Si
Si Si
No Si
No No
No No
Si Si
No No
Si No
No No
No No
Si No
Si Si
No No
Si Si
No No
No Si
Si No
No No
Si Si
Si Si
Si Si
No No
Si No
Si Si
Si Si
No No
No No
Si Si
Si Si
No Si
Si Si
No No
No No
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
No No
Si No
No No
Si Si
Si Si
No No
Si Si
Si Si
No No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si No
Si No
Si Si
Si Si
Si Si
Si No
Si No
Si No
Si Si
No No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
No Si
No No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
Si No
Si Si
No No
Si Si
No Si
Si Si
No No
No No
Si No
Si Si
Si Si
Si Si
No No
Si No
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
No Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No No
Si Si
No Si
Si Si
Si Si
Si Si
No Si
Si Si
No No
No No
Si Si
No No
Si No
Si Si
Si No
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No No
No No
No No
Si Si
Si No
No Si
Si Si
No No
No Si
Si Si
Si Si
No Si
No No
Si Si
No No
Si Si
No No
No No
No No
Si Si
Si Si
No No
No No
Si Si
Si No
Si No
Si No
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
No Si
Si No
Si Si
Si Si
Si No
Si No
No No
Si Si
No Si
Si Si
Si No
No No
Si Si
No No
Si Si
Si Si
Si Si
No No
No No
Si Si
Si No
No No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
No Si
No No
No No
Si Si
No No
Si Si
Si No
No Si
Si Si
Si Si
Si Si
No No
No No
No Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
No Si
Si Si
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si No
No Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No Si
Si Si
Si No
No No
Si No
Si Si
Si No
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
No No
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si Si
No No
No No
Si No
No Si
No No
No No
Si No
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
No No
No No
Si Si
Si Si
No No
Si Si
Si Si
No Si
Si No
Si Si
Si Si
Si Si
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No No
No No
No No
Si No
Si Si
No No
No No
No No
Si Si
Si Si
No No
No Si
Si Si
No No
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si No
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
No No
No Si
Si Si
No No
No No
No Si
Si Si
Si No
Si No
No No
Si No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si No
No No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si No
No No
Si Si
Si Si
No No
Si No
Si Si
No Si
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No Si
No Si
Si Si
Si Si
Si No
Si Si
Si Si
No No
No No
Si Si
Si Si
Si No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
No No
No No
No No
Si Si
No Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
No Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si No
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si No
No No
No No
Si Si
Si No
Si No
Si Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
No No
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si No
No Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si No
Si Si
No Si
No Si
No No
No No
No No
No No
Si No
Si Si
Si Si
Si Si
Si No
Si No
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si No
No No
Si Si
Si No
Si Si
No Si
Si No
Si Si
Si Si
Si No
Si Si
Si Si
No Si
No No
Si No
Si No
Si Si
Si No
Si Si
Si No
Si Si
No No
No No
Si Si
Si Si
Si No
Si No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si No
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
No Si
Si Si
Si No
Si Si
Si Si
Si Si
Si No
Si No
Si Si
Si Si
Si No
Si No
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si No
No No
Si Si
Si Si
Si Si
No No
No No
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si No
Si Si
No No
No Si
No No
Si Si
Si Si
No No
Si No
Si Si
No Si
No Si
Si Si
Si No
Si Si
Si Si
Si Si
Si No
No Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
No No
Si Si
No No
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
No No
Si No
No No
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
No Si
No No
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
No No
No No
Si Si
Si Si
No No
Si No
No Si
No No
No No
Si No
No Si
No No
Si Si
Si No
Si No
No No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si No
No Si
Si No
No No
Si Si
Si Si
No Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
No No
Si No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
No No
Si No
No No
No No
Si Si
No Si
Si Si
No No
No No
Si Si
Si Si
Si Si
No No
Si Si
No No
No Si
Si Si
Si Si
No No
Si No
No No
Si No
No No
Si Si
Si Si
Si Si
No No
No No
No No
Si No
Si Si
Si Si
No Si
Si No
No No
No No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
No No
Si No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
No No
Si Si
No No
No Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si No
Si No
Si Si
No No
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si No
No Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si No
No No
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
No No
No No
No Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No Si
Si Si
No No
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si No
Si Si
Si Si
No Si
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si No
Si No
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
No Si
No No
Si Si
Si Si
Si Si
No No
Si Si
No Si
Si Si
No No
No No
Si No
Si Si
Si Si
No No
No Si
No No
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
No No
No No
Si No
Si Si
No No
No No
Si Si
No Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si No
Si Si
Si No
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No Si
Si Si
Si Si
No No
Si Si
Si Si
No No
No No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
No Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
No Si
Si Si
Si Si
No No
Si Si
No No
No No
Si Si
No No
Si Si
No No
Si Si
Si No
Si No
Si Si
No Si
Si Si
No Si
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si No
Si Si
Si Si
Si Si
No No
No No
No Si
Si No
Si Si
Si Si
No No
Si Si
No No
Si No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si No
No Si
Si Si
Si Si
Si No
Si No
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
No No
No Si
No No
No No
No Si
Si Si
Si No
Si No
Si Si
Si Si
No No
Si Si
Si Si
No Si
Si Si
No No
Si Si
Si No
Si Si
Si No
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No Si
No No
Si No
Si Si
Si No
No No
No No
Si Si
No No
Si No
Si Si
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si No
No No
No No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
Si No
Si Si
Si Si
No No
No No
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
Si No
No No
Si No
Si No
No No
No No
Si Si
Si No
No No
Si Si
Si Si
No No
No No
Si Si
No No
No No
No No
Si Si
Si No
No No
Si No
Si Si
Si No
No No
Si No
Si Si
Si Si
Si Si
Si No
Si Si
No Si
No No
Si Si
No No
No No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si No
No No
Si Si
Si Si
Si Si
No No
No No
No No
No No
Si Si
Si No
No No
No Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
No No
Si Si
No Si
No No
No Si
Si Si
No Si
No No
Si No
Si Si
No No
Si Si
Si Si
Si Si
No Si
Si Si
Si Si
Si Si
Si Si
Si Si
No No
No No
Si Si
Si No
Si Si
Si Si
No No
Si Si
Si No
Si Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
No Si
Si Si
Si Si
Si Si
No No
No Si
Si Si
Si Si
Si No
Si Si
No No
Si Si
Si Si
No No
Si Si
Si Si
No No
Si Si
No Si
Si Si
Si Si
No No
Si No
Si Si
No No
Si Si
No No
Si Si
No No
Si Si
Si Si
Si Si
No No
Si Si
Si Si
No Si
Si Si
No Si
Si Si
Si Si
No No
Si Si
No No
No No
No Si
Si Si
No Si
precision <- as.numeric(mean(knn_test_pred_k3 == knn_test_output))
matriz <- table(knn_test_pred_k3, knn_test_output)

data.frame(
  Metrica = c("Precision", "Aciertos", "Errores", "Total"),
  Valor = c(
    paste0(round(precision * 100, 2), "%"),
    format(sum(diag(matriz)), big.mark = "."),
    format(sum(matriz) - sum(diag(matriz)), big.mark = "."),
    format(sum(matriz), big.mark = ".")
  )
) %>%
  gt() %>%
  tab_header(
    title = md("**Metricas de Desempeno - KNN (k=3)**"),
    subtitle = md("Prediccion de cotizacion a pension")
  ) %>%
  cols_label(
    Metrica = "Indicador",
    Valor = "Resultado"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  opt_row_striping() %>%
  tab_options(table.width = pct(50))
Metricas de Desempeno - KNN (k=3)
Prediccion de cotizacion a pension
Indicador Resultado
Precision 82%
Aciertos 2.050
Errores 450
Total 2.500
El modelo KNN con k = 3 alcanzó una precisión del 83.56%, clasificando correctamente 2.089 de los 2.500 casos del conjunto de prueba. Esta métrica evidencia un desempeño adecuado del modelo para identificar individuos pertenecientes al empleo formal e informal. Asimismo, el modelo presentó un margen de error cercano al 16.44%, correspondiente a 411 casos clasificados incorrectamente, reflejando un nivel de equivocación relativamente bajo frente al total de observaciones analizadas.
k <- 1:50
resultado <- data.frame(k, precision = 0)

for(n in k){
  knn_test_pred <- knn(train = knn_entrena_input, 
                       cl = knn_entrena_output, 
                       test = knn_test_input, 
                       k = n)
  
  resultado$precision[n] <- mean(knn_test_pred == knn_test_output)
}
resultado %>%
  gt() %>%
  tab_header(
    title = md("**Precision de KNN segun valor de k**"),
    subtitle = md("Comparacion de precision para k = 1 a 50")
  ) %>%
  cols_label(
    k = "Numero de vecinos (k)",
    precision = "Precision"
  ) %>%
  fmt_number(columns = precision, decimals = 4) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  data_color(
    columns = precision,
    colors = scales::col_numeric(palette = c("#D6CDEA", "#7C6A9C", "#4A3F55"), domain = NULL)
  ) %>%
  opt_row_striping() %>%
  tab_options(table.width = pct(50)) %>%
  htmltools::div(style = "height: 400px; overflow-y: auto;", .)
Precision de KNN segun valor de k
Comparacion de precision para k = 1 a 50
Numero de vecinos (k) Precision
1 0.8072
2 0.8132
3 0.8200
4 0.8216
5 0.8260
6 0.8240
7 0.8304
8 0.8276
9 0.8300
10 0.8304
11 0.8292
12 0.8256
13 0.8268
14 0.8260
15 0.8228
16 0.8224
17 0.8240
18 0.8236
19 0.8248
20 0.8196
21 0.8196
22 0.8220
23 0.8204
24 0.8236
25 0.8264
26 0.8240
27 0.8256
28 0.8252
29 0.8264
30 0.8260
31 0.8264
32 0.8232
33 0.8232
34 0.8216
35 0.8228
36 0.8224
37 0.8212
38 0.8208
39 0.8184
40 0.8184
41 0.8188
42 0.8200
43 0.8172
44 0.8160
45 0.8148
46 0.8144
47 0.8156
48 0.8128
49 0.8148
50 0.8112
resultado %>% 
  ggplot() +
  aes(k, precision) +
  geom_line(color = "#7C6A9C", size = 1, linetype = "solid") +
  geom_point(color = "#4A3F55", size = 1) +
  labs(title = "Precision de KNN segun valor de k",
       x = "Numero de vecinos (k)",
       y = "Precision") +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    axis.title = element_text(color = "#4A3F55", face = "bold"),
    axis.text = element_text(color = "#4A3F55"),
    panel.grid.major = element_line(color = "#D6CDEA", linetype = "dotted"),
    panel.grid.minor = element_blank()
  )

El gráfico de precisión de KNN según el valor de k muestra un comportamiento estable, con un rendimiento óptimo en el rango entre 5 y 25 vecinos, donde se alcanza una precisión entre el 82% y 83%. Para valores bajos de k el modelo tiende a sobreajustarse, mientras que para valores altos la precisión disminuye progresivamente. Este comportamiento evidencia que el modelo KNN logra un equilibrio adecuado entre sesgo y varianza dentro del rango óptimo, validando su capacidad predictiva para clasificar la formalidad laboral a partir de variables sociodemográficas y laborales. Según James et al. (2021), la selección adecuada del parámetro k es fundamental en modelos KNN, ya que valores muy pequeños pueden generar sobreajuste, mientras que valores demasiado grandes reducen la capacidad del modelo para capturar patrones importantes dentro de los datos.
set.seed(28)

knn_entrenado <- train(cotiza_f ~ Edad_esc + Sexo_esc + Zona_esc + 
                         Nivel_educativo_esc + Ingresos_esc, 
                       data = knn_entrena, 
                       method = "knn",  
                       tuneLength = 200)
load("Data final.RData")
mejor_k <- knn_entrenado$bestTune$k
mejor_precision <- knn_entrenado$results[knn_entrenado$results$k == mejor_k, "Accuracy"]

data.frame(
  Metrica = c("Mejor valor de k", "Precision alcanzada"),
  Valor = c(mejor_k, paste0(round(mejor_precision * 100, 2), "%"))
) %>%
  gt() %>%
  tab_header(title = md("**KNN - Mejor modelo encontrado**")) %>%
  cols_label(Metrica = "", Valor = "") %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  tab_options(table.width = pct(40))
KNN - Mejor modelo encontrado
Mejor valor de k 11
Precision alcanzada 82.78%
Los resultados obtenidos muestran que el mejor desempeño del modelo se alcanzó con un valor de k=11, obteniendo una precisión (accuracy) aproximada del 82.78%. Este resultado evidencia que el modelo KNN presenta un desempeño adecuado para clasificar individuos pertenecientes al empleo formal e informal, seleccionando automáticamente el parámetro que maximiza la capacidad predictiva dentro del rango evaluado.
knn_entrenado$results %>%
  ggplot(aes(x = k, y = Accuracy)) +
  geom_line(color = "#7C6A9C", size = 0.5) +
  geom_point(color = "#4A3F55", size = 1.5) +
  labs(title = "Precision de KNN segun valor de k",
       subtitle = paste("Mejor k =", knn_entrenado$bestTune$k),
       x = "Numero de vecinos (k)",
       y = "Precision (Accuracy)") +
  theme_minimal() +
  theme(
    plot.title = element_text(color = "#4A3F55", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#7C6A9C", size = 11),
    axis.title = element_text(color = "#4A3F55", face = "bold", size = 11),
    axis.text = element_text(color = "#4A3F55", size = 9),
    panel.grid.major = element_line(color = "#D6CDEA", linetype = "dashed"),
    panel.grid.minor = element_blank()
  )

El gráfico de precisión muestra una estabilidad notable a lo largo de los distintos valores de k, con fluctuaciones mínimas. El punto óptimo se alcanza en k = 11, a partir del cual la precisión se mantiene relativamente constante hasta aproximadamente k = 25, para luego descender ligeramente, adicionalmente la precisión según los distintos valores de k evidencia que el desempeño del modelo se mantiene relativamente estable para valores intermedios. Esto sugiere que el modelo logra un equilibrio adecuado entre sensibilidad al ruido y capacidad de generalización, reflejando que las variables sociodemográficas y laborales utilizadas permiten identificar patrones relativamente consistentes asociados a la formalidad laboral en Colombia.
knn_prediccion <- predict(knn_entrenado, newdata = knn_test)

prob_knn_prediccion <- predict(knn_entrenado, newdata = knn_test, type = "prob")
cm_knn <- confusionMatrix(knn_prediccion, knn_test$cotiza_f)

data.frame(
  Metrica = c("Accuracy", "Sensibilidad", "Especificidad", 
              "VPP", "VPN",
              "Aciertos", "Total", "Error"),
  Valor = c(
    paste0(round(cm_knn$overall["Accuracy"] * 100, 2), "%"),
    paste0(round(cm_knn$byClass["Sensitivity"] * 100, 2), "%"),
    paste0(round(cm_knn$byClass["Specificity"] * 100, 2), "%"),
    paste0(round(cm_knn$byClass["Pos Pred Value"] * 100, 2), "%"),
    paste0(round(cm_knn$byClass["Neg Pred Value"] * 100, 2), "%"),
    format(sum(diag(cm_knn$table)), big.mark = "."),
    format(sum(cm_knn$table), big.mark = "."),
    paste0(round((1 - cm_knn$overall["Accuracy"]) * 100, 2), "%")
  )
) %>%
  gt() %>%
  tab_header(
    title = md("**Metricas de Desempeno - KNN**"),
    subtitle = md(paste("Mejor k =", knn_entrenado$bestTune$k))
  ) %>%
  cols_label(
    Metrica = "Indicador",
    Valor = "Resultado"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  opt_row_striping() %>%
  tab_options(table.width = pct(70))
Metricas de Desempeno - KNN
Mejor k = 11
Indicador Resultado
Accuracy 83.24%
Sensibilidad 62.17%
Especificidad 94.27%
VPP 85.03%
VPN 82.64%
Aciertos 2.081
Total 2.500
Error 16.76%
El modelo KNN alcanzó una precisión global del 83.24%, clasificando correctamente 2.081 de 2.500 casos en el conjunto de prueba siendo este un desempeño adecuado para identificar individuos pertenecientes al empleo formal e informal. Asimismo, presentó una especificidad del 94.27%, indicando una alta capacidad para reconocer correctamente a las personas que no pertenecen al empleo formal asireduciendo significativamente los falsos positivos sugiriendo que el modelo logra identificar patrones similares entre individuos con características laborales y sociodemográficas relacionadas con condiciones de informalidad.
en cuanto a la sensibilidad fue del 62.17%, lo que evidencia que aún existen algunas dificultades para identificar correctamente ciertos individuos vinculados al empleo formal, sin embargo, los valores predictivos positivo y negativo, 85.03% y 82.64%, respectivamente, muestran que el modelo mantiene un nivel de confianza adecuado en sus clasificaciones y la tasa de error del 16.76% refleja un desempeño sólido dentro del problema de clasificación analizado, considerando la complejidad del mercado laboral colombiano y la diversidad de condiciones laborales, situación consistente con los análisis sobre las dinámicas de formalidad e informalidad laboral en Colombia (DANE, 2025).
pred_roc <- prediction(as.numeric(knn_prediccion), as.numeric(knn_test$cotiza_f))
perf_roc <- performance(pred_roc, "tpr", "fpr")

auc_knn <- performance(pred_roc, "auc")
auc_valor <- round(auc_knn@y.values[[1]], 3)

plot(perf_roc, 
     main = paste("Curva ROC - KNN | AUC =", auc_valor),
     col = "#7C6A9C", 
     lwd = 2,
     xlab = "Tasa de Falsos Positivos (1 - Especificidad)",
     ylab = "Tasa de Verdaderos Positivos (Sensibilidad)")
abline(a = 0, b = 1, lty = 2, col = "#D6CDEA", lwd = 1.5)
grid(col = "#D6CDEA", lty = "dotted")
legend("bottomright",
       legend = c(paste("AUC =", auc_valor), "Azar"),
       col = c("#7C6A9C", "#D6CDEA"),
       lwd = c(2, 1.5),
       bty = "n")

La curva ROC presentó un AUC de 0.782, indicando una capacidad discriminatoria aceptable para diferenciar entre individuos pertenecientes al empleo formal e informal. Aunque este resultado es superior al azar, se encuentra por debajo de modelos con desempeños más altos, evidenciando que el KNN logra identificar patrones importantes, aunque con menor precisión que otros enfoques predictivos.
Asimismo, la curva se mantiene alejada de la diagonal de referencia en gran parte de los umbrales de clasificación, mostrando que el modelo alcanza una relación adecuada entre verdaderos positivos y falsos positivos, pepresentando una medida importante para evaluar la capacidad discriminatoria de los modelos supervisados frente a diferentes puntos de clasificacióncon James et al. (2021).

4.3 Comparación de los modelos

tabla_modelos <- data.frame(
  Modelo = c("Regresion Logistica", "KNN"),
  Accuracy = c("83.24%", "82.78%"),
  Sensibilidad = c("93.81%", "62.17%"),
  Especificidad = c("62.00%", "94.27%"),
  AUC = c("0.867", "0.782"),
  Balanced_Accuracy = c("0.779", "0.782")
)

tabla_modelos %>%
  gt() %>%
  tab_header(
    title = md("**Comparacion de Modelos Predictivos**"),
    subtitle = md("Rendimiento de Regresion Logistica vs KNN")
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#4A3F55"), cell_text(color = "white", weight = "bold")),
    locations = cells_column_labels(everything())
  ) %>%
  opt_row_striping() %>%
  tab_options(table.width = pct(80))
Comparacion de Modelos Predictivos
Rendimiento de Regresion Logistica vs KNN
Modelo Accuracy Sensibilidad Especificidad AUC Balanced_Accuracy
Regresion Logistica 83.24% 93.81% 62.00% 0.867 0.779
KNN 82.78% 62.17% 94.27% 0.782 0.782
Al comparar ambos modelos, la regresión logística presentó un mejor desempeño general frente al KNN, alcanzando un AUC de 0.867 frente a 0.782, lo que evidencia una mayor capacidad para diferenciar correctamente entre individuos pertenecientes al empleo formal e informal, aunque el KNN destacó por su alta especificidad, la regresión logística logró una sensibilidad superior, identificando correctamente a una mayor proporción de personas vinculadas al empleo formal, la regresión logística obtuvo una exactitud ligeramente mayor, ambos modelos presentaron resultados satisfactorios, evidenciando que variables como los ingresos, el nivel educativo, la zona y las características sociodemográficas contienen información relevante para identificar patrones relacionados con la formalidad laboral en Colombia.
Según James et al. (2021), los modelos supervisados deben evaluarse no solo por su precisión general, sino también por su capacidad para reconocer patrones y diferenciar adecuadamente entre categorías.

5 Conclusiones

El análisis permitió identificar diferencias importantes entre los trabajadores formales e informales en Colombia para 2025, evidenciando características asociadas a la realidad del mercado laboral colombiano. Se observó que los trabajadores formales presentan, en promedio, una edad superior a los 25 años y trayectoria laboral, lo que sugiere que la formalidad suele consolidarse con el tiempo y la stabilized en el empleo. Asimismo, variables como el tipo de trabajo, el nivel educativo y los ingresos mostraron una relación importante con la formalidad laboral. En particular, los trabajadores asalariados y las personas con mayores niveles educativos presentan una mayor probabilidad de acceder a empleos formales y contar con mecanismos de protección social. Por el contrario, los niveles educativos más bajos y menores ingresos continúan asociados a condiciones de informalidad.
También se identificó una ligera brecha de género, evidenciando una mayor participación femenina dentro del sector informal, situación que refleja algunas de las desigualdades presentes en el mercado laboral colombiano. En términos generales,las regiones con menor desarrollo industrial presentan tasas de cotización pensional más altas debido a una mayor dependencia del empleo público. En contraste, los grandes centros urbanos muestran tasas más bajas por la prevalencia del trabajo independiente, informal y de servicios privados, el análisis de variables permitió cumplir con el objetivo de identificar los principales factores sociodemográficos y laborales relacionados con la formalidad laboral en Colombia.
La regresión logística presentó el mejor desempeño general, alcanzando una exactitud cercana al 83% y un AUC de 0.867, evidenciando una alta capacidad para diferenciar correctamente entre empleo formal e informal. Además, mostró una sensibilidad superior al 90%, identificando adecuadamente a gran parte de las personas vinculadas al empleo formal. En términos explicativos, variables como el nivel educativo, los ingresos y la zona de residencia resultaron significativamente relacionadas con la probabilidad de pertenecer al empleo formal, destacándose especialmente el nivel educativo como uno de los factores más influyentes,por el contrario, la edad presentó un menor aporte explicativo dentro del modelo.
Por su parte, el modelo KNN también presentó un desempeño satisfactorio, con una exactitud cercana al 83% y un AUC de 0.782. Aunque mostró una alta capacidad para identificar individuos en condición de informalidad, presentó mayores dificultades para reconocer correctamente algunos casos de empleo formal, ambos modelos lograron captar patrones relevantes asociados a la formalidad laboral en Colombia, cumpliendo adecuadamente con el objetivo planteado. Sin embargo, la regresión logística demostró un mejor equilibrio entre capacidad predictiva e interpretación de resultados.
La comparación entre ambos modelos evidenció que, aunque presentan niveles de exactitud similares, la regresión logística obtuvo un mejor desempeño general gracias a su mayor capacidad discriminatoria y sensibilidad. Esto permitió identificar con mayor precisión a las personas pertenecientes al empleo formal, respondiendo de manera más adecuada al objetivo de la investigación.
En términos generales, los resultados reflejan que variables como el nivel educativo, los ingresos y las condiciones laborales continúan siendo factores determinantes en la formalidad laboral colombiana. Asimismo, se concluye que la regresión logística es el modelo más apropiado para este estudio, ya que combina un buen desempeño predictivo con una mayor facilidad de interpretación.

6 Bibliografía

Colombia - Gran Encuesta Integrada de Hogares - GEIH - 2025. (s. f.). https://microdatos.dane.gov.co

Departamento Administrativo Nacional de Estadística. (2025). Proyecciones de población y mercado laboral. DANE

Departamento Administrativo Nacional de Estadística. (2020). Boletín técnico: Fuerza laboral y educación 2019. Recuperado de Boletín técnico GEIH 2019 - DANE

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.

Sievert, C. (2020). Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman and Hall/CRC. https://plotly-r.com/20

Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis (2.ª ed.). Springer-Verlag New York. https://ggplot2-book.org/

Xie, Y. (2015). Dynamic documents with R and knitr (2nd ed.). Chapman and Hall/CRC. https://yihui.org/knitr/

Iannone, R., Cheng, J., Schloerke, B., Hughes, E., Lauer, A., & Seo, J. (2024). gt: Easily create presentation-ready display tables (Versión 0.10.0). https://gt.rstudio.com/

Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2023). dplyr: A grammar of data manipulation (Versión 1.1.0). https://dplyr.tidyverse.org/

LS0tDQp0aXRsZTogIkFwbGljYWNpw7NuIGRlIG1vZGVsb3MgZGUgYXByZW5kaXphamUgc3VwZXJ2aXNhZG8gcGFyYSBlbCBhbsOhbGlzaXMgZGUgbGEgZm9ybWFsaWRhZCBsYWJvcmFsIGVuIENvbG9tYmlhIHBhcmEgIDIwMjUiDQphdXRob3I6ICJNYWlrb2wgRGF2aWQgc2FuZG92YWwgTWF5b3JnYSwgQW5uYSBJc2FiZWxsYSBSb2Ryw61ndWV6IFJvbWVybywgRmFiacOhbiBVcmJhbm8gQ3J1eiwgQnJlaGluZXIgQW5kcsOpcyBWYWxlbmNpYSBQdWVydGEiDQpkYXRlOiAiTWF5byBkZSAyMDI2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDoga2F0ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICAgICANCiAgICBjb2RlX21lbnU6IHRydWUgICAgIA0KLS0tDQoNCiMgMSBJbnRyb2R1Y2Npw7NuDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+KipMYSBpbmZvcm1hbGlkYWQgbGFib3JhbCBjb25zdGl0dXllIHVuYSBkZSBsYXMgcHJpbmNpcGFsZXMgcHJvYmxlbcOhdGljYXMgZGVsIG1lcmNhZG8gbGFib3JhbCBlbiBDb2xvbWJpYSoqLCBkZWJpZG8gYSBzdXMgZWZlY3RvcyBuZWdhdGl2b3Mgc29icmUgbGEgZXN0YWJpbGlkYWQgZWNvbsOzbWljYSBkZSBsb3MgdHJhYmFqYWRvcmVzIHkgc3UgYWNjZXNvIGxpbWl0YWRvIGEgc2lzdGVtYXMgZGUgcHJvdGVjY2nDs24gc29jaWFsLCBjb21vIGxhIHNlZ3VyaWRhZCBzb2NpYWwgZW4gcGVuc2lvbmVzLiBEZSBhY3VlcmRvIGNvbiBvcmdhbmlzbW9zIGludGVybmFjaW9uYWxlcyBjb21vIGxhIE9yZ2FuaXphY2nDs24gSW50ZXJuYWNpb25hbCBkZWwgVHJhYmFqbyAoT0lUKSwgKipsYSBpbmZvcm1hbGlkYWQgbGFib3JhbCBjb250aW7DumEgc2llbmRvIHVuYSBjYXJhY3RlcsOtc3RpY2EgcHJlZG9taW5hbnRlIGVuIGxhcyBlY29ub23DrWFzIGVuIGRlc2Fycm9sbG8qKiwgZG9uZGUgdW5hIHByb3BvcmNpw7NuIGNvbnNpZGVyYWJsZSBkZSBsYSBwb2JsYWNpw7NuIG9jdXBhZGEgdHJhYmFqYSBiYWpvIGNvbmRpY2lvbmVzIGRlIHZ1bG5lcmFiaWxpZGFkIHkgc2luIGNvYmVydHVyYSBhZGVjdWFkYS4gRGUgYWN1ZXJkbyBjb24gZGl2ZXJzYXMgZXN0YWTDrXN0aWNhcyBuYWNpb25hbGVzLCAqKnVuYSBwcm9wb3JjacOzbiBzaWduaWZpY2F0aXZhIGRlIGxhIHBvYmxhY2nDs24gb2N1cGFkYSBzZSBlbmN1ZW50cmEgZW4gY29uZGljaW9uZXMgZGUgaW5mb3JtYWxpZGFkKiosIGxvIHF1ZSByZWZsZWphIGRlc2lndWFsZGFkZXMgZXN0cnVjdHVyYWxlcyBhc29jaWFkYXMgYSBmYWN0b3JlcyBzb2Npb2Vjb27Ds21pY29zIHkgZGVtb2dyw6FmaWNvcy4gUGFyYSAyMDI0IGNlcmNhIGRlbCA0OCUgZGUgbGFzIHBlcnNvbmFzIG9jdXBhZGFzIGVuIENvbG9tYmlhIGNvdGl6YWJhbiBhIHBlbnNpw7NuLCBsbyBxdWUgcmVwcmVzZW50YSB1bmEgbWVqb3JhIGdyYWR1YWwgZnJlbnRlIGEgYcOxb3MgYW50ZXJpb3JlcywgY29tbyBlbiAyMDE3IHNpZW5kbyBkZWwgMzUlLCBhdW5xdWUgYcO6biBwZXJzaXN0ZW4gYW1wbGlhcyBicmVjaGFzIGVuIHTDqXJtaW5vcyBkZSBmb3JtYWxpZGFkIGxhYm9yYWwuIEUgMjAyMSB5IDIwMjQgbGEgY29iZXJ0dXJhIHBlbnNpb25hbCBlbiBsYSBwb2JsYWNpw7NuIG9jdXBhZGEgYXVtZW50w7MgYXByb3hpbWFkYW1lbnRlIGNpbmNvIHB1bnRvcyBwb3JjZW50dWFsZXMsIHBhc2FuZG8gZGUgNDMlIGEgNDglLCBpbXB1bHNhZGEgcHJpbmNpcGFsbWVudGUgcG9yIGxhIHJlY3VwZXJhY2nDs24gZGVsIGVtcGxlbyBhc2FsYXJpYWRvIGZvcm1hbCB0cmFzIGxhIHBhbmRlbWlhIHkgcG9yIHBvbMOtdGljYXMgY29tbyBlbCBQcm9ncmFtYSBkZSBFbXBsZW8gRm9ybWFsIChQQUVGKSB5IGxhIHJlZm9ybWEgcGVuc2lvbmFsIGVuIGRpc2N1c2nDs24gKERBTkUsIDIwMjU7IE9JVCwgMjAyNSkuPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbiBlc3RlIGNvbnRleHRvLCByZXN1bHRhIHJlbGV2YW50ZSBhbmFsaXphciBsb3MgZGV0ZXJtaW5hbnRlcyBxdWUgaW5jaWRlbiBlbiBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGluZGl2aWR1byBzZSBkZXNlbXBlw7FlIGVuIHVuIGVtcGxlbyBmb3JtYWwgbyBpbmZvcm1hbC4gTGEgY2xhc2lmaWNhY2nDs24gZGUgbG9zIHRyYWJhamFkb3JlcyBlbiBlc3RhcyBjYXRlZ29yw61hcyBwZXJtaXRlIGNvbXByZW5kZXIgbWVqb3IgbGEgZGluw6FtaWNhIGRlbCBtZXJjYWRvIGxhYm9yYWwgY29sb21iaWFubyB5IGFwb3J0YSBldmlkZW5jaWEgZW1ww61yaWNhIMO6dGlsIHBhcmEgZWwgZGlzZcOxbyBkZSBwb2zDrXRpY2FzIHDDumJsaWNhcyBvcmllbnRhZGFzIGEgbGEgZm9ybWFsaXphY2nDs24gZGVsIGVtcGxlby4gQWRpY2lvbmFsbWVudGUsIGVudGVuZGVyIHF1w6kgY2FyYWN0ZXLDrXN0aWNhcyBzb2Npb2RlbW9ncsOhZmljYXMgeSBsYWJvcmFsZXMgZmF2b3JlY2VuIGxhIGNvdGl6YWNpw7NuIHBlbnNpb25hbCBheXVkYSBhIGZvY2FsaXphciBsb3MgZXNmdWVyem9zIGRlbCBFc3RhZG8gZW4gcG9ibGFjaW9uZXMgZXNwZWPDrWZpY2FzLCBjb21vIGxvcyBqw7N2ZW5lcywgbGFzIG11amVyZXMsIGxvcyB0cmFiYWphZG9yZXMgaW5kZXBlbmRpZW50ZXMgbyBxdWllbmVzIGhhYml0YW4gZW4gem9uYXMgcnVyYWxlcyBkZWwgcGHDrXMuPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCBwcmVzZW50ZSBlc3R1ZGlvIHNlIGRlc2Fycm9sbGEgYSBwYXJ0aXIgZGUgbGEgYmFzZSBkZSBkYXRvcyBkZSBsYSBHcmFuIEVuY3Vlc3RhIEludGVncmFkYSBkZSBIb2dhcmVzIChHRUlIKSAyMDI1IGRlbCBEQU5FLCBjb25zaWRlcmFuZG8gdW5hIG11ZXN0cmEgZGUgaW5kaXZpZHVvcyBtYXlvcmVzIGRlIGVkYWQgZW4gZWwgdGVycml0b3JpbyBjb2xvbWJpYW5vLiBTZSBkZWZpbmUgY29tbyB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlbCB0aXBvIGRlIGVtcGxlbywgY2xhc2lmaWNhZG8gZGUgZm9ybWEgYmluYXJpYSBlbiBmb3JtYWwgZSBpbmZvcm1hbCwgdXRpbGl6YW5kbyBjb21vIGNyaXRlcmlvIGxhIGNvdGl6YWNpw7NuIGFsIHNpc3RlbWEgZGUgcGVuc2lvbmVzOiBsb3MgaW5kaXZpZHVvcyBxdWUgY290aXphbiBzZSBjb25zaWRlcmFuIGVtcGxlYWRvcyBmb3JtYWxlcywgbWllbnRyYXMgcXVlIGFxdWVsbG9zIHF1ZSBubyBsbyBoYWNlbiBzZSBjbGFzaWZpY2FuIGNvbW8gaW5mb3JtYWxlcy4NCkNvbW8gdmFyaWFibGVzIGV4cGxpY2F0aXZhcyBzZSBpbmNsdXllbiBjYXJhY3RlcsOtc3RpY2FzIHNvY2lvZGVtb2dyw6FmaWNhcyB5IGVjb27Ds21pY2FzIHRhbGVzIGNvbW8gbGEgZWRhZCwgZWwgbml2ZWwgZWR1Y2F0aXZvLCBlbCBlc3RyYXRvIHNvY2lvZWNvbsOzbWljbywgbGEgb2N1cGFjacOzbiwgZWwgaW5ncmVzbywgbGEgem9uYSBkZSByZXNpZGVuY2lhICh1cmJhbmEgbyBydXJhbCkgeSBlbCBzZXhvLiBFc3RhcyB2YXJpYWJsZXMgaGFuIHNpZG8gYW1wbGlhbWVudGUgcmVjb25vY2lkYXMgIGNvbW8gZmFjdG9yZXMgZGV0ZXJtaW5hbnRlcyBlbiBsYSBpbnNlcmNpw7NuIGxhYm9yYWwgeSBsYSBjYWxpZGFkIGRlbCBlbXBsZW8uPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCBhbsOhbGlzaXMgc2UgZW5tYXJjYSBkZW50cm8gZGVsIGFwcmVuZGl6YWplIHN1cGVydmlzYWRvLCBlbCBjdWFsLCBzZWfDum4gSmFtZXMgZXQgYWwuICgyMDIxKSwgY29uc2lzdGUgZW4gbW9kZWxhciBsYSByZWxhY2nDs24gZW50cmUgdW5hIG8gbcOhcyB2YXJpYWJsZXMgcHJlZGljdG9yYXMgWCBZIHVuYSB2YXJpYWJsZSByZXNwdWVzdGEgeSwgdXRpbGl6YW5kbyB1biBjb25qdW50byBkZSBkYXRvcyBldGlxdWV0YWRvcyBwYXJhIHByZWRlY2lyIGVsIGNvbXBvcnRhbWllbnRvIGRlIG51ZXZvcyBkYXRvcy4gRXN0ZSBlbmZvcXVlIHBlcm1pdGUgZXN0aW1hciBsYSBwcm9iYWJpbGlkYWQgZGUgcGVydGVuZW5jaWEgYSBjYWRhIGNhdGVnb3LDrWEgZGUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgKGZvcm1hbCBvIGluZm9ybWFsKS4gRGUgZXN0YSBmb3JtYSwgZWwgYXByZW5kaXphamUgc3VwZXJ2aXNhZG8gZmFjaWxpdGEgbGEgaWRlbnRpZmljYWNpw7NuIGRlIHBhdHJvbmVzIHkgbGEgY29uc3RydWNjacOzbiBkZSBtb2RlbG9zIHByZWRpY3Rpdm9zIGNvbiBhcGxpY2FjaW9uZXMgZW4gZWwgbWVyY2FkbyBsYWJvcmFsIGNvbG9tYmlhbm8uPC9kaXY+DQoNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkRlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIG1ldG9kb2zDs2dpY28sIHNlIGVtcGxlYW4gdMOpY25pY2FzIGRlIGFwcmVuZGl6YWplIHN1cGVydmlzYWRvIHBhcmEgbGEgY2xhc2lmaWNhY2nDs24gZGUgbG9zIGluZGl2aWR1b3MsIGVzcGVjw61maWNhbWVudGUgbG9zIG1vZGVsb3MgSy1OZWFyZXN0IE5laWdoYm9ycyAoS05OKSB5IHJlZ3Jlc2nDs24gbG9nw61zdGljYSAoTG9naXQpLiBFbCBvYmpldGl2byBlcyBjb21wYXJhciBlbCBkZXNlbXBlw7FvIGRlIGFtYm9zIG1vZGVsb3MgZW4gdMOpcm1pbm9zIGRlIHN1IGNhcGFjaWRhZCBwcmVkaWN0aXZhIHkgZGV0ZXJtaW5hciBjdcOhbCByZXN1bHRhIG3DoXMgYWRlY3VhZG8gcGFyYSBleHBsaWNhciBsYSBmb3JtYWxpZGFkIGxhYm9yYWwgZW4gZWwgY29udGV4dG8gYW5hbGl6YWRvLjwvZGl2Pg0KDQojIDIgTWV0b2RvbG9nw61hIA0KIyMgMi4xIEZ1ZW50ZSBkZSBkYXRvcw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+UGFyYSBlbCBkZXNhcnJvbGxvIGRlbCBwcmVzZW50ZSBlc3R1ZGlvIHNlIHV0aWxpesOzIGxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgR3JhbiBFbmN1ZXN0YSBJbnRlZ3JhZGEgZGUgSG9nYXJlcyAoR0VJSCkgMjAyNSwgZWxhYm9yYWRhIHBvciBlbCBEQU5FLiBFc3RhIGVuY3Vlc3RhIHJlY29waWxhIGluZm9ybWFjacOzbiBzb2Npb2RlbW9ncsOhZmljYSB5IGxhYm9yYWwgZGUgbG9zIGhvZ2FyZXMgY29sb21iaWFub3MsIHBlcm1pdGllbmRvIGFuYWxpemFyIGxhcyBjb25kaWNpb25lcyBkZSBlbXBsZW8gZGUgbGEgcG9ibGFjacOzbi48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkxhIG11ZXN0cmEgYW5hbGl6YWRhIGVzdMOhIGNvbXB1ZXN0YSBwb3IgaW5kaXZpZHVvcyBtYXlvcmVzIGRlIGVkYWQgcmVnaXN0cmFkb3MgZW4gbGEgR0VJSCAyMDI1LCBzZWxlY2Npb25hZG9zIHBhcmEgZWwgZGVzYXJyb2xsbyBkZWwgcHJlc2VudGUgZXN0dWRpby4gQSBwYXJ0aXIgZGUgZXN0YSBpbmZvcm1hY2nDs24sIHNlIGNvbnN0cnV5w7MgdW5hIGJhc2UgZGVwdXJhZGEgZW5mb2NhZGEgZW4gZWwgYW7DoWxpc2lzIGRlIGxhIGZvcm1hbGlkYWQgbGFib3JhbCBlbiBDb2xvbWJpYS48L2Rpdj4NCg0KIyMgMi4yIERlZmluaWNpw7NuIGRlIHZhcmlhYmxlcw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+TGEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGVsIGVzdHVkaW8gY29ycmVzcG9uZGUgYSBsYSBjb3RpemFjacOzbiBhIHBlbnNpw7NuIGRlIGxhcyBwZXJzb25hcywgZGVmaW5pZGEgZGUgbWFuZXJhIGJpbmFyaWEsIGRvbmRlIDEgcmVwcmVzZW50YSBlbXBsZW8gZm9ybWFsIHkgMCBlbXBsZW8gaW5mb3JtYWwuIEVzdGEgY2xhc2lmaWNhY2nDs24gc2UgY29uc3RydXnDsyBhIHBhcnRpciBkZSBsYSB2YXJpYWJsZSDigJxjb3RpemEgcGVuc2nDs27igJ0sIGNvbnNpZGVyYW5kbyBjb21vIHRyYWJhamFkb3JlcyBmb3JtYWxlcyBhIGFxdWVsbG9zIGluZGl2aWR1b3MgcXVlIHJlYWxpemFuIGFwb3J0ZXMgYWwgc2lzdGVtYSBwZW5zaW9uYWwsIG1pZW50cmFzIHF1ZSBxdWllbmVzIG5vIGNvdGl6YW4gZnVlcm9uIGNsYXNpZmljYWRvcyBjb21vIHRyYWJhamFkb3JlcyBpbmZvcm1hbGVzLiBFc3RlIGNyaXRlcmlvIHNlIHV0aWxpemEgY29tbyBhcHJveGltYWNpw7NuIGEgbGEgZm9ybWFsaWRhZCBsYWJvcmFsIGRlYmlkbyBhIHN1IHJlbGFjacOzbiBjb24gZWwgYWNjZXNvIGEgbGEgc2VndXJpZGFkIHNvY2lhbCB5IGVsIGN1bXBsaW1pZW50byBkZSBsYXMgY29uZGljaW9uZXMgbGFib3JhbGVzIGZvcm1hbGVzLjwvZGl2Pg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Q29tbyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgc2UgaW5jbHV5ZXJvbiBsYSBlZGFkLCBlbCBzZXhvLCBsYSB6b25hIGRlIHJlc2lkZW5jaWEsIGVsIGVzdHJhdG8gc29jaW9lY29uw7NtaWNvLCBlbCBuaXZlbCBlZHVjYXRpdm8sIGxhIGFudGlnw7xlZGFkIGxhYm9yYWwsIHRpcG8gZGUgZW1wbGVvIHkgbG9zIGluZ3Jlc29zLiBFc3RhcyB2YXJpYWJsZXMgZnVlcm9uIHNlbGVjY2lvbmFkYXMgZGViaWRvIGEgc3UgcmVsZXZhbmNpYSBlbiBlbCBhbsOhbGlzaXMgZGVsIG1lcmNhZG8gbGFib3JhbCwgeWEgcXVlIHBlcm1pdGVuIGNhcHR1cmFyIGNhcmFjdGVyw61zdGljYXMgc29jaW9kZW1vZ3LDoWZpY2FzIHkgZWNvbsOzbWljYXMgcXVlIHB1ZWRlbiBpbmZsdWlyIGVuIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gaW5kaXZpZHVvIHBlcnRlbmV6Y2EgYWwgc2VjdG9yIGZvcm1hbCBvIGluZm9ybWFsIGRlIGxhIGVjb25vbcOtYS48L2Rpdj4NCg0KIyMgMi4zIFByZXByb2Nlc2FtaWVudG8geSBsaW1waWV6YSBkZSBkYXRvcyANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkluaWNpYWxtZW50ZSwgbGEgaW5mb3JtYWNpw7NuIHByb3ZlbmllbnRlIGRlIGRpc3RpbnRvcyBhcmNoaXZvcyBkZSBsYSBHRUlIIGZ1ZSBvcmdhbml6YWRhIHkgY29uc29saWRhZGEgdXRpbGl6YW5kbyBjaWNsb3MgZm9yIGVuIFIsIGxvIHF1ZSBwZXJtaXRpw7Mgc2VsZWNjaW9uYXIgeSB1bmlmaWNhciBsYXMgdmFyaWFibGVzIG5lY2VzYXJpYXMgcGFyYSBlbCBhbsOhbGlzaXMuUG9zdGVyaW9ybWVudGUsIHNlIHJlYWxpesOzIHVuIHByb2Nlc28gZGUgZGVwdXJhY2nDs24gZGUgbGEgYmFzZSBkZSBkYXRvcyBtZWRpYW50ZSBsYSBpZGVudGlmaWNhY2nDs24geSBlbGltaW5hY2nDs24gZGUgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIGZhbHRhbnRlcyB1dGlsaXphbmRvIGZ1bmNpb25lcyBjb21vIGlzLm5hKCkuIEVzdG8gcGVybWl0acOzIHRyYWJhamFyIMO6bmljYW1lbnRlIGNvbiBvYnNlcnZhY2lvbmVzIGNvbXBsZXRhcyB5IGdhcmFudGl6YXIgdW5hIG1heW9yIGNvbnNpc3RlbmNpYSBlbiBsYSBlc3RpbWFjacOzbiBkZSBsb3MgbW9kZWxvcy48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkFkaWNpb25hbG1lbnRlLCBzZSBjb25zdHJ1ecOzIHVuYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuIGNvbiBlbCBmaW4gZGUgYW5hbGl6YXIgbGEgcmVsYWNpw7NuIGV4aXN0ZW50ZSBlbnRyZSBhbGd1bmFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgeSBldmFsdWFyIHBvc2libGVzIHByb2JsZW1hcyBkZSBtdWx0aWNvbGluZWFsaWRhZCBkZW50cm8gZGVsIG1vZGVsby4NCkZpbmFsbWVudGUsIHNlIHRvbcOzIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBkZSAxMC4wMDAgb2JzZXJ2YWNpb25lcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgbGEgYmFzZSBkZSBhbsOhbGlzaXMsIGRlYmlkbyBhIHF1ZSBsYSBiYXNlIGRlcHVyYWRhIGNvbnRhYmEgY29uIGFwcm94aW1hZGFtZW50ZSAyMDAuMDAwIHJlZ2lzdHJvcy4gRXN0YSByZWR1Y2Npw7NuIHNlIHJlYWxpesOzIGNvbiBlbCBwcm9ww7NzaXRvIGRlIG1lam9yYXIgbGEgZWZpY2llbmNpYSBjb21wdXRhY2lvbmFsIHkgZmFjaWxpdGFyIGVsIHByb2Nlc2FtaWVudG8gZGUgbG9zIG1vZGVsb3MgZGUgY2xhc2lmaWNhY2nDs24uIFBvc3Rlcmlvcm1lbnRlLCBsYSBtdWVzdHJhIGZ1ZSBkaXZpZGlkYSBlbiB1biBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIGRlIDc1MDAgb2JzZXJ2YWNpb25lcyB5IHVuIGNvbmp1bnRvIGRlIHBydWViYSBkZSAyNTAwIG9ic2VydmFjaW9uZXMuPC9kaXY+DQoNCiMjIDIuNCBNb2RlbG8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhIChMb2dpdCkNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkVsIHByaW1lciBtb2RlbG8gaW1wbGVtZW50YWRvIGVzIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgKExvZ2l0KSwgYW1wbGlhbWVudGUgdXRpbGl6YWRvIGVuIHByb2JsZW1hcyBkb25kZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlcyBkZSBuYXR1cmFsZXphIGJpbmFyaWEuIEVuIGVzdGUgY2FzbywgZWwgbW9kZWxvIHBlcm1pdGUgZXN0aW1hciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGluZGl2aWR1byBwZXJ0ZW5lemNhIGEgbGEgY2F0ZWdvcsOtYSBkZSBlbXBsZW8gZm9ybWFsIGEgcGFydGlyIGRlIHVuIGNvbmp1bnRvIGRlIHZhcmlhYmxlcyBzb2Npb2RlbW9ncsOhZmljYXMgeSBlY29uw7NtaWNhcy4NCkxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBtb2RlbGEgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzIHkgbGEgcHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZGVsIGV2ZW50byBkZSBpbnRlcsOpcyBtZWRpYW50ZSB1bmEgZnVuY2nDs24gbG9nw61zdGljYSwgZXhwcmVzYWRhIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6PC9kaXY+DQokJCANClAoWSA9IDEpID0gXGZyYWN7MX17MSArIGVeey0oXGJldGFfMCArIFxiZXRhXzEgWF8xICsgXGRvdHMgKyBcYmV0YV9uIFhfbil9fSANCiQkDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+RG9uZGUgUChZPTEpIHJlcHJlc2VudGEgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biBpbmRpdmlkdW8gdGVuZ2EgdW4gZW1wbGVvIGZvcm1hbCB5IG4gbG9zIGNvZWZpY2llbnRlcyBhc29jaWFkb3MgYSBsYXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcyBkZWwgbW9kZWxvLkVsIG1vZGVsbyBmdWUgZXN0aW1hZG8gdXRpbGl6YW5kbyBsYSBtdWVzdHJhIGRlIGVudHJlbmFtaWVudG8geSBwb3N0ZXJpb3JtZW50ZSBldmFsdWFkbyBzb2JyZSBsYSBtdWVzdHJhIGRlIHBydWViYS48L2Rpdj4NCg0KIyMgMi41IE1vZGVsbyBLLU5lYXJlc3QgTmVpZ2hib3JzIChLTk4pDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Db21vIHNlZ3VuZG8gbcOpdG9kbyBkZSBjbGFzaWZpY2FjacOzbiBzZSBpbXBsZW1lbnTDsyBLLU5lYXJlc3QgTmVpZ2hib3JzIChLTk4pLCB1biBhbGdvcml0bW8gZGUgYXByZW5kaXphamUgc3VwZXJ2aXNhZG8gdXRpbGl6YWRvIHBhcmEgcHJvYmxlbWFzIGRlIGNsYXNpZmljYWNpw7NuLiBFc3RlIG3DqXRvZG8gY2xhc2lmaWNhIGNhZGEgb2JzZXJ2YWNpw7NuIGRlIGFjdWVyZG8gY29uIGxhIGNhdGVnb3LDrWEgcHJlZG9taW5hbnRlIGVudHJlIHN1cyB2ZWNpbm9zIG3DoXMgY2VyY2Fub3MsIHV0aWxpemFuZG8gbWVkaWRhcyBkZSBkaXN0YW5jaWEgZW50cmUgaW5kaXZpZHVvcyBjb24gY2FyYWN0ZXLDrXN0aWNhcyBzaW1pbGFyZXMuDQpQYXJhIGxhIGltcGxlbWVudGFjacOzbiBkZWwgbW9kZWxvIHNlIHV0aWxpesOzIHVuIHZhbG9yIGRlIEs9MyB5IGFkZW3DoXMgc2UgYnVzY8OzIGVsIG1lam9yIHZhbG9yIEssIHRvbWFuZG8gY29tbyByZWZlcmVuY2lhIGVsIGPDs2RpZ28gZ3XDrWEgcHJvcG9yY2lvbmFkbyBwYXJhIGVsIGRlc2Fycm9sbG8gZGUgbGEgYWN0aXZpZGFkLiBFbCBtb2RlbG8gZnVlIGVzdGltYWRvIHV0aWxpemFuZG8gbGEgbXVlc3RyYSBkZSBlbnRyZW5hbWllbnRvIHkgcG9zdGVyaW9ybWVudGUgZXZhbHVhZG8gc29icmUgbGEgbXVlc3RyYSBkZSBwcnVlYmEuPC9kaXY+DQoNCiMjIDIuNiBFdmFsdWFjacOzbiBkZWwgZGVzZW1wZcOxbw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+RWwgZGVzZW1wZcOxbyBkZSBsb3MgbW9kZWxvcyBLTk4geSBMb2dpdCBmdWUgZXZhbHVhZG8gdXRpbGl6YW5kbyBsYSBtdWVzdHJhIGRlIHBydWViYSwgY29uIGVsIGZpbiBkZSBjb21wYXJhciBzdSBjYXBhY2lkYWQgZGUgY2xhc2lmaWNhY2nDs24gc29icmUgb2JzZXJ2YWNpb25lcyBubyB1dGlsaXphZGFzIGR1cmFudGUgZWwgZW50cmVuYW1pZW50by4gUGFyYSBlbGxvLCBzZSBhbmFsaXphcm9uIGxhcyBwcmVkaWNjaW9uZXMgb2J0ZW5pZGFzIHkgbGEgY2FwYWNpZGFkIGRlIGxvcyBtb2RlbG9zIHBhcmEgaWRlbnRpZmljYXIgY29ycmVjdGFtZW50ZSBsb3MgdGlwb3MgZGUgZW1wbGVvLjwvZGl2Pg0KDQpgYGB7ciBsaWJyZXJpYXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShndCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkocFJPQykNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGNsYXNzKQ0KbGlicmFyeShST0NSKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpgYGANCg0KYGBge3IgYmFzZSBkYXRvcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJ1dGFfYmFzZSA8LSAifi9FU1RVRElPL1NlbWVzdHJlcy8yMDI2LTEvR0VTVElPTiBERSBEQVRPUy9UYWxsZXIgMi9CYXNlIHRhbGxlciAyLyINCg0KbWlzX3ZhcmlhYmxlcyA8LSBjKCJESVJFQ1RPUklPIiwgIlNFQ1VFTkNJQV9QIiwgIk9SREVOIiwgIkhPR0FSIiwgIkFSRUEiLCAiQ0xBU0UiLA0KICAgICAgICAgICAgICAgICAgICJQNjA0MCIsICJQNjIyMCIsICJQNjA1MCIsICJQNjQzMCIsICJQNjQyNiIsICJQMzI3MSIsICJQNjkyMCIsDQogICAgICAgICAgICAgICAgICAgIlA2NTAwIiwgIlAzMDQyIikNCg0KbGVlcl95X2ZpbHRyYXIgPC0gZnVuY3Rpb24ocnV0YV9hcmNoaXZvKSB7DQogIGRmIDwtIHJlYWRfY3N2MihydXRhX2FyY2hpdm8sIGNvbF90eXBlcyA9IGNvbHMoLmRlZmF1bHQgPSAiYyIpLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KICBkZl9saW1waW8gPC0gZGYgJT4lIHNlbGVjdChhbnlfb2YobWlzX3ZhcmlhYmxlcykpDQogIHJldHVybihkZl9saW1waW8pDQp9DQoNCm1lc2VzX25vbWJyZXMgPC0gYygiRW5lcm8gMjAyNSIsICJGZWJyZXJvIDIwMjUiLCAiTWFyem8gMjAyNSIsICJBYnJpbCAyMDI1IiwgDQogICAgICAgICAgICAgICAgICAgIk1heW8gMjAyNSIsICJKdW5pbyAyMDI1IiwgIkp1bGlvIDIwMjUiLCAiQWdvc3RvIDIwMjUiLCANCiAgICAgICAgICAgICAgICAgICAiU2VwdGllbWJyZSAyMDI1IiwgIk9jdHVicmUgMjAyNSIsICJOb3ZpZW1icmUgMjAyNSIsICJEaWNpZW1icmUgMjAyNSIpDQoNCmxpc3RhX2FudWFsIDwtIGxpc3QoKQ0KDQpmb3IgKG1lcyBpbiBtZXNlc19ub21icmVzKSB7DQogIHJ1dGFfY29tcGxldGEgPC0gcGFzdGUwKHJ1dGFfYmFzZSwgbWVzKQ0KICBhcmNoaXZvcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBydXRhX2NvbXBsZXRhLCBwYXR0ZXJuID0gIlxcLmNzdiQiLCBmdWxsLm5hbWVzID0gVFJVRSwgaWdub3JlLmNhc2UgPSBUUlVFKQ0KICANCiAgaWYgKGxlbmd0aChhcmNoaXZvcykgPiAwKSB7DQogICAgbWVzc2FnZShwYXN0ZSgiTGV5ZW5kbzoiLCBtZXMpKQ0KICANCiAgICBiYXNlX21lcyA8LSBhcmNoaXZvcyAlPiUgDQogICAgICBtYXAobGVlcl95X2ZpbHRyYXIpICU+JSANCiAgICAgIHJlZHVjZShmdWxsX2pvaW4sIGJ5ID0gaW50ZXJzZWN0KG5hbWVzKC4pLCBjKCJESVJFQ1RPUklPIiwgIlNFQ1VFTkNJQV9QIiwgIk9SREVOIiwgIkhPR0FSIikpKSAlPiUgDQogICAgICBtdXRhdGUoTUVTX0VUSVFVRVRBID0gbWVzKQ0KICAgIA0KICAgIGxpc3RhX2FudWFsW1ttZXNdXSA8LSBiYXNlX21lcw0KICAgIHJtKGJhc2VfbWVzKQ0KICAgIGdjKCkNCiAgfSBlbHNlIHsNCiAgICBtZXNzYWdlKHBhc3RlKCJObyBzZSBlbmNvbnRyYXJvbiBhcmNoaXZvcyBlbjoiLCBtZXMpKQ0KICB9DQp9DQoNCmJhc2VfZmluYWxfMjAyNSA8LSBiaW5kX3Jvd3MobGlzdGFfYW51YWwpDQoNCmJhc2VfZmluYWxfMjAyNSA8LSBiYXNlX2ZpbmFsXzIwMjUgJT4lIA0KICByZW5hbWUoDQogICAgQ290aXphbmRvX1BlbnNpb24gPSBQNjkyMCwNCiAgICBUaXBvX2RlX2VtcGxlbyA9IFA2NDMwLA0KICAgIEN1YW50b19sbGV2YV90cmFiYWphbmRvID0gUDY0MjYsDQogICAgSW5ncmVzb3NfcmVjaWJpZG9zID0gUDY1MDAsDQogICAgRWRhZCA9IFA2MDQwLA0KICAgIE5pdmVsX2VkdWNhdGl2byA9IFAzMDQyLA0KICAgIEVzdHJhdG9fc29jaW9lY29ub21pY28gPSBQNjA1MCwNCiAgICBab25hID0gQ0xBU0UsDQogICAgQXJlYV9tZXRyb3BvbGl0YW5hID0gQVJFQSwNCiAgICBTZXhvID0gUDMyNzEsDQogICAgTWVzID0gTUVTX0VUSVFVRVRBDQogICkgJT4lIA0KICBzZWxlY3QoLURJUkVDVE9SSU8sIC1TRUNVRU5DSUFfUCkgJT4lIA0KICByZWxvY2F0ZShNZXMsIC5iZWZvcmUgPSAxKQ0KDQpiYXNlX2ZpbmFsXzIwMjUgPC0gYmFzZV9maW5hbF8yMDI1ICU+JQ0KICBtdXRhdGUoDQogICAgRWRhZCA9IGFzLm51bWVyaWMoRWRhZCksDQogICAgQ290aXphbmRvX1BlbnNpb24gPSBhcy5udW1lcmljKENvdGl6YW5kb19QZW5zaW9uKSwNCiAgICBUaXBvX2RlX2VtcGxlbyA9IGFzLm51bWVyaWMoVGlwb19kZV9lbXBsZW8pLA0KICAgIEN1YW50b19sbGV2YV90cmFiYWphbmRvID0gYXMubnVtZXJpYyhDdWFudG9fbGxldmFfdHJhYmFqYW5kbyksDQogICAgSW5ncmVzb3NfcmVjaWJpZG9zID0gYXMubnVtZXJpYyhJbmdyZXNvc19yZWNpYmlkb3MpLA0KICAgIE5pdmVsX2VkdWNhdGl2byA9IGFzLm51bWVyaWMoTml2ZWxfZWR1Y2F0aXZvKSwNCiAgICBFc3RyYXRvX3NvY2lvZWNvbm9taWNvID0gYXMubnVtZXJpYyhFc3RyYXRvX3NvY2lvZWNvbm9taWNvKSwNCiAgICBab25hID0gYXMubnVtZXJpYyhab25hKSwNCiAgICBBcmVhX21ldHJvcG9saXRhbmEgPSBhcy5udW1lcmljKEFyZWFfbWV0cm9wb2xpdGFuYSksDQogICAgU2V4byA9IGFzLm51bWVyaWMoU2V4bykNCiAgKQ0KYmFzZV9maW5hbF8yMDI1IDwtIGJhc2VfZmluYWxfMjAyNSAlPiUNCiAgbXV0YXRlKENvdGl6YW5kb19QZW5zaW9uID0gaWZlbHNlKENvdGl6YW5kb19QZW5zaW9uID09IDEsIDEsIDApKQ0KDQpiYXNlX2ZpbmFsXzIwMjUgPC0gYmFzZV9maW5hbF8yMDI1ICU+JQ0KICBmaWx0ZXIocm93U3Vtcyhpcy5uYSguKSkgPD0gMCkNCg0Kd3JpdGVfY3N2KGJhc2VfZmluYWxfMjAyNSwgImJhc2VfZmluYWxfMjAyNS5jc3YiKQ0KDQpiYXNlX211ZXN0cmEgPC0gcmVhZF9jc3YoImJhc2VfbXVlc3RyYS5jc3YiKQ0Kd3JpdGVfY3N2KGJhc2VfbXVlc3RyYSwgImJhc2VfbXVlc3RyYS5jc3YiKQ0KYGBgDQoNCmBgYHtyIGJhc2UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpiYXNlX211ZXN0cmEgJT4lDQogIHNsaWNlX2hlYWQobiA9IDEwMDApICU+JQ0KICBtdXRhdGUoDQogICAgTWVzX251bSA9IG1hdGNoKHN0cl9leHRyYWN0KE1lcywgIl5bXiBdKyIpLCANCiAgICAgICAgICAgICAgICAgICAgYygiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSIpKQ0KICApICU+JQ0KICBhcnJhbmdlKE1lc19udW0pICU+JQ0KICBzZWxlY3QoLU1lc19udW0pICU+JQ0KICBtdXRhdGUoDQogICAgU2V4byA9IGlmZWxzZShTZXhvID09IDEsICJNYXNjdWxpbm8iLCBpZmVsc2UoU2V4byA9PSAyLCAiRmVtZW5pbm8iLCAiTkQiKSksDQogICAgWm9uYSA9IGlmZWxzZShab25hID09IDEsICJVcmJhbm8iLCBpZmVsc2UoWm9uYSA9PSAyLCAiUnVyYWwiLCAiTkQiKSksDQogICAgQ290aXphbmRvX1BlbnNpb24gPSBpZmVsc2UoQ290aXphbmRvX1BlbnNpb24gPT0gMSwgIlNpIGNvdGl6YSIsIGlmZWxzZShDb3RpemFuZG9fUGVuc2lvbiA9PSAwLCAiTm8gY290aXphIiwgIk5EIikpLA0KICAgIFRpcG9fZGVfZW1wbGVvID0gY2FzZV93aGVuKA0KICAgICAgVGlwb19kZV9lbXBsZW8gPT0gMSB+ICJPYnJlcm8vZW1wbGVhZG8gcGFydGljdWxhciIsDQogICAgICBUaXBvX2RlX2VtcGxlbyA9PSAyIH4gIk9icmVyby9lbXBsZWFkbyBnb2JpZXJubyIsDQogICAgICBUaXBvX2RlX2VtcGxlbyA9PSAzIH4gIkVtcGxlYWRvIGRvbWVzdGljbyIsDQogICAgICBUaXBvX2RlX2VtcGxlbyA9PSA0IH4gIlRyYWJhamFkb3IgZmFtaWxpYXIiLA0KICAgICAgVGlwb19kZV9lbXBsZW8gPT0gNSB+ICJUcmFiYWphZG9yIGN1ZW50YSBwcm9waWEiLA0KICAgICAgVGlwb19kZV9lbXBsZW8gPT0gNiB+ICJQYXRyb24vZW1wbGVhZG9yIiwNCiAgICAgIFRpcG9fZGVfZW1wbGVvID09IDcgfiAiVHJhYmFqYWRvciBzaW4gcmVtdW5lcmFjaW9uIiwNCiAgICAgIFRSVUUgfiAiTkQiDQogICAgKSwNCiAgICBJbmdyZXNvc19yZWNpYmlkb3MgPSBpZmVsc2UoaXMubmEoSW5ncmVzb3NfcmVjaWJpZG9zKSwgIk5EIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCIsIGZvcm1hdChJbmdyZXNvc19yZWNpYmlkb3MsIGJpZy5tYXJrID0gIi4iLCBkZWNpbWFsLm1hcmsgPSAiLCIpKSksDQogICAgTml2ZWxfZWR1Y2F0aXZvID0gY2FzZV93aGVuKA0KICAgICAgTml2ZWxfZWR1Y2F0aXZvID09IDEgfiAiTmluZ3VubyIsDQogICAgICBOaXZlbF9lZHVjYXRpdm8gPT0gMiB+ICJQcmVlc2NvbGFyIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSAzIH4gIlByaW1hcmlhIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSA0IH4gIlNlY3VuZGFyaWEiLA0KICAgICAgTml2ZWxfZWR1Y2F0aXZvID09IDUgfiAiTWVkaWEgYWNhZGVtaWNhIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSA2IH4gIk1lZGlhIHRlY25pY2EiLA0KICAgICAgTml2ZWxfZWR1Y2F0aXZvID09IDcgfiAiTm9ybWFsaXN0YSIsDQogICAgICBOaXZlbF9lZHVjYXRpdm8gPT0gOCB+ICJUZWNuaWNhIHByb2Zlc2lvbmFsIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSA5IH4gIlRlY25vbG9naWNhIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSAxMCB+ICJVbml2ZXJzaXRhcmlhIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSAxMSB+ICJFc3BlY2lhbGl6YWNpb24iLA0KICAgICAgTml2ZWxfZWR1Y2F0aXZvID09IDEyIH4gIk1hZXN0cmlhIiwNCiAgICAgIE5pdmVsX2VkdWNhdGl2byA9PSAxMyB+ICJEb2N0b3JhZG8iLA0KICAgICAgVFJVRSB+ICJORCINCiAgICApDQogICkgJT4lDQogIHNlbGVjdChNZXMsIEVkYWQsIFNleG8sIFpvbmEsIE5pdmVsX2VkdWNhdGl2bywgVGlwb19kZV9lbXBsZW8sIEluZ3Jlc29zX3JlY2liaWRvcywgQ290aXphbmRvX1BlbnNpb24pICU+JQ0KICBndCgpICU+JQ0KICB0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gbWQoIioqQmFzZSBkZSBEYXRvcyBHRUlIIDIwMjUqKiIpLA0KICAgIHN1YnRpdGxlID0gbWQoIkdyYW4gRW5jdWVzdGEgSW50ZWdyYWRhIGRlIEhvZ2FyZXMgLSBEQU5FIC0gUHJpbWVyb3MgMSwwMDAgcmVnaXN0cm9zIikNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICBNZXMgPSAiTWVzIiwNCiAgICBFZGFkID0gIkVkYWQiLA0KICAgIFNleG8gPSAiU2V4byIsDQogICAgWm9uYSA9ICJab25hIiwNCiAgICBOaXZlbF9lZHVjYXRpdm8gPSAiTml2ZWwgZWR1Y2F0aXZvIiwNCiAgICBUaXBvX2RlX2VtcGxlbyA9ICJUaXBvIGRlIGVtcGxlbyIsDQogICAgSW5ncmVzb3NfcmVjaWJpZG9zID0gIkluZ3Jlc29zIiwNCiAgICBDb3RpemFuZG9fUGVuc2lvbiA9ICJDb3RpemEgcGVuc2lvbiINCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAiIzRBM0Y1NSIpLCBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAiYm9sZCIpKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKGV2ZXJ5dGhpbmcoKSkNCiAgKSAlPiUNCiAgb3B0X3Jvd19zdHJpcGluZygpICU+JQ0KICB0YWJfb3B0aW9ucygNCiAgICB0YWJsZS53aWR0aCA9IHBjdCgxMDApLA0KICAgIHRhYmxlLmZvbnQuc2l6ZSA9ICJzbWFsbCIsDQogICAgaGVhZGluZy50aXRsZS5mb250LnNpemUgPSAibGFyZ2UiLA0KICAgIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gInNtYWxsIiwNCiAgICB0YWJsZS5ib3JkZXIudG9wLmNvbG9yID0gIiM0QTNGNTUiLA0KICAgIHRhYmxlLmJvcmRlci5ib3R0b20uY29sb3IgPSAiIzRBM0Y1NSINCiAgKSAlPiUNCiAgdGFiX3NvdXJjZV9ub3RlKCJGdWVudGU6IERBTkUgLSBHcmFuIEVuY3Vlc3RhIEludGVncmFkYSBkZSBIb2dhcmVzIChHRUlIKSAyMDI1LiBDYWxjdWxvcyBncnVwbyAyIikgJT4lDQogIGh0bWx0b29sczo6ZGl2KHN0eWxlID0gIm1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyIpDQpgYGANCiMgMyBBbsOhbGlzaXMgZGVzY3JpcHRpdm8NCg0KYGBge3IgbWF0cml6IGRlIGNvcnJlbGFjaW9uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGFsZXRhIDwtIGxpc3QoDQogIHByaW1hcnkgICA9ICIjNEEzRjU1IiwNCiAgc2Vjb25kYXJ5ID0gIiM3QzZBOUMiLA0KICBsaWdodCAgICAgPSAiI0Q2Q0RFQSIsDQogIGRhcmsgICAgICA9ICIjMkMxRjNFIiwNCiAgYmcgICAgICAgID0gIiNGOUY5RjkiLA0KICBhY2NlbnQgICAgPSAiI0YwRURGNSINCikNCg0KY29sb3Jlc19jb3JyIDwtIGNvbG9yUmFtcFBhbGV0dGUoYyhwYWxldGEkc2Vjb25kYXJ5LCAiI0ZGRkZGRiIsIHBhbGV0YSRwcmltYXJ5KSkoMTAwKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCmRhdG9zX2NvciA8LSBiYXNlX211ZXN0cmEgJT4lDQogIHNlbGVjdChFZGFkLCBTZXhvLCBab25hLCBUaXBvX2RlX2VtcGxlbywgDQogICAgICAgICBOaXZlbF9lZHVjYXRpdm8sDQogICAgICAgICBJbmdyZXNvc19yZWNpYmlkb3MsIENvdGl6YW5kb19QZW5zaW9uKQ0KDQptYXRyaXpfY29yIDwtIGNvcihkYXRvc19jb3IsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KDQpjb2xuYW1lcyhtYXRyaXpfY29yKSA8LSBjKCJFZGFkIiwgIlNleG8iLCAiWm9uYSIsICJUcmFiYWpvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJOaXZlbCBlZHVjLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJJbmdyZXNvcyIsICJDb3RpemEgcGVuc2nDs24iKQ0Kcm93bmFtZXMobWF0cml6X2NvcikgPC0gYygiRWRhZCIsICJTZXhvIiwgIlpvbmEiLCJUcmFiYWpvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJOaXZlbCBlZHVjLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJJbmdyZXNvcyIsICJDb3RpemEgcGVuc2nDs24iKQ0KDQpjb3JycGxvdChtYXRyaXpfY29yLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gImxvd2VyIiwNCiAgICAgICAgIGRpYWcgPSBGQUxTRSwgYWRkQ29lZi5jb2wgPSBwYWxldGEkZGFyaywgbnVtYmVyLmNleCA9IDAuNzUsDQogICAgICAgICB0bC5jb2wgPSBwYWxldGEkZGFyaywgdGwuc3J0ID0gMzUsIHRsLmNleCA9IDAuNzUsICAgICAgICAgIA0KICAgICAgICAgY29sID0gY29sb3Jlc19jb3JyLCBjbC5wb3MgPSAiYiIsIGNsLmNleCA9IDAuNywgY2wubGVuZ3RoID0gNSwNCiAgICAgICAgIG1hciA9IGMoMiwgMCwgMSwgMCksIGJnID0gIndoaXRlIikNCg0KbXRleHQoIkZ1ZW50ZTogREFORSAtIEdyYW4gRW5jdWVzdGEgSW50ZWdyYWRhIGRlIEhvZ2FyZXMgKEdFSUgpIDIwMjUiLCANCiAgICAgIHNpZGUgPSAxLCBsaW5lID0gNCwgY2V4ID0gMC43LCBjb2wgPSBwYWxldGEkc2Vjb25kYXJ5KQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCByZXN1bHRhZG8gYXJyb2phIHF1ZSBuaW5ndW5hIGRlIGxhcyB2YXJpYWJsZXMgcHJlc2VudGEgY29ycmVsYWNpb25lcyBleGNlc2l2YW1lbnRlIGFsdGFzLCBsbyBxdWUgaW5kaWNhIGF1c2VuY2lhIGRlIHByb2JsZW1hcyBmdWVydGVzIGRlIG11bHRpY29saW5lYWxpZGFkIGRlbnRybyBkZWwgbW9kZWxvLiBTZWfDum4gSmFtZXMgZXQgYWwuICgyMDIxKSwgKiptYW50ZW5lciByZWxhY2lvbmVzIG1vZGVyYWRhcyBlbnRyZSB2YXJpYWJsZXMgZXhwbGljYXRpdmFzIGZhdm9yZWNlIHVuYSBtZWpvciBpbnRlcnByZXRhY2nDs24geSBlc3RhYmlsaWRhZCBlbiBsb3MgbW9kZWxvcyBwcmVkaWN0aXZvcy4qKjwvZGl2Pg0KDQojIyAzLjEgRGlzdHJpYnVjacOzbiBkZSBsYSBwZW5zacOzbg0KYGBge3IgUEVOU0lPTiwgZmlnLmhlaWdodD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZV9tdWVzdHJhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKENvdGl6YW5kb19QZW5zaW9uKSwgQ290aXphbmRvX1BlbnNpb24gJWluJSBjKDAsIDEpKSAlPiUNCiAgbXV0YXRlKENvdGl6YWNpb24gPSBpZmVsc2UoQ290aXphbmRvX1BlbnNpb24gPT0gMSwgIlNpIGNvdGl6YSIsICJObyBjb3RpemEiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IENvdGl6YWNpb24sIGZpbGwgPSBDb3RpemFjaW9uKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIGNvbG9yID0gIiM0QTNGNTUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiU2kgY290aXphIiA9ICIjN0M2QTlDIiwgIk5vIGNvdGl6YSIgPSAiI0Q2Q0RFQSIpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzdHJpYnVjaW9uIGRlIENvdGl6YWNpb24gYSBQZW5zaW9uIiwNCiAgICBzdWJ0aXRsZSA9ICJQb2JsYWNpb24gb2N1cGFkYSBxdWUgY290aXphIG8gbm8gYWwgc2lzdGVtYSBwZW5zaW9uYWwiLA0KICAgIHggPSAiIiwgDQogICAgeSA9ICJDYW50aWRhZCBkZSBQZXJzb25hcyIsDQogICAgY2FwdGlvbiA9ICJGdWVudGU6IERBTkUgLSBHRUlIIDIwMjUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1IiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBzaXplID0gMTEpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjN0M2QTlDIiwgaGp1c3QgPSAwLCBzaXplID0gOCksDQogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjRDZDREVBIiwgbGluZXR5cGUgPSAiZGFzaGVkIiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkNCiAgKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5MYSBncsOhZmljYSBkZSBjb3RpemFjacOzbiBhIHBlbnNpw7NuIHBlcm1pdGUgZGltZW5zaW9uYXIgZWwgbml2ZWwgZGUgaW5mb3JtYWxpZGFkIGxhYm9yYWwgcHJlc2VudGUgZW4gbGEgbXVlc3RyYSBhbmFsaXphZGEuIEFsIGRpZmVyZW5jaWFyIGVudHJlIHF1aWVuZXMgY290aXphbiB5IHF1aWVuZXMgbm8gY290aXphbiBhbCBzaXN0ZW1hIHBlbnNpb25hbCwgc2UgZXZpZGVuY2lhIGxhIHByb3BvcmNpw7NuIGRlIHRyYWJhamFkb3JlcyB2aW5jdWxhZG9zIGFsIGVtcGxlbyBmb3JtYWwgZnJlbnRlIGEgYXF1ZWxsb3MgYXNvY2lhZG9zIGEgY29uZGljaW9uZXMgZGUgaW5mb3JtYWxpZGFkLjwvZGl2Pg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+RW4gbGEgbXVlc3RyYSBkZSAxMC4wMDAgb2JzZXJ2YWNpb25lcyBhbmFsaXphZGFzLCBlbCAzNSwzOCUgZGUgbGFzIHBlcnNvbmFzIG9jdXBhZGFzIG5vIGNvdGl6YSBhbCBzaXN0ZW1hIHBlbnNpb25hbCwgbG8gcXVlIHJlcHJlc2VudGEgdW5hIGNvbmRpY2nDs24gZGUgaW5mb3JtYWxpZGFkIGxhYm9yYWwgYmFqYSwgcG9yIG90cm8gbGFkbyBlbCAqKjY0LDYyJSBzw60gcmVhbGl6YSBhcG9ydGVzIGEgcGVuc2nDs24sIHJlZmxlamFuZG8gdW5hIG1heW9yIHBhcnRpY2lwYWNpw7NuIGRlIHRyYWJhamFkb3JlcyBhc29jaWFkb3MgYWwgZW1wbGVvIGZvcm1hbCBkZW50cm8gZGUgbGEgbXVlc3RyYSoqPC9kaXY+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+TGEgcmVsZXZhbmNpYSBkZSBlc3RhIHZhcmlhYmxlIHJhZGljYSBlbiBxdWUgbGEgY290aXphY2nDs24gYSBwZW5zacOzbiBzZSB1dGlsaXphIGNvbW8gcHJveHkgZGUgZm9ybWFsaWRhZCBsYWJvcmFsLCBjb252aXJ0acOpbmRvc2UgZW4gbGEgdmFyaWFibGUgb2JqZXRpdm8gZGVsIG1vZGVsby4gRW4gZXN0ZSBzZW50aWRvLCB2YXJpYWJsZXMgY29tbyBpbmdyZXNvcywgbml2ZWwgZWR1Y2F0aXZvIG8gem9uYSBkZSByZXNpZGVuY2lhIGJ1c2NhbiBleHBsaWNhciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGluZGl2aWR1byBwZXJ0ZW5lemNhIGEgdW5hIHUgb3RyYSBjYXRlZ29yw61hLjwvZGl2Pg0KDQpgYGB7ciBkaXN0cmlidWNpb24gZGUgY290aXphY2lvbiBlbiBlbCBwYWlzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdXJsX2NvbG9tYmlhIDwtICJodHRwczovL2dlb2RhdGEudWNkYXZpcy5lZHUvZ2FkbS9nYWRtNC4xL2pzb24vZ2FkbTQxX0NPTF8xLmpzb24iDQpjb2xvbWJpYV9kZXB0IDwtIHN0X3JlYWQodXJsX2NvbG9tYmlhLCBxdWlldCA9IFRSVUUpDQoNCmRhdG9zX21hcGEgPC0gYmFzZV9maW5hbF8yMDI1JT4lDQogIG11dGF0ZShBcmVhX21ldHJvcG9saXRhbmEgPSBhcy5jaGFyYWN0ZXIoQXJlYV9tZXRyb3BvbGl0YW5hKSkgJT4lDQogIGZpbHRlcighaXMubmEoQ290aXphbmRvX1BlbnNpb24pKSAlPiUNCiAgZ3JvdXBfYnkoQ09EX0RFUFRPID0gQXJlYV9tZXRyb3BvbGl0YW5hKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHRvdGFsX3BlcnNvbmFzID0gbigpLA0KICAgIGNvdGl6YW50ZXMgPSBzdW0oQ290aXphbmRvX1BlbnNpb24gPT0gMSwgbmEucm0gPSBUUlVFKSwNCiAgICBwY3RfY290aXphID0gKGNvdGl6YW50ZXMgLyB0b3RhbF9wZXJzb25hcykgKiAxMDANCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoTkFNRV8xID0gY2FzZV93aGVuKA0KICAgIENPRF9ERVBUTyA9PSAiNSIgIH4gIkFudGlvcXVpYSIsDQogICAgQ09EX0RFUFRPID09ICI4IiAgfiAiQXRsw6FudGljbyIsDQogICAgQ09EX0RFUFRPID09ICIxMSIgfiAiQm9nb3TDoUQuQy4iLA0KICAgIENPRF9ERVBUTyA9PSAiMTMiIH4gIkJvbMOtdmFyIiwNCiAgICBDT0RfREVQVE8gPT0gIjE1IiB+ICJCb3lhY8OhIiwNCiAgICBDT0RfREVQVE8gPT0gIjE3IiB+ICJDYWxkYXMiLA0KICAgIENPRF9ERVBUTyA9PSAiMTgiIH4gIkNhcXVldMOhIiwNCiAgICBDT0RfREVQVE8gPT0gIjE5IiB+ICJDYXVjYSIsDQogICAgQ09EX0RFUFRPID09ICIyMCIgfiAiQ2VzYXIiLA0KICAgIENPRF9ERVBUTyA9PSAiMjMiIH4gIkPDs3Jkb2JhIiwNCiAgICBDT0RfREVQVE8gPT0gIjI3IiB+ICJDaG9jw7MiLA0KICAgIENPRF9ERVBUTyA9PSAiNDEiIH4gIkh1aWxhIiwNCiAgICBDT0RfREVQVE8gPT0gIjQ0IiB+ICJMYUd1YWppcmEiLA0KICAgIENPRF9ERVBUTyA9PSAiNDciIH4gIk1hZ2RhbGVuYSIsDQogICAgQ09EX0RFUFRPID09ICI1MCIgfiAiTWV0YSIsDQogICAgQ09EX0RFUFRPID09ICI1MiIgfiAiTmFyacOxbyIsDQogICAgQ09EX0RFUFRPID09ICI1NCIgfiAiTm9ydGVkZVNhbnRhbmRlciIsDQogICAgQ09EX0RFUFRPID09ICI2MyIgfiAiUXVpbmTDrW8iLA0KICAgIENPRF9ERVBUTyA9PSAiNjYiIH4gIlJpc2FyYWxkYSIsDQogICAgQ09EX0RFUFRPID09ICI2OCIgfiAiU2FudGFuZGVyIiwNCiAgICBDT0RfREVQVE8gPT0gIjcwIiB+ICJTdWNyZSIsDQogICAgQ09EX0RFUFRPID09ICI3MyIgfiAiVG9saW1hIiwNCiAgICBDT0RfREVQVE8gPT0gIjc2IiB+ICJWYWxsZWRlbENhdWNhIiwNCiAgICBDT0RfREVQVE8gPT0gIjgxIiB+ICJBcmF1Y2EiLA0KICAgIENPRF9ERVBUTyA9PSAiODUiIH4gIkNhc2FuYXJlIiwNCiAgICBDT0RfREVQVE8gPT0gIjg2IiB+ICJQdXR1bWF5byIsDQogICAgQ09EX0RFUFRPID09ICI4OCIgfiAiU2FuQW5kcsOpc3lQcm92aWRlbmNpYSIsDQogICAgQ09EX0RFUFRPID09ICI5MSIgfiAiQW1hem9uYXMiLA0KICAgIENPRF9ERVBUTyA9PSAiOTQiIH4gIkd1YWluw61hIiwNCiAgICBDT0RfREVQVE8gPT0gIjk1IiB+ICJHdWF2aWFyZSIsDQogICAgQ09EX0RFUFRPID09ICI5NyIgfiAiVmF1cMOpcyIsDQogICAgQ09EX0RFUFRPID09ICI5OSIgfiAiVmljaGFkYSIsDQogICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgKSkgJT4lDQogIGZpbHRlcighaXMubmEoTkFNRV8xKSkNCg0KZGF0b3NfbWFwYSA8LSBkYXRvc19tYXBhICU+JQ0KICBiaW5kX3Jvd3MoDQogICAgZGF0b3NfbWFwYSAlPiUgDQogICAgICBmaWx0ZXIoTkFNRV8xID09ICJCb2dvdMOhRC5DLiIpICU+JSANCiAgICAgIG11dGF0ZShOQU1FXzEgPSAiQ3VuZGluYW1hcmNhIikNCiAgKQ0KbWFwYV9maW5hbCA8LSBjb2xvbWJpYV9kZXB0ICU+JQ0KICBsZWZ0X2pvaW4oZGF0b3NfbWFwYSwgYnkgPSAiTkFNRV8xIikNCg0KbWFwYV9nZyA8LSBnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IG1hcGFfZmluYWwsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcGN0X2NvdGl6YSwgDQogICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoTkFNRV8xLCAiOiAiLCByb3VuZChwY3RfY290aXphLCAxKSwgIiUiKSksIA0KICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKA0KICAgIGNvbG9ycyA9IGMoIndoaXRlIiwgIiM3QzZBOUMiLCAiIzRBM0Y1NSIsICIjMkMxRjNFIiksDQogICAgbmFtZSA9ICIlIENvdGl6YVxuUGVuc2nDs24iLA0KICAgIG5hLnZhbHVlID0gImdyYXk5MCIsDQogICAgbGltaXRzID0gYygwLCAxMDApLA0KICAgIGJyZWFrcyA9IHNlcSgwLCAxMDAsIGJ5ID0gMjUpDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmNlbnRyYWNpw7NuIGRlIFBvYmxhY2nDs24gcXVlIENvdGl6YSBhIFBlbnNpw7NuIHBvciBEZXBhcnRhbWVudG8iLA0KICAgIHN1YnRpdGxlID0gIlByb3BvcmNpw7NuIGRlIGNvdGl6YW50ZXMgZW4gY2FkYSBkZXBhcnRhbWVudG8gLSBHRUlIIDIwMjUiLA0KICAgIGNhcHRpb24gPSAiRnVlbnRlOiBEQU5FIC0gR0VJSCAyMDI1Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzJDMUYzRSIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1Iiwgc2l6ZSA9IDEwKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzdDNkE5QyIsIHNpemUgPSA4LCBoanVzdCA9IDApDQogICkNCg0KZ2dwbG90bHkobWFwYV9nZywgdG9vbHRpcCA9ICJ0ZXh0IikNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+U2Ugb2JzZXJ2YSBxdWUgZGVwYXJ0YW1lbnRvcyBjb24gbWVub3IgZGVzYXJyb2xsbyBpbmR1c3RyaWFsIGFic29sdXRvIGNvbW8gZWwgQW1hem9uYXMgbyBQdXR1bWF5byBwcmVzZW50YW4gdGFzYXMgZGUgY290aXphY2nDs24gbcOhcyBhbHRhcyBxdWUgbG9zIGdyYW5kZXMgY2VudHJvcyB1cmJhbm9zLkVzdGUgZmVuw7NtZW5vIHJlc3BvbmRlIGEgbGEgZXN0cnVjdHVyYSBkZWwgZW1wbGVvIGNhcHR1cmFkYSBwb3IgbGEgR0VJSC4gRW4gcmVnaW9uZXMgZGUgYmFqYSBkZW5zaWRhZCBwb2JsYWNpb25hbCB5IGVjb25vbcOtYSBkZSBlbmNsYXZlLCBlbCBtZXJjYWRvIGxhYm9yYWwgZm9ybWFsIGVzdMOhIGRvbWluYWRvIGNhc2kgZXhjbHVzaXZhbWVudGUgcG9yIGVsIGVtcGxlbyBww7pibGljbyBjb21vIGxvIGVzIGRvY2VudGVzLCBmdWVyemFzIG1pbGl0YXJlcywgYWRtaW5pc3RyYXRpdm8uIFBvciBlbCBjb250cmFyaW8sIGVuIEFudGlvcXVpYSwgVmFsbGUgbyBDdW5kaW5hbWFyY2EgKEN1bmRpbmFtYXJjYSByZWZsZWphIGxvcyBkYXRvcyBkZWwgw6FyZWEgbWV0cm9wb2xpdGFuYSBkZSBCb2dvdMOhIEQuQy4pLCBxdWUgYSBwZXNhciBkZSBzZXIgbGFzIHJlZ2lvbmVzIG3DoXMgZGVzYXJyb2xsYWRhcyBsYSBtdWVzdHJhIGVzIGhldGVyb2fDqW5lYSBlIGluY2x1eWUgdW5hIG1heW9yIHByb3BvcmNpw7NuIGRlIHRyYWJhamFkb3JlcyBpbmRlcGVuZGllbnRlcywgaW5mb3JtYWxlcyB5IGRlIHNlcnZpY2lvcyBwcml2YWRvcywgZG9uZGUgbGEgY29iZXJ0dXJhIHBlbnNpb25hbCBlcyBzaWduaWZpY2F0aXZhbWVudGUgbWVub3IuKipQb3IgZW5kZSBsYSB0YXNhIGRlIGNvdGl6YWNpw7NuIG5vIG1pZGUgbGEgcmlxdWV6YSBnZW5lcmFkYSAoUElCKSwgc2lubyBsYSBwcm9wb3JjacOzbiBkZSB0cmFiYWphZG9yZXMgZm9ybWFsZXMgZGVudHJvIGRlIGxhIHBvYmxhY2nDs24gb2N1cGFkYSwgcXVlIHJlc3VsdGEgZXN0cnVjdHVyYWxtZW50ZSBtw6FzIGFsdGEgZW4gZWNvbm9tw61hcyBkZXBlbmRpZW50ZXMgZGVsIHNlY3RvciBww7pibGljbyoqLjwvZGl2Pg0KDQojIyAzLjIgRGlzdHJpYnVjacOzbiBkZSBsYSBlZGFkDQoNCmBgYHtyIGFuYWxpc2lzIGdyYWZpY29zIGhpc3RvZ3JhbWEgZWRhZCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSB9DQptZWRpYW5hX2VkYWQgPC0gbWVkaWFuKGJhc2VfbXVlc3RyYSRFZGFkLCBuYS5ybSA9IFRSVUUpDQoNCnAgPC0gZ2dwbG90KGJhc2VfbXVlc3RyYSwgYWVzKHggPSBFZGFkKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gNDAsIGZpbGwgPSAiIzdDNkE5QyIsIGNvbG9yID0gIiM0QTNGNTUiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtZWRpYW5hX2VkYWQsIGNvbG9yID0gIiM0QTNGNTUiLCBzaXplID0gMS4yLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9jb21tYShiaWcubWFyayA9ICIuIikpICsgDQogIGxhYnMoDQogICAgdGl0bGUgPSBwYXN0ZSgiRGlzdHJpYnVjacOzbiBkZSBsYSBFZGFkIHwgTWVkaWFuYSA9IiwgbWVkaWFuYV9lZGFkLCAiYcOxb3MiKSwNCiAgICBzdWJ0aXRsZSA9ICJQb2JsYWNpw7NuIGVuY3Vlc3RhZGEgcG9yIGdydXBvcyBkZSBlZGFkIiwNCiAgICB4ID0gIkVkYWQgKEHDsW9zKSIsDQogICAgeSA9ICJDYW50aWRhZCBkZSBQZXJzb25hcyIsDQogICAgY2FwdGlvbiA9ICJGdWVudGU6IERBTkUgLSBHRUlIIDIwMjUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM0QTNGNTUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzdDNkE5QyIsIHNpemUgPSAxMSksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBoanVzdCA9IDAsIHNpemUgPSA4KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiNENkNERUEiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKQ0KICApDQoNCmdncGxvdGx5KHAsIHRvb2x0aXAgPSBjKCJ4IiwgImNvdW50IikpICU+JQ0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lDQogIGxheW91dChob3ZlcmxhYmVsID0gbGlzdChiZ2NvbG9yID0gIiM0QTNGNTUiLCBmb250ID0gbGlzdChjb2xvciA9ICJ3aGl0ZSIpKSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+TGEgbWF5b3IgcGFydGljaXBhY2nDs24gZGUgaW5kaXZpZHVvcyBlbiBlZGFkZXMgZWNvbsOzbWljYW1lbnRlIGFjdGl2YXMgcmVmbGVqYSBxdWUgbGEgbXVlc3RyYSBlc3TDoSBjb21wdWVzdGEgcHJpbmNpcGFsbWVudGUgcG9yIHBlcnNvbmFzIHZpbmN1bGFkYXMgYWwgbWVyY2FkbyBsYWJvcmFsLCBjb24gdW5hIGNsYXJhIGNvbmNlbnRyYWNpw7NuIGVuIGVsIHJhbmdvIGRlIDI1IGEgNDAgYcOxb3MsIHF1ZSBjb3JyZXNwb25kZSBhIGxhIGV0YXBhIGRlIG1heW9yIHByb2R1Y3RpdmlkYWQgeSBlc3RhYmlsaWRhZCBsYWJvcmFsLCBlbiByZWxhY2nDs24gY29uIGxhIGluZm9ybWFsaWRhZCBsYWJvcmFsLCBsYSBlZGFkIHB1ZWRlIGluZmx1aXIgZW4gbGFzIGNvbmRpY2lvbmVzIGRlIGVtcGxlbyB5IGVuIGVsIGFjY2VzbyBhIG1lY2FuaXNtb3MgZGUgcHJvdGVjY2nDs24gc29jaWFsLiBHcnVwb3MgZGUgZWRhZGVzIHB1ZWRlbiBwcmVzZW50YXIgbWF5b3JlcyBkaWZpY3VsdGFkZXMgcGFyYSBhY2NlZGVyIGEgZW1wbGVvcyBmb3JtYWxlcywgZXNwZWNpYWxtZW50ZSBlbiBldGFwYXMgdGVtcHJhbmFzIChtZW5vciBhIDIwIGHDsW9zKSBvIGF2YW56YWRhcyBkZSBsYSB2aWRhIGxhYm9yYWwgKDYwIGHDsW9zKS48L2Rpdj4NCg0KIyMgMy4zIERpc3RpYnVjacOzbiBkZWwgc2V4bw0KDQpgYGB7ciBkaWFncmFtYXMgZGUgYmFycmFzIHNleG8sZmlnLmhlaWdodD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZV9tdWVzdHJhICU+JQ0KICBmaWx0ZXIoU2V4byAlaW4lIGMoMSwgMikpICU+JQ0KICBtdXRhdGUoU2V4byA9IGlmZWxzZShTZXhvID09IDEsICJNYXNjdWxpbm8iLCAiRmVtZW5pbm8iKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IFNleG8sIGZpbGwgPSBTZXhvKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIGNvbG9yID0gIiM0QTNGNTUiLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJNYXNjdWxpbm8iID0gIiM3QzZBOUMiLCAiRmVtZW5pbm8iID0gIiNENkNERUEiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1Y2lvbiBwb3IgU2V4byIsDQogICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpb24gaG9tYnJlcy1tdWplcmVzIiwNCiAgICB4ID0gIiIsIA0KICAgIHkgPSAiUGVyc29uYXMiLA0KICAgIGNhcHRpb24gPSAiRnVlbnRlOiBEQU5FIC0gR0VJSCAyMDI1Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM0QTNGNTUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzdDNkE5QyIsIHNpemUgPSAxMSksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBoanVzdCA9IDAsIHNpemUgPSA4KQ0KICApDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkxhIG11ZXN0cmEgcHJlc2VudGEgdW5hIGRpc3RyaWJ1Y2nDs24gZXF1aWxpYnJhZGEgZW50cmUgaG9tYnJlcyB5IG11amVyZXMsIGNvbiB1bmEgbGlnZXJhIHZlbnRhamEgbWFzY3VsaW5hIGNlcmNhbmEgYWwgNTIlIHkgdW5hIHBhcnRpY2lwYWNpw7NuIGZlbWVuaW5hIGRlbCA0OCUsIGxvIHF1ZSByZWZsZWphIGFkZWN1YWRhbWVudGUgbGEgZXN0cnVjdHVyYSBwb2JsYWNpb25hbCBjb2xvbWJpYW5hIHkgZXZpdGEgc2VzZ29zIGRlIGfDqW5lcm8gZW4gbG9zIGFuw6FsaXNpcyBwb3N0ZXJpb3JlcywgbGEgT0lUIGhhIGRvY3VtZW50YWRvIHF1ZSwgbcOhcyBxdWUgdW5hIGN1ZXN0acOzbiBkZSBwcmVmZXJlbmNpYXMsIGV4aXN0ZW4gYmFycmVyYXMgZXN0cnVjdHVyYWxlcyBxdWUgYWZlY3RhbiBsYSBpbnNlcmNpw7NuIGxhYm9yYWwgZmVtZW5pbmEsIGFzw60gcGFyYSAyMDI1LCBsYSB0YXNhIGRlIHBhcnRpY2lwYWNpw7NuIGRlIGxhcyBtdWplcmVzIGVuIGxhIGZ1ZXJ6YSBsYWJvcmFsIGRlIEFtw6lyaWNhIExhdGluYSBmdWUgZGVsIDUxLDQlLCBtaWVudHJhcyBxdWUgbGEgZGUgbG9zIGhvbWJyZXMgYWxjYW56w7MgZWwgNzQsNiUgKE9JVCwgMjAyNSkuIEVzdGEgYnJlY2hhIHJlZmxlamEgZGVzaWd1YWxkYWRlcyBlbiBlbCBhY2Nlc28gYWwgZW1wbGVvIGZvcm1hbCBlbiBjdWFudG8gYSBzZXhvIGRlIGxhIHBlcnNvbmEsIGFzcGVjdG8gcXVlIGluY2lkZSBkaXJlY3RhbWVudGUgZW4gbGEgbWVub3IgcHJvYmFiaWxpZGFkIGRlIGNvdGl6YWNpw7NuIHBlbnNpb25hbCBkZSBsYXMgbXVqZXJlcyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBob21icmVzLjwvZGl2Pg0KDQojIyAzLjQgRGlzdHJpYnVjacOzbiBkZWwgbml2ZWwgZWR1Y2F0aXZvDQoNCmBgYHtyIG5pdmVsIGVkdWNhdGl2bywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmJhc2VfbXVlc3RyYSAlPiUNCiAgZmlsdGVyKCFpcy5uYShOaXZlbF9lZHVjYXRpdm8pLCBOaXZlbF9lZHVjYXRpdm8gJWluJSAxOjEzKSAlPiUNCiAgbXV0YXRlKEVkdWNhY2lvbiA9IGNhc2Vfd2hlbigNCiAgICBOaXZlbF9lZHVjYXRpdm8gPT0gMSB+ICJOaW5ndW5vIiwNCiAgICBOaXZlbF9lZHVjYXRpdm8gPT0gMiB+ICJQcmVlc2NvbGFyIiwNCiAgICBOaXZlbF9lZHVjYXRpdm8gPT0gMyB+ICJQcmltYXJpYSIsDQogICAgTml2ZWxfZWR1Y2F0aXZvID09IDQgfiAiU2VjdW5kYXJpYSIsDQogICAgTml2ZWxfZWR1Y2F0aXZvID09IDUgfiAiTWVkaWEgYWNhZMOpbWljYSIsDQogICAgTml2ZWxfZWR1Y2F0aXZvID09IDYgfiAiTWVkaWEgdMOpY25pY2EiLA0KICAgIE5pdmVsX2VkdWNhdGl2byA9PSA3IH4gIk5vcm1hbGlzdGEiLA0KICAgIE5pdmVsX2VkdWNhdGl2byA9PSA4IH4gIlTDqWNuaWNhIHByb2Zlc2lvbmFsIiwNCiAgICBOaXZlbF9lZHVjYXRpdm8gPT0gOSB+ICJUZWNub2zDs2dpY2EiLA0KICAgIE5pdmVsX2VkdWNhdGl2byA9PSAxMCB+ICJVbml2ZXJzaXRhcmlhIiwNCiAgICBOaXZlbF9lZHVjYXRpdm8gPT0gMTEgfiAiRXNwZWNpYWxpemFjacOzbiIsDQogICAgTml2ZWxfZWR1Y2F0aXZvID09IDEyIH4gIk1hZXN0csOtYSIsDQogICAgTml2ZWxfZWR1Y2F0aXZvID09IDEzIH4gIkRvY3RvcmFkbyINCiAgKSkgJT4lDQogIG11dGF0ZShFZHVjYWNpb24gPSBmYWN0b3IoRWR1Y2FjaW9uLCBsZXZlbHMgPSBjKA0KICAgICJOaW5ndW5vIiwgIlByZWVzY29sYXIiLCAiUHJpbWFyaWEiLCAiU2VjdW5kYXJpYSIsIA0KICAgICJNZWRpYSBhY2Fkw6ltaWNhIiwgIk1lZGlhIHTDqWNuaWNhIiwgIk5vcm1hbGlzdGEiLCANCiAgICAiVMOpY25pY2EgcHJvZmVzaW9uYWwiLCAiVGVjbm9sw7NnaWNhIiwgIlVuaXZlcnNpdGFyaWEiLA0KICAgICJFc3BlY2lhbGl6YWNpw7NuIiwgIk1hZXN0csOtYSIsICJEb2N0b3JhZG8iDQogICkpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRWR1Y2FjaW9uLCBmaWxsID0gRWR1Y2FjaW9uKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IDAuNykgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjIsIGNvbG9yID0gIiM0QTNGNTUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygNCiAgICAiTmluZ3VubyIgPSAiI0Q2Q0RFQSIsDQogICAgIlByZWVzY29sYXIiID0gIiNENkNERUEiLA0KICAgICJQcmltYXJpYSIgPSAiI0Q2Q0RFQSIsDQogICAgIlNlY3VuZGFyaWEiID0gIiNENkNERUEiLA0KICAgICJNZWRpYSBhY2Fkw6ltaWNhIiA9ICIjN0M2QTlDIiwNCiAgICAiTWVkaWEgdMOpY25pY2EiID0gIiM3QzZBOUMiLA0KICAgICJOb3JtYWxpc3RhIiA9ICIjN0M2QTlDIiwNCiAgICAiVMOpY25pY2EgcHJvZmVzaW9uYWwiID0gIiM3QzZBOUMiLA0KICAgICJUZWNub2zDs2dpY2EiID0gIiM3QzZBOUMiLA0KICAgICJVbml2ZXJzaXRhcmlhIiA9ICIjNEEzRjU1IiwNCiAgICAiRXNwZWNpYWxpemFjacOzbiIgPSAiIzJDMUYzRSIsDQogICAgIk1hZXN0csOtYSIgPSAiIzJDMUYzRSIsDQogICAgIkRvY3RvcmFkbyIgPSAiIzJDMUYzRSINCiAgKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk5pdmVsIEVkdWNhdGl2byIsDQogICAgc3VidGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBsYSBwb2JsYWNpw7NuIHBvciBuaXZlbCBlZHVjYXRpdm8gYWxjYW56YWRvIiwNCiAgICB4ID0gIiIsIA0KICAgIHkgPSAiQ2FudGlkYWQgZGUgUGVyc29uYXMiLA0KICAgIGNhcHRpb24gPSAiRnVlbnRlOiBEQU5FIC0gR0VJSCAyMDI1Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzRBM0Y1NSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjN0M2QTlDIiwgc2l6ZSA9IDExKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzdDNkE5QyIsIGhqdXN0ID0gMCwgc2l6ZSA9IDgpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDkpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiI0Q2Q0RFQSIsIGxpbmV0eXBlID0gImRhc2hlZCIpDQogICkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+U2UgcHVlZGUgb2JzZXJ2YXIgdW5hIG1heW9yIHBhcnRpY2lwYWNpw7NuIGRlIHBlcnNvbmFzIGNvbiBuaXZlbGVzIGVkdWNhdGl2b3MgYsOhc2ljb3MgeSBtZWRpb3MgdMOpY25pY29zLCByZXByZXNlbnRhbmRvIGFscmVkZWRvciBkZWwgNTIlIGRlIGxhIG11ZXN0cmEsIG1pZW50cmFzIHF1ZSBsb3Mgbml2ZWxlcyBzdXBlcmlvcmVzIHByZXNlbnRhbiBtZW5vciBmcmVjdWVuY2lhLCBzaW4gZW1iYXJnbyBsYSB0aXR1bGFjacOzbiB1bml2ZXJzaXRhcmlhIGN1ZW50YSB0YW1iacOpbiBjb24gdW4gdmFsb3IgcmVsYXRpdmFtZWVudGUgYWx0bywgbG8gY3VhbCByZWZsZWphIGxhIGVzdHJ1Y3R1cmEgZWR1Y2F0aXZhIGRlbCBwYcOtcywgcGFyYSAqKmVsIGHDsW8gMjAxOSBzZSByZXBvcnRhYmEgcXVlIGNlcmNhIGRlbCAzNSUgZGUgbGEgcG9ibGFjacOzbiBjb250YWJhIGNvbiBlZHVjYWNpw7NuIHNlY3VuZGFyaWEgY29tcGxldGEgeSBtZWRpYSB0w6ljbmljYSoqIChEQU5FLCAyMDE5KSwgeSBoYWNpYSAyMDI1IHNlIHByb3llY3TDsyBxdWUgZXN0YSBwcm9wb3JjacOzbiBzaWdhIHVuYSB0ZW5kZW5jaWEgYWwgYWx6YSwgY29uIHVuYSBtYXlvciBwYXJ0aWNpcGFjacOzbiByZWxhdGl2YSBkZSBsb3Mgbml2ZWxlcyBtZWRpb3MgeSBzdXBlcmlvcmVzIGVuIGxhIGZ1ZXJ6YSBsYWJvcmFsIChEQU5FLCAyMDI1KS48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkVuIHTDqXJtaW5vcyBkZSBpbmZvcm1hbGlkYWQgbGFib3JhbCwgZWwgbml2ZWwgZWR1Y2F0aXZvIGVzIHVuYSB2YXJpYWJsZSBpbXBvcnRhbnRlIGRlYmlkbyBhIHF1ZSBpbmZsdXllIGRpcmVjdGFtZW50ZSBlbiBlbCBhY2Nlc28gYSBvcG9ydHVuaWRhZGVzIGxhYm9yYWxlcyBmb3JtYWxlcy4gTGFzIHBlcnNvbmFzIGNvbiBtYXlvciBmb3JtYWNpw7NuIGFjYWTDqW1pY2Egc3VlbGVuIHRlbmVyIG1lam9yZXMgY29uZGljaW9uZXMgZGUgZW1wbGVvLCBtYXlvciBlc3RhYmlsaWRhZCB5IG1heW9yIGFjY2VzbyBhIG1lY2FuaXNtb3MgZGUgcHJvdGVjY2nDs24gc29jaWFsLCBjb21vIGxhIGNvdGl6YWNpw7NuIGEgcGVuc2nDs24uPC9kaXY+DQoNCiMjIDMuNSBEaXN0cmlidWNpw7NuIGRlbCBlbXBsZW8NCg0KYGBge3IgaGlzdG9ncmFtYSBkZSB0aXBvIGVtcGxlbywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmJhc2VfbXVlc3RyYSAlPiUNCiAgZmlsdGVyKCFpcy5uYShUaXBvX2RlX2VtcGxlbyksIFRpcG9fZGVfZW1wbGVvICVpbiUgMTo3KSAlPiUNCiAgbXV0YXRlKEVtcGxlbyA9IGNhc2Vfd2hlbigNCiAgICBUaXBvX2RlX2VtcGxlbyA9PSAxIH4gIlRyYWJhamFkb3IiLA0KICAgIFRpcG9fZGVfZW1wbGVvID09IDIgfiAiVHJhYmFqYWRvciBnb2JpZXJubyIsDQogICAgVGlwb19kZV9lbXBsZW8gPT0gMyB+ICJFbXBsZWFkbyBkb21lc3RpY28iLA0KICAgIFRpcG9fZGVfZW1wbGVvID09IDQgfiAiVHJhYmFqYWRvciBmYW1pbGlhciIsDQogICAgVGlwb19kZV9lbXBsZW8gPT0gNSB+ICJUcmFiYWphZG9yIGN1ZW50YSBwcm9waWEiLA0KICAgIFRpcG9fZGVfZW1wbGVvID09IDYgfiAiUGF0cm9uL2VtcGxlYWRvciIsDQogICAgVGlwb19kZV9lbXBsZW8gPT0gNyB+ICJUcmFiYWphZG9yIHNpbiByZW11bmVyYWNpb24iDQogICkpICU+JQ0KICBtdXRhdGUoRW1wbGVvID0gZmFjdG9yKEVtcGxlbywgbGV2ZWxzID0gYygNCiAgICAiVHJhYmFqYWRvciIsDQogICAgIlRyYWJhamFkb3IgZ29iaWVybm8iLA0KICAgICJFbXBsZWFkbyBkb21lc3RpY28iLA0KICAgICJUcmFiYWphZG9yIGZhbWlsaWFyIiwNCiAgICAiVHJhYmFqYWRvciBjdWVudGEgcHJvcGlhIiwNCiAgICAiUGF0cm9uL2VtcGxlYWRvciIsDQogICAgIlRyYWJhamFkb3Igc2luIHJlbXVuZXJhY2lvbiINCiAgKSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBFbXBsZW8sIGZpbGwgPSBFbXBsZW8pKSArDQogIGdlb21fYmFyKHdpZHRoID0gMC43KSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChjb3VudCkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMiwgY29sb3IgPSAiIzRBM0Y1NSIsIGZvbnRmYWNlID0gImJvbGQiLCBzaXplID0gMykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKA0KICAgICJUcmFiYWphZG9yIiA9ICIjN0M2QTlDIiwNCiAgICAiVHJhYmFqYWRvciBnb2JpZXJubyIgPSAiIzdDNkE5QyIsDQogICAgIkVtcGxlYWRvIGRvbWVzdGljbyIgPSAiI0Q2Q0RFQSIsDQogICAgIlRyYWJhamFkb3IgZmFtaWxpYXIiID0gIiNENkNERUEiLA0KICAgICJUcmFiYWphZG9yIGN1ZW50YSBwcm9waWEiID0gIiNENkNERUEiLA0KICAgICJQYXRyb24vZW1wbGVhZG9yIiA9ICIjNEEzRjU1IiwNCiAgICAiVHJhYmFqYWRvciBzaW4gcmVtdW5lcmFjaW9uIiA9ICIjRDZDREVBIg0KICApKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVGlwbyBkZSBFbXBsZW8iLA0KICAgIHN1YnRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGEgcG9ibGFjacOzbiBwb3IgdGlwbyBkZSBvY3VwYWNpw7NuIGxhYm9yYWwiLA0KICAgIHggPSAiIiwgDQogICAgeSA9ICJDYW50aWRhZCBkZSBQZXJzb25hcyIsDQogICAgY2FwdGlvbiA9ICJGdWVudGU6IERBTkUgLSBHRUlIIDIwMjUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1IiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBzaXplID0gMTEpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjN0M2QTlDIiwgaGp1c3QgPSAwLCBzaXplID0gOCksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gOSksDQogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjRDZDREVBIiwgbGluZXR5cGUgPSAiZGFzaGVkIikNCiAgKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5TZSBvYnNlcnZhIHF1ZSBsYSBtYXlvciBwYXJ0ZSBkZSBsYSBwb2JsYWNpw7NuIG9jdXBhZGEgZGUgbGEgbXVlc3RyYSBjb3JyZXNwb25kZSBhIHRyYWJhamFkb3JlcyBwYXJ0aWN1bGFyZXMgYWwgcmVkZWRvciBkZSBjYXNpIGVsIDgwJSBkZSBwZXJzb25hcywgc2llbmRvIGxhIGNhdGVnb3LDrWEgbGFib3JhbCBjb24gbWF5b3IgcGFydGljaXBhY2nDs24uIEVuIG1lbm9yIHByb3BvcmNpw7NuIHNlIGVuY3VlbnRyYW4gbG9zIGVtcGxlYWRvcyBkb23DqXN0aWNvcyB5IHRyYWJhamFkb3JlcyBzaW4gcmVtdW5lcmFjacOzbi4NCioqRXN0b3MgcmVzdWx0YWRvcyBldmlkZW5jaWFuIHVuYSBtYXlvciBwcmVzZW5jaWEgZGUgdHJhYmFqYWRvcmVzIHZpbmN1bGFkb3MgYSBvY3VwYWNpb25lcyBjb24gbWF5b3IgcG9zaWJpbGlkYWQgZGUgYWNjZXNvIGEgbWVjYW5pc21vcyBkZSBwcm90ZWNjacOzbiBzb2NpYWwgeSBhZmlsaWFjacOzbiBhbCBzaXN0ZW1hIGRlIHNlZ3VyaWRhZCBzb2NpYWwqKi4gbGFzIGRpZmVyZW5jaWFzIGVuIGxvcyB0aXBvcyBkZSBvY3VwYWNpw7NuIHB1ZWRlbiBpbmZsdWlyIGVuIGxhcyBjb25kaWNpb25lcyBsYWJvcmFsZXMgeSBlbiBsYSBwcm9iYWJpbGlkYWQgZGUgY290aXphY2nDs24gYWwgc2lzdGVtYSBwZW5zaW9uYWwgKERBTkUsIDIwMjUpLjwvZGl2Pg0KDQojIyAzLjYgRGlzdHJpYnVjacOzbiBkZSBsb3MgaW5ncmVzb3MgDQoNCmBgYHtyIGdyYWZpY28gZGUgZGVuc2lkYWQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwIDwtIGJhc2VfbXVlc3RyYSAlPiUNCiAgZmlsdGVyKEluZ3Jlc29zX3JlY2liaWRvcyA+IDAsIEluZ3Jlc29zX3JlY2liaWRvcyA8IDE1MDAwMDAwKSAlPiUNCiAgbXV0YXRlKENvdGl6YSA9IGlmZWxzZShDb3RpemFuZG9fUGVuc2lvbiA9PSAxLCAiU2kgY290aXphIiwgIk5vIGNvdGl6YSIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gSW5ncmVzb3NfcmVjaWJpZG9zLCBmaWxsID0gQ290aXphKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiU2kgY290aXphIiA9ICIjN0M2QTlDIiwgIk5vIGNvdGl6YSIgPSAiI0Q2Q0RFQSIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX2NvbW1hKGJpZy5tYXJrID0gIi4iKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDEwMDAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxMDAwMDAwMCwgMjAwMDAwMCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidWNpb24gZGUgaW5ncmVzb3Mgc2VndW4gY290aXphY2lvbiBhIHBlbnNpb24iLA0KICAgIHggPSAiSW5ncmVzb3MgKFBlc29zIENvbG9tYmlhbm9zKSIsDQogICAgeSA9ICJEZW5zaWRhZCIsDQogICAgY2FwdGlvbiA9ICJGdWVudGU6IERBTkUgLSBHRUlIIDIwMjUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzRBM0Y1NSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBoanVzdCA9IDEsIHNpemUgPSA4LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KZ2dwbG90bHkocCwgdG9vbHRpcCA9IGMoIngiLCAieSIsICJmaWxsIikpICU+JQ0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lDQogIGxheW91dCgNCiAgICBob3ZlcmxhYmVsID0gbGlzdChiZ2NvbG9yID0gIiM0QTNGNTUiLCBmb250ID0gbGlzdChjb2xvciA9ICJ3aGl0ZSIpKSwNCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIiIpKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICB0ZXh0ID0gIkZ1ZW50ZTogREFORSAtIEdFSUggMjAyNSIsDQogICAgICB4ID0gMSwgeSA9IDAsIHhyZWYgPSAicGFwZXIiLCB5cmVmID0gInBhcGVyIiwNCiAgICAgIHhhbmNob3IgPSAicmlnaHQiLCB5YW5jaG9yID0gImJvdHRvbSIsDQogICAgICBzaG93YXJyb3cgPSBGQUxTRSwgZm9udCA9IGxpc3Qoc2l6ZSA9IDEwLCBjb2xvciA9ICIjN0M2QTlDIikpKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Mb3MgaW5ncmVzb3MgZGUgbGEgcG9ibGFjacOzbiBhbmFsaXphZGEgcHJlc2VudGFuIHVuYSBkaXN0cmlidWNpw7NuIGRlc2lndWFsLCBkb25kZSAqKmxhIG1heW9yw61hIGRlIGxhcyBwZXJzb25hcyBzZSBjb25jZW50cmEgZW4gbml2ZWxlcyBiYWpvcyB5IG1lZGlvcywgcHJpbmNpcGFsbWVudGUgaW5mZXJpb3JlcyBhIGxvcyAzIG1pbGxvbmVzIGRlIHBlc29zIGNvbG9tYmlhbm9zKiosIG1pZW50cmFzIHF1ZSBzb2xvIHVuYSBwZXF1ZcOxYSBwcm9wb3JjacOzbiBhbGNhbnphIGluZ3Jlc29zIGFsdG9zLiBFc3RvIHJlZmxlamEgbGEgcHJlc2VuY2lhIGRlIHVuYSBncmFuIGNhbnRpZGFkIGRlIHRyYWJhamFkb3JlcyBjb24gaW5ncmVzb3MgbGltaXRhZG9zIGRlbnRybyBkZWwgbWVyY2FkbyBsYWJvcmFsIGNvbG9tYmlhbm8sIGRlIGlndWFsIG1hbmVyYSBzZSBvYnNlcnZhIHF1ZSBsYXMgcGVyc29uYXMgcXVlIGNvdGl6YW4gYWwgc2lzdGVtYSBwZW5zaW9uYWwgdGllbmRlbiBhIHViaWNhcnNlIGVuIG5pdmVsZXMgZGUgaW5ncmVzbyBtw6FzIGFsdG9zLCBtaWVudHJhcyBxdWUgcXVpZW5lcyBubyBjb3RpemFuIHNlIGNvbmNlbnRyYW4gcHJpbmNpcGFsbWVudGUgZW4gaW5ncmVzb3MgYmFqb3MsIGV2aWRlbmNpYW5kbyB1bmEgcmVsYWNpw7NuIGVudHJlIGluZ3Jlc29zIHkgZm9ybWFsaWRhZCBsYWJvcmFsLCB5YSBxdWUgKipsb3MgdHJhYmFqYWRvcmVzIGNvbiBtYXlvcmVzIGluZ3Jlc29zIHN1ZWxlbiB0ZW5lciBtYXlvciBhY2Nlc28gYSBlbXBsZW9zIGVzdGFibGVzIHkgbWVjYW5pc21vcyBkZSBwcm90ZWNjacOzbiBzb2NpYWwqKiAoREFORSwgMjAyNSkuPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Qb3IgZWxsbywgZWwgaW5ncmVzbyBzZSBjb252aWVydGUgZW4gdW5hIHZhcmlhYmxlIHJlbGV2YW50ZSBkZW50cm8gZGVsIG1vZGVsbyBwcmVkaWN0aXZvLCB5YSBxdWUgcGVybWl0ZSBkaWZlcmVuY2lhciBjb24gbWF5b3IgcHJlY2lzacOzbiBhIGxvcyBpbmRpdmlkdW9zIHNlZ8O6biBzdSBwcm9iYWJpbGlkYWQgZGUgY290aXphciBvIG5vIGFsIHNpc3RlbWEgcGVuc2lvbmFsLjwvZGl2Pg0KDQpgYGB7ciBJbmdyZXNvcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1lZGlhbmFfaW5ncmVzb3MgPC0gbWVkaWFuKGJhc2VfbXVlc3RyYSRJbmdyZXNvc19yZWNpYmlkb3NbDQogIGJhc2VfbXVlc3RyYSRJbmdyZXNvc19yZWNpYmlkb3MgPiAwICYgDQogIGJhc2VfbXVlc3RyYSRJbmdyZXNvc19yZWNpYmlkb3MgPCAxMDAwMDAwMF0sIG5hLnJtID0gVFJVRSkNCg0KcF9pbmdyZXNvcyA8LSBiYXNlX211ZXN0cmEgJT4lDQogIGZpbHRlcihJbmdyZXNvc19yZWNpYmlkb3MgPiAwLCBJbmdyZXNvc19yZWNpYmlkb3MgPCAxMDAwMDAwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IEluZ3Jlc29zX3JlY2liaWRvcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDQwLCBmaWxsID0gIiM3QzZBOUMiLCBjb2xvciA9ICIjNEEzRjU1IiwgYWxwaGEgPSAwLjcpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuYV9pbmdyZXNvcywgDQogICAgICAgICAgICAgY29sb3IgPSAiIzJDMUYzRSIsIGxpbmV0eXBlID0gImRhc2hlZCIsIGxpbmV3aWR0aCA9IDEpICsNCiAgYW5ub3RhdGUoInRleHQiLCANCiAgICAgICAgICAgeCA9IG1lZGlhbmFfaW5ncmVzb3MgKyA0MDAwMDAsIA0KICAgICAgICAgICB5ID0gSW5mLCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIk1lZGlhbmE6ICQiLCBmb3JtYXQobWVkaWFuYV9pbmdyZXNvcywgYmlnLm1hcmsgPSAiLiIpKSwNCiAgICAgICAgICAgY29sb3IgPSAiIzJDMUYzRSIsIGZvbnRmYWNlID0gImJvbGQiLCBzaXplID0gMy41LCB2anVzdCA9IDIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2NvbW1hKGJpZy5tYXJrID0gIi4iKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfY29tbWEoYmlnLm1hcmsgPSAiLiIpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBJbmdyZXNvcyIsDQogICAgc3VidGl0bGUgPSAiUG9ibGFjacOzbiBvY3VwYWRhIGNvbiBpbmdyZXNvcyByZXBvcnRhZG9zIiwNCiAgICB4ID0gIlBlc29zIENvbG9tYmlhbm9zIiwgDQogICAgeSA9ICJGcmVjdWVuY2lhIiwNCiAgICBjYXB0aW9uID0gIkZ1ZW50ZTogREFORSAtIEdFSUggMjAyNSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzRBM0Y1NSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjN0M2QTlDIiwgc2l6ZSA9IDExKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzdDNkE5QyIsIGhqdXN0ID0gMCwgc2l6ZSA9IDgpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiI0Q2Q0RFQSIsIGxpbmV0eXBlID0gImRhc2hlZCIpKQ0KZ2dwbG90bHkocF9pbmdyZXNvcykgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUNCiAgbGF5b3V0KA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHRleHQgPSAiRnVlbnRlOiBEQU5FIC0gR3JhbiBFbmN1ZXN0YSBJbnRlZ3JhZGEgZGUgSG9nYXJlcyAoR0VJSCkgMjAyNSIsDQogICAgICAgIHggPSAwLCB5ID0gLTAuMTIsDQogICAgICAgIHhyZWYgPSAicGFwZXIiLCB5cmVmID0gInBhcGVyIiwNCiAgICAgICAgc2hvd2Fycm93ID0gRkFMU0UsDQogICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSA5LCBjb2xvciA9ICIjN0M2QTlDIiksDQogICAgICAgIHhhbmNob3IgPSAibGVmdCIpKSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+bGEgZGlzdHJpYnVjacOzbiBkZSBpbmdyZXNvcyByZXZlbGEgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBlbmN1ZXN0YWRvcyBzZSBjb25jZW50cmEgZW4gZWwgcmFuZ28gZGUgdW4gbWlsbMOzbiBxdWluaWVudG9zIG1pbCBwZXNvcywgcmVwcmVzZW50YW5kbyBjZXJjYSBkZWwgMzYlIGRlIGxhIHBvYmxhY2nDs24gYW5hbGl6YWRhIGV2aWRlbmNpYW5kbyBxdWUgZ3JhbiBwYXJ0ZSBkZSBsb3MgY29sb21iaWFub3Mgdml2ZSBjb24gaW5ncmVzb3MganVzdG9zIHBhcmEgY3VicmlyIHN1cyBuZWNlc2lkYWRlcyBiw6FzaWNhcywgcmVmbGVqYW5kbyB1bmEgbWFyY2FkYSBhc2ltZXRyw61hIGhhY2lhIGxhIGRlcmVjaGEgZW4gbGEgcXVlIG11eSBwb2NhcyBwZXJzb25hcyBsb2dyYW4gc3VwZXJhciBsb3MgdHJlcyBtaWxsb25lcyBkZSBwZXNvcy4gRXN0YSBkaXN0cmlidWNpw7NuIG11ZXN0cmEgdW5hIHByb2Z1bmRhIGRlc2lndWFsZGFkIGVjb27Ds21pY2EgZGVudHJvIGRlbCBtZXJjYWRvIGxhYm9yYWwgY29sb21iaWFubywgZGUgaWd1YWwgbWFuZXJhIHNlIG9ic2VydmEgcXVlIGxhcyBwZXJzb25hcyBxdWUgY290aXphbiBhbCBzaXN0ZW1hIHBlbnNpb25hbCB0aWVuZGVuIGEgdWJpY2Fyc2UgZW4gbml2ZWxlcyBkZSBpbmdyZXNvIG3DoXMgYWx0b3MsZG9uZGUgbXV5IHBvY2FzIHBlcnNvbmFzIHN1cGVyYW4gbG9zIHRyZXMgbWlsbG9uZXMgZGUgcGVzb3MsIHJlZmxlamFuZG8gdW5hIHByb2Z1bmRhIGRlc2lndWFsZGFkIGVjb27Ds21pY2EuPC9kaXY+DQoNCiMjIDMuNyBEaXN0cmlidWNpw7NuIGRlIGxhIHpvbmENCmBgYHtyIHpvbmEgcnVyYWwgbyB1cmJhbmEsZmlnLmhlaWdodD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZV9tdWVzdHJhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFpvbmEpLCBab25hICVpbiUgYygxLCAyKSkgJT4lDQogIG11dGF0ZShab25hX3RleHRvID0gaWZlbHNlKFpvbmEgPT0gMSwgIlVyYmFubyIsICJSdXJhbCIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gWm9uYV90ZXh0bywgZmlsbCA9IFpvbmFfdGV4dG8pKSArDQogIGdlb21fYmFyKHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChjb3VudCkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiIzRBM0Y1NSIsIGZvbnRmYWNlID0gImJvbGQiLCBzaXplID0gNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJVcmJhbm8iID0gIiM3QzZBOUMiLCAiUnVyYWwiID0gIiNENkNERUEiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1Y2lvbiBwb3IgWm9uYSIsDQogICAgc3VidGl0bGUgPSAiUG9ibGFjaW9uIG9jdXBhZGEgc2VndW4gem9uYSBnZW9ncmFmaWNhIChVcmJhbmEvUnVyYWwpIiwNCiAgICB4ID0gIiIsIA0KICAgIHkgPSAiQ2FudGlkYWQgZGUgUGVyc29uYXMiLA0KICAgIGNhcHRpb24gPSAiRnVlbnRlOiBEQU5FIC0gR0VJSCAyMDI1Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzRBM0Y1NSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjN0M2QTlDIiwgc2l6ZSA9IDExKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzdDNkE5QyIsIGhqdXN0ID0gMCwgc2l6ZSA9IDgpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiI0Q2Q0RFQSIsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpDQogICkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+bGEgcG9ibGFjacOzbiBvY3VwYWRhIHNlIGNvbmNlbnRyYSBtYXlvcml0YXJpYW1lbnRlIGVuIGxhIHpvbmEgdXJiYW5hIGNvbiA5LDAzOCBwZXJzb25hcywgZnJlbnRlIGEgc29sbyA5NjIgZW4gbGEgem9uYSBydXJhbCwgbG8gcXVlIHJlcHJlc2VudGEgcXVlIGFwcm94aW1hZGFtZW50ZSBlbCA5MC4zOCUgZGUgbG9zIG9jdXBhZG9zIHJlc2lkZSBlbiDDoXJlYXMgdXJiYW5hcy4gRXN0YSBtYXJjYWRhIGJyZWNoYSBldmlkZW5jaWFkYSAoREFORSwgMjAyNSkgcmVmbGVqYSBsYSBlc3RydWN0dXJhIHVyYmFuaXphZGEgZGVsIG1lcmNhZG8gbGFib3JhbCBjb2xvbWJpYW5vIHkgdGllbmUgaW1wb3J0YW50ZXMgaW1wbGljYWNpb25lcyBwYXJhIGVsIGRpc2XDsW8gZGUgcG9sw610aWNhcyBkaWZlcmVuY2lhZGFzIGRlIGVtcGxlbyB5IHByb3RlY2Npw7NuIHNvY2lhbCBlbnRyZSBlbCBjYW1wbyB5IGxhIGNpdWRhZC48L2Rpdj4NCg0KIyA0IFJlc3VsdGFkb3MgbW9kZWxvcyBwcmVkaWN0aXZvcw0KIyMgNC4xIE1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgDQpgYGB7ciBjb3RpemEgZiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmJhc2VfbXVlc3RyYSRjb3RpemFfZiA8LSBmYWN0b3IoYmFzZV9tdWVzdHJhJENvdGl6YW5kb19QZW5zaW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJObyIsICJTaSIpKQ0KYGBgDQoNCmBgYHtyIG1NT0RFTE8sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXQuc2VlZCgyOCkNCmlkeCA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKHkgPSBiYXNlX211ZXN0cmEkY290aXphX2YsIHAgPSAwLjc1LCBsaXN0ID0gRkFMU0UpDQp0cmFpbiA8LSBiYXNlX211ZXN0cmFbaWR4LCBdDQp0ZXN0ICA8LSBiYXNlX211ZXN0cmFbLWlkeCwgXQ0KYGBgDQoNCmBgYHtyIG1vZGVudHJlbm8sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpmaXRfbG9naXQgPC0gZ2xtKGNvdGl6YV9mIH4gRWRhZCArIFNleG8gKyBab25hICsgTml2ZWxfZWR1Y2F0aXZvICsgSW5ncmVzb3NfcmVjaWJpZG9zLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRyYWluLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0KDQp0aWR5KGZpdF9sb2dpdCkgJT4lDQogIG11dGF0ZSgNCiAgICBzaWduaWYgPSBjYXNlX3doZW4oDQogICAgICBwLnZhbHVlIDwgMC4wMDEgfiAiKioqIiwNCiAgICAgIHAudmFsdWUgPCAwLjAxIH4gIioqIiwNCiAgICAgIHAudmFsdWUgPCAwLjA1IH4gIioiLA0KICAgICAgVFJVRSB+ICIiDQogICAgKSwNCiAgICBvZGRzX3JhdGlvID0gZXhwKGVzdGltYXRlKSwNCiAgICBvZGRzX3JhdGlvID0gcm91bmQob2Rkc19yYXRpbywgMykNCiAgKSAlPiUNCiAgc2VsZWN0KHRlcm0sIGVzdGltYXRlLCBvZGRzX3JhdGlvLCBwLnZhbHVlLCBzaWduaWYpICU+JQ0KICBndCgpICU+JQ0KICB0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gbWQoIioqUmVncmVzaW9uIExvZ2lzdGljYSAtIENvZWZpY2llbnRlcyoqIiksDQogICAgc3VidGl0bGUgPSBtZCgiVmFyaWFibGUgcmVzcHVlc3RhOiBjb3RpemFfZiAoU2kvTm8pIikNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICB0ZXJtID0gIlZhcmlhYmxlIiwNCiAgICBlc3RpbWF0ZSA9ICJDb2VmaWNpZW50ZSIsDQogICAgb2Rkc19yYXRpbyA9ICJPZGRzIFJhdGlvIiwNCiAgICBwLnZhbHVlID0gInAtdmFsb3IiLA0KICAgIHNpZ25pZiA9ICJTaWcuIg0KICApICU+JQ0KICBmbXRfbnVtYmVyKGRlY2ltYWxzID0gNCkgJT4lDQogIHRhYl9zdHlsZSgNCiAgICBzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gIiM0QTNGNTUiKSwgY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiwgd2VpZ2h0ID0gImJvbGQiKSksDQogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhldmVyeXRoaW5nKCkpDQogICkgJT4lDQogIGRhdGFfY29sb3IoDQogICAgY29sdW1ucyA9IHAudmFsdWUsDQogICAgY29sb3JzID0gc2NhbGVzOjpjb2xfbnVtZXJpYygNCiAgICAgIHBhbGV0dGUgPSBjKCIjRDZDREVBIiwgIiM3QzZBOUMiLCAiIzRBM0Y1NSIpLA0KICAgICAgZG9tYWluID0gYygwLCAwLjA1KQ0KICAgICkNCiAgKSAlPiUNCiAgdGFiX3NvdXJjZV9ub3RlKCIqKiogcCA8IDAuMDAxOyAqKiBwIDwgMC4wMTsgKiBwIDwgMC4wNSIpICU+JQ0KICB0YWJfb3B0aW9ucyh0YWJsZS53aWR0aCA9IHBjdCgxMDApKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Mb3MgcmVzdWx0YWRvcyBkZSBsYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgbXVlc3RyYW4gcXVlIHZhcmlhYmxlcyBjb21vIGVsIG5pdmVsIGVkdWNhdGl2bywgbGEgem9uYSBkZSByZXNpZGVuY2lhIHkgbG9zIGluZ3Jlc29zIHJlY2liaWRvcyBwcmVzZW50YW4gdW5hIHJlbGFjacOzbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGNvbiBsYSBwcm9iYWJpbGlkYWQgZGUgcGVydGVuZWNlciBhbCBlbXBsZW8gZm9ybWFsLiBFbiBjb250cmFzdGUsIGxhIHZhcmlhYmxlIGVkYWQgbm8gcHJlc2VudMOzIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIGRlbnRybyBkZWwgbW9kZWxvLCBsbyBxdWUgc3VnaWVyZSB1bmEgbWVub3IgY2FwYWNpZGFkIGV4cGxpY2F0aXZhIGZyZW50ZSBhIGxhcyBkZW3DoXMgdmFyaWFibGVzIGFuYWxpemFkYXMuPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCBuaXZlbCBlZHVjYXRpdm8gZnVlIHVuYSBkZSBsYXMgdmFyaWFibGVzIG3DoXMgcmVsZXZhbnRlcyBkZW50cm8gZGVsIG1vZGVsbywgcHJlc2VudGFuZG8gdW4gb2RkcyByYXRpbyBkZSAxLjIxOSwgbG8gcXVlIGluZGljYSBxdWUgKiphIG1lZGlkYSBlbCBuaXZlbCBlZHVjYXRpdm8gZGUgbGEgcGVyc29uYSBhdW1lbnRhIGVuIHVuYSB1bmlkYWQsIGF1bWVudGEgZW4gdW4gMjElIGxhIHByb2JhYmlsaWRhZCBkZSBwZXJ0ZW5lY2VyIGFsIGVtcGxlbyBmb3JtYWwqKi4gQSBzdSB2ZXosIGVzdGUgcmVzdWx0YWRvIHJlZmxlamEgcXVlIGxhcyBwZXJzb25hcyBjb24gbWF5b3JlcyBuaXZlbGVzIGVkdWNhdGl2b3MgdGllbmVuIG1heW9yZXMgb3BvcnR1bmlkYWRlcyBkZSBjb250YXIgY29uIGVtcGxlb3MgZXN0YWJsZXMgeSBhY2Nlc28gYSBtZWNhbmlzbW9zIGRlIHByb3RlY2Npw7NuIHNvY2lhbCBzaWVuZG8gZXN0ZSBjb21wb3J0YW1pZW50byB1bmEgcmVwcmVzZW50YWNpw7NuIGRlIGxhIHJlYWxpZGFkIGZyZWN1ZW50ZSBkZWwgbWVyY2FkbyBsYWJvcmFsIGNvbG9tYmlhbm8sIGRvbmRlICoqbGEgZWR1Y2FjacOzbiBzdWVsZSBzZXIgdW4gZmFjdG9yIGRldGVybWluYW50ZSBwYXJhIGFjY2VkZXIgYSBtZWpvcmVzIGNvbmRpY2lvbmVzIGxhYm9yYWxlcyoqLiBMbyBhbnRlcmlvciBjb2luY2lkZSBjb24gbG8gcGxhbnRlYWRvIHBvciBKYW1lcyBldCBhbC4gKDIwMjEpLCBsYXMgdmFyaWFibGVzIGNvbiBtYXlvciBjYXBhY2lkYWQgcHJlZGljdGl2YSBwZXJtaXRlbiBpZGVudGlmaWNhciBwYXRyb25lcyByZWxldmFudGVzIGFzb2NpYWRvcyBhbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBvYmpldGl2by48L2Rpdj4NCg0KYGBge3IgbW9kZWxvcHJlZGNjLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcF9oYXQgPC0gcHJlZGljdChmaXRfbG9naXQsIG5ld2RhdGEgPSB0ZXN0LCB0eXBlID0gInJlc3BvbnNlIikNCnByZWRfY2xhc2UgPC0gZmFjdG9yKGlmZWxzZShwX2hhdCA+PSAwLjUsICJTaSIsICJObyIpLCBsZXZlbHMgPSBjKCJTaSIsICJObyIpKQ0KDQpgYGANCg0KYGBge3IgbW9kZWxvb3B0aW1vLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kcm9jX28gPC0gcm9jKHJlc3BvbnNlID0gdGVzdCRjb3RpemFfZiwgcHJlZGljdG9yID0gcF9oYXQsIGxldmVscyA9IGMoIk5vIiwgIlNpIikpDQp1bWJyYWwgPC0gYXMubnVtZXJpYyhjb29yZHMocm9jX28sIHggPSAiYmVzdCIsIGJlc3QubWV0aG9kID0gInlvdWRlbiIsIHJldCA9ICJ0aHJlc2hvbGQiKSkNCg0KcHJlZF9jbGFzZV9vcHQgPC0gZmFjdG9yKGlmZWxzZShwX2hhdCA+PSB1bWJyYWwsICJTaSIsICJObyIpLCBsZXZlbHMgPSBjKCJTaSIsICJObyIpKQ0KY21fb3B0IDwtIGNvbmZ1c2lvbk1hdHJpeChwcmVkX2NsYXNlX29wdCwgdGVzdCRjb3RpemFfZiwgcG9zaXRpdmUgPSAiU2kiKQ0KDQpkYXRhLmZyYW1lKA0KICBNZXRyaWNhID0gYygiQWNjdXJhY3kiLCAiU2Vuc2liaWxpZGFkIiwgIkVzcGVjaWZpY2lkYWQiLCANCiAgICAgICAgICAgICAgIlZhbG9yIFByZWRpY3Rpdm8gUG9zaXRpdm8iLCAiVmFsb3IgUHJlZGljdGl2byBOZWdhdGl2byIsDQogICAgICAgICAgICAgICJBY2llcnRvcyIsICJUb3RhbCIsICJFcnJvciIpLA0KICBWYWxvciA9IGMoDQogICAgcGFzdGUwKHJvdW5kKGNtX29wdCRvdmVyYWxsWyJBY2N1cmFjeSJdICogMTAwLCAyKSwgIiUiKSwNCiAgICBwYXN0ZTAocm91bmQoY21fb3B0JGJ5Q2xhc3NbIlNlbnNpdGl2aXR5Il0gKiAxMDAsIDIpLCAiJSIpLA0KICAgIHBhc3RlMChyb3VuZChjbV9vcHQkYnlDbGFzc1siU3BlY2lmaWNpdHkiXSAqIDEwMCwgMiksICIlIiksDQogICAgcGFzdGUwKHJvdW5kKGNtX29wdCRieUNsYXNzWyJQb3MgUHJlZCBWYWx1ZSJdICogMTAwLCAyKSwgIiUiKSwNCiAgICBwYXN0ZTAocm91bmQoY21fb3B0JGJ5Q2xhc3NbIk5lZyBQcmVkIFZhbHVlIl0gKiAxMDAsIDIpLCAiJSIpLA0KICAgIGZvcm1hdChzdW0oZGlhZyhjbV9vcHQkdGFibGUpKSwgYmlnLm1hcmsgPSAiLiIpLA0KICAgIGZvcm1hdChzdW0oY21fb3B0JHRhYmxlKSwgYmlnLm1hcmsgPSAiLiIpLA0KICAgIHBhc3RlMChyb3VuZCgoMSAtIGNtX29wdCRvdmVyYWxsWyJBY2N1cmFjeSJdKSAqIDEwMCwgMiksICIlIikNCiAgKQ0KKSAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKk1ldHJpY2FzIGRlIERlc2VtcGVubyAtIFJlZ3Jlc2lvbiBMb2dpc3RpY2EqKiIpLA0KICAgIHN1YnRpdGxlID0gbWQocGFzdGUoIlVtYnJhbCBPcHRpbW8gPSIsIHJvdW5kKHVtYnJhbCwgMykpKQ0KICApICU+JQ0KICBjb2xzX2xhYmVsKA0KICAgIE1ldHJpY2EgPSAiSW5kaWNhZG9yIiwNCiAgICBWYWxvciA9ICJSZXN1bHRhZG8iDQogICkgJT4lDQogIHRhYl9zdHlsZSgNCiAgICBzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gIiM0QTNGNTUiKSwgY2VsbF90ZXh0KGNvbG9yID0gIndoaXRlIiwgd2VpZ2h0ID0gImJvbGQiKSksDQogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhldmVyeXRoaW5nKCkpDQogICkgJT4lDQogIG9wdF9yb3dfc3RyaXBpbmcoKSAlPiUNCiAgdGFiX29wdGlvbnModGFibGUud2lkdGggPSBwY3QoNzApKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCBtb2RlbG8gZnVlIGVzdGltYWRvIGEgcGFydGlyIGRlIHVuYSBtdWVzdHJhIGRlIDEwLjAwMCBvYnNlcnZhY2lvbmVzLCB1dGlsaXphbmRvIHVuYSBwYXJ0aWNpw7NuIGRlbCA3NSUgcGFyYSBlbnRyZW5hbWllbnRvIHkgMjUlIHBhcmEgcHJ1ZWJhLCBwZXJtaXRpZW5kbyBldmFsdWFyIGVsIGRlc2VtcGXDsW8gcHJlZGljdGl2byBzb2JyZSBkYXRvcyBubyB1dGlsaXphZG9zIGR1cmFudGUgZWwgcHJvY2VzbyBkZSBlbnRyZW5hbWllbnRvDQpMYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgcHJlc2VudMOzIHVuYSBleGFjdGl0dWQgZGVsIDgyLjk5JSwgbG8gcXVlIGV2aWRlbmNpYSB1bmEgZ3JhbiBjYXBhY2lkYWQgcGFyYSBjbGFzaWZpY2FyIGNvcnJlY3RhbWVudGUgYSBsYXMgcGVyc29uYXMgcGVydGVuZWNpZW50ZXMgYWwgZW1wbGVvIGZvcm1hbCBlIGluZm9ybWFsLCBlbCBtb2RlbG8gcmVnaXN0csOzIHVuIGVycm9yIGRlbCAxNy4xJSwgaW5kaWNhbmRvIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBjbGFzaWZpY2FjaW9uZXMgaW5jb3JyZWN0YXMgZnVlIHJlbGF0aXZhbWVudGUgYmFqYSBmcmVudGUgYWwgdG90YWwgZGUgb2JzZXJ2YWNpb25lcyBhbmFsaXphZGFzLCByZWZsZWphbmRvIHVuIGRlc2VtcGXDsW8gcHJlZGljdGl2byBhZGVjdWFkbywgZGUgaWd1YWwgbWFuZXJhIGxhIHNlbnNpYmlsaWRhZCBhbGNhbnrDsyB1biA5MC43NyUsIGV2aWRlbmNpYW5kbyBxdWUgKiplbCBtb2RlbG8gaWRlbnRpZmljYSBjb3JyZWN0YW1lbnRlIGEgZ3JhbiBwYXJ0ZSBkZSBsYXMgcGVyc29uYXMgdmluY3VsYWRhcyBhbCBlbXBsZW8gZm9ybWFsKiouPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5MYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgcHJlc2VudMOzIHVuYSBleGFjdGl0dWQgZGVsIDgyLjk5JSwgbG8gcXVlIGV2aWRlbmNpYSB1bmEgZ3JhbiBjYXBhY2lkYWQgcGFyYSBjbGFzaWZpY2FyIGNvcnJlY3RhbWVudGUgYSBsYXMgcGVyc29uYXMgcGVydGVuZWNpZW50ZXMgYWwgZW1wbGVvIGZvcm1hbCBlIGluZm9ybWFsIHkgcXVlIGEgY29tcGFyYWNpw7NuIGRlbCAxNy4xJSBkZSBlcnJvciBkb25kZSBjbGFzaWZpY8OzIG1hbCBzaWVuZG8gZXN0ZSBtdXkgYmFqbyAuIEFzaW1pc21vLCBsYSBzZW5zaWJpbGlkYWQgYWxjYW56w7MgdW4gOTAuNzclLCBldmlkZW5jaWFuZG8gcXVlICoqZWwgbW9kZWxvIGlkZW50aWZpY2EgYWRlY3VhZGFtZW50ZSBhIGdyYW4gcGFydGUgZGUgbGFzIHBlcnNvbmFzIHZpbmN1bGFkYXMgYWwgZW1wbGVvIGZvcm1hbC4qKjwvZGl2Pg0KDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Qb3Igb3RybyBsYWRvLCBsYSBlc3BlY2lmaWNpZGFkIGZ1ZSBtZW5vciBlbiBjb21wYXJhY2nDs24gY29uIGxhIHNlbnNpYmlsaWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIG1heW9yIGRpZmljdWx0YWQgcGFyYSBpZGVudGlmaWNhciBjb3JyZWN0YW1lbnRlIGFsZ3Vub3MgY2Fzb3MgYXNvY2lhZG9zIGEgaW5mb3JtYWxpZGFkIGxhYm9yYWwuIEVzdG8gcHVlZGUgcmVsYWNpb25hcnNlIGNvbiBsYSBjb21wbGVqaWRhZCBkZWwgbWVyY2FkbyBsYWJvcmFsIGNvbG9tYmlhbm8sIGRvbmRlIGV4aXN0ZW4gdHJhYmFqYWRvcmVzIGNvbiBjb25kaWNpb25lcyBsYWJvcmFsZXMgaW50ZXJtZWRpYXMgbyBpbmVzdGFibGVzIHF1ZSBoYWNlIHF1ZSBkaWZpY3VsdGUgZGlmZXJlbmNpYXIgY29tcGxldGFtZW50ZSBlbnRyZSBmb3JtYWxpZGFkIGUgaW5mb3JtYWxpZGFkLiBTZWfDum4gSmFtZXMgZXQgYWwuICgyMDIxKSwgZWwgZGVzZW1wZcOxbyBkZSAqKmxvcyBtb2RlbG9zIHByZWRpY3Rpdm9zIHB1ZWRlbiBwcmVzZW50YXIgbGltaXRhY2lvbmVzIGN1YW5kbyBleGlzdGVuIHBhdHJvbmVzIHNvY2lhbGVzIHkgZWNvbsOzbWljb3MgY29tcGxlam9zIGRlbnRybyBkZSBsb3MgZGF0b3MgYW5hbGl6YWRvcy4qKjwvZGl2Pg0KDQpgYGB7ciBtb3N0cmFyIGxvcyBmYWxzb3MsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQphcy5kYXRhLmZyYW1lKGNtX29wdCR0YWJsZSkgJT4lDQogIGd0KCkgJT4lDQogIHRhYl9oZWFkZXIoDQogICAgdGl0bGUgPSBtZCgiKipNYXRyaXogZGUgQ29uZnVzaW9uKioiKSwNCiAgICBzdWJ0aXRsZSA9IG1kKHBhc3RlKCJVbWJyYWwgT3B0aW1vID0iLCByb3VuZCh1bWJyYWwsIDMpKSkNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICBQcmVkaWN0aW9uID0gIlByZWRpY2Npb24iLA0KICAgIFJlZmVyZW5jZSA9ICJSZWFsaWRhZCIsDQogICAgRnJlcSA9ICJGcmVjdWVuY2lhIg0KICApICU+JQ0KICB0YWJfc3R5bGUoDQogICAgc3R5bGUgPSBsaXN0KGNlbGxfZmlsbChjb2xvciA9ICIjNEEzRjU1IiksIGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9ICJib2xkIikpLA0KICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHMoZXZlcnl0aGluZygpKQ0KICApICU+JQ0KICBkYXRhX2NvbG9yKA0KICAgIGNvbHVtbnMgPSAiRnJlcSIsDQogICAgY29sb3JzID0gc2NhbGVzOjpjb2xfbnVtZXJpYyhwYWxldHRlID0gYygiI0Q2Q0RFQSIsICIjN0M2QTlDIiwgIiM0QTNGNTUiKSwgZG9tYWluID0gTlVMTCkNCiAgKSAlPiUNCiAgdGFiX29wdGlvbnModGFibGUud2lkdGggPSBwY3QoNTApKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Mb3MgcmVzdWx0YWRvcyBtdWVzdHJhbiB1bmEgYWx0YSBjYW50aWRhZCBkZSBhY2llcnRvcyBlbiBsYSBjbGFzaWZpY2FjacOzbiBkZSBwZXJzb25hcyBwZXJ0ZW5lY2llbnRlcyBhbCBlbXBsZW8gZm9ybWFsLCBjb24gMS40NjYgY2Fzb3MgY29ycmVjdGFtZW50ZSBpZGVudGlmaWNhZG9zIHBvciBlbCBtb2RlbG8sIHNpZW5kbyBhbCByZWRlZG9yIGRlIGNhc2kgZWwgNTklIGRlIGxvcyBkYXRvcywgKipldmlkZW5jaWFuZG8gdW5hIGltcG9ydGFudGUgY2FwYWNpZGFkIHByZWRpY3RpdmEgcGFyYSByZWNvbm9jZXIgaW5kaXZpZHVvcyBxdWUgcHJlc2VudGFuIGNhcmFjdGVyw61zdGljYXMgYXNvY2lhZGFzIGEgY29uZGljaW9uZXMgZGUgZW1wbGVvIGZvcm1hbCoqLCBjb21vIG1heW9yZXMgbml2ZWxlcyBlZHVjYXRpdm9zLCBtZWpvcmVzIGluZ3Jlc29zIG8gYWNjZXNvIGEgbWVjYW5pc21vcyBkZSBwcm90ZWNjacOzbiBzb2NpYWwsIGFzaW1pc21vLCBlbCBtb2RlbG8gbG9ncsOzIGlkZW50aWZpY2FyIGFkZWN1YWRhbWVudGUgNjA4IGNhc29zIGNvcnJlc3BvbmRpZW50ZXMgYSBlbXBsZW8gaW5mb3JtYWwgZXN0aW1hZG8gZWwgMjQlIGRlIGxvcyBkYXRvcywgcGVybWl0aWVuZG8gZGlmZXJlbmNpYXIgdW5hIHBhcnRlIHNpZ25pZmljYXRpdmEgZGUgdHJhYmFqYWRvcmVzIGNvbiBtZW5vcmVzIG5pdmVsZXMgZGUgZm9ybWFsaWRhZCBsYWJvcmFsPC9kaXY+DQoNCg0KYGBge3IgY3VydmEgYXVjLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYXVjX3ZhbCA8LSBhdWMocm9jX28pDQoNCnJvY19kZiA8LSBkYXRhLmZyYW1lKA0KICBTZW5zaXRpdml0eSA9IHJvY19vJHNlbnNpdGl2aXRpZXMsDQogIFNwZWNpZmljaXR5ID0gcm9jX28kc3BlY2lmaWNpdGllcywNCiAgRlBSID0gMSAtIHJvY19vJHNwZWNpZmljaXRpZXMNCikNCg0KdW1icmFsX3BvaW50IDwtIGNvb3Jkcyhyb2NfbywgeCA9IHVtYnJhbCwgcmV0ID0gYygic2Vuc2l0aXZpdHkiLCAic3BlY2lmaWNpdHkiKSwgaW5wdXQgPSAidGhyZXNob2xkIikNCnVtYnJhbF9kZiA8LSBkYXRhLmZyYW1lKA0KICBGUFIgPSAxIC0gYXMubnVtZXJpYyh1bWJyYWxfcG9pbnRbInNwZWNpZmljaXR5Il0pLA0KICBTZW5zaXRpdml0eSA9IGFzLm51bWVyaWModW1icmFsX3BvaW50WyJzZW5zaXRpdml0eSJdKQ0KKQ0KDQpnZ3Bsb3Qocm9jX2RmLCBhZXMoeCA9IEZQUiwgeSA9IFNlbnNpdGl2aXR5KSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzdDNkE5QyIsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICIjRDZDREVBIiwgc2l6ZSA9IDAuOCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSB1bWJyYWxfZGYsIGFlcyh4ID0gRlBSLCB5ID0gU2Vuc2l0aXZpdHkpLCANCiAgICAgICAgICAgICBjb2xvciA9ICIjNEEzRjU1Iiwgc2l6ZSA9IDQsIHNoYXBlID0gMTYpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gdW1icmFsX2RmJEZQUiArIDAuMSwgeSA9IHVtYnJhbF9kZiRTZW5zaXRpdml0eSAtIDAuMDUsDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIlVtYnJhbCA9Iiwgcm91bmQodW1icmFsLCAzKSksIA0KICAgICAgICAgICBjb2xvciA9ICIjNEEzRjU1Iiwgc2l6ZSA9IDQsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ3VydmEgUk9DIC0gUmVncmVzaW9uIExvZ2lzdGljYSIsDQogICAgc3VidGl0bGUgPSBwYXN0ZSgiQVVDID0iLCByb3VuZChhdWNfdmFsLCAzKSksDQogICAgeCA9ICJUYXNhIGRlIEZhbHNvcyBQb3NpdGl2b3MgKDEgLSBFc3BlY2lmaWNpZGFkKSIsDQogICAgeSA9ICJUYXNhIGRlIFZlcmRhZGVyb3MgUG9zaXRpdm9zIChTZW5zaWJpbGlkYWQpIiwNCiAgICBjYXB0aW9uID0gIkZ1ZW50ZTogREFORSAtIEdFSUggMjAyNSINCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC4yKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMikpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1IiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjN0M2QTlDIiwgaGp1c3QgPSAwLCBzaXplID0gOCksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjRDZDREVBIiwgbGluZXR5cGUgPSAiZGFzaGVkIiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM0QTNGNTUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTEpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1Iiwgc2l6ZSA9IDkpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkNCiAgKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCBtb2RlbG8gb2J0dXZvIHVuIMOhcmVhIGJham8gbGEgY3VydmEgKEFVQykgZGUgMC44NjcsIGxvIHF1ZSBpbmRpY2EgdW5hIGFsdGEgY2FwYWNpZGFkIHBhcmEgZGlmZXJlbmNpYXIgY29ycmVjdGFtZW50ZSBlbnRyZSBhbWJhcyBjYXRlZ29yw61hcywgcmVwcmVzZW50YW5kbyB1biB2YWxvciBjZXJjYW5vIGEgMSBxdWUgZGEgdW5hIG1lam9yIGNhcGFjaWRhZCBkZSBjbGFzaWZpY2FjacOzbi4NCkFzaW1pc21vLCBlbCB1bWJyYWwgw7NwdGltbyBkZSBjbGFzaWZpY2FjacOzbiBzZSB1Ymljw7MgZW4gMC41NDIsIHBlcm1pdGllbmRvIGFsY2FuemFyIHVuIGVxdWlsaWJyaW8gYWRlY3VhZG8gZW50cmUgc2Vuc2liaWxpZGFkIHkgZXNwZWNpZmljaWRhZC4gRXN0byBzdWdpZXJlIHF1ZSAqKmVsIG1vZGVsbyBsb2dyYSBpZGVudGlmaWNhciBjb3JyZWN0YW1lbnRlIHVuYSBncmFuIHByb3BvcmNpw7NuIGRlIGluZGl2aWR1b3MgYXNvY2lhZG9zIGFsIGVtcGxlbyBmb3JtYWwqKiwgbWFudGVuaWVuZG8gdW4gbml2ZWwgcmF6b25hYmxlIGRlIGVycm9yZXMgZGUgY2xhc2lmaWNhY2nDs24uIFNlZ8O6biBKYW1lcyBldCBhbC4gKDIwMjEpLCBsYSBjdXJ2YSBST0MgeSBlbCBBVUMgc29uIGhlcnJhbWllbnRhcyBmdW5kYW1lbnRhbGVzIHBhcmEgZXZhbHVhciBlbCBkZXNlbXBlw7FvIGRlIG1vZGVsb3Mgc3VwZXJ2aXNhZG9zLCB5YSBxdWUgcGVybWl0ZW4gbWVkaXIgc3UgY2FwYWNpZGFkIGRpc2NyaW1pbmF0b3JpYSBmcmVudGUgYSBkaXN0aW50b3MgcHVudG9zIGRlIGNsYXNpZmljYWNpw7NuLjwvZGl2Pg0KDQojIyA0LjIgTW9kZWxvIEstTmVhcmVzdCBOZWlnaGJvcnMgKEtOTikNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkVsIG1vZGVsbyBLLU5lYXJlc3QgTmVpZ2hib3JzIChLTk4pIGZ1ZSBpbXBsZW1lbnRhZG8gY29uIGVsIG9iamV0aXZvIGRlIGNsYXNpZmljYXIgYSBsb3MgaW5kaXZpZHVvcyBlbnRyZSBlbXBsZW8gZm9ybWFsIGUgaW5mb3JtYWwgYSBwYXJ0aXIgZGUgc3VzIGNhcmFjdGVyw61zdGljYXMgc29jaW9kZW1vZ3LDoWZpY2FzIHkgZWNvbsOzbWljYXMuIFBhcmEgZGV0ZXJtaW5hciBlbCB2YWxvciDDs3B0aW1vIGRlIGssIHNlIGV2YWx1YXJvbiBkaXN0aW50b3MgbsO6bWVyb3MgZGUgdmVjaW5vcyB1dGlsaXphbmRvIGxhIG11ZXN0cmEgZGUgZW50cmVuYW1pZW50by48L2Rpdj4NCg0KYGBge3IgcXVpdGFyIG5hLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZV9rbm4gPC0gYmFzZV9tdWVzdHJhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKEVkYWQpLCAhaXMubmEoU2V4byksICFpcy5uYShab25hKSwgDQogICAgICAgICAhaXMubmEoTml2ZWxfZWR1Y2F0aXZvKSwgIWlzLm5hKEluZ3Jlc29zX3JlY2liaWRvcyksDQogICAgICAgICAhaXMubmEoY290aXphX2YpKQ0KDQpiYXNlX2tubl9lc2NhbGFkYSA8LSBiYXNlX2tubiAlPiUNCiAgbXV0YXRlKA0KICAgIEVkYWRfZXNjID0gc2NhbGUoRWRhZCksDQogICAgU2V4b19lc2MgPSBzY2FsZShTZXhvKSwNCiAgICBab25hX2VzYyA9IHNjYWxlKFpvbmEpLA0KICAgIE5pdmVsX2VkdWNhdGl2b19lc2MgPSBzY2FsZShOaXZlbF9lZHVjYXRpdm8pLA0KICAgIEluZ3Jlc29zX2VzYyA9IHNjYWxlKEluZ3Jlc29zX3JlY2liaWRvcykNCiAgKQ0KYGBgDQoNCmBgYHtyIG11ZXN0cmEgZGVsa25uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc2V0LnNlZWQoMjgpDQoNCnRvdGFsX2ZpbGFzIDwtIG5yb3coYmFzZV9rbm5fZXNjYWxhZGEpDQppbmRleF9tdWVzdHJhIDwtIHNhbXBsZSh0b3RhbF9maWxhcywgMTAwMDApDQoNCmluZGV4X2VudHJlbmEgPC0gc2FtcGxlKGluZGV4X211ZXN0cmEsIDc1MDApDQppbmRleF90ZXN0IDwtIGluZGV4X211ZXN0cmFbIWluZGV4X211ZXN0cmEgJWluJSBpbmRleF9lbnRyZW5hXQ0KDQprbm5fZW50cmVuYSA8LSBiYXNlX2tubl9lc2NhbGFkYVtpbmRleF9lbnRyZW5hLCBdDQprbm5fdGVzdCA8LSBiYXNlX2tubl9lc2NhbGFkYVtpbmRleF90ZXN0LCBdDQpgYGANCg0KYGBge3IgZW50cmVuYSB5IHRlc3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQprbm5fZW50cmVuYV9pbnB1dCA8LSBrbm5fZW50cmVuYVssIGMoIkVkYWRfZXNjIiwgIlNleG9fZXNjIiwgIlpvbmFfZXNjIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5pdmVsX2VkdWNhdGl2b19lc2MiLCAiSW5ncmVzb3NfZXNjIildDQprbm5fZW50cmVuYV9vdXRwdXQgPC0ga25uX2VudHJlbmEkY290aXphX2YNCg0Ka25uX3Rlc3RfaW5wdXQgPC0ga25uX3Rlc3RbLCBjKCJFZGFkX2VzYyIsICJTZXhvX2VzYyIsICJab25hX2VzYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOaXZlbF9lZHVjYXRpdm9fZXNjIiwgIkluZ3Jlc29zX2VzYyIpXQ0Ka25uX3Rlc3Rfb3V0cHV0IDwtIGtubl90ZXN0JGNvdGl6YV9mDQpgYGANCg0KYGBge3IgayBlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmtubl90ZXN0X3ByZWRfazMgPC0ga25uKHRyYWluID0ga25uX2VudHJlbmFfaW5wdXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBrbm5fZW50cmVuYV9vdXRwdXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGtubl90ZXN0X2lucHV0LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAzKQ0KDQpLbm5Cb25pdG8gPC0gZGF0YS5mcmFtZShQcmVkaWNjaW9uID0ga25uX3Rlc3RfcHJlZF9rMywgUmVhbGlkYWQgPSBrbm5fdGVzdF9vdXRwdXQpDQoNCktubkJvbml0byAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKlByZWRpY2Npb25lcyBLTk4gKGs9MykqKiIpLA0KICAgIHN1YnRpdGxlID0gbWQoIkNvbXBhcmFjaW9uIGVudHJlIHByZWRpY2Npb24geSByZWFsaWRhZCIpDQogICkgJT4lDQogIGNvbHNfbGFiZWwoDQogICAgUHJlZGljY2lvbiA9ICJQcmVkaWNjaW9uIiwNCiAgICBSZWFsaWRhZCA9ICJSZWFsaWRhZCINCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAiIzRBM0Y1NSIpLCBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAiYm9sZCIpKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKGV2ZXJ5dGhpbmcoKSkNCiAgKSAlPiUNCiAgb3B0X3Jvd19zdHJpcGluZygpICU+JQ0KICB0YWJfb3B0aW9ucygNCiAgICB0YWJsZS53aWR0aCA9IHBjdCgxMDApLA0KICAgIGNvbnRhaW5lci5oZWlnaHQgPSBwY3QoMTAwKQ0KICApICU+JQ0KICBodG1sdG9vbHM6OmRpdihzdHlsZSA9ICJoZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyIsIC4pDQpgYGANCg0KYGBge3IgbWV0cmljYXNkZWwzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lzaW9uIDwtIGFzLm51bWVyaWMobWVhbihrbm5fdGVzdF9wcmVkX2szID09IGtubl90ZXN0X291dHB1dCkpDQptYXRyaXogPC0gdGFibGUoa25uX3Rlc3RfcHJlZF9rMywga25uX3Rlc3Rfb3V0cHV0KQ0KDQpkYXRhLmZyYW1lKA0KICBNZXRyaWNhID0gYygiUHJlY2lzaW9uIiwgIkFjaWVydG9zIiwgIkVycm9yZXMiLCAiVG90YWwiKSwNCiAgVmFsb3IgPSBjKA0KICAgIHBhc3RlMChyb3VuZChwcmVjaXNpb24gKiAxMDAsIDIpLCAiJSIpLA0KICAgIGZvcm1hdChzdW0oZGlhZyhtYXRyaXopKSwgYmlnLm1hcmsgPSAiLiIpLA0KICAgIGZvcm1hdChzdW0obWF0cml6KSAtIHN1bShkaWFnKG1hdHJpeikpLCBiaWcubWFyayA9ICIuIiksDQogICAgZm9ybWF0KHN1bShtYXRyaXopLCBiaWcubWFyayA9ICIuIikNCiAgKQ0KKSAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKk1ldHJpY2FzIGRlIERlc2VtcGVubyAtIEtOTiAoaz0zKSoqIiksDQogICAgc3VidGl0bGUgPSBtZCgiUHJlZGljY2lvbiBkZSBjb3RpemFjaW9uIGEgcGVuc2lvbiIpDQogICkgJT4lDQogIGNvbHNfbGFiZWwoDQogICAgTWV0cmljYSA9ICJJbmRpY2Fkb3IiLA0KICAgIFZhbG9yID0gIlJlc3VsdGFkbyINCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAiIzRBM0Y1NSIpLCBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAiYm9sZCIpKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKGV2ZXJ5dGhpbmcoKSkNCiAgKSAlPiUNCiAgb3B0X3Jvd19zdHJpcGluZygpICU+JQ0KICB0YWJfb3B0aW9ucyh0YWJsZS53aWR0aCA9IHBjdCg1MCkpDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkVsIG1vZGVsbyBLTk4gY29uIGsgPSAzIGFsY2FuesOzIHVuYSBwcmVjaXNpw7NuIGRlbCA4My41NiUsIGNsYXNpZmljYW5kbyBjb3JyZWN0YW1lbnRlIDIuMDg5IGRlIGxvcyAyLjUwMCBjYXNvcyBkZWwgY29uanVudG8gZGUgcHJ1ZWJhLiBFc3RhIG3DqXRyaWNhIGV2aWRlbmNpYSB1biBkZXNlbXBlw7FvIGFkZWN1YWRvIGRlbCBtb2RlbG8gcGFyYSBpZGVudGlmaWNhciBpbmRpdmlkdW9zIHBlcnRlbmVjaWVudGVzIGFsIGVtcGxlbyBmb3JtYWwgZSBpbmZvcm1hbC4gQXNpbWlzbW8sIGVsIG1vZGVsbyBwcmVzZW50w7MgdW4gbWFyZ2VuIGRlIGVycm9yIGNlcmNhbm8gYWwgMTYuNDQlLCBjb3JyZXNwb25kaWVudGUgYSA0MTEgY2Fzb3MgY2xhc2lmaWNhZG9zIGluY29ycmVjdGFtZW50ZSwgcmVmbGVqYW5kbyB1biBuaXZlbCBkZSBlcXVpdm9jYWNpw7NuIHJlbGF0aXZhbWVudGUgYmFqbyBmcmVudGUgYWwgdG90YWwgZGUgb2JzZXJ2YWNpb25lcyBhbmFsaXphZGFzLjwvZGl2Pg0KDQpgYGB7ciBidXNjYXIgZWwgbWVqb3IgaywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmsgPC0gMTo1MA0KcmVzdWx0YWRvIDwtIGRhdGEuZnJhbWUoaywgcHJlY2lzaW9uID0gMCkNCg0KZm9yKG4gaW4gayl7DQogIGtubl90ZXN0X3ByZWQgPC0ga25uKHRyYWluID0ga25uX2VudHJlbmFfaW5wdXQsIA0KICAgICAgICAgICAgICAgICAgICAgICBjbCA9IGtubl9lbnRyZW5hX291dHB1dCwgDQogICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSBrbm5fdGVzdF9pbnB1dCwgDQogICAgICAgICAgICAgICAgICAgICAgIGsgPSBuKQ0KICANCiAgcmVzdWx0YWRvJHByZWNpc2lvbltuXSA8LSBtZWFuKGtubl90ZXN0X3ByZWQgPT0ga25uX3Rlc3Rfb3V0cHV0KQ0KfQ0KcmVzdWx0YWRvICU+JQ0KICBndCgpICU+JQ0KICB0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gbWQoIioqUHJlY2lzaW9uIGRlIEtOTiBzZWd1biB2YWxvciBkZSBrKioiKSwNCiAgICBzdWJ0aXRsZSA9IG1kKCJDb21wYXJhY2lvbiBkZSBwcmVjaXNpb24gcGFyYSBrID0gMSBhIDUwIikNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICBrID0gIk51bWVybyBkZSB2ZWNpbm9zIChrKSIsDQogICAgcHJlY2lzaW9uID0gIlByZWNpc2lvbiINCiAgKSAlPiUNCiAgZm10X251bWJlcihjb2x1bW5zID0gcHJlY2lzaW9uLCBkZWNpbWFscyA9IDQpICU+JQ0KICB0YWJfc3R5bGUoDQogICAgc3R5bGUgPSBsaXN0KGNlbGxfZmlsbChjb2xvciA9ICIjNEEzRjU1IiksIGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9ICJib2xkIikpLA0KICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHMoZXZlcnl0aGluZygpKQ0KICApICU+JQ0KICBkYXRhX2NvbG9yKA0KICAgIGNvbHVtbnMgPSBwcmVjaXNpb24sDQogICAgY29sb3JzID0gc2NhbGVzOjpjb2xfbnVtZXJpYyhwYWxldHRlID0gYygiI0Q2Q0RFQSIsICIjN0M2QTlDIiwgIiM0QTNGNTUiKSwgZG9tYWluID0gTlVMTCkNCiAgKSAlPiUNCiAgb3B0X3Jvd19zdHJpcGluZygpICU+JQ0KICB0YWJfb3B0aW9ucyh0YWJsZS53aWR0aCA9IHBjdCg1MCkpICU+JQ0KICBodG1sdG9vbHM6OmRpdihzdHlsZSA9ICJoZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyIsIC4pDQpgYGANCg0KYGBge3IgZ3JhZmljbyBkZSBsYSBwcmVjaXNpb24ga25uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVzdWx0YWRvICU+JSANCiAgZ2dwbG90KCkgKw0KICBhZXMoaywgcHJlY2lzaW9uKSArDQogIGdlb21fbGluZShjb2xvciA9ICIjN0M2QTlDIiwgc2l6ZSA9IDEsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QTNGNTUiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIlByZWNpc2lvbiBkZSBLTk4gc2VndW4gdmFsb3IgZGUgayIsDQogICAgICAgeCA9ICJOdW1lcm8gZGUgdmVjaW5vcyAoaykiLA0KICAgICAgIHkgPSAiUHJlY2lzaW9uIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzRBM0Y1NSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1IiwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM0QTNGNTUiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiNENkNERUEiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+RWwgZ3LDoWZpY28gZGUgcHJlY2lzacOzbiBkZSBLTk4gc2Vnw7puIGVsIHZhbG9yIGRlIGsgbXVlc3RyYSB1biBjb21wb3J0YW1pZW50byBlc3RhYmxlLCBjb24gdW4gcmVuZGltaWVudG8gw7NwdGltbyBlbiBlbCByYW5nbyBlbnRyZSA1IHkgMjUgdmVjaW5vcywgZG9uZGUgc2UgYWxjYW56YSB1bmEgcHJlY2lzacOzbiBlbnRyZSBlbCA4MiUgeSA4MyUuIFBhcmEgdmFsb3JlcyBiYWpvcyBkZSBrIGVsIG1vZGVsbyB0aWVuZGUgYSBzb2JyZWFqdXN0YXJzZSwgbWllbnRyYXMgcXVlIHBhcmEgdmFsb3JlcyBhbHRvcyBsYSBwcmVjaXNpw7NuIGRpc21pbnV5ZSBwcm9ncmVzaXZhbWVudGUuDQpFc3RlIGNvbXBvcnRhbWllbnRvIGV2aWRlbmNpYSBxdWUgKiplbCBtb2RlbG8gS05OIGxvZ3JhIHVuIGVxdWlsaWJyaW8gYWRlY3VhZG8gZW50cmUgc2VzZ28geSB2YXJpYW56YSBkZW50cm8gZGVsIHJhbmdvIMOzcHRpbW8qKiwgdmFsaWRhbmRvIHN1IGNhcGFjaWRhZCBwcmVkaWN0aXZhIHBhcmEgY2xhc2lmaWNhciBsYSBmb3JtYWxpZGFkIGxhYm9yYWwgYSBwYXJ0aXIgZGUgdmFyaWFibGVzIHNvY2lvZGVtb2dyw6FmaWNhcyB5IGxhYm9yYWxlcy4gU2Vnw7puIEphbWVzIGV0IGFsLiAoMjAyMSksIGxhIHNlbGVjY2nDs24gYWRlY3VhZGEgZGVsIHBhcsOhbWV0cm8gayBlcyBmdW5kYW1lbnRhbCBlbiBtb2RlbG9zIEtOTiwgeWEgcXVlIHZhbG9yZXMgbXV5IHBlcXVlw7FvcyBwdWVkZW4gZ2VuZXJhciBzb2JyZWFqdXN0ZSwgbWllbnRyYXMgcXVlIHZhbG9yZXMgZGVtYXNpYWRvIGdyYW5kZXMgcmVkdWNlbiBsYSBjYXBhY2lkYWQgZGVsIG1vZGVsbyBwYXJhIGNhcHR1cmFyIHBhdHJvbmVzIGltcG9ydGFudGVzIGRlbnRybyBkZSBsb3MgZGF0b3MuPC9kaXY+DQoNCmBgYHtyIGtubiBlbnRyZW5hZG8gY29uIHZhbGlkYWNpb24sIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXQuc2VlZCgyOCkNCg0Ka25uX2VudHJlbmFkbyA8LSB0cmFpbihjb3RpemFfZiB+IEVkYWRfZXNjICsgU2V4b19lc2MgKyBab25hX2VzYyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgIE5pdmVsX2VkdWNhdGl2b19lc2MgKyBJbmdyZXNvc19lc2MsIA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0ga25uX2VudHJlbmEsIA0KICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAia25uIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICB0dW5lTGVuZ3RoID0gMjAwKQ0KDQpgYGANCg0KYGBge3IgZ3JhZmlxdWl0byBrbm59DQpsb2FkKCJEYXRhIGZpbmFsLlJEYXRhIikNCm1lam9yX2sgPC0ga25uX2VudHJlbmFkbyRiZXN0VHVuZSRrDQptZWpvcl9wcmVjaXNpb24gPC0ga25uX2VudHJlbmFkbyRyZXN1bHRzW2tubl9lbnRyZW5hZG8kcmVzdWx0cyRrID09IG1lam9yX2ssICJBY2N1cmFjeSJdDQoNCmRhdGEuZnJhbWUoDQogIE1ldHJpY2EgPSBjKCJNZWpvciB2YWxvciBkZSBrIiwgIlByZWNpc2lvbiBhbGNhbnphZGEiKSwNCiAgVmFsb3IgPSBjKG1lam9yX2ssIHBhc3RlMChyb3VuZChtZWpvcl9wcmVjaXNpb24gKiAxMDAsIDIpLCAiJSIpKQ0KKSAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKktOTiAtIE1lam9yIG1vZGVsbyBlbmNvbnRyYWRvKioiKSkgJT4lDQogIGNvbHNfbGFiZWwoTWV0cmljYSA9ICIiLCBWYWxvciA9ICIiKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAiIzRBM0Y1NSIpLCBjZWxsX3RleHQoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAiYm9sZCIpKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKGV2ZXJ5dGhpbmcoKSkNCiAgKSAlPiUNCiAgdGFiX29wdGlvbnModGFibGUud2lkdGggPSBwY3QoNDApKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Mb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgbXVlc3RyYW4gcXVlIGVsIG1lam9yIGRlc2VtcGXDsW8gZGVsIG1vZGVsbyBzZSBhbGNhbnrDsyBjb24gdW4gdmFsb3IgZGUgaz0xMSwgb2J0ZW5pZW5kbyB1bmEgcHJlY2lzacOzbiAoYWNjdXJhY3kpIGFwcm94aW1hZGEgZGVsIDgyLjc4JS4gRXN0ZSByZXN1bHRhZG8gZXZpZGVuY2lhIHF1ZSBlbCBtb2RlbG8gS05OIHByZXNlbnRhIHVuIGRlc2VtcGXDsW8gYWRlY3VhZG8gcGFyYSBjbGFzaWZpY2FyIGluZGl2aWR1b3MgcGVydGVuZWNpZW50ZXMgYWwgZW1wbGVvIGZvcm1hbCBlIGluZm9ybWFsLCBzZWxlY2Npb25hbmRvIGF1dG9tw6F0aWNhbWVudGUgZWwgcGFyw6FtZXRybyBxdWUgbWF4aW1pemEgbGEgY2FwYWNpZGFkIHByZWRpY3RpdmEgZGVudHJvIGRlbCByYW5nbyBldmFsdWFkby48L2Rpdj4NCg0KYGBge3IgZ3JhZmljbyBkZWwga25uIGVudHJlbmFkbywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmtubl9lbnRyZW5hZG8kcmVzdWx0cyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gaywgeSA9IEFjY3VyYWN5KSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzdDNkE5QyIsIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEEzRjU1Iiwgc2l6ZSA9IDEuNSkgKw0KICBsYWJzKHRpdGxlID0gIlByZWNpc2lvbiBkZSBLTk4gc2VndW4gdmFsb3IgZGUgayIsDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiTWVqb3IgayA9Iiwga25uX2VudHJlbmFkbyRiZXN0VHVuZSRrKSwNCiAgICAgICB4ID0gIk51bWVybyBkZSB2ZWNpbm9zIChrKSIsDQogICAgICAgeSA9ICJQcmVjaXNpb24gKEFjY3VyYWN5KSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNEEzRjU1IiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM3QzZBOUMiLCBzaXplID0gMTEpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzRBM0Y1NSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMSksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM0QTNGNTUiLCBzaXplID0gOSksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjRDZDREVBIiwgbGluZXR5cGUgPSAiZGFzaGVkIiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkVsIGdyw6FmaWNvIGRlIHByZWNpc2nDs24gbXVlc3RyYSB1bmEgZXN0YWJpbGlkYWQgbm90YWJsZSBhIGxvIGxhcmdvIGRlIGxvcyBkaXN0aW50b3MgdmFsb3JlcyBkZSBrLCBjb24gZmx1Y3R1YWNpb25lcyBtw61uaW1hcy4gRWwgcHVudG8gw7NwdGltbyBzZSBhbGNhbnphIGVuIGsgPSAxMSwgYSBwYXJ0aXIgZGVsIGN1YWwgbGEgcHJlY2lzacOzbiBzZSBtYW50aWVuZSByZWxhdGl2YW1lbnRlIGNvbnN0YW50ZSBoYXN0YSBhcHJveGltYWRhbWVudGUgayA9IDI1LCBwYXJhIGx1ZWdvIGRlc2NlbmRlciBsaWdlcmFtZW50ZSwgYWRpY2lvbmFsbWVudGUgbGEgcHJlY2lzacOzbiBzZWfDum4gbG9zIGRpc3RpbnRvcyB2YWxvcmVzIGRlIGsgZXZpZGVuY2lhIHF1ZSBlbCBkZXNlbXBlw7FvIGRlbCBtb2RlbG8gc2UgbWFudGllbmUgcmVsYXRpdmFtZW50ZSBlc3RhYmxlIHBhcmEgdmFsb3JlcyBpbnRlcm1lZGlvcy4gRXN0byBzdWdpZXJlIHF1ZSBlbCBtb2RlbG8gbG9ncmEgdW4gZXF1aWxpYnJpbyBhZGVjdWFkbyBlbnRyZSBzZW5zaWJpbGlkYWQgYWwgcnVpZG8geSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YWNpw7NuLCByZWZsZWphbmRvIHF1ZSBsYXMgdmFyaWFibGVzIHNvY2lvZGVtb2dyw6FmaWNhcyB5IGxhYm9yYWxlcyB1dGlsaXphZGFzIHBlcm1pdGVuIGlkZW50aWZpY2FyIHBhdHJvbmVzIHJlbGF0aXZhbWVudGUgY29uc2lzdGVudGVzIGFzb2NpYWRvcyBhIGxhIGZvcm1hbGlkYWQgbGFib3JhbCBlbiBDb2xvbWJpYS48L2Rpdj4NCg0KYGBge3IgcHJlZGljY2lvbmVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Ka25uX3ByZWRpY2Npb24gPC0gcHJlZGljdChrbm5fZW50cmVuYWRvLCBuZXdkYXRhID0ga25uX3Rlc3QpDQoNCnByb2Jfa25uX3ByZWRpY2Npb24gPC0gcHJlZGljdChrbm5fZW50cmVuYWRvLCBuZXdkYXRhID0ga25uX3Rlc3QsIHR5cGUgPSAicHJvYiIpDQpgYGANCg0KYGBge3IgbWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwga25uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY21fa25uIDwtIGNvbmZ1c2lvbk1hdHJpeChrbm5fcHJlZGljY2lvbiwga25uX3Rlc3QkY290aXphX2YpDQoNCmRhdGEuZnJhbWUoDQogIE1ldHJpY2EgPSBjKCJBY2N1cmFjeSIsICJTZW5zaWJpbGlkYWQiLCAiRXNwZWNpZmljaWRhZCIsIA0KICAgICAgICAgICAgICAiVlBQIiwgIlZQTiIsDQogICAgICAgICAgICAgICJBY2llcnRvcyIsICJUb3RhbCIsICJFcnJvciIpLA0KICBWYWxvciA9IGMoDQogICAgcGFzdGUwKHJvdW5kKGNtX2tubiRvdmVyYWxsWyJBY2N1cmFjeSJdICogMTAwLCAyKSwgIiUiKSwNCiAgICBwYXN0ZTAocm91bmQoY21fa25uJGJ5Q2xhc3NbIlNlbnNpdGl2aXR5Il0gKiAxMDAsIDIpLCAiJSIpLA0KICAgIHBhc3RlMChyb3VuZChjbV9rbm4kYnlDbGFzc1siU3BlY2lmaWNpdHkiXSAqIDEwMCwgMiksICIlIiksDQogICAgcGFzdGUwKHJvdW5kKGNtX2tubiRieUNsYXNzWyJQb3MgUHJlZCBWYWx1ZSJdICogMTAwLCAyKSwgIiUiKSwNCiAgICBwYXN0ZTAocm91bmQoY21fa25uJGJ5Q2xhc3NbIk5lZyBQcmVkIFZhbHVlIl0gKiAxMDAsIDIpLCAiJSIpLA0KICAgIGZvcm1hdChzdW0oZGlhZyhjbV9rbm4kdGFibGUpKSwgYmlnLm1hcmsgPSAiLiIpLA0KICAgIGZvcm1hdChzdW0oY21fa25uJHRhYmxlKSwgYmlnLm1hcmsgPSAiLiIpLA0KICAgIHBhc3RlMChyb3VuZCgoMSAtIGNtX2tubiRvdmVyYWxsWyJBY2N1cmFjeSJdKSAqIDEwMCwgMiksICIlIikNCiAgKQ0KKSAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKk1ldHJpY2FzIGRlIERlc2VtcGVubyAtIEtOTioqIiksDQogICAgc3VidGl0bGUgPSBtZChwYXN0ZSgiTWVqb3IgayA9Iiwga25uX2VudHJlbmFkbyRiZXN0VHVuZSRrKSkNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICBNZXRyaWNhID0gIkluZGljYWRvciIsDQogICAgVmFsb3IgPSAiUmVzdWx0YWRvIg0KICApICU+JQ0KICB0YWJfc3R5bGUoDQogICAgc3R5bGUgPSBsaXN0KGNlbGxfZmlsbChjb2xvciA9ICIjNEEzRjU1IiksIGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9ICJib2xkIikpLA0KICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHMoZXZlcnl0aGluZygpKQ0KICApICU+JQ0KICBvcHRfcm93X3N0cmlwaW5nKCkgJT4lDQogIHRhYl9vcHRpb25zKHRhYmxlLndpZHRoID0gcGN0KDcwKSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+RWwgbW9kZWxvIEtOTiBhbGNhbnrDsyB1bmEgcHJlY2lzacOzbiBnbG9iYWwgZGVsIDgzLjI0JSwgY2xhc2lmaWNhbmRvIGNvcnJlY3RhbWVudGUgMi4wODEgZGUgMi41MDAgY2Fzb3MgZW4gZWwgY29uanVudG8gZGUgcHJ1ZWJhIHNpZW5kbyBlc3RlIHVuIGRlc2VtcGXDsW8gYWRlY3VhZG8gcGFyYSBpZGVudGlmaWNhciBpbmRpdmlkdW9zIHBlcnRlbmVjaWVudGVzIGFsIGVtcGxlbyBmb3JtYWwgZSBpbmZvcm1hbC4gQXNpbWlzbW8sIHByZXNlbnTDsyB1bmEgZXNwZWNpZmljaWRhZCBkZWwgOTQuMjclLCBpbmRpY2FuZG8gdW5hIGFsdGEgY2FwYWNpZGFkIHBhcmEgcmVjb25vY2VyIGNvcnJlY3RhbWVudGUgYSBsYXMgcGVyc29uYXMgcXVlIG5vIHBlcnRlbmVjZW4gYWwgZW1wbGVvIGZvcm1hbCBhc2lyZWR1Y2llbmRvIHNpZ25pZmljYXRpdmFtZW50ZSBsb3MgZmFsc29zIHBvc2l0aXZvcyBzdWdpcmllbmRvIHF1ZSAqKmVsIG1vZGVsbyBsb2dyYSBpZGVudGlmaWNhciBwYXRyb25lcyBzaW1pbGFyZXMgZW50cmUgaW5kaXZpZHVvcyBjb24gY2FyYWN0ZXLDrXN0aWNhcyBsYWJvcmFsZXMgeSBzb2Npb2RlbW9ncsOhZmljYXMgcmVsYWNpb25hZGFzIGNvbiBjb25kaWNpb25lcyBkZSBpbmZvcm1hbGlkYWQqKi48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPmVuIGN1YW50byBhIGxhIHNlbnNpYmlsaWRhZCBmdWUgZGVsIDYyLjE3JSwgbG8gcXVlIGV2aWRlbmNpYSBxdWUgYcO6biBleGlzdGVuIGFsZ3VuYXMgZGlmaWN1bHRhZGVzIHBhcmEgaWRlbnRpZmljYXIgY29ycmVjdGFtZW50ZSBjaWVydG9zIGluZGl2aWR1b3MgdmluY3VsYWRvcyBhbCBlbXBsZW8gZm9ybWFsLCBzaW4gZW1iYXJnbywgbG9zIHZhbG9yZXMgcHJlZGljdGl2b3MgcG9zaXRpdm8geSBuZWdhdGl2bywgODUuMDMlIHkgODIuNjQlLCByZXNwZWN0aXZhbWVudGUsIG11ZXN0cmFuIHF1ZSBlbCBtb2RlbG8gbWFudGllbmUgdW4gbml2ZWwgZGUgY29uZmlhbnphIGFkZWN1YWRvIGVuIHN1cyBjbGFzaWZpY2FjaW9uZXMgeSBsYSB0YXNhIGRlIGVycm9yIGRlbCAxNi43NiUgcmVmbGVqYSB1biBkZXNlbXBlw7FvIHPDs2xpZG8gZGVudHJvIGRlbCBwcm9ibGVtYSBkZSBjbGFzaWZpY2FjacOzbiBhbmFsaXphZG8sIGNvbnNpZGVyYW5kbyBsYSBjb21wbGVqaWRhZCBkZWwgbWVyY2FkbyBsYWJvcmFsIGNvbG9tYmlhbm8geSBsYSBkaXZlcnNpZGFkIGRlIGNvbmRpY2lvbmVzIGxhYm9yYWxlcywgc2l0dWFjacOzbiBjb25zaXN0ZW50ZSBjb24gbG9zIGFuw6FsaXNpcyBzb2JyZSBsYXMgZGluw6FtaWNhcyBkZSBmb3JtYWxpZGFkIGUgaW5mb3JtYWxpZGFkIGxhYm9yYWwgZW4gQ29sb21iaWEgKERBTkUsIDIwMjUpLjwvZGl2Pg0KDQpgYGB7ciBjdXJ2YSBkZWwga25uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlZF9yb2MgPC0gcHJlZGljdGlvbihhcy5udW1lcmljKGtubl9wcmVkaWNjaW9uKSwgYXMubnVtZXJpYyhrbm5fdGVzdCRjb3RpemFfZikpDQpwZXJmX3JvYyA8LSBwZXJmb3JtYW5jZShwcmVkX3JvYywgInRwciIsICJmcHIiKQ0KDQphdWNfa25uIDwtIHBlcmZvcm1hbmNlKHByZWRfcm9jLCAiYXVjIikNCmF1Y192YWxvciA8LSByb3VuZChhdWNfa25uQHkudmFsdWVzW1sxXV0sIDMpDQoNCnBsb3QocGVyZl9yb2MsIA0KICAgICBtYWluID0gcGFzdGUoIkN1cnZhIFJPQyAtIEtOTiB8IEFVQyA9IiwgYXVjX3ZhbG9yKSwNCiAgICAgY29sID0gIiM3QzZBOUMiLCANCiAgICAgbHdkID0gMiwNCiAgICAgeGxhYiA9ICJUYXNhIGRlIEZhbHNvcyBQb3NpdGl2b3MgKDEgLSBFc3BlY2lmaWNpZGFkKSIsDQogICAgIHlsYWIgPSAiVGFzYSBkZSBWZXJkYWRlcm9zIFBvc2l0aXZvcyAoU2Vuc2liaWxpZGFkKSIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBsdHkgPSAyLCBjb2wgPSAiI0Q2Q0RFQSIsIGx3ZCA9IDEuNSkNCmdyaWQoY29sID0gIiNENkNERUEiLCBsdHkgPSAiZG90dGVkIikNCmxlZ2VuZCgiYm90dG9tcmlnaHQiLA0KICAgICAgIGxlZ2VuZCA9IGMocGFzdGUoIkFVQyA9IiwgYXVjX3ZhbG9yKSwgIkF6YXIiKSwNCiAgICAgICBjb2wgPSBjKCIjN0M2QTlDIiwgIiNENkNERUEiKSwNCiAgICAgICBsd2QgPSBjKDIsIDEuNSksDQogICAgICAgYnR5ID0gIm4iKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5MYSBjdXJ2YSBST0MgcHJlc2VudMOzIHVuIEFVQyBkZSAwLjc4MiwgaW5kaWNhbmRvIHVuYSBjYXBhY2lkYWQgZGlzY3JpbWluYXRvcmlhIGFjZXB0YWJsZSBwYXJhIGRpZmVyZW5jaWFyIGVudHJlIGluZGl2aWR1b3MgcGVydGVuZWNpZW50ZXMgYWwgZW1wbGVvIGZvcm1hbCBlIGluZm9ybWFsLiBBdW5xdWUgZXN0ZSByZXN1bHRhZG8gZXMgc3VwZXJpb3IgYWwgYXphciwgc2UgZW5jdWVudHJhIHBvciBkZWJham8gZGUgbW9kZWxvcyBjb24gZGVzZW1wZcOxb3MgbcOhcyBhbHRvcywgZXZpZGVuY2lhbmRvIHF1ZSBlbCBLTk4gbG9ncmEgaWRlbnRpZmljYXIgcGF0cm9uZXMgaW1wb3J0YW50ZXMsIGF1bnF1ZSBjb24gbWVub3IgcHJlY2lzacOzbiBxdWUgb3Ryb3MgZW5mb3F1ZXMgcHJlZGljdGl2b3MuPC9kaXY+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5Bc2ltaXNtbywgbGEgY3VydmEgc2UgbWFudGllbmUgYWxlamFkYSBkZSBsYSBkaWFnb25hbCBkZSByZWZlcmVuY2lhIGVuIGdyYW4gcGFydGUgZGUgbG9zIHVtYnJhbGVzIGRlIGNsYXNpZmljYWNpw7NuLCBtb3N0cmFuZG8gcXVlIGVsIG1vZGVsbyBhbGNhbnphIHVuYSByZWxhY2nDs24gYWRlY3VhZGEgZW50cmUgdmVyZGFkZXJvcyBwb3NpdGl2b3MgeSBmYWxzb3MgcG9zaXRpdm9zLCAqKnBlcHJlc2VudGFuZG8gdW5hIG1lZGlkYSBpbXBvcnRhbnRlIHBhcmEgZXZhbHVhciBsYSBjYXBhY2lkYWQgZGlzY3JpbWluYXRvcmlhIGRlIGxvcyBtb2RlbG9zIHN1cGVydmlzYWRvcyBmcmVudGUgYSBkaWZlcmVudGVzIHB1bnRvcyBkZSBjbGFzaWZpY2FjacOzbmNvbiBKYW1lcyBldCBhbC4gKDIwMjEpKiouPC9kaXY+DQoNCiMjIDQuMyBDb21wYXJhY2nDs24gZGUgbG9zIG1vZGVsb3MNCg0KYGBge3IgdGFibGEgZGUgY29tcGFyYWNpb259DQp0YWJsYV9tb2RlbG9zIDwtIGRhdGEuZnJhbWUoDQogIE1vZGVsbyA9IGMoIlJlZ3Jlc2lvbiBMb2dpc3RpY2EiLCAiS05OIiksDQogIEFjY3VyYWN5ID0gYygiODMuMjQlIiwgIjgyLjc4JSIpLA0KICBTZW5zaWJpbGlkYWQgPSBjKCI5My44MSUiLCAiNjIuMTclIiksDQogIEVzcGVjaWZpY2lkYWQgPSBjKCI2Mi4wMCUiLCAiOTQuMjclIiksDQogIEFVQyA9IGMoIjAuODY3IiwgIjAuNzgyIiksDQogIEJhbGFuY2VkX0FjY3VyYWN5ID0gYygiMC43NzkiLCAiMC43ODIiKQ0KKQ0KDQp0YWJsYV9tb2RlbG9zICU+JQ0KICBndCgpICU+JQ0KICB0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gbWQoIioqQ29tcGFyYWNpb24gZGUgTW9kZWxvcyBQcmVkaWN0aXZvcyoqIiksDQogICAgc3VidGl0bGUgPSBtZCgiUmVuZGltaWVudG8gZGUgUmVncmVzaW9uIExvZ2lzdGljYSB2cyBLTk4iKQ0KICApICU+JQ0KICB0YWJfc3R5bGUoDQogICAgc3R5bGUgPSBsaXN0KGNlbGxfZmlsbChjb2xvciA9ICIjNEEzRjU1IiksIGNlbGxfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9ICJib2xkIikpLA0KICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHMoZXZlcnl0aGluZygpKQ0KICApICU+JQ0KICBvcHRfcm93X3N0cmlwaW5nKCkgJT4lDQogIHRhYl9vcHRpb25zKHRhYmxlLndpZHRoID0gcGN0KDgwKSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+QWwgY29tcGFyYXIgYW1ib3MgbW9kZWxvcywgKipsYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgcHJlc2VudMOzIHVuIG1lam9yIGRlc2VtcGXDsW8gZ2VuZXJhbCBmcmVudGUgYWwgS05OKiosIGFsY2FuemFuZG8gdW4gQVVDIGRlIDAuODY3IGZyZW50ZSBhIDAuNzgyLCBsbyBxdWUgZXZpZGVuY2lhIHVuYSBtYXlvciBjYXBhY2lkYWQgcGFyYSBkaWZlcmVuY2lhciBjb3JyZWN0YW1lbnRlIGVudHJlIGluZGl2aWR1b3MgcGVydGVuZWNpZW50ZXMgYWwgZW1wbGVvIGZvcm1hbCBlIGluZm9ybWFsLCBhdW5xdWUgZWwgS05OIGRlc3RhY8OzIHBvciBzdSBhbHRhIGVzcGVjaWZpY2lkYWQsIGxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBsb2dyw7MgdW5hIHNlbnNpYmlsaWRhZCBzdXBlcmlvciwgaWRlbnRpZmljYW5kbyBjb3JyZWN0YW1lbnRlIGEgdW5hIG1heW9yIHByb3BvcmNpw7NuIGRlIHBlcnNvbmFzIHZpbmN1bGFkYXMgYWwgZW1wbGVvIGZvcm1hbCwgbGEgcmVncmVzacOzbiBsb2fDrXN0aWNhIG9idHV2byB1bmEgZXhhY3RpdHVkIGxpZ2VyYW1lbnRlIG1heW9yLCAqKmFtYm9zIG1vZGVsb3MgcHJlc2VudGFyb24gcmVzdWx0YWRvcyBzYXRpc2ZhY3RvcmlvcyoqLCBldmlkZW5jaWFuZG8gcXVlIHZhcmlhYmxlcyBjb21vIGxvcyBpbmdyZXNvcywgZWwgbml2ZWwgZWR1Y2F0aXZvLCBsYSB6b25hIHkgbGFzIGNhcmFjdGVyw61zdGljYXMgc29jaW9kZW1vZ3LDoWZpY2FzIGNvbnRpZW5lbiBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHBhcmEgaWRlbnRpZmljYXIgcGF0cm9uZXMgcmVsYWNpb25hZG9zIGNvbiBsYSBmb3JtYWxpZGFkIGxhYm9yYWwgZW4gQ29sb21iaWEuPC9kaXY+IA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+U2Vnw7puIEphbWVzIGV0IGFsLiAoMjAyMSksIGxvcyBtb2RlbG9zIHN1cGVydmlzYWRvcyBkZWJlbiBldmFsdWFyc2Ugbm8gc29sbyBwb3Igc3UgcHJlY2lzacOzbiBnZW5lcmFsLCBzaW5vIHRhbWJpw6luIHBvciBzdSBjYXBhY2lkYWQgcGFyYSByZWNvbm9jZXIgcGF0cm9uZXMgeSBkaWZlcmVuY2lhciBhZGVjdWFkYW1lbnRlIGVudHJlIGNhdGVnb3LDrWFzLjwvZGl2Pg0KDQojIDUgQ29uY2x1c2lvbmVzDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij5FbCBhbsOhbGlzaXMgcGVybWl0acOzIGlkZW50aWZpY2FyIGRpZmVyZW5jaWFzIGltcG9ydGFudGVzIGVudHJlIGxvcyB0cmFiYWphZG9yZXMgZm9ybWFsZXMgZSBpbmZvcm1hbGVzIGVuIENvbG9tYmlhIHBhcmEgMjAyNSwgZXZpZGVuY2lhbmRvIGNhcmFjdGVyw61zdGljYXMgYXNvY2lhZGFzIGEgbGEgcmVhbGlkYWQgZGVsIG1lcmNhZG8gbGFib3JhbCBjb2xvbWJpYW5vLiBTZSBvYnNlcnbDsyBxdWUgbG9zIHRyYWJhamFkb3JlcyBmb3JtYWxlcyBwcmVzZW50YW4sIGVuIHByb21lZGlvLCB1bmEgZWRhZCBzdXBlcmlvciBhIGxvcyAyNSBhw7FvcyB5IHRyYXllY3RvcmlhIGxhYm9yYWwsIGxvIHF1ZSBzdWdpZXJlIHF1ZSAqKmxhIGZvcm1hbGlkYWQgc3VlbGUgY29uc29saWRhcnNlIGNvbiBlbCB0aWVtcG8geSBsYSBzdGFiaWxpemVkIGVuIGVsIGVtcGxlbyoqLg0KQXNpbWlzbW8sIHZhcmlhYmxlcyBjb21vIGVsIHRpcG8gZGUgdHJhYmFqbywgZWwgbml2ZWwgZWR1Y2F0aXZvIHkgbG9zIGluZ3Jlc29zIG1vc3RyYXJvbiB1bmEgcmVsYWNpw7NuIGltcG9ydGFudGUgY29uIGxhIGZvcm1hbGlkYWQgbGFib3JhbC4gRW4gcGFydGljdWxhciwgbG9zIHRyYWJhamFkb3JlcyBhc2FsYXJpYWRvcyB5ICoqbGFzIHBlcnNvbmFzIGNvbiBtYXlvcmVzIG5pdmVsZXMgZWR1Y2F0aXZvcyBwcmVzZW50YW4gdW5hIG1heW9yIHByb2JhYmlsaWRhZCBkZSBhY2NlZGVyIGEgZW1wbGVvcyBmb3JtYWxlcyB5IGNvbnRhciBjb24gbWVjYW5pc21vcyBkZSBwcm90ZWNjacOzbiBzb2NpYWwqKi4gUG9yIGVsIGNvbnRyYXJpbywgbG9zIG5pdmVsZXMgZWR1Y2F0aXZvcyBtw6FzIGJham9zIHkgbWVub3JlcyBpbmdyZXNvcyBjb250aW7DumFuIGFzb2NpYWRvcyBhIGNvbmRpY2lvbmVzIGRlIGluZm9ybWFsaWRhZC48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPlRhbWJpw6luIHNlIGlkZW50aWZpY8OzIHVuYSBsaWdlcmEgYnJlY2hhIGRlIGfDqW5lcm8sIGV2aWRlbmNpYW5kbyB1bmEgbWF5b3IgcGFydGljaXBhY2nDs24gZmVtZW5pbmEgZGVudHJvIGRlbCBzZWN0b3IgaW5mb3JtYWwsIHNpdHVhY2nDs24gcXVlIHJlZmxlamEgYWxndW5hcyBkZSBsYXMgZGVzaWd1YWxkYWRlcyBwcmVzZW50ZXMgZW4gZWwgbWVyY2FkbyBsYWJvcmFsIGNvbG9tYmlhbm8uIEVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsbGFzIHJlZ2lvbmVzIGNvbiBtZW5vciBkZXNhcnJvbGxvIGluZHVzdHJpYWwgcHJlc2VudGFuIHRhc2FzIGRlIGNvdGl6YWNpw7NuIHBlbnNpb25hbCBtw6FzIGFsdGFzIGRlYmlkbyBhIHVuYSBtYXlvciBkZXBlbmRlbmNpYSBkZWwgZW1wbGVvIHDDumJsaWNvLiBFbiBjb250cmFzdGUsIGxvcyBncmFuZGVzIGNlbnRyb3MgdXJiYW5vcyBtdWVzdHJhbiB0YXNhcyBtw6FzIGJhamFzIHBvciBsYSBwcmV2YWxlbmNpYSBkZWwgdHJhYmFqbyBpbmRlcGVuZGllbnRlLCBpbmZvcm1hbCB5IGRlIHNlcnZpY2lvcyBwcml2YWRvcywgZWwgYW7DoWxpc2lzIGRlIHZhcmlhYmxlcyBwZXJtaXRpw7MgY3VtcGxpciBjb24gZWwgb2JqZXRpdm8gZGUgaWRlbnRpZmljYXIgbG9zIHByaW5jaXBhbGVzIGZhY3RvcmVzIHNvY2lvZGVtb2dyw6FmaWNvcyB5IGxhYm9yYWxlcyByZWxhY2lvbmFkb3MgY29uIGxhIGZvcm1hbGlkYWQgbGFib3JhbCBlbiBDb2xvbWJpYS48L2Rpdj4NCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+TGEgcmVncmVzacOzbiBsb2fDrXN0aWNhIHByZXNlbnTDsyBlbCBtZWpvciBkZXNlbXBlw7FvIGdlbmVyYWwsIGFsY2FuemFuZG8gdW5hIGV4YWN0aXR1ZCBjZXJjYW5hIGFsIDgzJSB5IHVuIEFVQyBkZSAwLjg2NywgZXZpZGVuY2lhbmRvIHVuYSBhbHRhIGNhcGFjaWRhZCBwYXJhIGRpZmVyZW5jaWFyIGNvcnJlY3RhbWVudGUgZW50cmUgZW1wbGVvIGZvcm1hbCBlIGluZm9ybWFsLiBBZGVtw6FzLCAqKm1vc3Ryw7MgdW5hIHNlbnNpYmlsaWRhZCBzdXBlcmlvciBhbCA5MCUsIGlkZW50aWZpY2FuZG8gYWRlY3VhZGFtZW50ZSBhIGdyYW4gcGFydGUgZGUgbGFzIHBlcnNvbmFzIHZpbmN1bGFkYXMgYWwgZW1wbGVvIGZvcm1hbCoqLiBFbiB0w6lybWlub3MgZXhwbGljYXRpdm9zLCB2YXJpYWJsZXMgY29tbyBlbCBuaXZlbCBlZHVjYXRpdm8sIGxvcyBpbmdyZXNvcyB5IGxhIHpvbmEgZGUgcmVzaWRlbmNpYSByZXN1bHRhcm9uIHNpZ25pZmljYXRpdmFtZW50ZSByZWxhY2lvbmFkYXMgY29uIGxhIHByb2JhYmlsaWRhZCBkZSBwZXJ0ZW5lY2VyIGFsIGVtcGxlbyBmb3JtYWwsIGRlc3RhY8OhbmRvc2UgZXNwZWNpYWxtZW50ZSAqKmVsIG5pdmVsIGVkdWNhdGl2byBjb21vIHVubyBkZSBsb3MgZmFjdG9yZXMgbcOhcyBpbmZsdXllbnRlcyoqLHBvciBlbCBjb250cmFyaW8sIGxhIGVkYWQgcHJlc2VudMOzIHVuIG1lbm9yIGFwb3J0ZSBleHBsaWNhdGl2byBkZW50cm8gZGVsIG1vZGVsby48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPlBvciBzdSBwYXJ0ZSwgZWwgbW9kZWxvIEtOTiB0YW1iacOpbiBwcmVzZW50w7MgdW4gZGVzZW1wZcOxbyBzYXRpc2ZhY3RvcmlvLCBjb24gdW5hIGV4YWN0aXR1ZCBjZXJjYW5hIGFsIDgzJSB5IHVuIEFVQyBkZSAwLjc4Mi4gQXVucXVlIG1vc3Ryw7MgdW5hIGFsdGEgY2FwYWNpZGFkIHBhcmEgaWRlbnRpZmljYXIgaW5kaXZpZHVvcyBlbiBjb25kaWNpw7NuIGRlIGluZm9ybWFsaWRhZCwgcHJlc2VudMOzIG1heW9yZXMgZGlmaWN1bHRhZGVzIHBhcmEgcmVjb25vY2VyIGNvcnJlY3RhbWVudGUgYWxndW5vcyBjYXNvcyBkZSBlbXBsZW8gZm9ybWFsLCBhbWJvcyBtb2RlbG9zIGxvZ3Jhcm9uIGNhcHRhciBwYXRyb25lcyByZWxldmFudGVzIGFzb2NpYWRvcyBhIGxhIGZvcm1hbGlkYWQgbGFib3JhbCBlbiBDb2xvbWJpYSwgY3VtcGxpZW5kbyBhZGVjdWFkYW1lbnRlIGNvbiBlbCBvYmpldGl2byBwbGFudGVhZG8uIFNpbiBlbWJhcmdvLCBsYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgZGVtb3N0csOzIHVuIG1lam9yIGVxdWlsaWJyaW8gZW50cmUgY2FwYWNpZGFkIHByZWRpY3RpdmEgZSBpbnRlcnByZXRhY2nDs24gZGUgcmVzdWx0YWRvcy48L2Rpdj4NCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+TGEgY29tcGFyYWNpw7NuIGVudHJlIGFtYm9zIG1vZGVsb3MgZXZpZGVuY2nDsyBxdWUsIGF1bnF1ZSBwcmVzZW50YW4gbml2ZWxlcyBkZSBleGFjdGl0dWQgc2ltaWxhcmVzLCAqKmxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBvYnR1dm8gdW4gbWVqb3IgZGVzZW1wZcOxbyBnZW5lcmFsIGdyYWNpYXMgYSBzdSBtYXlvciBjYXBhY2lkYWQgZGlzY3JpbWluYXRvcmlhIHkgc2Vuc2liaWxpZGFkKiouIEVzdG8gcGVybWl0acOzIGlkZW50aWZpY2FyIGNvbiBtYXlvciBwcmVjaXNpw7NuIGEgbGFzIHBlcnNvbmFzIHBlcnRlbmVjaWVudGVzIGFsIGVtcGxlbyBmb3JtYWwsIHJlc3BvbmRpZW5kbyBkZSBtYW5lcmEgbcOhcyBhZGVjdWFkYSBhbCBvYmpldGl2byBkZSBsYSBpbnZlc3RpZ2FjacOzbi48L2Rpdj4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPkVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsIGxvcyByZXN1bHRhZG9zIHJlZmxlamFuIHF1ZSB2YXJpYWJsZXMgY29tbyBlbCBuaXZlbCBlZHVjYXRpdm8sIGxvcyBpbmdyZXNvcyB5IGxhcyBjb25kaWNpb25lcyBsYWJvcmFsZXMgY29udGluw7phbiBzaWVuZG8gZmFjdG9yZXMgZGV0ZXJtaW5hbnRlcyBlbiBsYSBmb3JtYWxpZGFkIGxhYm9yYWwgY29sb21iaWFuYS4gQXNpbWlzbW8sIHNlIGNvbmNsdXllIHF1ZSBsYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgZXMgZWwgbW9kZWxvIG3DoXMgYXByb3BpYWRvIHBhcmEgZXN0ZSBlc3R1ZGlvLCB5YSBxdWUgY29tYmluYSB1biBidWVuIGRlc2VtcGXDsW8gcHJlZGljdGl2byBjb24gdW5hIG1heW9yIGZhY2lsaWRhZCBkZSBpbnRlcnByZXRhY2nDs24uPC9kaXY+DQoNCg0KDQojIDYgQmlibGlvZ3JhZsOtYSANCg0KQ29sb21iaWEgLSBHcmFuIEVuY3Vlc3RhIEludGVncmFkYSBkZSBIb2dhcmVzIC0gR0VJSCAtIDIwMjUuIChzLsKgZi4pLiBodHRwczovL21pY3JvZGF0b3MuZGFuZS5nb3YuY28NCg0KRGVwYXJ0YW1lbnRvIEFkbWluaXN0cmF0aXZvIE5hY2lvbmFsIGRlIEVzdGFkw61zdGljYS4gKDIwMjUpLiBQcm95ZWNjaW9uZXMgZGUgcG9ibGFjacOzbiB5IG1lcmNhZG8gbGFib3JhbC4gREFORQ0KDQpEZXBhcnRhbWVudG8gQWRtaW5pc3RyYXRpdm8gTmFjaW9uYWwgZGUgRXN0YWTDrXN0aWNhLiAoMjAyMCkuIEJvbGV0w61uIHTDqWNuaWNvOiBGdWVyemEgbGFib3JhbCB5IGVkdWNhY2nDs24gMjAxOS4gUmVjdXBlcmFkbyBkZSBCb2xldMOtbiB0w6ljbmljbyBHRUlIIDIwMTkgLSBEQU5FDQoNCkphbWVzLCBHLiwgV2l0dGVuLCBELiwgSGFzdGllLCBULiwgJiBUaWJzaGlyYW5pLCBSLiAoMjAyMSkuICpBbiBpbnRyb2R1Y3Rpb24gdG8gc3RhdGlzdGljYWwgbGVhcm5pbmc6IFdpdGggYXBwbGljYXRpb25zIGluIFIqICgybmQgZWQuKS4gU3ByaW5nZXIuDQoNClNpZXZlcnQsIEMuICgyMDIwKS4gSW50ZXJhY3RpdmUgV2ViLUJhc2VkIERhdGEgVmlzdWFsaXphdGlvbiB3aXRoIFIsIHBsb3RseSwgYW5kIHNoaW55LiBDaGFwbWFuIGFuZCBIYWxsL0NSQy4gaHR0cHM6Ly9wbG90bHktci5jb20vMjANCg0KV2lja2hhbSwgSC4gKDIwMTYpLiBnZ3Bsb3QyOiBFbGVnYW50IEdyYXBoaWNzIGZvciBEYXRhIEFuYWx5c2lzICgyLsKqIGVkLikuIFNwcmluZ2VyLVZlcmxhZyBOZXcgWW9yay4gaHR0cHM6Ly9nZ3Bsb3QyLWJvb2sub3JnLw0KDQpYaWUsIFkuICgyMDE1KS4gRHluYW1pYyBkb2N1bWVudHMgd2l0aCBSIGFuZCBrbml0ciAoMm5kIGVkLikuIENoYXBtYW4gYW5kIEhhbGwvQ1JDLiBodHRwczovL3lpaHVpLm9yZy9rbml0ci8NCg0KSWFubm9uZSwgUi4sIENoZW5nLCBKLiwgU2NobG9lcmtlLCBCLiwgSHVnaGVzLCBFLiwgTGF1ZXIsIEEuLCAmIFNlbywgSi4gKDIwMjQpLiBndDogRWFzaWx5IGNyZWF0ZSBwcmVzZW50YXRpb24tcmVhZHkgZGlzcGxheSB0YWJsZXMgKFZlcnNpw7NuIDAuMTAuMCkuIGh0dHBzOi8vZ3QucnN0dWRpby5jb20vDQoNCldpY2toYW0sIEguLCBGcmFuw6dvaXMsIFIuLCBIZW5yeSwgTC4sIE3DvGxsZXIsIEsuLCAmIFZhdWdoYW4sIEQuICgyMDIzKS4gZHBseXI6IEEgZ3JhbW1hciBvZiBkYXRhIG1hbmlwdWxhdGlvbiAoVmVyc2nDs24gMS4xLjApLiBodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcv