1 Elaborado por:

Nicolás Martínez Ramos
Bioestadístico Oficina de Investigaciones
Psicólogo, Esp. medición y evaluación psicológica y mg. bioestadística

2 Exploración base de datos

library(readxl)
BASE <- read_excel("ACTITUDES HACIA LOS GRUPOS BALINT Y SU INFLUENCIA EN EL BIENESTAR PSICOSOCIAL(1-177).xlsx") # 5-08-2026

library(dplyr) 
library(dlookr)
library(DT)
library(janitor)


BASE <- BASE %>%
  clean_names()  # Convierte todo a snake_case automáticamente

2.1 Limpieza base

#Items 
names(BASE)[15:29] <- paste0("i4_", 1:15)
names(BASE)[30] <- "i5_1"


#recodificando los niveles de los items 
BASE[15:30] <- lapply(BASE[15:30], function(x) as.numeric(gsub("=.*", "", x)))

#creando copia de factor de los items

nuevas_vars <- lapply(BASE[15:30], as.factor)
names(nuevas_vars) <- paste0(names(BASE)[15:30], "_f")
BASE <- cbind(BASE, nuevas_vars)

#Variables sociodemográficas

##edad
BASE$edad[BASE$edad == "juan fernando camargo arenas"] <- NA #ID 130
BASE$edad2 <- as.numeric(gsub("=.*", "", BASE$edad))

##sexo
BASE$genero <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$genero))

