Packages
pacman::p_load(tidyverse,
janitor,
visdat,
tableone,
emmeans)
Dataset
df <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vSlA8QaLV8oP976nOJ0l9RwdZRqnPY5RXyEFFyXwWQ3iEZEc_xKVynZZGcXjAWLveK1ckDiOBTnwy2V/pub?gid=888653489&single=true&output=csv")
Parsed with column specification:
cols(
.default = col_character(),
`Número de autores` = [32mcol_double()[39m,
`Año de publicación` = [32mcol_double()[39m,
`n secuelas` = [32mcol_double()[39m,
`Pacientes que incluye el informe` = [32mcol_double()[39m,
Cumple = [32mcol_double()[39m,
`No cumple` = [32mcol_double()[39m,
SUMA = [32mcol_double()[39m
)
See spec(...) for full column specifications.
Data exploration 1
head(df)
# names(df)
Data cleaning
Cleaning and removing not used variables
df <- df %>%
janitor::clean_names() %>%
janitor::remove_empty(c("cols", "rows"))
df <- df %>%
select(
titulo_del_estudio,
revista,
pais_1er_autor_o_afiliacion,
continente,
numero_de_autores,
ano_de_publicacion,
antes_post_care,
denticion_afect,
tema,
t1:ci13,
calidad = cumple
)
Check NA
visdat::vis_dat(df)

Remove columns with more than 50% of NA
df <- df %>%
purrr::discard(~sum(is.na(.x))/length(.x)* 100 >=50)
Elimino los que tienen revista o año NA
Dataset ready for analysis
Analysis and tables
Year and journals
df %>%
ggplot(aes(x = ano_de_publicacion, fill = revista)) +
geom_histogram(bins = 10) +
labs(
title = "Articles per journal per year",
x = "Year",
y = "Articles",
fill = "Journal"
) +
ggpubr::theme_pubclean()

Table journal by year by n
df %>%
group_by(revista, ano_de_publicacion) %>%
summarise(n = n()) %>%
pivot_wider(names_from = ano_de_publicacion,
values_from = n,
values_fill = list(n = 0))
Graph journal by n by year
df %>%
group_by(revista, ano_de_publicacion) %>%
summarise(n = n()) %>%
ggplot(aes(x = as_factor(ano_de_publicacion),
y = n,
group = revista,
color = revista)) +
geom_line() +
scale_y_log10() +
labs(
title = "Publication by journal",
x = "Year",
y = "Articles (Log 10 n)",
color = "Journal"
) +
ggpubr::theme_pubclean()

df %>%
janitor::tabyl(revista) %>%
adorn_totals("row") %>%
adorn_pct_formatting()
revista n percent
Dent Traumatol 141 69.5%
Eur Arch Paediatr Dent 10 4.9%
Int J Clin Pediatr Dent 16 7.9%
Int J Paed Dent 2 1.0%
J Clin Pediatr Dent 19 9.4%
Pediatr Dent 15 7.4%
Total 203 100.0%
df %>%
janitor::tabyl(ano_de_publicacion, revista) %>%
janitor::adorn_percentages("col") %>%
janitor::adorn_totals("col") %>%
janitor::adorn_pct_formatting(rounding = "half up", digits = 0) %>%
janitor::adorn_ns() %>%
janitor::adorn_title("combined")
ano_de_publicacion/revista Dent Traumatol Eur Arch Paediatr Dent Int J Clin Pediatr Dent
2008 35% (50) 10% (1) 0% (0)
2009 12% (17) 10% (1) 13% (2)
2010 17% (24) 0% (0) 0% (0)
2011 17% (24) 30% (3) 19% (3)
2012 7% (10) 20% (2) 13% (2)
2013 3% (4) 0% (0) 19% (3)
2014 2% (3) 0% (0) 6% (1)
2015 3% (4) 10% (1) 13% (2)
2016 1% (1) 0% (0) 6% (1)
2017 1% (2) 0% (0) 6% (1)
2018 1% (2) 20% (2) 6% (1)
Int J Paed Dent J Clin Pediatr Dent Pediatr Dent Total
0% (0) 0% (0) 0% (0) 45% (51)
0% (0) 11% (2) 33% (5) 78% (27)
0% (0) 11% (2) 20% (3) 48% (29)
0% (0) 5% (1) 7% (1) 78% (32)
50% (1) 21% (4) 33% (5) 144% (24)
0% (0) 11% (2) 0% (0) 32% (9)
50% (1) 0% (0) 0% (0) 58% (5)
0% (0) 11% (2) 7% (1) 43% (10)
0% (0) 16% (3) 0% (0) 23% (5)
0% (0) 16% (3) 0% (0) 23% (6)
0% (0) 0% (0) 0% (0) 28% (5)
Countries, journals and year
Countries
df %>%
janitor::tabyl(pais_1er_autor_o_afiliacion) %>%
arrange(desc(n)) %>%
# adorn_totals("row") %>%
adorn_pct_formatting(rounding = "half up", digits = 0)
Countries per year
df %>%
group_by(pais_1er_autor_o_afiliacion, ano_de_publicacion, revista) %>%
count(sort = T) %>%
filter(n > 1) %>%
ggplot(aes(x = as_factor(ano_de_publicacion), y = n, color = pais_1er_autor_o_afiliacion)) +
geom_jitter(alpha = .7) +
labs(
title = "Case reports by country",
subtitle = "Only countries with >1",
x = "Year",
y = "Case reports",
color = "Country"
) +
ggpubr::theme_pubclean()

pivot_wider(names_from = ano_de_publicacion, values_from = n) %>%
ggplot(aes(x = as_factor(ano_de_publicacion), y = n))
Error in build_wider_spec(data, names_from = !!names_from, values_from = !!values_from, :
el argumento "data" está ausente, sin valor por omisión
Pre and post CARE
df %>%
aov(calidad ~ antes_post_care, data = .) %>%
summary()
Df Sum Sq Mean Sq F value Pr(>F)
antes_post_care 1 5.1 5.076 0.735 0.392
Residuals 201 1388.2 6.907
Pre and post CARE by country
Pendiente
ver si existe cambio por paÃs antes y despues
Ver distribución por paises años revistas
df %>%
janitor::tabyl(revista) %>%
arrange(desc(n)) %>%
# adorn_totals("row") %>%
adorn_pct_formatting(rounding = "half up", digits = 0) %>%
adorn_totals("col")
hacer una tabla que combine todo esto
luego hacer una evaluación de la calidad
Quality
Calculo la calidad total
df <- df %>%
mutate(calidad = reduce(select( ., introduccion_4_b_hace_referencia_a_la_literatura_medica_pertinente_number:x88),
`+` ))


mean(df$calidad)
[1] 14.36946
Inferential
Hay diferencia por año?
summary(aov(calidad ~ ano_de_publicacion, data = df))
Df Sum Sq Mean Sq F value Pr(>F)
ano_de_publicacion 1 45.9 45.89 6.846 0.00956 **
Residuals 201 1347.4 6.70
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Hay diferencia por revista?
summary(aov(calidad ~ revista, data = df))
Df Sum Sq Mean Sq F value Pr(>F)
revista 5 104.9 20.98 3.209 0.00829 **
Residuals 197 1288.4 6.54
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Hay diferencia antes y después del 2013?
df %>%
mutate(care = case_when(
ano_de_publicacion > 2013 ~ "Despues",
TRUE ~ "Antes"
)) %>%
aov(calidad~care, data = .) %>%
summary()
Df Sum Sq Mean Sq F value Pr(>F)
care 1 5.1 5.076 0.735 0.392
Residuals 201 1388.2 6.907
df %>%
aov(calidad~revista, data = .) %>%
TukeyHSD()
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = calidad ~ revista, data = .)
$revista
diff lwr upr p adj
Eur Arch Paediatr Dent-Dent Traumatol 2.3666667 -0.0418685 4.7752018 0.0572236
Int J Clin Pediatr Dent-Dent Traumatol -1.4583333 -3.3999091 0.4832425 0.2606121
Int J Paed Dent-Dent Traumatol 2.1666667 -3.0743741 7.4077074 0.8413587
J Clin Pediatr Dent-Dent Traumatol -0.2807018 -2.0793561 1.5179526 0.9976729
Pediatr Dent-Dent Traumatol 0.5333333 -1.4655212 2.5321879 0.9725610
Int J Clin Pediatr Dent-Eur Arch Paediatr Dent -3.8250000 -6.7918853 -0.8581147 0.0036173
Int J Paed Dent-Eur Arch Paediatr Dent -0.2000000 -5.9009824 5.5009824 0.9999985
J Clin Pediatr Dent-Eur Arch Paediatr Dent -2.6473684 -5.5227552 0.2280184 0.0904329
Pediatr Dent-Eur Arch Paediatr Dent -1.8333333 -4.8380149 1.1713482 0.4966393
Int J Paed Dent-Int J Clin Pediatr Dent 3.6250000 -1.8949525 9.1449525 0.4113784
J Clin Pediatr Dent-Int J Clin Pediatr Dent 1.1776316 -1.3196718 3.6749350 0.7524336
Pediatr Dent-Int J Clin Pediatr Dent 1.9916667 -0.6534772 4.6368105 0.2580469
J Clin Pediatr Dent-Int J Paed Dent -2.4473684 -7.9186860 3.0239492 0.7916917
Pediatr Dent-Int J Paed Dent -1.6333333 -7.1736923 3.9070257 0.9578912
Pediatr Dent-J Clin Pediatr Dent 0.8140351 -1.7280560 3.3561261 0.9405930
Journal comparison

Year comparison

Continent comparison

Pre-post CARE comparison

first author country comparison

LS0tCnRpdGxlOiAiQ2FsaWRhZCByZXBvcnRlcyBUcmF1bWEgRGVudGFsIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgZmlnX2NhcHRpb246IHRydWUKLS0tCgojIFBhY2thZ2VzCmBgYHtyfQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIAogICAgICAgICAgICAgICBqYW5pdG9yLCAKICAgICAgICAgICAgICAgdmlzZGF0LCAKICAgICAgICAgICAgICAgdGFibGVvbmUsIAogICAgICAgICAgICAgICBlbW1lYW5zKQpgYGAKCiMgRGF0YXNldAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CmRmIDwtIHJlYWRfY3N2KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2U2xBOFFhTFY4b1A5NzZuT0owbDlSd2RaUnFuUFk1Ulh5RUZGeVh3V1EzaUVaRWNfeEtWeW5aWkdjWGpBV0x2ZUsxY2tEaU9CVG53eTJWL3B1Yj9naWQ9ODg4NjUzNDg5JnNpbmdsZT10cnVlJm91dHB1dD1jc3YiKQpgYGAKCgojIERhdGEgZXhwbG9yYXRpb24gMQpgYGB7ciBoZWFkfQpoZWFkKGRmKQpgYGAKCmBgYHtyIG5hbWVzfQojIG5hbWVzKGRmKQpgYGAKCgojIERhdGEgY2xlYW5pbmcKCkNsZWFuaW5nIGFuZCByZW1vdmluZyBub3QgdXNlZCB2YXJpYWJsZXMKYGBge3IgamFuaXRvcn0KZGYgPC0gZGYgJT4lIAogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIAogIGphbml0b3I6OnJlbW92ZV9lbXB0eShjKCJjb2xzIiwgInJvd3MiKSkKYGBgCgpgYGB7ciBzZWxlY2Npb25vIGFsZ3VuYXMgdmFyc30KZGYgPC0gZGYgJT4lCiAgc2VsZWN0KAogICAgdGl0dWxvX2RlbF9lc3R1ZGlvLCAKICByZXZpc3RhLAogIHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbiwKICBjb250aW5lbnRlLAogIG51bWVyb19kZV9hdXRvcmVzLAogIGFub19kZV9wdWJsaWNhY2lvbiwKICBhbnRlc19wb3N0X2NhcmUsCiAgZGVudGljaW9uX2FmZWN0LAogIHRlbWEsCiAgdDE6Y2kxMywgCiAgY2FsaWRhZCA9IGN1bXBsZQogICkKYGBgCgoKCkNoZWNrIE5BCgpgYGB7cn0KdmlzZGF0Ojp2aXNfZGF0KGRmKQpgYGAKUmVtb3ZlIGNvbHVtbnMgd2l0aCBtb3JlIHRoYW4gNTAlIG9mIE5BCgpgYGB7cn0KZGYgPC0gZGYgJT4lIAogIHB1cnJyOjpkaXNjYXJkKH5zdW0oaXMubmEoLngpKS9sZW5ndGgoLngpKiAxMDAgPj01MCkgCmBgYAoKCkVsaW1pbm8gbG9zIHF1ZSB0aWVuZW4gcmV2aXN0YSBvIGHDsW8gTkEKCkRhdGFzZXQgcmVhZHkgZm9yIGFuYWx5c2lzCgojIEFuYWx5c2lzIGFuZCB0YWJsZXMKCiMjIFllYXIgYW5kIGpvdXJuYWxzCmBgYHtyfQpkZiAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYW5vX2RlX3B1YmxpY2FjaW9uLCBmaWxsID0gcmV2aXN0YSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwKSArIAogIGxhYnMoCiAgICB0aXRsZSA9ICJBcnRpY2xlcyBwZXIgam91cm5hbCBwZXIgeWVhciIsIAogICAgeCA9ICJZZWFyIiwgCiAgICB5ID0gIkFydGljbGVzIiwgCiAgICBmaWxsID0gIkpvdXJuYWwiCiAgKSArIAogIGdncHVicjo6dGhlbWVfcHViY2xlYW4oKQpgYGAKVGFibGUgam91cm5hbCBieSB5ZWFyIGJ5IG4KYGBge3J9CmRmICU+JQogIGdyb3VwX2J5KHJldmlzdGEsIGFub19kZV9wdWJsaWNhY2lvbikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFub19kZV9wdWJsaWNhY2lvbiwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBuLCAKICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQpgYGAKCkdyYXBoIGpvdXJuYWwgYnkgbiBieSB5ZWFyCmBgYHtyfQpkZiAlPiUKICBncm91cF9ieShyZXZpc3RhLCBhbm9fZGVfcHVibGljYWNpb24pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGFzX2ZhY3Rvcihhbm9fZGVfcHVibGljYWNpb24pLCAKICAgICAgICAgICAgIHkgPSBuLCAKICAgICAgICAgICAgIGdyb3VwID0gcmV2aXN0YSwgCiAgICAgICAgICAgICBjb2xvciA9IHJldmlzdGEpKSArIAogIGdlb21fbGluZSgpICsgCiAgc2NhbGVfeV9sb2cxMCgpICsgCiAgbGFicygKICAgIHRpdGxlID0gIlB1YmxpY2F0aW9uIGJ5IGpvdXJuYWwiLCAKICAgIHggPSAiWWVhciIsIAogICAgeSA9ICJBcnRpY2xlcyAoTG9nIDEwIG4pIiwgCiAgICBjb2xvciA9ICJKb3VybmFsIgogICkgICsgCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpCmBgYApgYGB7cn0KZGYgJT4lIAogIGphbml0b3I6OnRhYnlsKHJldmlzdGEpICU+JSAKICBhZG9ybl90b3RhbHMoInJvdyIpICU+JQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkKYGBgCgpgYGB7cn0KZGYgJT4lCiAgamFuaXRvcjo6dGFieWwoYW5vX2RlX3B1YmxpY2FjaW9uLCByZXZpc3RhKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCJjb2wiKSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fcGN0X2Zvcm1hdHRpbmcocm91bmRpbmcgPSAiaGFsZiB1cCIsIGRpZ2l0cyA9IDApICU+JQogIGphbml0b3I6OmFkb3JuX25zKCkgJT4lIAogIGphbml0b3I6OmFkb3JuX3RpdGxlKCJjb21iaW5lZCIpIAoKCmBgYAojIyBDb3VudHJpZXMsIGpvdXJuYWxzIGFuZCB5ZWFyCgojIyMgQ291bnRyaWVzCgoKYGBge3J9CmRmICU+JQogIGphbml0b3I6OnRhYnlsKHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbikgJT4lCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgCiAgIyAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUKICBhZG9ybl9wY3RfZm9ybWF0dGluZyhyb3VuZGluZyA9ICJoYWxmIHVwIiwgZGlnaXRzID0gMCkKYGBgCgojIyMgQ291bnRyaWVzIHBlciB5ZWFyCgpgYGB7cn0KZGYgJT4lIAogIGdyb3VwX2J5KHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbiwgYW5vX2RlX3B1YmxpY2FjaW9uLCByZXZpc3RhKSAlPiUKICBjb3VudChzb3J0ID0gVCkgJT4lIAogIGZpbHRlcihuID4gMSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGFzX2ZhY3Rvcihhbm9fZGVfcHVibGljYWNpb24pLCB5ID0gbiwgY29sb3IgPSBwYWlzXzFlcl9hdXRvcl9vX2FmaWxpYWNpb24pKSArIAogIGdlb21faml0dGVyKGFscGhhID0gLjcpICsgCiAgbGFicygKICAgIHRpdGxlID0gIkNhc2UgcmVwb3J0cyBieSBjb3VudHJ5IiwKICAgIHN1YnRpdGxlID0gIk9ubHkgY291bnRyaWVzIHdpdGggPjEiLCAKICAgIHggPSAiWWVhciIsIAogICAgeSA9ICJDYXNlIHJlcG9ydHMiLCAKICAgIGNvbG9yID0gIkNvdW50cnkiCiAgKSArCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpCiAgCgoKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFub19kZV9wdWJsaWNhY2lvbiwgdmFsdWVzX2Zyb20gPSBuKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYXNfZmFjdG9yKGFub19kZV9wdWJsaWNhY2lvbiksIHkgPSBuKSkKICBzdW1tYXJpc2UoIG4gPSBjb3VudCgpKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSBhbm9fZGUpKQogICMgZ2dwbG90KGFlcykKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYW5vX2RlX3B1YmxpY2FjaW9uLCB2YWx1ZXNfZnJvbSA9IG4pCmBgYAoKCiMjIFByZSBhbmQgcG9zdCBDQVJFCgpgYGB7cn0KZGYgJT4lIAogIGdyb3VwX2J5KGFudGVzX3Bvc3RfY2FyZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCBtZWFuID0gbWVhbihjYWxpZGFkKSwgc2QgPSBzZChjYWxpZGFkKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkKYGBgCgoKYGBge3J9CmRmICU+JSAKICBhb3YoY2FsaWRhZCB+IGFudGVzX3Bvc3RfY2FyZSwgZGF0YSA9IC4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgojIyBQcmUgYW5kIHBvc3QgQ0FSRSBieSBjb3VudHJ5CgpgYGB7cn0KZGYgJT4lIAogIGdyb3VwX2J5KGFudGVzX3Bvc3RfY2FyZSwgcGFpc18xZXJfYXV0b3Jfb19hZmlsaWFjaW9uKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNhbGlkYWQpKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFudGVzX3Bvc3RfY2FyZSwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBtZWFuKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAxKQpgYGAKUGVuZGllbnRlCgp2ZXIgc2kgZXhpc3RlIGNhbWJpbyBwb3IgcGHDrXMgYW50ZXMgeSBkZXNwdWVzCgpWZXIgZGlzdHJpYnVjacOzbiBwb3IgCnBhaXNlcwphw7FvcwpyZXZpc3RhcwpgYGB7cn0KZGYgJT4lCiAgamFuaXRvcjo6dGFieWwocmV2aXN0YSkgJT4lCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgCiAgIyAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUKICBhZG9ybl9wY3RfZm9ybWF0dGluZyhyb3VuZGluZyA9ICJoYWxmIHVwIiwgZGlnaXRzID0gMCkgJT4lIAogIGFkb3JuX3RvdGFscygiY29sIikKYGBgCgoKaGFjZXIgdW5hIHRhYmxhIHF1ZSBjb21iaW5lIHRvZG8gZXN0bwoKbHVlZ28gaGFjZXIgdW5hIGV2YWx1YWNpw7NuIGRlIGxhIGNhbGlkYWQKCgojIyBRdWFsaXR5CgpDYWxjdWxvIGxhIGNhbGlkYWQgdG90YWwKYGBge3J9CiMgZGYgPC0gZGYgJT4lCiMgIG11dGF0ZShjYWxpZGFkID0gcmVkdWNlKHNlbGVjdCggLiwgICMgaW50cm9kdWNjaW9uXzRfYl9oYWNlX3JlZmVyZW5jaWFfYV9sYV9saXRlcmF0dXJhX21lZGljYV9wZXJ0aW5lbnRlX251bWJlcjp4ODgpLAojICBgK2AgICkpCmBgYAoKYGBge3J9CmRmICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjYWxpZGFkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gOCkgKyAKICBmYWNldF9ncmlkKHJldmlzdGF+LikKYGBgCgpgYGB7cn0KZGYgJT4lIAogIGdncGxvdChhZXMoeCA9IGNhbGlkYWQpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA4KSArIAogIGZhY2V0X2dyaWQoYW5vX2RlX3B1YmxpY2FjaW9ufi4pCmBgYApgYGB7cn0KbWVhbihkZiRjYWxpZGFkKQpgYGAKYGBge3J9CmRmICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgCiAgICAgICAgICAgIFFNZWFuID0gbWVhbihjYWxpZGFkKSwgCiAgICAgICAgICAgIHNkID0gc2QoY2FsaWRhZCksIAogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oY2FsaWRhZCksIAogICAgICAgICAgICBtaW4gPSBtaW4oY2FsaWRhZCksIAogICAgICAgICAgICBtYXggPSBtYXgoY2FsaWRhZCkpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDApCmBgYAoKCgojIyBRdWFsaXR5IGJ5IHllYXIKCmBgYHtyfQpkZiAlPiUgCiAgZ3JvdXBfYnkoYW5vX2RlX3B1YmxpY2FjaW9uKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIHF1YWxpdHlNZWFuID0gbWVhbihjYWxpZGFkKSwgc2QgPSBzZChjYWxpZGFkKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkgCmBgYAoKCgojIyBRdWFsaXR5IGJ5IGpvdXJuYWwKCmBgYHtyfQpkZiAlPiUgCiAgZ3JvdXBfYnkocmV2aXN0YSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCBxdWFsaXR5TWVhbiA9IG1lYW4oY2FsaWRhZCksIHNkID0gc2QoY2FsaWRhZCksIG1lZGlhbiA9IG1lZGlhbihjYWxpZGFkKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkKYGBgCgojIyBGaWd1cmUgcXVhbGl0eSBtZWFuIGJ5IHllYXIgYW5kIGpvdXJuYWwKCmBgYHtyfQpkZiAlPiUKICBncm91cF9ieShhbm9fZGVfcHVibGljYWNpb24sIHJldmlzdGEpICU+JQogIHN1bW1hcmlzZShjYWxpZGFkUHJvbWVkaW8gPSBtZWFuKGNhbGlkYWQpKSAlPiUgCiAgIyBkcm9wX25hKCkgJT4lIAogICMgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFub19kZV9wdWJsaWNhY2lvbiwKICAjICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjYWxpZGFkUHJvbWVkaW8pICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gYW5vX2RlX3B1YmxpY2FjaW9uLCAKICAgICMgeCA9IGFzX2ZhY3Rvcihhbm9fZGVfcHVibGljYWNpb24pLAogICAgeSA9IGNhbGlkYWRQcm9tZWRpbywKICAgIGNvbG9yID0gcmV2aXN0YSwKICAgIGdyb3VwID0gcmV2aXN0YQogICAgKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X2dyaWQoLiB+IHJldmlzdGEpICsKICAjIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiMjAwOCIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxMyIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOCIpKSArCiAgdGhlbWVfbGlnaHQoKSArCiAgIyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1yZWwoMC42KSkpICsKICBsYWJzKHRpdGxlID0gIk1lYW4gQ0FSRSBxdWFsaXR5IGluZGV4IG9mIHB1Ymxpc2hlZCBjYXNlLXJlcG9ydHMiLAogICAgICAgc3VidGl0bGUgPSAiUmVkIGxpbmUgPSBDQVJFIGd1aWRlbGluZXMgcHVibGlzaGVkIiwgCiAgICAgICB5ID0gIk1lYW4gQ0FSRSBpbmRleCIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgY29sb3IgPSAiSm91cm5hbCIKICApICsgCiAgeWxpbSgwLCAyNCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgyMDA4LCAyMDE4LCAyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTMsIGxpbmV0eXBlPSJkb3R0ZWQiLCAKICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsIHNpemU9LjUpCiAgCgpgYGAKYGBge3J9CmRmICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBhbm9fZGVfcHVibGljYWNpb24sIHkgPSBjYWxpZGFkLCBjb2xvciA9IHJldmlzdGEpKSArIAogIGdlb21faml0dGVyKCkgKyAKICB5bGltKDAsIDMwKSArIAogIGxhYnModGl0bGUgPSAiSW5kaXZpZHVhbCBxdWFsaXR5IG9mIGNhc2UtcmVwb3J0cyBieSB5ZWFyIGFuZCBqb3VybmFsIiwgCiAgICAgICB5ID0gIkNBUkUgaW5kZXgiLCAKICAgICAgIHggPSAiWWVhciIsIAogICAgICAgY29sb3IgPSAiSm91cm5hbCIpICsgCiAgdGhlbWVfbGlnaHQoKQpgYGAKIyBJbmZlcmVudGlhbAoKIyMgSGF5IGRpZmVyZW5jaWEgcG9yIGHDsW8/CmBgYHtyfQpzdW1tYXJ5KGFvdihjYWxpZGFkIH4gYW5vX2RlX3B1YmxpY2FjaW9uLCBkYXRhID0gZGYpKQpgYGAKCiMjIEhheSBkaWZlcmVuY2lhIHBvciByZXZpc3RhPwpgYGB7cn0Kc3VtbWFyeShhb3YoY2FsaWRhZCB+IHJldmlzdGEsIGRhdGEgPSBkZikpCmBgYAoKCiMjIEhheSBkaWZlcmVuY2lhIGFudGVzIHkgZGVzcHXDqXMgZGVsIDIwMTM/CgpgYGB7cn0KZGYgJT4lIAogIG11dGF0ZShjYXJlID0gY2FzZV93aGVuKAogICAgYW5vX2RlX3B1YmxpY2FjaW9uID4gMjAxMyB+ICJEZXNwdWVzIiwgCiAgICBUUlVFIH4gIkFudGVzIiAKICApKSAlPiUgCiAgYW92KGNhbGlkYWR+Y2FyZSwgZGF0YSA9IC4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZGYgJT4lIAogIGFvdihjYWxpZGFkfnJldmlzdGEsIGRhdGEgPSAuKSAlPiUgCiAgVHVrZXlIU0QoKQpgYGAKCiMjIEpvdXJuYWwgY29tcGFyaXNvbgpgYGB7cn0KZGYgJT4lIAogIGFvdihjYWxpZGFkfnJldmlzdGEsIGRhdGEgPSAuKSAlPiUgCiAgZW1tZWFuczo6ZW1tZWFucyguLCB+cmV2aXN0YSkgJT4lIAogICMgVHVrZXlIU0QoKSAlPiUgCiAgZW1tZWFuczo6Y29udHJhc3QoLiwKICAgICAgICBtZXRob2QgPSAidHVrZXkiKSAlPiUgCiAgcGxvdChlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgbHR5PTIpICsgCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpICsgCiAgbGFicyh0aXRsZSA9ICJKb3VybmFsIGNvbXBhcmlzb24gKEFOT1ZBICsgVHVrZXlIU0QpIiwgCiAgICAgICB5ID0gIkNvbnRyYXN0IiwgCiAgICAgICB4ID0gIkVzdGltYXRlIikKCmBgYAojIyBZZWFyIGNvbXBhcmlzb24KYGBge3J9CmRmICU+JQogIGFvdihjYWxpZGFkIH4gYXNfZmFjdG9yKGFub19kZV9wdWJsaWNhY2lvbiksIGRhdGEgPSAuKSAlPiUKICBlbW1lYW5zOjplbW1lYW5zKC4sIH4gYXNfZmFjdG9yKGFub19kZV9wdWJsaWNhY2lvbikpICU+JQogICMgVHVrZXlIU0QoKSAlPiUKICBlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpICU+JQogIHBsb3QoZW1tZWFuczo6Y29udHJhc3QoLiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwKICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsCiAgICAgICAgICAgICBsdHkgPSAyKSArCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpICsKICBsYWJzKHRpdGxlID0gIlllYXIgY29tcGFyaXNvbiAoQU5PVkEgKyBUdWtleUhTRCkiLAogICAgICAgeSA9ICJDb250cmFzdCIsCiAgICAgICB4ID0gIkVzdGltYXRlIikKYGBgCiMjIENvbnRpbmVudCBjb21wYXJpc29uCmBgYHtyfQpkZiAlPiUKICBhb3YoY2FsaWRhZCB+IGNvbnRpbmVudGUsIGRhdGEgPSAuKSAlPiUKICBlbW1lYW5zOjplbW1lYW5zKC4sIH4gY29udGluZW50ZSkgJT4lCiAgIyBUdWtleUhTRCgpICU+JQogIGVtbWVhbnM6OmNvbnRyYXN0KC4sCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikgJT4lCiAgcGxvdChlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgIGx0eSA9IDIpICsKICBnZ3B1YnI6OnRoZW1lX3B1YmNsZWFuKCkgKwogIGxhYnModGl0bGUgPSAiQ29udGluZW50IGNvbXBhcmlzb24gKEFOT1ZBICsgVHVrZXlIU0QpIiwKICAgICAgIHkgPSAiQ29udHJhc3QiLAogICAgICAgeCA9ICJFc3RpbWF0ZSIpCmBgYAojIyBQcmUtcG9zdCBDQVJFIGNvbXBhcmlzb24KYGBge3J9CmRmICU+JQogIGFvdihjYWxpZGFkIH4gYW50ZXNfcG9zdF9jYXJlLCBkYXRhID0gLikgJT4lCiAgZW1tZWFuczo6ZW1tZWFucyguLCB+IGFudGVzX3Bvc3RfY2FyZSkgJT4lCiAgIyBUdWtleUhTRCgpICU+JQogIGVtbWVhbnM6OmNvbnRyYXN0KC4sCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikgJT4lCiAgcGxvdChlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgIGx0eSA9IDIpICsKICBnZ3B1YnI6OnRoZW1lX3B1YmNsZWFuKCkgKwogIGxhYnModGl0bGUgPSAiUHJlIGFuZCBwb3N0IENBUkUgcHVibGljYXRpb24gKEFOT1ZBICsgVHVrZXlIU0QpIiwKICAgICAgIHkgPSAiQ29udHJhc3QiLAogICAgICAgeCA9ICJFc3RpbWF0ZSIpCmBgYAojIyBmaXJzdCBhdXRob3IgY291bnRyeSBjb21wYXJpc29uCmBgYHtyfQpkZiAlPiUKICBhb3YoY2FsaWRhZCB+IHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbiwgZGF0YSA9IC4pICU+JQogIGVtbWVhbnM6OmVtbWVhbnMoLiwgfiBwYWlzXzFlcl9hdXRvcl9vX2FmaWxpYWNpb24pICU+JQogICMgVHVrZXlIU0QoKSAlPiUKICBlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpICU+JQogIHBsb3QoZW1tZWFuczo6Y29udHJhc3QoLiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwKICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsCiAgICAgICAgICAgICBsdHkgPSAyKSArCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpICsKICBsYWJzKHRpdGxlID0gIkNvdW50cnkgZmlyc3QgYXV0aG9yIChBTk9WQSArIFR1a2V5SFNEKSIsCiAgICAgICB5ID0gIkNvbnRyYXN0IiwKICAgICAgIHggPSAiRXN0aW1hdGUiKQpgYGA=