En el seminario de contrucción a cargo la Docente Lina Bonilla, en el que abordará el tratamiento estadistico los trabajos de grado, se inició con una actividad que se describirá a continuación.
Con el fin de tener un grupo de datos de diferente tipo, se realizó una encuesta a todos los 24 estudiantes de clase, a ellos se les pregunto por las variables que se presentan a continuación:
C<-read.csv("LibroEjercicio.csv", sep = ";")
names(C)
[1] "NOMBRE" "EDAD" "ESTATURA" "PESO..Kg."
[5] "PROFESIÓN" "CANT..HIJOS" "ESTRATO" "CANT..HERMANO"
[9] "MATRICULADO" "ESTADO.CIVIL" "LUGAR.DE.ORIGEN" "SEXO"
library(ggplot2)
ggplot(C, aes(x = EDAD)) + geom_histogram(breaks = seq(20, 40, by = 5), col = "black", fill = "pink") + ggtitle("HISTOGRAMA EDADES") + ylab("CANTIDAD DE ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 14, by = 2), limits = c(0,14)) + xlab("EDADES [Años]") + annotate("text", x = c(22.5, 27.5, 32.5, 37.5), y = c(12.5, 6.5, 1.5, 2.5), label = c("50%", "25%", "4.17%", "8.33%"))

ggplot(C, aes(x = ESTATURA)) + geom_histogram(breaks = seq(1.5, 1.9, by = 0.1), col = "black", fill = "orange") + ggtitle("HISTOGRAMA ESTATURA") + ylab("CANTIDAD DE ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 10, by = 2), limits = c(0,10)) + xlab("ESTATURAS [m]") + annotate("text", x = c(1.55, 1.65, 1.75, 1.85), y = c(9.5, 7.5, 5.5, 3.5), label = c("37.5%", "29.17%", "20.83%", "12.5%"))

ggplot(C, aes(x = C$PESO..Kg.)) + geom_histogram(breaks = seq(50, 80, by = 6), col = "black", fill = "dark red") + ggtitle("HISTOGRAMA PESO") + ylab("CANTIDAD DE ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 7, by = 1), limits = c(0,7)) + xlab("PESOS [Kg]") + scale_x_continuous(breaks = seq(50, 80, by = 6), limits = c(50,80)) + annotate("text", x = c(53, 59, 65, 71, 77), y = c(4.5, 6.5, 2.5, 4.5, 6.5), label = c("16.67%", "25%", "8.33%", "16.67%", "25%"))

NA
PRO<-as.data.frame(prop.table(table(C$PROFESIÓN))*100)
colnames(PRO)<-c("PROFESION", "PORCENTAJE")
k<-c("Pregrado", "Postgrado", "Doctorado")
v<-c("1", "2", "3")
ggplot(PRO, aes(x = PROFESION, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "deeppink4") + ggtitle("EDUCACIÓN") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = v, labels = k) + scale_y_continuous(breaks = seq(0, 80, by = 5), limits = c(0,80))

H<-as.data.frame(prop.table(table(C$CANT..HIJOS))*100)
colnames(H)<-c("HIJOS", "PORCENTAJE")
ggplot(H, aes(x = HIJOS, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "darkturquoise") + ggtitle("HIJOS") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 0.5), size=4, vjust=0.5, hjust=-0.2 ,col="black") + scale_y_continuous(breaks = seq(0, 80, by = 5), limits = c(0,80)) + xlab("CANTIDAD DE HIJOS") + coord_flip()

Est<-as.data.frame(prop.table(table(C$ESTRATO))*100)
colnames(Est)<-c("Estrato", "PORCENTAJE")
ggplot(Est, aes(x = Estrato, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "gold2") + ggtitle("ESTRATOS") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=0.5, hjust=-0.2 ,col="black") + scale_x_discrete(breaks = c("1","2","3","4","5"), labels = c("Estrato 1", "Estrato 2", "Estrato 3", "Estrato 4", "Estrato 5")) + coord_flip()

HE<-as.data.frame(prop.table(table(C$CANT..HERMANO))*100)
colnames(HE)<-c("Hermanos", "PORCENTAJE")
ggplot(HE, aes(x = Hermanos, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "mediumpurple1", col = "black") + ggtitle("HERMANOS") + xlab("NÚMERO DE HERMANOS") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_y_continuous(breaks = seq(0, 30, by = 5), limits = c(0,30))

M<-as.data.frame(prop.table(table(C$MATRICULADO))*100)
colnames(M)<-c("MATRICULADO", "PORCENTAJE")
library(ggplot2)
ggplot(M, aes(x="", y = PORCENTAJE, fill = MATRICULADO)) + geom_bar(stat = "identity", width = 1)+coord_polar("y", start=0)+scale_fill_brewer(palette = "Set2", labels=c("Si","No"))+ labs(title = "MATRICULADO", x = NULL, y = NULL, fill = "")+scale_x_discrete(labels=NULL,breaks = NULL)+scale_y_discrete(labels=NULL,breaks = NULL)+ geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 1), size=5, vjust=-3.5, hjust=0.7 ,col="black")+ylim(0, 100)+ theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid"))
Scale for 'y' is already present. Adding another scale for 'y', which will
replace the existing scale.

EC<-as.data.frame(prop.table(table(C$ESTADO.CIVIL))*100)
colnames(EC)<-c("ECI", "PORCENTAJE")
library(ggplot2)
ggplot(EC, aes(x="", y = PORCENTAJE, fill = ECI)) + geom_bar(stat = "identity", width = 1)+coord_polar("y", start=0)+scale_fill_brewer(palette = "Set3", labels=c("Soltero","Casado"))+ labs(title = "ESTADO CIVIL", x = NULL, y = NULL, fill = "")+scale_x_discrete(labels=NULL,breaks = NULL)+scale_y_discrete(labels=NULL,breaks = NULL)+ geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 1), size=4, vjust=0, hjust=1.2 ,col="black")+ylim(0, 100)+ theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid"))
Scale for 'y' is already present. Adding another scale for 'y', which will
replace the existing scale.