##profesion
BASE$profesion_unificada <- case_when(
  grepl("resident", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Residente de medicina",
  grepl("especialista", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Médico especialista",
  grepl("medic[ao] general|^medic[ao]$", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Médico general",
  grepl("enfermer[ií]a$|auxiliar de enfermer", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Auxiliar de enfermería",
  grepl("coordinadora de enfermer", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Coordinadora de enfermería",
  grepl("enfermero", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Enfermero(a)",
  grepl("tecnico en auxiliar", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Técnico auxiliar de enfermería",
  grepl("administrativo", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Administrativo",
  grepl("biolog", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Bióloga",
  grepl("citohistotecnolog", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Citohistotecnóloga",
  grepl("fisioterapeuta", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Fisioterapeuta",
  grepl("ingeniero de sistemas", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Ingeniero de sistemas",
  grepl("instrumentadora", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Instrumentadora quirúrgica",
  grepl("qu[ií]mic[ao] far", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Químico farmacéutico",
  grepl("^asistencial$", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Asistencial",
  grepl("^X$", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Desconocido",
  TRUE ~ as.character(BASE$cual_es_su_profesion)
)

BASE$profesion_unificada <- as.factor(BASE$profesion_unificada)

## especialidad
BASE$especialidad_unificada <- case_when(
  grepl("anestesiolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Anestesiología",
  grepl("^an[oó]nimo$", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Desconocido",
  grepl("cirugia pediatrica|cirug[ií]a pedi[aá]trica", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Cirugía pediátrica",
  grepl("^cirujano$", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Cirugía general",
  grepl("paliativ", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Cuidados paliativos",
  grepl("urgencia|emergencia", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina de urgencias/emergencias",
  grepl("neonatolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Neonatología",
  grepl("neumolog.*pediatr|pediatr.*neumolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Neumología pediátrica",
  grepl("medicina.*familiar|residente de medicina familiar", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina familiar",
  grepl("medicina interna", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina interna",
  grepl("medicina\\s*general|medico general|médico general", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina general",
  grepl("^general$", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina general",
  grepl("geriatria|geriatría", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Geriatría",
  grepl("hematolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Hematología",
  grepl("pediatr", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Pediatría",
  grepl("patologia|patología|sst.*patolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Patología",
  grepl("psiquiatr", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Psiquiatría",
  grepl("radioterapia", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Radioterapia",
  grepl("radiolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Radiología",
  grepl("urologia|urología", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Urología",
  TRUE ~ as.character(BASE$cual_es_su_especialidad)
)
BASE$especialidad_unificada <- as.factor(BASE$especialidad_unificada)

## años ejercicio profesional
BASE$anos_de_ejercicio_profesional <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$anos_de_ejercicio_profesional))

#cargo desempeñado
BASE$esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo))

#participacio nen actividades docentes
BASE$participa_en_actividades_docentes <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$participa_en_actividades_docentes))







library(stringr)
library(stringi)

# 1. Normalizar texto: minúsculas, sin tildes, sin espacios extra
esp <- BASE$cual_es_su_profesion %>%
  str_to_lower() %>%
  stri_trans_general("Latin-ASCII") %>%
  str_squish()

# 2. Patrones
pat_enfermeria <- "enfermer|auxiliar"
pat_medico <- paste(
  "anestes", "cirug", "paliativ", "dolor", "emergenc", "urgenc",
  "fellow", "neonat", "general", "geriatr", "hemat", "medicina",
  "medico", "pediatr", "patolog", "psiquiat", "radiol", "radioter",
  "residente", "urolog", "neumol",
  sep = "|"
)

# 3. Nueva variable (residentes y fellows quedan en médicos)
BASE$grupo_profesional <- case_when(
  str_detect(esp, pat_enfermeria) ~ "Enfermería",
  str_detect(esp, pat_medico)     ~ "Profesionales médicos",
  TRUE                            ~ "Otros"
) %>%
  factor(levels = c("Profesionales médicos", "Enfermería", "Otros"))

3 Análisis descriptivo (sin ítems)

edad se reportó como variable continua.

library(gtsummary)
tabla0 <- BASE %>%
  select(ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado, durante_cuanto_tiempo_ha_participado_en_grupos_balint, a_durante_mis_estudios_de_pregrado, b_durante_la_residencia_medica,
c_como_especialista_subespecialista, d_durante_mis_estudios_para_subespecialista, e_como_auxiliar_de_enfermeria_enfermer, f_como_administrativo, genero, grupo_profesional, profesion_unificada, especialidad_unificada, anos_de_ejercicio_profesional, esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo, participa_en_actividades_docentes, edad2) %>%
  tbl_summary(
    type = list(
      all_categorical() ~ "categorical",
      edad2 ~ "continuous"
    ),
    label = list(
      ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado ~ "Participación actual o pasada en grupo balint", 
      durante_cuanto_tiempo_ha_participado_en_grupos_balint ~ "Tiempo participación grpo balint", 
      a_durante_mis_estudios_de_pregrado ~ "Durante pregrado", 
      b_durante_la_residencia_medica ~ "Durante Residencia médica",
      c_como_especialista_subespecialista ~ "Como Especialista - subespecialista", 
      d_durante_mis_estudios_para_subespecialista ~ "Durante estudios subespecialidad", 
      e_como_auxiliar_de_enfermeria_enfermer ~ "Como auxiliar de enfermería", 
      f_como_administrativo ~ "Como administrativo", 
      genero ~ "Género", 
      grupo_profesional ~ "Grupo profesional",
      profesion_unificada ~ "Profesion", 
      especialidad_unificada ~ "Especialidad", 
      anos_de_ejercicio_profesional ~ "Años ejercicio profesional", 
      esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo ~ "Desempeño trabajo en que el tenga personal a cargo", 
      participa_en_actividades_docentes ~ "Partiipación act. docente",
      edad2 ~ "Edad"
    ),
    statistic = list(
      all_categorical() ~ "{n} ({p}%)",
      edad2 ~ "{mean} ({sd})"
    ),
    digits = list(
      all_categorical() ~ 1,
      edad2 ~ 1
    ),
    missing = "ifany",
    missing_text = "Sin dato"
  ) %>%
  modify_header(label ~ "**Variable**") %>%
  bold_labels() %>%
  modify_caption("**Tabla 1**")


library(writexl)

tabla0 %>%
  as_tibble() %>%
  write_xlsx("tabla0.xlsx")
tabla0
Tabla 1
Variable N = 1771
Participación actual o pasada en grupo balint
    Actualmente participo en un grupo Balint. 80.0 (45.2%)
    He participado en un grupo Balint en el pasado. 84.0 (47.5%)
    Nunca he participado en un grupo Balint. 13.0 (7.3%)
Tiempo participación grpo balint
    De 1 a 2 años. 49.0 (27.7%)
    De 2 a 3 años 10.0 (5.6%)
    Más de 3 años. 34.0 (19.2%)
    Menos de un año. 84.0 (47.5%)
Durante pregrado
    NO 168.0 (94.9%)
    SI 9.0 (5.1%)
Durante Residencia médica
    NO 118.0 (66.7%)
    SI 59.0 (33.3%)
Como Especialista - subespecialista
    NO 140.0 (79.1%)
    SI 37.0 (20.9%)
Durante estudios subespecialidad
    NO 173.0 (97.7%)
    SI 4.0 (2.3%)
Como auxiliar de enfermería
    NO 139.0 (78.5%)
    SI 38.0 (21.5%)
Como administrativo
    NO 132.0 (74.6%)
    SI 45.0 (25.4%)
Género
    Femenino 133.0 (75.1%)
    Masculino 44.0 (24.9%)
Grupo profesional
    Profesionales médicos 93.0 (52.5%)
    Enfermería 52.0 (29.4%)
    Otros 32.0 (18.1%)
Profesion
    Administrativo 23.0 (13.0%)
    Asistencial 1.0 (0.6%)
    Auxiliar de enfermería 8.0 (4.5%)
    Bióloga 1.0 (0.6%)
    Citohistotecnóloga 1.0 (0.6%)
    Desconocido 1.0 (0.6%)
    Enfermero(a) 44.0 (24.9%)
    Fisioterapeuta 1.0 (0.6%)
    Ingeniero de sistemas 1.0 (0.6%)
    Instrumentadora quirúrgica 1.0 (0.6%)
    Médica General 1.0 (0.6%)
    Médico especialista 37.0 (20.9%)
    Médico general 6.0 (3.4%)
    Químico farmacéutico 2.0 (1.1%)
    Residente de medicina 49.0 (27.7%)
Especialidad
    Anestesiología 5.0 (6.5%)
    Cirugía general 1.0 (1.3%)
    Cirugía pediátrica 1.0 (1.3%)
    Cuidados paliativos 7.0 (9.1%)
    Desconocido 1.0 (1.3%)
    Geriatría 2.0 (2.6%)
    Hematología 2.0 (2.6%)
    Medicina de urgencias/emergencias 9.0 (11.7%)
    Medicina familiar 9.0 (11.7%)
    Medicina general 7.0 (9.1%)
    Medicina interna 6.0 (7.8%)
    Neonatología 2.0 (2.6%)
    Neumología pediátrica 1.0 (1.3%)
    Patología 2.0 (2.6%)
    Pediatría 7.0 (9.1%)
    Psiquiatría 3.0 (3.9%)
    Radiología 5.0 (6.5%)
    Radioterapia 1.0 (1.3%)
    Urología 6.0 (7.8%)
    Sin dato 100
Años ejercicio profesional
    11-19 años 47.0 (26.6%)
    6-10 años 31.0 (17.5%)
    Hasta 5 años 57.0 (32.2%)
    Más de 20 años. 42.0 (23.7%)
Desempeño trabajo en que el tenga personal a cargo
    No 100.0 (56.5%)
    Sí 77.0 (43.5%)
Partiipación act. docente
    No 110.0 (62.1%)
    Sí 67.0 (37.9%)
Edad 37.4 (8.7)
    Sin dato 11
1 n (%); Mean (SD)

4 Gráfico Likert de respuesta

library(likert)
library(ggplot2)

library(dplyr)

items_directos   <- paste0("i4_", 1:11)
items_invertidos <- c(paste0("i4_", 12:15), "i5_1")

niveles <- c("Desfavorable", "Neutro", "Favorable")

BASE <- BASE %>%
  mutate(
    # Ítems directos: 1-2 = Desfavorable, 3 = Neutro, 4-5 = Favorable
    across(
      all_of(items_directos),
      ~ factor(case_when(
          . %in% 1:2 ~ "Desfavorable",
          . == 3     ~ "Neutro",
          . %in% 4:5 ~ "Favorable",
          TRUE       ~ NA_character_
        ), levels = niveles),
      .names = "{.col}_cat"
    ),
    # Ítems invertidos: 1-2 = Favorable, 3 = Neutro, 4-5 = Desfavorable
    across(
      all_of(items_invertidos),
      ~ factor(case_when(
          . %in% 1:2 ~ "Favorable",
          . == 3     ~ "Neutro",
          . %in% 4:5 ~ "Desfavorable",
          TRUE       ~ NA_character_
        ), levels = niveles),
      .names = "{.col}_cat"
    )
  )

datos_likert <- BASE %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

library(ggstats)

colores_likert <- c(
  "Desfavorable" = "indianred3",
  "Neutro"       = "#FFDEAD",
  "Favorable"    = "steelblue"
)

g_likert <- gglikert_stacked(datos_likert, labels_size = 6) +
  scale_fill_manual(values = colores_likert, name = "Respuesta") +
  ggtitle("Escala Likert", subtitle = "Actitudes Grupo Balint") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

g_likert

ggsave(
  filename = file.path("likert_balint.png"),
  plot = g_likert,
  width = 14, height = 10, dpi = 300, bg = "white",
  scale = 0.4
)
g_likert

datos_likert2 <- datos_likert
names(datos_likert2) <- c(
  "4.1. El GB mejoró mis relaciones con los pacientes",
  "4.2. El GB me ayudó a establecer una relación de apoyo con mis colegas",
  "4.3. El GB mejoró mis relaciones con otros miembros del equipo multidisciplinario",
  "4.4. El GB me proporcionó habilidades para la resolución de problemas en el entorno profesional",
  "4.5. El GB me ayudó a aliviar el agotamiento profesional (burnout)",
  "4.6. El GB facilitó un mejor manejo de los pacientes (o usuarios) en mi consulta o atención",
  "4.7. El GB mejoró mis habilidades de empatía hacia los pacientes (o usuarios)",
  "4.8. El GB me hizo sentir satisfecho (a).",
  "4.9. Mi preocupación por el autocuidado fue abordada en el GB",
  "4.10. El GB se convirtió en una valiosa red de apoyo profesional para mi",
  "4.11. El GB contribuyó al desarrollo de mi identidad profesional",
  "4.12. Las discusiones en el GB me resultaron aburridas",
  "4.13. Las discusiones en el GB son superficiales",
  "4.14. Me sentí incómodo (a) al compartir mis casos en el GB",
  "4.15. La orientación brindada en el GB no fue profesional",
  "5.1. ¿Qué tan importante considera que es la participación en el grupo Balint para su bienestar profesional?"
)


g_likert2 <- gglikert_stacked(datos_likert2, labels_size = 6) +
  scale_fill_manual(values = colores_likert, name = "Respuesta") +
  ggtitle("Escala Likert", subtitle = "Actitudes Grupo Balint") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

g_likert2

ggsave(
  filename = file.path("likert_balint2.png"),
  plot = g_likert2,
  width = 14, height = 10, dpi = 300, bg = "white",
  scale = 0.4
)
g_likert2

4.1 Gráfico para profesionales de medicina

BASE_MED <- BASE %>% filter(grupo_profesional == "Profesionales médicos")

datos_likert_MED <- BASE_MED %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert_MED) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

g_likert3 <- gglikert_stacked(datos_likert_MED, labels_size = 6) +
  scale_fill_manual(values = colores_likert, name = "Respuesta") +
  ggtitle("Escala Likert", subtitle = "Actitudes Grupo Balint Medicina") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

g_likert3

ggsave(
  filename = file.path("likert_balint3.png"),
  plot = g_likert3,
  width = 14, height = 10, dpi = 300, bg = "white",
  scale = 0.4
)
g_likert3

4.2 Gráfico profesionales de enfermería

BASE_ENF <- BASE %>% filter(grupo_profesional == "Enfermería")

datos_likert_ENF <- BASE_ENF %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert_ENF) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

g_likert4 <- gglikert_stacked(datos_likert_ENF, labels_size = 6) +
  scale_fill_manual(values = colores_likert, name = "Respuesta") +
  ggtitle("Escala Likert", subtitle = "Actitudes Grupo Balint Enfermeria") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

g_likert4

ggsave(
  filename = file.path("likert_balint4.png"),
  plot = g_likert4,
  width = 14, height = 10, dpi = 300, bg = "white",
  scale = 0.4
)
g_likert4

4.3 Gráfico otros

BASE_OTRO <- BASE %>% filter(grupo_profesional == "Otros")

datos_likert_OTRO <- BASE_OTRO %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert_OTRO) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

g_likert5 <- gglikert_stacked(datos_likert_OTRO, labels_size = 6) +
  scale_fill_manual(values = colores_likert, name = "Respuesta") +
  ggtitle("Escala Likert", subtitle = "Actitudes Grupo Balint Otras profesiones") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

g_likert5

ggsave(
  filename = file.path("likert_balint5.png"),
  plot = g_likert5,
  width = 14, height = 10, dpi = 300, bg = "white",
  scale = 0.4
)
g_likert5

Recodificando los valores de los items aparentemente invertidos

BASE <- BASE %>%
  mutate(
    across(c(i4_12, i4_13, i4_14, i4_15), ~ 6 - .)
  )

4.4 Perfilación de sujetos a partir del resultado de actitud

  • Posiblemente se peuda descubrir una actitud alta y baja
library(mclust)
DATA_PROFILES <- BASE[, 15:30]
set.seed(2025)
mc1 <-mclustBIC(BASE[,15:30]) 
summary(mc1) # 3 grupos
## Best BIC values:
##              EEE,3      EEE,1      EEV,1
## BIC      -6842.973 -6945.5907 -6945.5907
## BIC diff     0.000  -102.6181  -102.6181
set.seed(2025)
model1 <- Mclust(BASE[,15:30], modelNames = "EEE", G = 3)
summary(model1)
## ---------------------------------------------------- 
## Gaussian finite mixture model fitted by EM algorithm 
## ---------------------------------------------------- 
## 
## Mclust EEE (ellipsoidal, equal volume, shape and orientation) model with 3
## components: 
## 
##  log-likelihood   n  df       BIC       ICL
##       -2940.104 177 186 -6842.973 -6843.214
## 
## Clustering table:
##   1   2   3 
## 123   8  46

Se grafica la solucion

library(tibble)
library(tidyr)

means <- data.frame(model1$parameters$mean) %>%
  rownames_to_column() %>%
  rename(DATA_PROFILES = rowname) %>%
  pivot_longer(cols = c(X1, X2, X3), names_to = "Profile", values_to = "Mean") %>%
  mutate(
    Mean = round(Mean, 2),
    # Estandarización Z (normalización usando media y desviación estándar)
    Mean = (Mean - mean(Mean)) / sd(Mean)
  )

p <- means %>%
  mutate(
    Profile = case_when(
      Profile == "X1" ~ "P1 (123)",
      Profile == "X2" ~ "P2 (8)",
      Profile == "X3" ~ "P3 (46)",
      TRUE ~ Profile
    )
  ) %>%
  ggplot(aes(
    x = DATA_PROFILES,
    y = Mean,
    group = Profile,
    color = Profile
  )) +
  geom_point(size = 2.25) +
  geom_line(linewidth = 1.25) +
  scale_x_discrete(
    limits = c(
      "i4_1", "i4_2", "i4_3", "i4_4", "i4_5", "i4_6", "i4_7", "i4_8",
      "i4_9", "i4_10", "i4_11", "i4_12", "i4_13", "i4_14", "i4_15",
      "i5_1"
    )
  ) +
  scale_color_manual(
    values = c(
      "P1 (123)" = "blue2",
      "P2 (8)" = "green4",
      "P3 (46)" = "red"
    )
  ) +
  labs(
    x = "Items actitud",
    y = "Media estandarizada",
    color = "Perfil",
    title = "Perfiles Actitud grupo Balint"
  ) +
  theme_bw(base_size = 14) +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1, size = 20, face = "bold"),
    axis.text.y = element_text(size = 20, face = "bold"),
    axis.title.x = element_text(size = 22, face = "bold"),
    axis.title.y = element_text(size = 22, face = "bold"),
    legend.position = "right",
    legend.text = element_text(size = 15, face = "bold"),
    legend.title = element_text(size = 25, face = "bold")
  )

ggsave(
  filename = file.path("perfiles_balint.png"),
  plot = p,
  width = 14, height = 8, dpi = 300, bg = "white",
  scale = 0.5
)
p

Se encontraron 3 potenciales perfiles, de manera general da la impesión que existe un perfil de sujetos que tienen una actitud más positiva acerca del grupo Balint, sin emabrgo no encuentran gran aporte (items 5.1). Los otros se diferencian especialmente en los ítems que parecen invertidos.

4.5 Caracterización perfiles de actitud

# Extraer las clasificaciones del modelo
clases <- model1$classification

# Agregar las clases al data frame
BASE <- BASE %>%
  mutate(Perfil = clases)

BASE$Perfil <- factor(BASE$Perfil, levels = c(1, 3, 2), labels = c ("Alto", "Medio", "Bajo"))

BASE <- BASE %>% 
  mutate(Perfil2 = case_when(
    Perfil == "Alto"  ~ "Favorable",
    Perfil == "Medio" ~ "Neutro - Desfavorable",
    Perfil == "Bajo"  ~ "Neutro - Desfavorable",
    TRUE              ~ NA_character_
  ))
tabla1 <- BASE %>%
  select(
    ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado,
    durante_cuanto_tiempo_ha_participado_en_grupos_balint, genero, grupo_profesional,
    anos_de_ejercicio_profesional, esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo,
    participa_en_actividades_docentes, edad2, Perfil
  ) %>%
  tbl_summary(
    by = Perfil,
    type = list(
      all_categorical() ~ "categorical",
      edad2 ~ "continuous"
    ),
    label = list(
      ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado ~ "Participación actual o pasada en grupo Balint",
      durante_cuanto_tiempo_ha_participado_en_grupos_balint ~ "Tiempo participación grupo Balint",
      genero ~ "Género",
      grupo_profesional ~ "Grupo profesional",
      anos_de_ejercicio_profesional ~ "Años ejercicio profesional",
      esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo ~ "Desempeña cargo con personal a cargo",
      participa_en_actividades_docentes ~ "Participación act. docente",
      edad2 ~ "Edad"
    ),
    statistic = list(
      all_categorical() ~ "{n} ({p}%)",
      edad2 ~ "{median} ({p25}, {p75})"
    ),
    digits = list(
      all_categorical() ~ 1,
      edad2 ~ 1
    ),
    missing = "ifany",
    missing_text = "Sin dato"
  ) %>%
  add_p(
    test = list(
      all_categorical() ~ "chisq.test",
      all_continuous()  ~ "kruskal.test"
    ),
    pvalue_fun = ~ style_pvalue(.x, digits = 3)
  ) %>%
  add_overall(last = FALSE, col_label = "**Total**, N = {N}") %>%
  modify_header(label ~ "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Perfil**") %>%
  bold_labels() %>%
  bold_p(t = 0.05) %>%
  modify_caption("**Tabla 1**")

tabla1 %>%
  as_tibble() %>%
  write_xlsx("tabla1.xlsx")

tabla1
Tabla 1
Variable
Perfil
p-value2
Total, N = 1771 Alto
N = 123
1
Medio
N = 46
1
Bajo
N = 8
1
Participación actual o pasada en grupo Balint



0.018
    Actualmente participo en un grupo Balint. 80.0 (45.2%) 64.0 (52.0%) 14.0 (30.4%) 2.0 (25.0%)
    He participado en un grupo Balint en el pasado. 84.0 (47.5%) 53.0 (43.1%) 25.0 (54.3%) 6.0 (75.0%)
    Nunca he participado en un grupo Balint. 13.0 (7.3%) 6.0 (4.9%) 7.0 (15.2%) 0.0 (0.0%)
Tiempo participación grupo Balint



0.650
    De 1 a 2 años. 49.0 (27.7%) 36.0 (29.3%) 11.0 (23.9%) 2.0 (25.0%)
    De 2 a 3 años 10.0 (5.6%) 7.0 (5.7%) 2.0 (4.3%) 1.0 (12.5%)
    Más de 3 años. 34.0 (19.2%) 26.0 (21.1%) 8.0 (17.4%) 0.0 (0.0%)
    Menos de un año. 84.0 (47.5%) 54.0 (43.9%) 25.0 (54.3%) 5.0 (62.5%)
Género



0.621
    Femenino 133.0 (75.1%) 93.0 (75.6%) 33.0 (71.7%) 7.0 (87.5%)
    Masculino 44.0 (24.9%) 30.0 (24.4%) 13.0 (28.3%) 1.0 (12.5%)
Grupo profesional



0.505
    Profesionales médicos 93.0 (52.5%) 69.0 (56.1%) 19.0 (41.3%) 5.0 (62.5%)
    Enfermería 52.0 (29.4%) 33.0 (26.8%) 17.0 (37.0%) 2.0 (25.0%)
    Otros 32.0 (18.1%) 21.0 (17.1%) 10.0 (21.7%) 1.0 (12.5%)
Años ejercicio profesional



0.436
    11-19 años 47.0 (26.6%) 35.0 (28.5%) 10.0 (21.7%) 2.0 (25.0%)
    6-10 años 31.0 (17.5%) 17.0 (13.8%) 12.0 (26.1%) 2.0 (25.0%)
    Hasta 5 años 57.0 (32.2%) 44.0 (35.8%) 11.0 (23.9%) 2.0 (25.0%)
    Más de 20 años. 42.0 (23.7%) 27.0 (22.0%) 13.0 (28.3%) 2.0 (25.0%)
Desempeña cargo con personal a cargo



0.494
    No 100.0 (56.5%) 67.0 (54.5%) 27.0 (58.7%) 6.0 (75.0%)
    Sí 77.0 (43.5%) 56.0 (45.5%) 19.0 (41.3%) 2.0 (25.0%)
Participación act. docente



0.574
    No 110.0 (62.1%) 75.0 (61.0%) 31.0 (67.4%) 4.0 (50.0%)
    Sí 67.0 (37.9%) 48.0 (39.0%) 15.0 (32.6%) 4.0 (50.0%)
Edad 36.0 (30.0, 44.0) 35.0 (29.0, 43.0) 38.0 (31.0, 45.0) 38.5 (29.5, 45.5) 0.571
    Sin dato 11 7 4 0
1 n (%); Median (Q1, Q3)
2 Pearson’s Chi-squared test; Kruskal-Wallis rank sum test
tabla2 <- BASE %>%
  select(
    ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado,
    durante_cuanto_tiempo_ha_participado_en_grupos_balint, genero, grupo_profesional,
    anos_de_ejercicio_profesional, esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo,
    participa_en_actividades_docentes, edad2, Perfil2
  ) %>%
  tbl_summary(
    by = Perfil2,
    type = list(
      all_categorical() ~ "categorical",
      edad2 ~ "continuous"
    ),
    label = list(
      ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado ~ "Participación actual o pasada en grupo Balint",
      durante_cuanto_tiempo_ha_participado_en_grupos_balint ~ "Tiempo participación grupo Balint",
      genero ~ "Género",
      grupo_profesional ~ "Grupo profesional",
      anos_de_ejercicio_profesional ~ "Años ejercicio profesional",
      esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo ~ "Desempeña cargo con personal a cargo",
      participa_en_actividades_docentes ~ "Participación act. docente",
      edad2 ~ "Edad"
    ),
    statistic = list(
      all_categorical() ~ "{n} ({p}%)",
      edad2 ~ "{median} ({p25}, {p75})"
    ),
    digits = list(
      all_categorical() ~ 1,
      edad2 ~ 1
    ),
    missing = "ifany",
    missing_text = "Sin dato"
  ) %>%
  add_p(
    test = list(
      all_categorical() ~ "fisher.test",
      all_continuous()  ~ "kruskal.test"
    ),
    pvalue_fun = ~ style_pvalue(.x, digits = 3)
  ) %>%
  add_overall(last = FALSE, col_label = "**Total**, N = {N}") %>%
  modify_header(label ~ "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Perfil**") %>%
  bold_labels() %>%
  bold_p(t = 0.05) %>%
  modify_caption("**Tabla 1 - Ajustada**")

tabla2 %>%
  as_tibble() %>%
  write_xlsx("tabla2.xlsx")

tabla2
Tabla 1 - Ajustada
Variable
Perfil
p-value2
Total, N = 1771 Favorable
N = 123
1
Neutro - Desfavorable
N = 54
1
Participación actual o pasada en grupo Balint


0.010
    Actualmente participo en un grupo Balint. 80.0 (45.2%) 64.0 (52.0%) 16.0 (29.6%)
    He participado en un grupo Balint en el pasado. 84.0 (47.5%) 53.0 (43.1%) 31.0 (57.4%)
    Nunca he participado en un grupo Balint. 13.0 (7.3%) 6.0 (4.9%) 7.0 (13.0%)
Tiempo participación grupo Balint


0.562
    De 1 a 2 años. 49.0 (27.7%) 36.0 (29.3%) 13.0 (24.1%)
    De 2 a 3 años 10.0 (5.6%) 7.0 (5.7%) 3.0 (5.6%)
    Más de 3 años. 34.0 (19.2%) 26.0 (21.1%) 8.0 (14.8%)
    Menos de un año. 84.0 (47.5%) 54.0 (43.9%) 30.0 (55.6%)
Género


0.851
    Femenino 133.0 (75.1%) 93.0 (75.6%) 40.0 (74.1%)
    Masculino 44.0 (24.9%) 30.0 (24.4%) 14.0 (25.9%)
Grupo profesional


0.358
    Profesionales médicos 93.0 (52.5%) 69.0 (56.1%) 24.0 (44.4%)
    Enfermería 52.0 (29.4%) 33.0 (26.8%) 19.0 (35.2%)
    Otros 32.0 (18.1%) 21.0 (17.1%) 11.0 (20.4%)
Años ejercicio profesional


0.127
    11-19 años 47.0 (26.6%) 35.0 (28.5%) 12.0 (22.2%)
    6-10 años 31.0 (17.5%) 17.0 (13.8%) 14.0 (25.9%)
    Hasta 5 años 57.0 (32.2%) 44.0 (35.8%) 13.0 (24.1%)
    Más de 20 años. 42.0 (23.7%) 27.0 (22.0%) 15.0 (27.8%)
Desempeña cargo con personal a cargo


0.510
    No 100.0 (56.5%) 67.0 (54.5%) 33.0 (61.1%)
    Sí 77.0 (43.5%) 56.0 (45.5%) 21.0 (38.9%)
Participación act. docente


0.737
    No 110.0 (62.1%) 75.0 (61.0%) 35.0 (64.8%)
    Sí 67.0 (37.9%) 48.0 (39.0%) 19.0 (35.2%)
Edad 36.0 (30.0, 44.0) 35.0 (29.0, 43.0) 38.0 (30.0, 45.0) 0.290
    Sin dato 11 7 4
1 n (%); Median (Q1, Q3)
2 Fisher’s exact test; Kruskal-Wallis rank sum test

````

LS0tDQp0aXRsZTogIkFjdGl0dWQgYmFsaW50Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIyBFbGFib3JhZG8gcG9yOg0KDQp8ICpOaWNvbMOhcyBNYXJ0w61uZXogUmFtb3MqIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqKkJpb2VzdGFkw61zdGljbyBPZmljaW5hIGRlIEludmVzdGlnYWNpb25lcyoqKiB8DQp8ICoqKlBzaWPDs2xvZ28sIEVzcC4gbWVkaWNpw7NuIHkgZXZhbHVhY2nDs24gcHNpY29sw7NnaWNhIHkgbWcuIGJpb2VzdGFkw61zdGljYSoqKiB8DQoNCmBgYHtyfQ0KYGBgDQoNCiMjIEV4cGxvcmFjacOzbiBiYXNlIGRlIGRhdG9zDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpCQVNFIDwtIHJlYWRfZXhjZWwoIkFDVElUVURFUyBIQUNJQSBMT1MgR1JVUE9TIEJBTElOVCBZIFNVIElORkxVRU5DSUEgRU4gRUwgQklFTkVTVEFSIFBTSUNPU09DSUFMKDEtMTc3KS54bHN4IikgIyA1LTA4LTIwMjYNCg0KbGlicmFyeShkcGx5cikgDQpsaWJyYXJ5KGRsb29rcikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGphbml0b3IpDQoNCg0KQkFTRSA8LSBCQVNFICU+JQ0KICBjbGVhbl9uYW1lcygpICAjIENvbnZpZXJ0ZSB0b2RvIGEgc25ha2VfY2FzZSBhdXRvbcOhdGljYW1lbnRlDQpgYGANCg0KIyMjIExpbXBpZXphIGJhc2UNCg0KYGBge3J9DQojSXRlbXMgDQpuYW1lcyhCQVNFKVsxNToyOV0gPC0gcGFzdGUwKCJpNF8iLCAxOjE1KQ0KbmFtZXMoQkFTRSlbMzBdIDwtICJpNV8xIg0KDQoNCiNyZWNvZGlmaWNhbmRvIGxvcyBuaXZlbGVzIGRlIGxvcyBpdGVtcyANCkJBU0VbMTU6MzBdIDwtIGxhcHBseShCQVNFWzE1OjMwXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhnc3ViKCI9LioiLCAiIiwgeCkpKQ0KDQojY3JlYW5kbyBjb3BpYSBkZSBmYWN0b3IgZGUgbG9zIGl0ZW1zDQoNCm51ZXZhc192YXJzIDwtIGxhcHBseShCQVNFWzE1OjMwXSwgYXMuZmFjdG9yKQ0KbmFtZXMobnVldmFzX3ZhcnMpIDwtIHBhc3RlMChuYW1lcyhCQVNFKVsxNTozMF0sICJfZiIpDQpCQVNFIDwtIGNiaW5kKEJBU0UsIG51ZXZhc192YXJzKQ0KDQojVmFyaWFibGVzIHNvY2lvZGVtb2dyw6FmaWNhcw0KDQojI2VkYWQNCkJBU0UkZWRhZFtCQVNFJGVkYWQgPT0gImp1YW4gZmVybmFuZG8gY2FtYXJnbyBhcmVuYXMiXSA8LSBOQSAjSUQgMTMwDQpCQVNFJGVkYWQyIDwtIGFzLm51bWVyaWMoZ3N1YigiPS4qIiwgIiIsIEJBU0UkZWRhZCkpDQoNCiMjc2V4bw0KQkFTRSRnZW5lcm8gPC0gYXMuZmFjdG9yKGdzdWIoIl5bQS1aXVxcLlxccyoiLCAiIiwgQkFTRSRnZW5lcm8pKQ0KDQojI3Byb2Zlc2lvbg0KQkFTRSRwcm9mZXNpb25fdW5pZmljYWRhIDwtIGNhc2Vfd2hlbigNCiAgZ3JlcGwoInJlc2lkZW50IiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJSZXNpZGVudGUgZGUgbWVkaWNpbmEiLA0KICBncmVwbCgiZXNwZWNpYWxpc3RhIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNw6lkaWNvIGVzcGVjaWFsaXN0YSIsDQogIGdyZXBsKCJtZWRpY1thb10gZ2VuZXJhbHxebWVkaWNbYW9dJCIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiTcOpZGljbyBnZW5lcmFsIiwNCiAgZ3JlcGwoImVuZmVybWVyW2nDrV1hJHxhdXhpbGlhciBkZSBlbmZlcm1lciIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiQXV4aWxpYXIgZGUgZW5mZXJtZXLDrWEiLA0KICBncmVwbCgiY29vcmRpbmFkb3JhIGRlIGVuZmVybWVyIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDb29yZGluYWRvcmEgZGUgZW5mZXJtZXLDrWEiLA0KICBncmVwbCgiZW5mZXJtZXJvIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJFbmZlcm1lcm8oYSkiLA0KICBncmVwbCgidGVjbmljbyBlbiBhdXhpbGlhciIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiVMOpY25pY28gYXV4aWxpYXIgZGUgZW5mZXJtZXLDrWEiLA0KICBncmVwbCgiYWRtaW5pc3RyYXRpdm8iLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkFkbWluaXN0cmF0aXZvIiwNCiAgZ3JlcGwoImJpb2xvZyIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiQmnDs2xvZ2EiLA0KICBncmVwbCgiY2l0b2hpc3RvdGVjbm9sb2ciLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkNpdG9oaXN0b3RlY27Ds2xvZ2EiLA0KICBncmVwbCgiZmlzaW90ZXJhcGV1dGEiLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkZpc2lvdGVyYXBldXRhIiwNCiAgZ3JlcGwoImluZ2VuaWVybyBkZSBzaXN0ZW1hcyIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiSW5nZW5pZXJvIGRlIHNpc3RlbWFzIiwNCiAgZ3JlcGwoImluc3RydW1lbnRhZG9yYSIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiSW5zdHJ1bWVudGFkb3JhIHF1aXLDunJnaWNhIiwNCiAgZ3JlcGwoInF1W2nDrV1taWNbYW9dIGZhciIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiUXXDrW1pY28gZmFybWFjw6l1dGljbyIsDQogIGdyZXBsKCJeYXNpc3RlbmNpYWwkIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJBc2lzdGVuY2lhbCIsDQogIGdyZXBsKCJeWCQiLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkRlc2Nvbm9jaWRvIiwNCiAgVFJVRSB+IGFzLmNoYXJhY3RlcihCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uKQ0KKQ0KDQpCQVNFJHByb2Zlc2lvbl91bmlmaWNhZGEgPC0gYXMuZmFjdG9yKEJBU0UkcHJvZmVzaW9uX3VuaWZpY2FkYSkNCg0KIyMgZXNwZWNpYWxpZGFkDQpCQVNFJGVzcGVjaWFsaWRhZF91bmlmaWNhZGEgPC0gY2FzZV93aGVuKA0KICBncmVwbCgiYW5lc3Rlc2lvbG9nIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJBbmVzdGVzaW9sb2fDrWEiLA0KICBncmVwbCgiXmFuW2/Ds11uaW1vJCIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiRGVzY29ub2NpZG8iLA0KICBncmVwbCgiY2lydWdpYSBwZWRpYXRyaWNhfGNpcnVnW2nDrV1hIHBlZGlbYcOhXXRyaWNhIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDaXJ1Z8OtYSBwZWRpw6F0cmljYSIsDQogIGdyZXBsKCJeY2lydWphbm8kIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDaXJ1Z8OtYSBnZW5lcmFsIiwNCiAgZ3JlcGwoInBhbGlhdGl2IiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDdWlkYWRvcyBwYWxpYXRpdm9zIiwNCiAgZ3JlcGwoInVyZ2VuY2lhfGVtZXJnZW5jaWEiLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIk1lZGljaW5hIGRlIHVyZ2VuY2lhcy9lbWVyZ2VuY2lhcyIsDQogIGdyZXBsKCJuZW9uYXRvbG9nIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJOZW9uYXRvbG9nw61hIiwNCiAgZ3JlcGwoIm5ldW1vbG9nLipwZWRpYXRyfHBlZGlhdHIuKm5ldW1vbG9nIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJOZXVtb2xvZ8OtYSBwZWRpw6F0cmljYSIsDQogIGdyZXBsKCJtZWRpY2luYS4qZmFtaWxpYXJ8cmVzaWRlbnRlIGRlIG1lZGljaW5hIGZhbWlsaWFyIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNZWRpY2luYSBmYW1pbGlhciIsDQogIGdyZXBsKCJtZWRpY2luYSBpbnRlcm5hIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNZWRpY2luYSBpbnRlcm5hIiwNCiAgZ3JlcGwoIm1lZGljaW5hXFxzKmdlbmVyYWx8bWVkaWNvIGdlbmVyYWx8bcOpZGljbyBnZW5lcmFsIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNZWRpY2luYSBnZW5lcmFsIiwNCiAgZ3JlcGwoIl5nZW5lcmFsJCIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiTWVkaWNpbmEgZ2VuZXJhbCIsDQogIGdyZXBsKCJnZXJpYXRyaWF8Z2VyaWF0csOtYSIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiR2VyaWF0csOtYSIsDQogIGdyZXBsKCJoZW1hdG9sb2ciLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkhlbWF0b2xvZ8OtYSIsDQogIGdyZXBsKCJwZWRpYXRyIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJQZWRpYXRyw61hIiwNCiAgZ3JlcGwoInBhdG9sb2dpYXxwYXRvbG9nw61hfHNzdC4qcGF0b2xvZyIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiUGF0b2xvZ8OtYSIsDQogIGdyZXBsKCJwc2lxdWlhdHIiLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIlBzaXF1aWF0csOtYSIsDQogIGdyZXBsKCJyYWRpb3RlcmFwaWEiLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIlJhZGlvdGVyYXBpYSIsDQogIGdyZXBsKCJyYWRpb2xvZyIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiUmFkaW9sb2fDrWEiLA0KICBncmVwbCgidXJvbG9naWF8dXJvbG9nw61hIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJVcm9sb2fDrWEiLA0KICBUUlVFIH4gYXMuY2hhcmFjdGVyKEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQpDQopDQpCQVNFJGVzcGVjaWFsaWRhZF91bmlmaWNhZGEgPC0gYXMuZmFjdG9yKEJBU0UkZXNwZWNpYWxpZGFkX3VuaWZpY2FkYSkNCg0KIyMgYcOxb3MgZWplcmNpY2lvIHByb2Zlc2lvbmFsDQpCQVNFJGFub3NfZGVfZWplcmNpY2lvX3Byb2Zlc2lvbmFsIDwtIGFzLmZhY3Rvcihnc3ViKCJeW0EtWl1cXC5cXHMqIiwgIiIsIEJBU0UkYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwpKQ0KDQojY2FyZ28gZGVzZW1wZcOxYWRvDQpCQVNFJGVzdGFfZGVzZW1wZW5hbmRvX3VuX2NhcmdvX2VuX2VsX2N1YWxfdGVuZ2FfcGVyc29uYWxfYV9jYXJnbyA8LSBhcy5mYWN0b3IoZ3N1YigiXltBLVpdXFwuXFxzKiIsICIiLCBCQVNFJGVzdGFfZGVzZW1wZW5hbmRvX3VuX2NhcmdvX2VuX2VsX2N1YWxfdGVuZ2FfcGVyc29uYWxfYV9jYXJnbykpDQoNCiNwYXJ0aWNpcGFjaW8gbmVuIGFjdGl2aWRhZGVzIGRvY2VudGVzDQpCQVNFJHBhcnRpY2lwYV9lbl9hY3RpdmlkYWRlc19kb2NlbnRlcyA8LSBhcy5mYWN0b3IoZ3N1YigiXltBLVpdXFwuXFxzKiIsICIiLCBCQVNFJHBhcnRpY2lwYV9lbl9hY3RpdmlkYWRlc19kb2NlbnRlcykpDQoNCg0KDQoNCg0KDQoNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoc3RyaW5naSkNCg0KIyAxLiBOb3JtYWxpemFyIHRleHRvOiBtaW7DunNjdWxhcywgc2luIHRpbGRlcywgc2luIGVzcGFjaW9zIGV4dHJhDQplc3AgPC0gQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiAlPiUNCiAgc3RyX3RvX2xvd2VyKCkgJT4lDQogIHN0cmlfdHJhbnNfZ2VuZXJhbCgiTGF0aW4tQVNDSUkiKSAlPiUNCiAgc3RyX3NxdWlzaCgpDQoNCiMgMi4gUGF0cm9uZXMNCnBhdF9lbmZlcm1lcmlhIDwtICJlbmZlcm1lcnxhdXhpbGlhciINCnBhdF9tZWRpY28gPC0gcGFzdGUoDQogICJhbmVzdGVzIiwgImNpcnVnIiwgInBhbGlhdGl2IiwgImRvbG9yIiwgImVtZXJnZW5jIiwgInVyZ2VuYyIsDQogICJmZWxsb3ciLCAibmVvbmF0IiwgImdlbmVyYWwiLCAiZ2VyaWF0ciIsICJoZW1hdCIsICJtZWRpY2luYSIsDQogICJtZWRpY28iLCAicGVkaWF0ciIsICJwYXRvbG9nIiwgInBzaXF1aWF0IiwgInJhZGlvbCIsICJyYWRpb3RlciIsDQogICJyZXNpZGVudGUiLCAidXJvbG9nIiwgIm5ldW1vbCIsDQogIHNlcCA9ICJ8Ig0KKQ0KDQojIDMuIE51ZXZhIHZhcmlhYmxlIChyZXNpZGVudGVzIHkgZmVsbG93cyBxdWVkYW4gZW4gbcOpZGljb3MpDQpCQVNFJGdydXBvX3Byb2Zlc2lvbmFsIDwtIGNhc2Vfd2hlbigNCiAgc3RyX2RldGVjdChlc3AsIHBhdF9lbmZlcm1lcmlhKSB+ICJFbmZlcm1lcsOtYSIsDQogIHN0cl9kZXRlY3QoZXNwLCBwYXRfbWVkaWNvKSAgICAgfiAiUHJvZmVzaW9uYWxlcyBtw6lkaWNvcyIsDQogIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAiT3Ryb3MiDQopICU+JQ0KICBmYWN0b3IobGV2ZWxzID0gYygiUHJvZmVzaW9uYWxlcyBtw6lkaWNvcyIsICJFbmZlcm1lcsOtYSIsICJPdHJvcyIpKQ0KDQoNCg0KYGBgDQoNCiMjIEFuw6FsaXNpcyBkZXNjcmlwdGl2byAoc2luIMOtdGVtcykNCg0KZWRhZCBzZSByZXBvcnTDsyBjb21vIHZhcmlhYmxlIGNvbnRpbnVhLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ3RzdW1tYXJ5KQ0KdGFibGEwIDwtIEJBU0UgJT4lDQogIHNlbGVjdChoYV9wYXJ0aWNpcGFkb19hbGd1bmFfdmV6X2VuX3VuX2dydXBvX2JhbGludF95YV9zZWFfYWN0dWFsbWVudGVfb19lbl9lbF9wYXNhZG8sIGR1cmFudGVfY3VhbnRvX3RpZW1wb19oYV9wYXJ0aWNpcGFkb19lbl9ncnVwb3NfYmFsaW50LCBhX2R1cmFudGVfbWlzX2VzdHVkaW9zX2RlX3ByZWdyYWRvLCBiX2R1cmFudGVfbGFfcmVzaWRlbmNpYV9tZWRpY2EsDQpjX2NvbW9fZXNwZWNpYWxpc3RhX3N1YmVzcGVjaWFsaXN0YSwgZF9kdXJhbnRlX21pc19lc3R1ZGlvc19wYXJhX3N1YmVzcGVjaWFsaXN0YSwgZV9jb21vX2F1eGlsaWFyX2RlX2VuZmVybWVyaWFfZW5mZXJtZXIsIGZfY29tb19hZG1pbmlzdHJhdGl2bywgZ2VuZXJvLCBncnVwb19wcm9mZXNpb25hbCwgcHJvZmVzaW9uX3VuaWZpY2FkYSwgZXNwZWNpYWxpZGFkX3VuaWZpY2FkYSwgYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwsIGVzdGFfZGVzZW1wZW5hbmRvX3VuX2NhcmdvX2VuX2VsX2N1YWxfdGVuZ2FfcGVyc29uYWxfYV9jYXJnbywgcGFydGljaXBhX2VuX2FjdGl2aWRhZGVzX2RvY2VudGVzLCBlZGFkMikgJT4lDQogIHRibF9zdW1tYXJ5KA0KICAgIHR5cGUgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAiY2F0ZWdvcmljYWwiLA0KICAgICAgZWRhZDIgfiAiY29udGludW91cyINCiAgICApLA0KICAgIGxhYmVsID0gbGlzdCgNCiAgICAgIGhhX3BhcnRpY2lwYWRvX2FsZ3VuYV92ZXpfZW5fdW5fZ3J1cG9fYmFsaW50X3lhX3NlYV9hY3R1YWxtZW50ZV9vX2VuX2VsX3Bhc2FkbyB+ICJQYXJ0aWNpcGFjacOzbiBhY3R1YWwgbyBwYXNhZGEgZW4gZ3J1cG8gYmFsaW50IiwgDQogICAgICBkdXJhbnRlX2N1YW50b190aWVtcG9faGFfcGFydGljaXBhZG9fZW5fZ3J1cG9zX2JhbGludCB+ICJUaWVtcG8gcGFydGljaXBhY2nDs24gZ3JwbyBiYWxpbnQiLCANCiAgICAgIGFfZHVyYW50ZV9taXNfZXN0dWRpb3NfZGVfcHJlZ3JhZG8gfiAiRHVyYW50ZSBwcmVncmFkbyIsIA0KICAgICAgYl9kdXJhbnRlX2xhX3Jlc2lkZW5jaWFfbWVkaWNhIH4gIkR1cmFudGUgUmVzaWRlbmNpYSBtw6lkaWNhIiwNCiAgICAgIGNfY29tb19lc3BlY2lhbGlzdGFfc3ViZXNwZWNpYWxpc3RhIH4gIkNvbW8gRXNwZWNpYWxpc3RhIC0gc3ViZXNwZWNpYWxpc3RhIiwgDQogICAgICBkX2R1cmFudGVfbWlzX2VzdHVkaW9zX3BhcmFfc3ViZXNwZWNpYWxpc3RhIH4gIkR1cmFudGUgZXN0dWRpb3Mgc3ViZXNwZWNpYWxpZGFkIiwgDQogICAgICBlX2NvbW9fYXV4aWxpYXJfZGVfZW5mZXJtZXJpYV9lbmZlcm1lciB+ICJDb21vIGF1eGlsaWFyIGRlIGVuZmVybWVyw61hIiwgDQogICAgICBmX2NvbW9fYWRtaW5pc3RyYXRpdm8gfiAiQ29tbyBhZG1pbmlzdHJhdGl2byIsIA0KICAgICAgZ2VuZXJvIH4gIkfDqW5lcm8iLCANCiAgICAgIGdydXBvX3Byb2Zlc2lvbmFsIH4gIkdydXBvIHByb2Zlc2lvbmFsIiwNCiAgICAgIHByb2Zlc2lvbl91bmlmaWNhZGEgfiAiUHJvZmVzaW9uIiwgDQogICAgICBlc3BlY2lhbGlkYWRfdW5pZmljYWRhIH4gIkVzcGVjaWFsaWRhZCIsIA0KICAgICAgYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwgfiAiQcOxb3MgZWplcmNpY2lvIHByb2Zlc2lvbmFsIiwgDQogICAgICBlc3RhX2Rlc2VtcGVuYW5kb191bl9jYXJnb19lbl9lbF9jdWFsX3RlbmdhX3BlcnNvbmFsX2FfY2FyZ28gfiAiRGVzZW1wZcOxbyB0cmFiYWpvIGVuIHF1ZSBlbCB0ZW5nYSBwZXJzb25hbCBhIGNhcmdvIiwgDQogICAgICBwYXJ0aWNpcGFfZW5fYWN0aXZpZGFkZXNfZG9jZW50ZXMgfiAiUGFydGlpcGFjacOzbiBhY3QuIGRvY2VudGUiLA0KICAgICAgZWRhZDIgfiAiRWRhZCINCiAgICApLA0KICAgIHN0YXRpc3RpYyA9IGxpc3QoDQogICAgICBhbGxfY2F0ZWdvcmljYWwoKSB+ICJ7bn0gKHtwfSUpIiwNCiAgICAgIGVkYWQyIH4gInttZWFufSAoe3NkfSkiDQogICAgKSwNCiAgICBkaWdpdHMgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAxLA0KICAgICAgZWRhZDIgfiAxDQogICAgKSwNCiAgICBtaXNzaW5nID0gImlmYW55IiwNCiAgICBtaXNzaW5nX3RleHQgPSAiU2luIGRhdG8iDQogICkgJT4lDQogIG1vZGlmeV9oZWFkZXIobGFiZWwgfiAiKipWYXJpYWJsZSoqIikgJT4lDQogIGJvbGRfbGFiZWxzKCkgJT4lDQogIG1vZGlmeV9jYXB0aW9uKCIqKlRhYmxhIDEqKiIpDQoNCg0KbGlicmFyeSh3cml0ZXhsKQ0KDQp0YWJsYTAgJT4lDQogIGFzX3RpYmJsZSgpICU+JQ0KICB3cml0ZV94bHN4KCJ0YWJsYTAueGxzeCIpDQp0YWJsYTANCg0KDQoNCmBgYA0KDQojIyBHcsOhZmljbyBMaWtlcnQgZGUgcmVzcHVlc3RhDQoNCmBgYHtyfQ0KbGlicmFyeShsaWtlcnQpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmxpYnJhcnkoZHBseXIpDQoNCml0ZW1zX2RpcmVjdG9zICAgPC0gcGFzdGUwKCJpNF8iLCAxOjExKQ0KaXRlbXNfaW52ZXJ0aWRvcyA8LSBjKHBhc3RlMCgiaTRfIiwgMTI6MTUpLCAiaTVfMSIpDQoNCm5pdmVsZXMgPC0gYygiRGVzZmF2b3JhYmxlIiwgIk5ldXRybyIsICJGYXZvcmFibGUiKQ0KDQpCQVNFIDwtIEJBU0UgJT4lDQogIG11dGF0ZSgNCiAgICAjIMONdGVtcyBkaXJlY3RvczogMS0yID0gRGVzZmF2b3JhYmxlLCAzID0gTmV1dHJvLCA0LTUgPSBGYXZvcmFibGUNCiAgICBhY3Jvc3MoDQogICAgICBhbGxfb2YoaXRlbXNfZGlyZWN0b3MpLA0KICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKA0KICAgICAgICAgIC4gJWluJSAxOjIgfiAiRGVzZmF2b3JhYmxlIiwNCiAgICAgICAgICAuID09IDMgICAgIH4gIk5ldXRybyIsDQogICAgICAgICAgLiAlaW4lIDQ6NSB+ICJGYXZvcmFibGUiLA0KICAgICAgICAgIFRSVUUgICAgICAgfiBOQV9jaGFyYWN0ZXJfDQogICAgICAgICksIGxldmVscyA9IG5pdmVsZXMpLA0KICAgICAgLm5hbWVzID0gInsuY29sfV9jYXQiDQogICAgKSwNCiAgICAjIMONdGVtcyBpbnZlcnRpZG9zOiAxLTIgPSBGYXZvcmFibGUsIDMgPSBOZXV0cm8sIDQtNSA9IERlc2Zhdm9yYWJsZQ0KICAgIGFjcm9zcygNCiAgICAgIGFsbF9vZihpdGVtc19pbnZlcnRpZG9zKSwNCiAgICAgIH4gZmFjdG9yKGNhc2Vfd2hlbigNCiAgICAgICAgICAuICVpbiUgMToyIH4gIkZhdm9yYWJsZSIsDQogICAgICAgICAgLiA9PSAzICAgICB+ICJOZXV0cm8iLA0KICAgICAgICAgIC4gJWluJSA0OjUgfiAiRGVzZmF2b3JhYmxlIiwNCiAgICAgICAgICBUUlVFICAgICAgIH4gTkFfY2hhcmFjdGVyXw0KICAgICAgICApLCBsZXZlbHMgPSBuaXZlbGVzKSwNCiAgICAgIC5uYW1lcyA9ICJ7LmNvbH1fY2F0Ig0KICAgICkNCiAgKQ0KDQpkYXRvc19saWtlcnQgPC0gQkFTRSAlPiUNCiAgc2VsZWN0KGk0XzFfY2F0LCBpNF8yX2NhdCwgaTRfM19jYXQsIGk0XzRfY2F0LCBpNF81X2NhdCwgaTRfNl9jYXQsIGk0XzdfY2F0LCBpNF84X2NhdCwgaTRfOV9jYXQsIGk0XzEwX2NhdCwgaTRfMTFfY2F0LCBpNF8xMl9jYXQsIGk0XzEzX2NhdCwgaTRfMTRfY2F0LCBpNF8xNV9jYXQsIGk1XzFfY2F0KQ0KDQpuYW1lcyhkYXRvc19saWtlcnQpIDwtIGMoDQogICI0LjEgUmVsYWNpb25lcyBjb24gcGFjaWVudGVzIiwNCiAgIjQuMiBSZWxhY2nDs24gYXBveW8gY29sZWdhcyIsDQogICI0LjMgTWVqb3LDsyByZWxhY2lvbmVzIGVxdWlwbyIsDQogICI0LjQgUmVzb2x1Y2nDs24gZGUgcHJvYmxlbWFzIiwNCiAgIjQuNSBEaXNtaW51ecOzIGJ1cm5vdXQiLA0KICAiNC42IE1hbmVqbyBkZSBwYWNpZW50ZXMiLA0KICAiNC43IEVtcGF0w61hIiwNCiAgIjQuOCBTYXRpc2ZhY2Npw7NuIiwNCiAgIjQuOSBBdXRvY3VpZGFkbyIsDQogICI0LjEwIFJlZCBkZSBhcG95byIsDQogICI0LjExIElkZW50aWRhZCBwcm9mZXNpb25hbCIsDQogICI0LjEyIERpc2N1c2lvbmVzIGFidXJyaWRhcyIsDQogICI0LjEzIERpc2N1c2lvbmVzIHN1cGVyZmljaWFsZXMiLA0KICAiNC4xNCBJbmNvbW9kaWRhZCBhbCBjb21wYXJ0aXIiLA0KICAiNC4xNSBPcmllbnRhY2nDs24gbm8gcHJvZmVzaW9uYWwiLA0KICAiNS4xIEltcG9ydGFuY2lhIGRlbCBHcnVwbyBCYWxpbnQiDQopDQoNCmxpYnJhcnkoZ2dzdGF0cykNCg0KY29sb3Jlc19saWtlcnQgPC0gYygNCiAgIkRlc2Zhdm9yYWJsZSIgPSAiaW5kaWFucmVkMyIsDQogICJOZXV0cm8iICAgICAgID0gIiNGRkRFQUQiLA0KICAiRmF2b3JhYmxlIiAgICA9ICJzdGVlbGJsdWUiDQopDQoNCmdfbGlrZXJ0IDwtIGdnbGlrZXJ0X3N0YWNrZWQoZGF0b3NfbGlrZXJ0LCBsYWJlbHNfc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3Jlc19saWtlcnQsIG5hbWUgPSAiUmVzcHVlc3RhIikgKw0KICBnZ3RpdGxlKCJFc2NhbGEgTGlrZXJ0Iiwgc3VidGl0bGUgPSAiQWN0aXR1ZGVzIEdydXBvIEJhbGludCIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjApLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9IE5BKQ0KICApDQoNCmdfbGlrZXJ0DQoNCmdnc2F2ZSgNCiAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoImxpa2VydF9iYWxpbnQucG5nIiksDQogIHBsb3QgPSBnX2xpa2VydCwNCiAgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiLA0KICBzY2FsZSA9IDAuNA0KKQ0KZ19saWtlcnQNCmBgYA0KDQpgYGB7cn0NCmRhdG9zX2xpa2VydDIgPC0gZGF0b3NfbGlrZXJ0DQpuYW1lcyhkYXRvc19saWtlcnQyKSA8LSBjKA0KICAiNC4xLiBFbCBHQiBtZWpvcsOzIG1pcyByZWxhY2lvbmVzIGNvbiBsb3MgcGFjaWVudGVzIiwNCiAgIjQuMi4gRWwgR0IgbWUgYXl1ZMOzIGEgZXN0YWJsZWNlciB1bmEgcmVsYWNpw7NuIGRlIGFwb3lvIGNvbiBtaXMgY29sZWdhcyIsDQogICI0LjMuIEVsIEdCIG1lam9yw7MgbWlzIHJlbGFjaW9uZXMgY29uIG90cm9zIG1pZW1icm9zIGRlbCBlcXVpcG8gbXVsdGlkaXNjaXBsaW5hcmlvIiwNCiAgIjQuNC4gRWwgR0IgbWUgcHJvcG9yY2lvbsOzIGhhYmlsaWRhZGVzIHBhcmEgbGEgcmVzb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGVuIGVsIGVudG9ybm8gcHJvZmVzaW9uYWwiLA0KICAiNC41LiBFbCBHQiBtZSBheXVkw7MgYSBhbGl2aWFyIGVsIGFnb3RhbWllbnRvIHByb2Zlc2lvbmFsIChidXJub3V0KSIsDQogICI0LjYuIEVsIEdCIGZhY2lsaXTDsyB1biBtZWpvciBtYW5lam8gZGUgbG9zIHBhY2llbnRlcyAobyB1c3VhcmlvcykgZW4gbWkgY29uc3VsdGEgbyBhdGVuY2nDs24iLA0KICAiNC43LiBFbCBHQiBtZWpvcsOzIG1pcyBoYWJpbGlkYWRlcyBkZSBlbXBhdMOtYSBoYWNpYSBsb3MgcGFjaWVudGVzIChvIHVzdWFyaW9zKSIsDQogICI0LjguIEVsIEdCIG1lIGhpem8gc2VudGlyIHNhdGlzZmVjaG8gKGEpLiIsDQogICI0LjkuIE1pIHByZW9jdXBhY2nDs24gcG9yIGVsIGF1dG9jdWlkYWRvIGZ1ZSBhYm9yZGFkYSBlbiBlbCBHQiIsDQogICI0LjEwLiBFbCBHQiBzZSBjb252aXJ0acOzIGVuIHVuYSB2YWxpb3NhIHJlZCBkZSBhcG95byBwcm9mZXNpb25hbCBwYXJhIG1pIiwNCiAgIjQuMTEuIEVsIEdCIGNvbnRyaWJ1ecOzIGFsIGRlc2Fycm9sbG8gZGUgbWkgaWRlbnRpZGFkIHByb2Zlc2lvbmFsIiwNCiAgIjQuMTIuIExhcyBkaXNjdXNpb25lcyBlbiBlbCBHQiBtZSByZXN1bHRhcm9uIGFidXJyaWRhcyIsDQogICI0LjEzLiBMYXMgZGlzY3VzaW9uZXMgZW4gZWwgR0Igc29uIHN1cGVyZmljaWFsZXMiLA0KICAiNC4xNC4gTWUgc2VudMOtIGluY8OzbW9kbyAoYSkgYWwgY29tcGFydGlyIG1pcyBjYXNvcyBlbiBlbCBHQiIsDQogICI0LjE1LiBMYSBvcmllbnRhY2nDs24gYnJpbmRhZGEgZW4gZWwgR0Igbm8gZnVlIHByb2Zlc2lvbmFsIiwNCiAgIjUuMS4gwr9RdcOpIHRhbiBpbXBvcnRhbnRlIGNvbnNpZGVyYSBxdWUgZXMgbGEgcGFydGljaXBhY2nDs24gZW4gZWwgZ3J1cG8gQmFsaW50IHBhcmEgc3UgYmllbmVzdGFyIHByb2Zlc2lvbmFsPyINCikNCg0KDQpnX2xpa2VydDIgPC0gZ2dsaWtlcnRfc3RhY2tlZChkYXRvc19saWtlcnQyLCBsYWJlbHNfc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3Jlc19saWtlcnQsIG5hbWUgPSAiUmVzcHVlc3RhIikgKw0KICBnZ3RpdGxlKCJFc2NhbGEgTGlrZXJ0Iiwgc3VidGl0bGUgPSAiQWN0aXR1ZGVzIEdydXBvIEJhbGludCIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjApLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9IE5BKQ0KICApDQoNCmdfbGlrZXJ0Mg0KDQpnZ3NhdmUoDQogIGZpbGVuYW1lID0gZmlsZS5wYXRoKCJsaWtlcnRfYmFsaW50Mi5wbmciKSwNCiAgcGxvdCA9IGdfbGlrZXJ0MiwNCiAgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiLA0KICBzY2FsZSA9IDAuNA0KKQ0KZ19saWtlcnQyDQoNCmBgYA0KDQojIyMgR3LDoWZpY28gcGFyYSBwcm9mZXNpb25hbGVzIGRlIG1lZGljaW5hDQoNCmBgYHtyfQ0KQkFTRV9NRUQgPC0gQkFTRSAlPiUgZmlsdGVyKGdydXBvX3Byb2Zlc2lvbmFsID09ICJQcm9mZXNpb25hbGVzIG3DqWRpY29zIikNCg0KZGF0b3NfbGlrZXJ0X01FRCA8LSBCQVNFX01FRCAlPiUNCiAgc2VsZWN0KGk0XzFfY2F0LCBpNF8yX2NhdCwgaTRfM19jYXQsIGk0XzRfY2F0LCBpNF81X2NhdCwgaTRfNl9jYXQsIGk0XzdfY2F0LCBpNF84X2NhdCwgaTRfOV9jYXQsIGk0XzEwX2NhdCwgaTRfMTFfY2F0LCBpNF8xMl9jYXQsIGk0XzEzX2NhdCwgaTRfMTRfY2F0LCBpNF8xNV9jYXQsIGk1XzFfY2F0KQ0KDQpuYW1lcyhkYXRvc19saWtlcnRfTUVEKSA8LSBjKA0KICAiNC4xIFJlbGFjaW9uZXMgY29uIHBhY2llbnRlcyIsDQogICI0LjIgUmVsYWNpw7NuIGFwb3lvIGNvbGVnYXMiLA0KICAiNC4zIE1lam9yw7MgcmVsYWNpb25lcyBlcXVpcG8iLA0KICAiNC40IFJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyIsDQogICI0LjUgRGlzbWludXnDsyBidXJub3V0IiwNCiAgIjQuNiBNYW5lam8gZGUgcGFjaWVudGVzIiwNCiAgIjQuNyBFbXBhdMOtYSIsDQogICI0LjggU2F0aXNmYWNjacOzbiIsDQogICI0LjkgQXV0b2N1aWRhZG8iLA0KICAiNC4xMCBSZWQgZGUgYXBveW8iLA0KICAiNC4xMSBJZGVudGlkYWQgcHJvZmVzaW9uYWwiLA0KICAiNC4xMiBEaXNjdXNpb25lcyBhYnVycmlkYXMiLA0KICAiNC4xMyBEaXNjdXNpb25lcyBzdXBlcmZpY2lhbGVzIiwNCiAgIjQuMTQgSW5jb21vZGlkYWQgYWwgY29tcGFydGlyIiwNCiAgIjQuMTUgT3JpZW50YWNpw7NuIG5vIHByb2Zlc2lvbmFsIiwNCiAgIjUuMSBJbXBvcnRhbmNpYSBkZWwgR3J1cG8gQmFsaW50Ig0KKQ0KDQpnX2xpa2VydDMgPC0gZ2dsaWtlcnRfc3RhY2tlZChkYXRvc19saWtlcnRfTUVELCBsYWJlbHNfc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3Jlc19saWtlcnQsIG5hbWUgPSAiUmVzcHVlc3RhIikgKw0KICBnZ3RpdGxlKCJFc2NhbGEgTGlrZXJ0Iiwgc3VidGl0bGUgPSAiQWN0aXR1ZGVzIEdydXBvIEJhbGludCBNZWRpY2luYSIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjApLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9IE5BKQ0KICApDQoNCmdfbGlrZXJ0Mw0KDQpnZ3NhdmUoDQogIGZpbGVuYW1lID0gZmlsZS5wYXRoKCJsaWtlcnRfYmFsaW50My5wbmciKSwNCiAgcGxvdCA9IGdfbGlrZXJ0MywNCiAgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiLA0KICBzY2FsZSA9IDAuNA0KKQ0KZ19saWtlcnQzDQoNCg0KDQpgYGANCg0KIyMjIEdyw6FmaWNvIHByb2Zlc2lvbmFsZXMgZGUgZW5mZXJtZXLDrWENCg0KYGBge3J9DQpCQVNFX0VORiA8LSBCQVNFICU+JSBmaWx0ZXIoZ3J1cG9fcHJvZmVzaW9uYWwgPT0gIkVuZmVybWVyw61hIikNCg0KZGF0b3NfbGlrZXJ0X0VORiA8LSBCQVNFX0VORiAlPiUNCiAgc2VsZWN0KGk0XzFfY2F0LCBpNF8yX2NhdCwgaTRfM19jYXQsIGk0XzRfY2F0LCBpNF81X2NhdCwgaTRfNl9jYXQsIGk0XzdfY2F0LCBpNF84X2NhdCwgaTRfOV9jYXQsIGk0XzEwX2NhdCwgaTRfMTFfY2F0LCBpNF8xMl9jYXQsIGk0XzEzX2NhdCwgaTRfMTRfY2F0LCBpNF8xNV9jYXQsIGk1XzFfY2F0KQ0KDQpuYW1lcyhkYXRvc19saWtlcnRfRU5GKSA8LSBjKA0KICAiNC4xIFJlbGFjaW9uZXMgY29uIHBhY2llbnRlcyIsDQogICI0LjIgUmVsYWNpw7NuIGFwb3lvIGNvbGVnYXMiLA0KICAiNC4zIE1lam9yw7MgcmVsYWNpb25lcyBlcXVpcG8iLA0KICAiNC40IFJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyIsDQogICI0LjUgRGlzbWludXnDsyBidXJub3V0IiwNCiAgIjQuNiBNYW5lam8gZGUgcGFjaWVudGVzIiwNCiAgIjQuNyBFbXBhdMOtYSIsDQogICI0LjggU2F0aXNmYWNjacOzbiIsDQogICI0LjkgQXV0b2N1aWRhZG8iLA0KICAiNC4xMCBSZWQgZGUgYXBveW8iLA0KICAiNC4xMSBJZGVudGlkYWQgcHJvZmVzaW9uYWwiLA0KICAiNC4xMiBEaXNjdXNpb25lcyBhYnVycmlkYXMiLA0KICAiNC4xMyBEaXNjdXNpb25lcyBzdXBlcmZpY2lhbGVzIiwNCiAgIjQuMTQgSW5jb21vZGlkYWQgYWwgY29tcGFydGlyIiwNCiAgIjQuMTUgT3JpZW50YWNpw7NuIG5vIHByb2Zlc2lvbmFsIiwNCiAgIjUuMSBJbXBvcnRhbmNpYSBkZWwgR3J1cG8gQmFsaW50Ig0KKQ0KDQpnX2xpa2VydDQgPC0gZ2dsaWtlcnRfc3RhY2tlZChkYXRvc19saWtlcnRfRU5GLCBsYWJlbHNfc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3Jlc19saWtlcnQsIG5hbWUgPSAiUmVzcHVlc3RhIikgKw0KICBnZ3RpdGxlKCJFc2NhbGEgTGlrZXJ0Iiwgc3VidGl0bGUgPSAiQWN0aXR1ZGVzIEdydXBvIEJhbGludCBFbmZlcm1lcmlhIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDI1LCBjb2xvciA9ICJibGFjayIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpDQogICkNCg0KZ19saWtlcnQ0DQoNCmdnc2F2ZSgNCiAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoImxpa2VydF9iYWxpbnQ0LnBuZyIpLA0KICBwbG90ID0gZ19saWtlcnQ0LA0KICB3aWR0aCA9IDE0LCBoZWlnaHQgPSAxMCwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIsDQogIHNjYWxlID0gMC40DQopDQpnX2xpa2VydDQNCmBgYA0KDQojIyMgR3LDoWZpY28gb3Ryb3MNCg0KYGBge3J9DQpCQVNFX09UUk8gPC0gQkFTRSAlPiUgZmlsdGVyKGdydXBvX3Byb2Zlc2lvbmFsID09ICJPdHJvcyIpDQoNCmRhdG9zX2xpa2VydF9PVFJPIDwtIEJBU0VfT1RSTyAlPiUNCiAgc2VsZWN0KGk0XzFfY2F0LCBpNF8yX2NhdCwgaTRfM19jYXQsIGk0XzRfY2F0LCBpNF81X2NhdCwgaTRfNl9jYXQsIGk0XzdfY2F0LCBpNF84X2NhdCwgaTRfOV9jYXQsIGk0XzEwX2NhdCwgaTRfMTFfY2F0LCBpNF8xMl9jYXQsIGk0XzEzX2NhdCwgaTRfMTRfY2F0LCBpNF8xNV9jYXQsIGk1XzFfY2F0KQ0KDQpuYW1lcyhkYXRvc19saWtlcnRfT1RSTykgPC0gYygNCiAgIjQuMSBSZWxhY2lvbmVzIGNvbiBwYWNpZW50ZXMiLA0KICAiNC4yIFJlbGFjacOzbiBhcG95byBjb2xlZ2FzIiwNCiAgIjQuMyBNZWpvcsOzIHJlbGFjaW9uZXMgZXF1aXBvIiwNCiAgIjQuNCBSZXNvbHVjacOzbiBkZSBwcm9ibGVtYXMiLA0KICAiNC41IERpc21pbnV5w7MgYnVybm91dCIsDQogICI0LjYgTWFuZWpvIGRlIHBhY2llbnRlcyIsDQogICI0LjcgRW1wYXTDrWEiLA0KICAiNC44IFNhdGlzZmFjY2nDs24iLA0KICAiNC45IEF1dG9jdWlkYWRvIiwNCiAgIjQuMTAgUmVkIGRlIGFwb3lvIiwNCiAgIjQuMTEgSWRlbnRpZGFkIHByb2Zlc2lvbmFsIiwNCiAgIjQuMTIgRGlzY3VzaW9uZXMgYWJ1cnJpZGFzIiwNCiAgIjQuMTMgRGlzY3VzaW9uZXMgc3VwZXJmaWNpYWxlcyIsDQogICI0LjE0IEluY29tb2RpZGFkIGFsIGNvbXBhcnRpciIsDQogICI0LjE1IE9yaWVudGFjacOzbiBubyBwcm9mZXNpb25hbCIsDQogICI1LjEgSW1wb3J0YW5jaWEgZGVsIEdydXBvIEJhbGludCINCikNCg0KZ19saWtlcnQ1IDwtIGdnbGlrZXJ0X3N0YWNrZWQoZGF0b3NfbGlrZXJ0X09UUk8sIGxhYmVsc19zaXplID0gNikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzX2xpa2VydCwgbmFtZSA9ICJSZXNwdWVzdGEiKSArDQogIGdndGl0bGUoIkVzY2FsYSBMaWtlcnQiLCBzdWJ0aXRsZSA9ICJBY3RpdHVkZXMgR3J1cG8gQmFsaW50IE90cmFzIHByb2Zlc2lvbmVzIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDI1LCBjb2xvciA9ICJibGFjayIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpDQogICkNCg0KZ19saWtlcnQ1DQoNCmdnc2F2ZSgNCiAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoImxpa2VydF9iYWxpbnQ1LnBuZyIpLA0KICBwbG90ID0gZ19saWtlcnQ1LA0KICB3aWR0aCA9IDE0LCBoZWlnaHQgPSAxMCwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIsDQogIHNjYWxlID0gMC40DQopDQpnX2xpa2VydDUNCmBgYA0KDQoqUmVjb2RpZmljYW5kbyBsb3MgdmFsb3JlcyBkZSBsb3MgaXRlbXMgYXBhcmVudGVtZW50ZSBpbnZlcnRpZG9zKg0KDQpgYGB7cn0NCkJBU0UgPC0gQkFTRSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcyhjKGk0XzEyLCBpNF8xMywgaTRfMTQsIGk0XzE1KSwgfiA2IC0gLikNCiAgKQ0KDQpgYGANCg0KDQojIyMgUGVyZmlsYWNpw7NuIGRlIHN1amV0b3MgYSBwYXJ0aXIgZGVsIHJlc3VsdGFkbyBkZSBhY3RpdHVkDQoNCi0gUG9zaWJsZW1lbnRlIHNlIHBldWRhIGRlc2N1YnJpciB1bmEgYWN0aXR1ZCBhbHRhIHkgYmFqYQ0KDQpgYGB7cn0NCmxpYnJhcnkobWNsdXN0KQ0KREFUQV9QUk9GSUxFUyA8LSBCQVNFWywgMTU6MzBdDQpzZXQuc2VlZCgyMDI1KQ0KbWMxIDwtbWNsdXN0QklDKEJBU0VbLDE1OjMwXSkgDQpzdW1tYXJ5KG1jMSkgIyAzIGdydXBvcw0KDQpgYGANCg0KYGBge3J9DQpzZXQuc2VlZCgyMDI1KQ0KbW9kZWwxIDwtIE1jbHVzdChCQVNFWywxNTozMF0sIG1vZGVsTmFtZXMgPSAiRUVFIiwgRyA9IDMpDQpzdW1tYXJ5KG1vZGVsMSkNCg0KYGBgDQoNCioqU2UgZ3JhZmljYSBsYSBzb2x1Y2lvbioqDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KHRpZHlyKQ0KDQptZWFucyA8LSBkYXRhLmZyYW1lKG1vZGVsMSRwYXJhbWV0ZXJzJG1lYW4pICU+JQ0KICByb3duYW1lc190b19jb2x1bW4oKSAlPiUNCiAgcmVuYW1lKERBVEFfUFJPRklMRVMgPSByb3duYW1lKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKFgxLCBYMiwgWDMpLCBuYW1lc190byA9ICJQcm9maWxlIiwgdmFsdWVzX3RvID0gIk1lYW4iKSAlPiUNCiAgbXV0YXRlKA0KICAgIE1lYW4gPSByb3VuZChNZWFuLCAyKSwNCiAgICAjIEVzdGFuZGFyaXphY2nDs24gWiAobm9ybWFsaXphY2nDs24gdXNhbmRvIG1lZGlhIHkgZGVzdmlhY2nDs24gZXN0w6FuZGFyKQ0KICAgIE1lYW4gPSAoTWVhbiAtIG1lYW4oTWVhbikpIC8gc2QoTWVhbikNCiAgKQ0KDQpwIDwtIG1lYW5zICU+JQ0KICBtdXRhdGUoDQogICAgUHJvZmlsZSA9IGNhc2Vfd2hlbigNCiAgICAgIFByb2ZpbGUgPT0gIlgxIiB+ICJQMSAoMTIzKSIsDQogICAgICBQcm9maWxlID09ICJYMiIgfiAiUDIgKDgpIiwNCiAgICAgIFByb2ZpbGUgPT0gIlgzIiB+ICJQMyAoNDYpIiwNCiAgICAgIFRSVUUgfiBQcm9maWxlDQogICAgKQ0KICApICU+JQ0KICBnZ3Bsb3QoYWVzKA0KICAgIHggPSBEQVRBX1BST0ZJTEVTLA0KICAgIHkgPSBNZWFuLA0KICAgIGdyb3VwID0gUHJvZmlsZSwNCiAgICBjb2xvciA9IFByb2ZpbGUNCiAgKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLjI1KSArDQogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjI1KSArDQogIHNjYWxlX3hfZGlzY3JldGUoDQogICAgbGltaXRzID0gYygNCiAgICAgICJpNF8xIiwgImk0XzIiLCAiaTRfMyIsICJpNF80IiwgImk0XzUiLCAiaTRfNiIsICJpNF83IiwgImk0XzgiLA0KICAgICAgImk0XzkiLCAiaTRfMTAiLCAiaTRfMTEiLCAiaTRfMTIiLCAiaTRfMTMiLCAiaTRfMTQiLCAiaTRfMTUiLA0KICAgICAgImk1XzEiDQogICAgKQ0KICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoDQogICAgICAiUDEgKDEyMykiID0gImJsdWUyIiwNCiAgICAgICJQMiAoOCkiID0gImdyZWVuNCIsDQogICAgICAiUDMgKDQ2KSIgPSAicmVkIg0KICAgICkNCiAgKSArDQogIGxhYnMoDQogICAgeCA9ICJJdGVtcyBhY3RpdHVkIiwNCiAgICB5ID0gIk1lZGlhIGVzdGFuZGFyaXphZGEiLA0KICAgIGNvbG9yID0gIlBlcmZpbCIsDQogICAgdGl0bGUgPSAiUGVyZmlsZXMgQWN0aXR1ZCBncnVwbyBCYWxpbnQiDQogICkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSwgZmFjZSA9ICJib2xkIikNCiAgKQ0KDQpnZ3NhdmUoDQogIGZpbGVuYW1lID0gZmlsZS5wYXRoKCJwZXJmaWxlc19iYWxpbnQucG5nIiksDQogIHBsb3QgPSBwLA0KICB3aWR0aCA9IDE0LCBoZWlnaHQgPSA4LCBkcGkgPSAzMDAsIGJnID0gIndoaXRlIiwNCiAgc2NhbGUgPSAwLjUNCikNCnANCmBgYA0KDQpTZSBlbmNvbnRyYXJvbiAzIHBvdGVuY2lhbGVzIHBlcmZpbGVzLCBkZSBtYW5lcmEgZ2VuZXJhbCBkYSBsYSBpbXBlc2nDs24gcXVlIGV4aXN0ZSB1biBwZXJmaWwgZGUgc3VqZXRvcyBxdWUgdGllbmVuIHVuYSBhY3RpdHVkIG3DoXMgcG9zaXRpdmEgYWNlcmNhIGRlbCBncnVwbyBCYWxpbnQsIHNpbiBlbWFicmdvIG5vIGVuY3VlbnRyYW4gZ3JhbiBhcG9ydGUgKGl0ZW1zIDUuMSkuIExvcyBvdHJvcyBzZSBkaWZlcmVuY2lhbiBlc3BlY2lhbG1lbnRlIGVuIGxvcyDDrXRlbXMgcXVlIHBhcmVjZW4gaW52ZXJ0aWRvcy4NCg0KIyMjIENhcmFjdGVyaXphY2nDs24gcGVyZmlsZXMgZGUgYWN0aXR1ZA0KDQpgYGB7cn0NCiMgRXh0cmFlciBsYXMgY2xhc2lmaWNhY2lvbmVzIGRlbCBtb2RlbG8NCmNsYXNlcyA8LSBtb2RlbDEkY2xhc3NpZmljYXRpb24NCg0KIyBBZ3JlZ2FyIGxhcyBjbGFzZXMgYWwgZGF0YSBmcmFtZQ0KQkFTRSA8LSBCQVNFICU+JQ0KICBtdXRhdGUoUGVyZmlsID0gY2xhc2VzKQ0KDQpCQVNFJFBlcmZpbCA8LSBmYWN0b3IoQkFTRSRQZXJmaWwsIGxldmVscyA9IGMoMSwgMywgMiksIGxhYmVscyA9IGMgKCJBbHRvIiwgIk1lZGlvIiwgIkJham8iKSkNCg0KQkFTRSA8LSBCQVNFICU+JSANCiAgbXV0YXRlKFBlcmZpbDIgPSBjYXNlX3doZW4oDQogICAgUGVyZmlsID09ICJBbHRvIiAgfiAiRmF2b3JhYmxlIiwNCiAgICBQZXJmaWwgPT0gIk1lZGlvIiB+ICJOZXV0cm8gLSBEZXNmYXZvcmFibGUiLA0KICAgIFBlcmZpbCA9PSAiQmFqbyIgIH4gIk5ldXRybyAtIERlc2Zhdm9yYWJsZSIsDQogICAgVFJVRSAgICAgICAgICAgICAgfiBOQV9jaGFyYWN0ZXJfDQogICkpDQoNCg0KDQpgYGANCg0KYGBge3J9DQp0YWJsYTEgPC0gQkFTRSAlPiUNCiAgc2VsZWN0KA0KICAgIGhhX3BhcnRpY2lwYWRvX2FsZ3VuYV92ZXpfZW5fdW5fZ3J1cG9fYmFsaW50X3lhX3NlYV9hY3R1YWxtZW50ZV9vX2VuX2VsX3Bhc2FkbywNCiAgICBkdXJhbnRlX2N1YW50b190aWVtcG9faGFfcGFydGljaXBhZG9fZW5fZ3J1cG9zX2JhbGludCwgZ2VuZXJvLCBncnVwb19wcm9mZXNpb25hbCwNCiAgICBhbm9zX2RlX2VqZXJjaWNpb19wcm9mZXNpb25hbCwgZXN0YV9kZXNlbXBlbmFuZG9fdW5fY2FyZ29fZW5fZWxfY3VhbF90ZW5nYV9wZXJzb25hbF9hX2NhcmdvLA0KICAgIHBhcnRpY2lwYV9lbl9hY3RpdmlkYWRlc19kb2NlbnRlcywgZWRhZDIsIFBlcmZpbA0KICApICU+JQ0KICB0Ymxfc3VtbWFyeSgNCiAgICBieSA9IFBlcmZpbCwNCiAgICB0eXBlID0gbGlzdCgNCiAgICAgIGFsbF9jYXRlZ29yaWNhbCgpIH4gImNhdGVnb3JpY2FsIiwNCiAgICAgIGVkYWQyIH4gImNvbnRpbnVvdXMiDQogICAgKSwNCiAgICBsYWJlbCA9IGxpc3QoDQogICAgICBoYV9wYXJ0aWNpcGFkb19hbGd1bmFfdmV6X2VuX3VuX2dydXBvX2JhbGludF95YV9zZWFfYWN0dWFsbWVudGVfb19lbl9lbF9wYXNhZG8gfiAiUGFydGljaXBhY2nDs24gYWN0dWFsIG8gcGFzYWRhIGVuIGdydXBvIEJhbGludCIsDQogICAgICBkdXJhbnRlX2N1YW50b190aWVtcG9faGFfcGFydGljaXBhZG9fZW5fZ3J1cG9zX2JhbGludCB+ICJUaWVtcG8gcGFydGljaXBhY2nDs24gZ3J1cG8gQmFsaW50IiwNCiAgICAgIGdlbmVybyB+ICJHw6luZXJvIiwNCiAgICAgIGdydXBvX3Byb2Zlc2lvbmFsIH4gIkdydXBvIHByb2Zlc2lvbmFsIiwNCiAgICAgIGFub3NfZGVfZWplcmNpY2lvX3Byb2Zlc2lvbmFsIH4gIkHDsW9zIGVqZXJjaWNpbyBwcm9mZXNpb25hbCIsDQogICAgICBlc3RhX2Rlc2VtcGVuYW5kb191bl9jYXJnb19lbl9lbF9jdWFsX3RlbmdhX3BlcnNvbmFsX2FfY2FyZ28gfiAiRGVzZW1wZcOxYSBjYXJnbyBjb24gcGVyc29uYWwgYSBjYXJnbyIsDQogICAgICBwYXJ0aWNpcGFfZW5fYWN0aXZpZGFkZXNfZG9jZW50ZXMgfiAiUGFydGljaXBhY2nDs24gYWN0LiBkb2NlbnRlIiwNCiAgICAgIGVkYWQyIH4gIkVkYWQiDQogICAgKSwNCiAgICBzdGF0aXN0aWMgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAie259ICh7cH0lKSIsDQogICAgICBlZGFkMiB+ICJ7bWVkaWFufSAoe3AyNX0sIHtwNzV9KSINCiAgICApLA0KICAgIGRpZ2l0cyA9IGxpc3QoDQogICAgICBhbGxfY2F0ZWdvcmljYWwoKSB+IDEsDQogICAgICBlZGFkMiB+IDENCiAgICApLA0KICAgIG1pc3NpbmcgPSAiaWZhbnkiLA0KICAgIG1pc3NpbmdfdGV4dCA9ICJTaW4gZGF0byINCiAgKSAlPiUNCiAgYWRkX3AoDQogICAgdGVzdCA9IGxpc3QoDQogICAgICBhbGxfY2F0ZWdvcmljYWwoKSB+ICJjaGlzcS50ZXN0IiwNCiAgICAgIGFsbF9jb250aW51b3VzKCkgIH4gImtydXNrYWwudGVzdCINCiAgICApLA0KICAgIHB2YWx1ZV9mdW4gPSB+IHN0eWxlX3B2YWx1ZSgueCwgZGlnaXRzID0gMykNCiAgKSAlPiUNCiAgYWRkX292ZXJhbGwobGFzdCA9IEZBTFNFLCBjb2xfbGFiZWwgPSAiKipUb3RhbCoqLCBOID0ge059IikgJT4lDQogIG1vZGlmeV9oZWFkZXIobGFiZWwgfiAiKipWYXJpYWJsZSoqIikgJT4lDQogIG1vZGlmeV9zcGFubmluZ19oZWFkZXIoYWxsX3N0YXRfY29scygpIH4gIioqUGVyZmlsKioiKSAlPiUNCiAgYm9sZF9sYWJlbHMoKSAlPiUNCiAgYm9sZF9wKHQgPSAwLjA1KSAlPiUNCiAgbW9kaWZ5X2NhcHRpb24oIioqVGFibGEgMSoqIikNCg0KdGFibGExICU+JQ0KICBhc190aWJibGUoKSAlPiUNCiAgd3JpdGVfeGxzeCgidGFibGExLnhsc3giKQ0KDQp0YWJsYTENCmBgYA0KDQpgYGB7cn0NCnRhYmxhMiA8LSBCQVNFICU+JQ0KICBzZWxlY3QoDQogICAgaGFfcGFydGljaXBhZG9fYWxndW5hX3Zlel9lbl91bl9ncnVwb19iYWxpbnRfeWFfc2VhX2FjdHVhbG1lbnRlX29fZW5fZWxfcGFzYWRvLA0KICAgIGR1cmFudGVfY3VhbnRvX3RpZW1wb19oYV9wYXJ0aWNpcGFkb19lbl9ncnVwb3NfYmFsaW50LCBnZW5lcm8sIGdydXBvX3Byb2Zlc2lvbmFsLA0KICAgIGFub3NfZGVfZWplcmNpY2lvX3Byb2Zlc2lvbmFsLCBlc3RhX2Rlc2VtcGVuYW5kb191bl9jYXJnb19lbl9lbF9jdWFsX3RlbmdhX3BlcnNvbmFsX2FfY2FyZ28sDQogICAgcGFydGljaXBhX2VuX2FjdGl2aWRhZGVzX2RvY2VudGVzLCBlZGFkMiwgUGVyZmlsMg0KICApICU+JQ0KICB0Ymxfc3VtbWFyeSgNCiAgICBieSA9IFBlcmZpbDIsDQogICAgdHlwZSA9IGxpc3QoDQogICAgICBhbGxfY2F0ZWdvcmljYWwoKSB+ICJjYXRlZ29yaWNhbCIsDQogICAgICBlZGFkMiB+ICJjb250aW51b3VzIg0KICAgICksDQogICAgbGFiZWwgPSBsaXN0KA0KICAgICAgaGFfcGFydGljaXBhZG9fYWxndW5hX3Zlel9lbl91bl9ncnVwb19iYWxpbnRfeWFfc2VhX2FjdHVhbG1lbnRlX29fZW5fZWxfcGFzYWRvIH4gIlBhcnRpY2lwYWNpw7NuIGFjdHVhbCBvIHBhc2FkYSBlbiBncnVwbyBCYWxpbnQiLA0KICAgICAgZHVyYW50ZV9jdWFudG9fdGllbXBvX2hhX3BhcnRpY2lwYWRvX2VuX2dydXBvc19iYWxpbnQgfiAiVGllbXBvIHBhcnRpY2lwYWNpw7NuIGdydXBvIEJhbGludCIsDQogICAgICBnZW5lcm8gfiAiR8OpbmVybyIsDQogICAgICBncnVwb19wcm9mZXNpb25hbCB+ICJHcnVwbyBwcm9mZXNpb25hbCIsDQogICAgICBhbm9zX2RlX2VqZXJjaWNpb19wcm9mZXNpb25hbCB+ICJBw7FvcyBlamVyY2ljaW8gcHJvZmVzaW9uYWwiLA0KICAgICAgZXN0YV9kZXNlbXBlbmFuZG9fdW5fY2FyZ29fZW5fZWxfY3VhbF90ZW5nYV9wZXJzb25hbF9hX2NhcmdvIH4gIkRlc2VtcGXDsWEgY2FyZ28gY29uIHBlcnNvbmFsIGEgY2FyZ28iLA0KICAgICAgcGFydGljaXBhX2VuX2FjdGl2aWRhZGVzX2RvY2VudGVzIH4gIlBhcnRpY2lwYWNpw7NuIGFjdC4gZG9jZW50ZSIsDQogICAgICBlZGFkMiB+ICJFZGFkIg0KICAgICksDQogICAgc3RhdGlzdGljID0gbGlzdCgNCiAgICAgIGFsbF9jYXRlZ29yaWNhbCgpIH4gIntufSAoe3B9JSkiLA0KICAgICAgZWRhZDIgfiAie21lZGlhbn0gKHtwMjV9LCB7cDc1fSkiDQogICAgKSwNCiAgICBkaWdpdHMgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAxLA0KICAgICAgZWRhZDIgfiAxDQogICAgKSwNCiAgICBtaXNzaW5nID0gImlmYW55IiwNCiAgICBtaXNzaW5nX3RleHQgPSAiU2luIGRhdG8iDQogICkgJT4lDQogIGFkZF9wKA0KICAgIHRlc3QgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAiZmlzaGVyLnRlc3QiLA0KICAgICAgYWxsX2NvbnRpbnVvdXMoKSAgfiAia3J1c2thbC50ZXN0Ig0KICAgICksDQogICAgcHZhbHVlX2Z1biA9IH4gc3R5bGVfcHZhbHVlKC54LCBkaWdpdHMgPSAzKQ0KICApICU+JQ0KICBhZGRfb3ZlcmFsbChsYXN0ID0gRkFMU0UsIGNvbF9sYWJlbCA9ICIqKlRvdGFsKiosIE4gPSB7Tn0iKSAlPiUNCiAgbW9kaWZ5X2hlYWRlcihsYWJlbCB+ICIqKlZhcmlhYmxlKioiKSAlPiUNCiAgbW9kaWZ5X3NwYW5uaW5nX2hlYWRlcihhbGxfc3RhdF9jb2xzKCkgfiAiKipQZXJmaWwqKiIpICU+JQ0KICBib2xkX2xhYmVscygpICU+JQ0KICBib2xkX3AodCA9IDAuMDUpICU+JQ0KICBtb2RpZnlfY2FwdGlvbigiKipUYWJsYSAxIC0gQWp1c3RhZGEqKiIpDQoNCnRhYmxhMiAlPiUNCiAgYXNfdGliYmxlKCkgJT4lDQogIHdyaXRlX3hsc3goInRhYmxhMi54bHN4IikNCg0KdGFibGEyDQpgYGANCg0KXGBcYFxgXGANCg==