R<-as.data.frame(prop.table(table(C$LUGAR.DE.ORIGEN))*100)
colnames(R)<-c("L", "PORCENTAJE")
ggplot(R, aes(x = L, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "lightsalmon") + ggtitle("LUGAR DE ORIGEN") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 80, by = 10), limits = c(0,80)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = c("1","2", "3","4","5"), labels = c("Valle del Cauca", "Cauca", "Quindio", "Nariño", "Cundinamarca"))

Sexo<-as.data.frame(prop.table(table(C$SEXO))*100)
colnames(Sexo)<-c("Sexo", "PORCENTAJE")
d<-c("HOMBRES", "MUJERES")
f<-c("1", "2")
library(ggplot2)
ggplot(Sexo, aes(x = Sexo, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.5, fill =c("lightblue", "hotpink1")) + ggtitle("GÉNERO") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = f, labels = d) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60))

Medidas de tendencia central: Son aquellas que pretenden resumir en un solo valor a un conjunto de valores, reprecentan el centro en torno al cual se encuentran ubicados los datos.
summary(C)
NOMBRE EDAD ESTATURA PESO..Kg.
ALEJANDRO ARCILA: 1 Min. :21.00 Min. :1.520 Min. :50.00
ANDRÉS CASANOVA : 1 1st Qu.:23.00 1st Qu.:1.595 1st Qu.:57.00
ANGELA PEREZ : 1 Median :25.50 Median :1.660 Median :67.50
ANGIE ALDEMAR : 1 Mean :28.71 Mean :1.673 Mean :67.46
ANGIE CABEZAS : 1 3rd Qu.:30.25 3rd Qu.:1.750 3rd Qu.:75.25
CARLOS ZAPATA : 1 Max. :49.00 Max. :1.880 Max. :98.00
(Other) :18
PROFESIÓN CANT..HIJOS ESTRATO CANT..HERMANO
Min. :1.000 Min. :0.0000 Min. :1.00 Min. :0.000
1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:3.00 1st Qu.:1.000
Median :1.000 Median :0.0000 Median :3.00 Median :2.000
Mean :1.375 Mean :0.4167 Mean :3.25 Mean :2.292
3rd Qu.:2.000 3rd Qu.:0.2500 3rd Qu.:4.00 3rd Qu.:3.250
Max. :3.000 Max. :3.0000 Max. :5.00 Max. :6.000
MATRICULADO ESTADO.CIVIL LUGAR.DE.ORIGEN SEXO
Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
Median :1.000 Median :1.000 Median :1.000 Median :2.000
Mean :1.375 Mean :1.125 Mean :1.875 Mean :1.583
3rd Qu.:2.000 3rd Qu.:1.000 3rd Qu.:2.000 3rd Qu.:2.000
Max. :2.000 Max. :2.000 Max. :5.000 Max. :2.000
Esto corresponde a que el promedio de edades es 28,7; el estrato promedio de la población es 3; y el numero de hijos esta entre 0-1
La mediana nos indica que el 50% de la población es menor de 25 años y el 50% es mayor de 25 años; 50% es menor, de la misma manera pertenece al estrato 0 y tienen 0 hijos
La moda para la edad corresponde a 23 años, la moda de estrato corresponde al 3, y el número de hijos corresponde a 0
La varianza indica que la variable edad es la que presenta mayor variablidad, mientras que el estrato y el número de hijos, tiene una pequeña variabilidad.
LS0tDQp0aXRsZTogIkVOQ1VFU1RBIENMQVNFIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkVuIGVsIHNlbWluYXJpbyBkZSBjb250cnVjY2nzbiBhIGNhcmdvIGxhIERvY2VudGUgTGluYSBCb25pbGxhLCBlbiBlbCBxdWUgYWJvcmRhcuEgZWwgdHJhdGFtaWVudG8gZXN0YWRpc3RpY28gbG9zIHRyYWJham9zIGRlIGdyYWRvLCBzZSBpbmljafMgY29uIHVuYSBhY3RpdmlkYWQgcXVlIHNlIGRlc2NyaWJpcuEgYSBjb250aW51YWNp824uDQoNCkNvbiBlbCBmaW4gZGUgdGVuZXIgdW4gZ3J1cG8gZGUgZGF0b3MgZGUgZGlmZXJlbnRlIHRpcG8sIHNlIHJlYWxpevMgdW5hIGVuY3Vlc3RhIGEgdG9kb3MgbG9zIDI0IGVzdHVkaWFudGVzIGRlIGNsYXNlLCBhIGVsbG9zIHNlIGxlcyBwcmVndW50byBwb3IgbGFzIHZhcmlhYmxlcyBxdWUgc2UgcHJlc2VudGFuIGEgY29udGludWFjafNuOg0KDQoNCmBgYHtyfQ0KQzwtcmVhZC5jc3YoIkxpYnJvRWplcmNpY2lvLmNzdiIsIHNlcCA9ICI7IikNCm5hbWVzKEMpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KEMsIGFlcyh4ID0gRURBRCkpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDIwLCA0MCwgYnkgPSA1KSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJwaW5rIikgKyBnZ3RpdGxlKCJISVNUT0dSQU1BIEVEQURFUyIpICsgeWxhYigiQ0FOVElEQUQgREUgRU5DVUVTVEFET1MiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTQsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwxNCkpICsgeGxhYigiRURBREVTIFtB8W9zXSIpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gYygyMi41LCAyNy41LCAzMi41LCAzNy41KSwgeSA9IGMoMTIuNSwgNi41LCAxLjUsIDIuNSksIGxhYmVsID0gYygiNTAlIiwgIjI1JSIsICI0LjE3JSIsICI4LjMzJSIpKQ0KDQpnZ3Bsb3QoQywgYWVzKHggPSBFU1RBVFVSQSkpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDEuNSwgMS45LCBieSA9IDAuMSksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAib3JhbmdlIikgKyBnZ3RpdGxlKCJISVNUT0dSQU1BIEVTVEFUVVJBIikgKyB5bGFiKCJDQU5USURBRCBERSBFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSwgbGltaXRzID0gYygwLDEwKSkgKyB4bGFiKCJFU1RBVFVSQVMgW21dIikgKyBhbm5vdGF0ZSgidGV4dCIsIHggPSBjKDEuNTUsIDEuNjUsIDEuNzUsIDEuODUpLCB5ID0gYyg5LjUsIDcuNSwgNS41LCAzLjUpLCBsYWJlbCA9IGMoIjM3LjUlIiwgIjI5LjE3JSIsICIyMC44MyUiLCAiMTIuNSUiKSkNCg0KZ2dwbG90KEMsIGFlcyh4ID0gQyRQRVNPLi5LZy4pKSArIGdlb21faGlzdG9ncmFtKGJyZWFrcyA9IHNlcSg1MCwgODAsIGJ5ID0gNiksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAiZGFyayByZWQiKSArIGdndGl0bGUoIkhJU1RPR1JBTUEgUEVTTyIpICsgeWxhYigiQ0FOVElEQUQgREUgRU5DVUVTVEFET1MiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNywgYnkgPSAxKSwgbGltaXRzID0gYygwLDcpKSArIHhsYWIoIlBFU09TIFtLZ10iKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoNTAsIDgwLCBieSA9IDYpLCBsaW1pdHMgPSBjKDUwLDgwKSkgICsgYW5ub3RhdGUoInRleHQiLCB4ID0gYyg1MywgNTksIDY1LCA3MSwgNzcpLCB5ID0gYyg0LjUsIDYuNSwgMi41LCA0LjUsIDYuNSksIGxhYmVsID0gYygiMTYuNjclIiwgIjI1JSIsICI4LjMzJSIsICIxNi42NyUiLCAiMjUlIikpDQogDQoNCmBgYA0KDQpgYGB7cn0NClBSTzwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKEMkUFJPRkVTSdNOKSkqMTAwKQ0KY29sbmFtZXMoUFJPKTwtYygiUFJPRkVTSU9OIiwgIlBPUkNFTlRBSkUiKQ0KDQprPC1jKCJQcmVncmFkbyIsICJQb3N0Z3JhZG8iLCAiRG9jdG9yYWRvIikNCnY8LWMoIjEiLCAiMiIsICIzIikNCg0KZ2dwbG90KFBSTywgYWVzKHggPSBQUk9GRVNJT04sIHkgPSBQT1JDRU5UQUpFKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgsIGZpbGwgPSAiZGVlcHBpbms0IikgKyBnZ3RpdGxlKCJFRFVDQUNJ004iKSArIHhsYWIoIiIpICsgeWxhYigiJSBFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAxKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaXplPTQsIHZqdXN0PS0wLjUsIGhqdXN0PTAuNSAsY29sPSJibGFjayIpICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSB2LCBsYWJlbHMgPSBrKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgODAsIGJ5ID0gNSksIGxpbWl0cyA9IGMoMCw4MCkpDQpgYGANCg0KYGBge3J9DQpIPC1hcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoQyRDQU5ULi5ISUpPUykpKjEwMCkNCmNvbG5hbWVzKEgpPC1jKCJISUpPUyIsICJQT1JDRU5UQUpFIikNCg0KDQoNCmdncGxvdChILCBhZXMoeCA9IEhJSk9TLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC44LCBmaWxsID0gImRhcmt0dXJxdW9pc2UiKSArIGdndGl0bGUoIkhJSk9TIikgKyB5bGFiKCIlIEVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDEpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9MC41LCBoanVzdD0tMC4yICxjb2w9ImJsYWNrIikgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsODApKSArIHhsYWIoIkNBTlRJREFEIERFIEhJSk9TIikgKyBjb29yZF9mbGlwKCkNCmBgYA0KYGBge3J9DQpFc3Q8LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShDJEVTVFJBVE8pKSoxMDApDQpjb2xuYW1lcyhFc3QpPC1jKCJFc3RyYXRvIiwgIlBPUkNFTlRBSkUiKQ0KDQoNCmdncGxvdChFc3QsIGFlcyh4ID0gRXN0cmF0bywgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9ICJnb2xkMiIpICsgZ2d0aXRsZSgiRVNUUkFUT1MiKSArIHhsYWIoIiIpICsgeWxhYigiJSBFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDYwKSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDIpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9MC41LCBoanVzdD0tMC4yICxjb2w9ImJsYWNrIikgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiksIGxhYmVscyA9IGMoIkVzdHJhdG8gMSIsICJFc3RyYXRvIDIiLCAiRXN0cmF0byAzIiwgIkVzdHJhdG8gNCIsICJFc3RyYXRvIDUiKSkgKyBjb29yZF9mbGlwKCkNCmBgYA0KDQpgYGB7cn0NCkhFPC1hcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoQyRDQU5ULi5IRVJNQU5PKSkqMTAwKQ0KY29sbmFtZXMoSEUpPC1jKCJIZXJtYW5vcyIsICJQT1JDRU5UQUpFIikNCg0KDQpnZ3Bsb3QoSEUsIGFlcyh4ID0gSGVybWFub3MsIHkgPSBQT1JDRU5UQUpFKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgsIGZpbGwgPSAibWVkaXVtcHVycGxlMSIsICBjb2wgPSAiYmxhY2siKSArIGdndGl0bGUoIkhFUk1BTk9TIikgKyB4bGFiKCJO2k1FUk8gREUgSEVSTUFOT1MiKSArIHlsYWIoIiUgRU5DVUVTVEFET1MiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIGdlb21fdGV4dChhZXMoeSA9IFBPUkNFTlRBSkUsIGxhYmVsID0gcGFzdGUocm91bmQoUE9SQ0VOVEFKRSwgMiksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2l6ZT00LCB2anVzdD0tMC41LCBoanVzdD0wLjUgLGNvbD0iYmxhY2siKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMzAsIGJ5ID0gNSksIGxpbWl0cyA9IGMoMCwzMCkpDQpgYGANCmBgYHtyfQ0KTTwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKEMkTUFUUklDVUxBRE8pKSoxMDApDQpjb2xuYW1lcyhNKTwtYygiTUFUUklDVUxBRE8iLCAiUE9SQ0VOVEFKRSIpDQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KE0sIGFlcyh4PSIiLCB5ID0gUE9SQ0VOVEFKRSwgZmlsbCA9IE1BVFJJQ1VMQURPKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxKStjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIsIGxhYmVscz1jKCJTaSIsIk5vIikpKyBsYWJzKHRpdGxlID0gIk1BVFJJQ1VMQURPIiwgeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIiIpK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzPU5VTEwsYnJlYWtzID0gTlVMTCkrc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9TlVMTCxicmVha3MgPSBOVUxMKSsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAxKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc2l6ZT01LCB2anVzdD0tMy41LCBoanVzdD0wLjcgLGNvbD0iYmxhY2siKSt5bGltKDAsIDEwMCkrIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpKQ0KYGBgDQpgYGB7cn0NCkVDPC1hcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoQyRFU1RBRE8uQ0lWSUwpKSoxMDApDQpjb2xuYW1lcyhFQyk8LWMoIkVDSSIsICJQT1JDRU5UQUpFIikNCg0KDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoRUMsIGFlcyh4PSIiLCB5ID0gUE9SQ0VOVEFKRSwgZmlsbCA9IEVDSSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkrY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiLCBsYWJlbHM9YygiU29sdGVybyIsIkNhc2FkbyIpKSsgbGFicyh0aXRsZSA9ICJFU1RBRE8gQ0lWSUwiLCB4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSAiIikrc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9TlVMTCxicmVha3MgPSBOVUxMKStzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz1OVUxMLGJyZWFrcyA9IE5VTEwpKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDEpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCBzaXplPTQsIHZqdXN0PTAsIGhqdXN0PTEuMiAsY29sPSJibGFjayIpK3lsaW0oMCwgMTAwKSsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIikpDQpgYGANCmBgYHtyfQ0KUjwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKEMkTFVHQVIuREUuT1JJR0VOKSkqMTAwKQ0KY29sbmFtZXMoUik8LWMoIkwiLCAiUE9SQ0VOVEFKRSIpDQoNCg0KZ2dwbG90KFIsIGFlcyh4ID0gTCwgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9ICJsaWdodHNhbG1vbiIpICsgZ2d0aXRsZSgiTFVHQVIgREUgT1JJR0VOIikgKyB4bGFiKCIiKSArIHlsYWIoIiUgRU5DVUVTVEFET1MiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgODAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDAsODApKSArIGdlb21fdGV4dChhZXMoeSA9IFBPUkNFTlRBSkUsIGxhYmVsID0gcGFzdGUocm91bmQoUE9SQ0VOVEFKRSwgMiksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2l6ZT00LCB2anVzdD0tMC41LCBoanVzdD0wLjUgLGNvbD0iYmxhY2siKSArIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzID0gYygiMSIsIjIiLCAiMyIsIjQiLCI1IiksIGxhYmVscyA9IGMoIlZhbGxlIGRlbCBDYXVjYSIsICJDYXVjYSIsICJRdWluZGlvIiwgIk5hcmnxbyIsICJDdW5kaW5hbWFyY2EiKSkgDQpgYGANCmBgYHtyfQ0KU2V4bzwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKEMkU0VYTykpKjEwMCkNCmNvbG5hbWVzKFNleG8pPC1jKCJTZXhvIiwgIlBPUkNFTlRBSkUiKQ0KDQpkPC1jKCJIT01CUkVTIiwgIk1VSkVSRVMiKQ0KZjwtYygiMSIsICIyIikNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChTZXhvLCBhZXMoeCA9IFNleG8sIHkgPSBQT1JDRU5UQUpFKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjUsIGZpbGwgPWMoImxpZ2h0Ymx1ZSIsICJob3RwaW5rMSIpKSArIGdndGl0bGUoIkfJTkVSTyIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDIpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9LTAuNSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIikgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGYsIGxhYmVscyA9IGQpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDYwKSkNCmBgYA0KTWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbDogU29uIGFxdWVsbGFzIHF1ZSBwcmV0ZW5kZW4gcmVzdW1pciBlbiB1biBzb2xvIHZhbG9yIGEgdW4gY29uanVudG8gZGUgdmFsb3JlcywgcmVwcmVjZW50YW4gZWwgY2VudHJvIGVuIHRvcm5vIGFsIGN1YWwgc2UgZW5jdWVudHJhbiB1YmljYWRvcyBsb3MgZGF0b3MuDQoNCg0KYGBge3J9DQpzdW1tYXJ5KEMpDQpgYGANCkVzdG8gY29ycmVzcG9uZGUgYSBxdWUgZWwgcHJvbWVkaW8gZGUgZWRhZGVzIGVzIDI4LDc7IGVsIGVzdHJhdG8gcHJvbWVkaW8gZGUgbGEgcG9ibGFjafNuIGVzIDM7IHkgZWwgbnVtZXJvIGRlIGhpam9zIGVzdGEgZW50cmUgMC0xDQoNCkxhIG1lZGlhbmEgbm9zIGluZGljYSBxdWUgZWwgNTAlIGRlIGxhIHBvYmxhY2nzbiBlcyBtZW5vciBkZSAyNSBh8W9zIHkgZWwgNTAlIGVzIG1heW9yIGRlIDI1IGHxb3M7IDUwJSBlcyBtZW5vciwgZGUgbGEgbWlzbWEgbWFuZXJhIHBlcnRlbmVjZSBhbCBlc3RyYXRvIDAgeSB0aWVuZW4gMCBoaWpvcw0KDQpMYSBtb2RhIHBhcmEgbGEgZWRhZCBjb3JyZXNwb25kZSBhIDIzIGHxb3MsIGxhIG1vZGEgZGUgZXN0cmF0byBjb3JyZXNwb25kZSBhbCAzLCB5IGVsIG76bWVybyBkZSBoaWpvcyBjb3JyZXNwb25kZSBhIDANCg0KTGEgdmFyaWFuemEgaW5kaWNhIHF1ZSBsYSB2YXJpYWJsZSBlZGFkIGVzIGxhIHF1ZSBwcmVzZW50YSBtYXlvciB2YXJpYWJsaWRhZCwgbWllbnRyYXMgcXVlIGVsIGVzdHJhdG8geSBlbCBu+m1lcm8gZGUgaGlqb3MsIHRpZW5lIHVuYSBwZXF1ZfFhIHZhcmlhYmlsaWRhZC4NCg0KDQoNCg==