# El aguacate necesita grandes cantidades de potasio y manganeso. Este cultivo es sensible al sodio y a los cloruros. La toxicidad por cloruros disminuye enormemente el crecimiento y engorde de las frutas, y causa necrosis de los márgenes de las hojas. La toxicidad del sodio produce clorosis y necrosis en las hojas. El árbol del aguacate es extraordinariamente versátil en su adaptación al tipo de suelo, se comporta bien en diferentes tipos, como los de arcillas rojas, arenas, margas volcánicas o suelos calcáreos. El valor deseable del pH en el suelo es, por lo general, de entre 6 y 7. La prioridad del árbol es contar con un buen drenaje. No aguanta la humedad excesiva del suelo ni la anegación temporal. (Tomado de ICL https://icl-sf.com/es-es/product-guide/cultivo-fruta-tropical/aguacate/)
# Por lo tanto, la aplicacion de fertilizantes foliares que contribuyan a promover un buen desarrollo del fruto, asi como el buen manejo del riego, es fundamental para analizar el rendimiento del cultivo. A continuacion se presenta el analisis estadistico de un diseño factorial incompleto en parcelas dividas, para estudiar y concluir el efecto de varios factores (Riego, Fertilizacion) sobre la variable respuesta.
library(readxl)
datos_hass <- read_excel("C:/Users/User/Desktop/AvoHass.xlsx")
datos_hass <- within(datos_hass, SoliF <- factor(Soli))
head(datos_hass)
Soli <- factor(datos_hass$Solinure)
Riego <- factor(datos_hass$Riego)
Bloque <-factor(datos_hass$Bloque)
Rto <-as.vector(datos_hass$Rto)
Re1 <-as.numeric(Rto)
library(collapsibleTree)
Re1 = datos_hass$Rto
Riego = datos_hass$Riego
SoliF= datos_hass$Soli
Warning: Unknown or uninitialised column: `Soli`.
dfsp<-data.frame(Rto = datos_hass$Rto,Riego = datos_hass$Riego, SoliF = datos_hass$SoliF)
dfsp
collapsibleTree::collapsibleTree(dfsp,c("Riego","SoliF"))
library(agricolae)
fran.anova <-strip.plot(Bloque, Soli, Riego, Re1)
ANALYSIS STRIP PLOT: Re1
Class level information
Soli : 0 25 50
Riego : Bajo Alto
Bloque : 1 2 3 4
Number of observations: 24
model Y: Re1 ~ Bloque + Soli + Ea + Riego + Eb + Riego:Soli + Ec
Analysis of Variance Table
Response: Re1
Df Sum Sq Mean Sq F value Pr(>F)
Bloque 3 214.026 71.342
Soli 2 43.178 21.589 0.8473 0.47414
Ea 6 152.884 25.481
Riego 1 17.428 17.428 5.3603 0.10353
Eb 3 9.754 3.251
Riego:Soli 2 188.103 94.051 8.8878 0.01607 *
Ec 6 63.493 10.582
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
cv(a) = 5 %, cv(b) = 1.8 %, cv(c) = 3.2 %, Mean = 100.667
fran.anova
$data
$ANOVA
Analysis of Variance Table
Response: Re1
Df Sum Sq Mean Sq F value Pr(>F)
Bloque 3 214.026 71.342
Soli 2 43.178 21.589 0.8473 0.47414
Ea 6 152.884 25.481
Riego 1 17.428 17.428 5.3603 0.10353
Eb 3 9.754 3.251
Riego:Soli 2 188.103 94.051 8.8878 0.01607 *
Ec 6 63.493 10.582
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
$gl.a
[1] 6
$gl.b
[1] 3
$gl.c
[1] 6
$Ea
[1] 25.48065
$Eb
[1] 3.251329
$Ec
[1] 10.58211
### Se observa que como el P valor de la interaccion es menor al Nivel de significancia, 0.05 si existe una interaccion entre la fertilizacion con Solinure y el tipo de Riego (Alto o bajo), por lo cual aplicamos el HSD Test (Tukey)
Factor1 <- HSD.test(Re1, Soli, fran.anova$gl.a, fran.anova$Ea); Factor1
$statistics
MSerror Df Mean CV MSD
25.48065 6 100.667 5.014391 7.744074
$parameters
test name.t ntr StudentizedRange alpha
Tukey Soli 3 4.339195 0.05
$means
Re1 std r Min Max Q25
0 100.57809 6.306749 8 93.09131 110.5291 94.96896
25 102.35236 5.703283 8 92.12843 109.5361 99.17359
50 99.07049 4.465256 8 90.46573 106.5962 98.32769
Q50 Q75
0 99.81995 105.5431
25 103.67415 106.3182
50 99.13017 100.0139
$comparison
NULL
$groups
Re1 groups
25 102.35236 a
0 100.57809 a
50 99.07049 a
attr(,"class")
[1] "group"
Factor2 <- HSD.test(Re1, Riego, fran.anova$gl.b, fran.anova$Eb); Factor2
# Para Dosis de Fertilizacion con Niveles de Riego
# Interacciones entre Aplicaciones de Solinure y Tipos de Riego para Aguacate Hass
Factor12<-HSD.test(Re1,Riego:Soli,fran.anova$gl.c,fran.anova$Ec);Factor12
$statistics
MSerror Df Mean CV MSD
10.58211 6 100.667 3.231462 9.15456
$parameters
test name.t ntr StudentizedRange alpha
Tukey Riego:Soli 6 5.628353 0.05
$means
Re1 std r Min Max
Alto:0 99.80117 7.898867 4 93.09131 110.52914
Alto:25 98.03444 4.634454 4 92.12843 103.06011
Alto:50 101.60886 3.519706 4 99.09645 106.59625
Bajo:0 101.35500 5.367199 4 95.05510 106.31181
Bajo:25 106.67029 2.168065 4 104.28818 109.53609
Bajo:50 96.53213 4.117371 4 90.46573 99.49227
Q25 Q50 Q75
Alto:0 94.30573 97.79212 103.28757
Alto:25 95.83958 98.47460 100.66946
Alto:50 99.14703 100.37136 102.83319
Bajo:0 97.83842 102.02655 105.54313
Bajo:25 105.72798 106.42845 107.37075
Bajo:50 95.81672 98.08526 98.80066
$comparison
NULL
$groups
Re1 groups
Bajo:25 106.67029 a
Alto:50 101.60886 ab
Bajo:0 101.35500 ab
Alto:0 99.80117 ab
Alto:25 98.03444 ab
Bajo:50 96.53213 b
attr(,"class")
[1] "group"
# Comparaciones de medias y graficas de barras
## Tuker para Dosis de Solinure
out1<-with(fran.anova,HSD.test(Re1,Soli,fran.anova$gl.a,fran.anova$Ea));out1
$statistics
MSerror Df Mean CV MSD
25.48065 6 100.667 5.014391 7.744074
$parameters
test name.t ntr StudentizedRange alpha
Tukey Soli 3 4.339195 0.05
$means
Re1 std r Min Max Q25
0 100.57809 6.306749 8 93.09131 110.5291 94.96896
25 102.35236 5.703283 8 92.12843 109.5361 99.17359
50 99.07049 4.465256 8 90.46573 106.5962 98.32769
Q50 Q75
0 99.81995 105.5431
25 103.67415 106.3182
50 99.13017 100.0139
$comparison
NULL
$groups
Re1 groups
25 102.35236 a
0 100.57809 a
50 99.07049 a
attr(,"class")
[1] "group"
bar.err(out1$means, variation ="SE", ylim=c(0,120), xlab="Aplicaciones de Solinure", ylab="Rto")

out2<-with(fran.anova,HSD.test(Re1,Riego,fran.anova$gl.b,fran.anova$Eb));out2
$statistics
MSerror Df Mean CV MSD
3.251329 3 100.667 1.791197 2.342696
$parameters
test name.t ntr StudentizedRange alpha
Tukey Riego 2 4.500659 0.05
$means
Re1 std r Min Max Q25
Alto 99.81482 5.34560 12 92.12843 110.5291 96.48510
Bajo 101.51914 5.69774 12 90.46573 109.5361 98.32769
Q50 Q75
Alto 99.51824 101.9492
Bajo 101.89022 106.2339
$comparison
NULL
$groups
Re1 groups
Bajo 101.51914 a
Alto 99.81482 a
attr(,"class")
[1] "group"
bar.err(out2$means, variation ="SE", ylim=c(0,120), xlab="Riego", ylab="Rto")

# Prueba de Tukey para Interaccion
out3<-with(fran.anova,HSD.test(Re1,Riego:Soli,fran.anova$gl.c,fran.anova$Ec));out3
$statistics
MSerror Df Mean CV MSD
10.58211 6 100.667 3.231462 9.15456
$parameters
test name.t ntr StudentizedRange alpha
Tukey Riego:Soli 6 5.628353 0.05
$means
Re1 std r Min Max Q25 Q50 Q75
Alto:0 99.80117 7.898867 4 93.09131 110.52914 94.30573 97.79212 103.28757
Alto:25 98.03444 4.634454 4 92.12843 103.06011 95.83958 98.47460 100.66946
Alto:50 101.60886 3.519706 4 99.09645 106.59625 99.14703 100.37136 102.83319
Bajo:0 101.35500 5.367199 4 95.05510 106.31181 97.83842 102.02655 105.54313
Bajo:25 106.67029 2.168065 4 104.28818 109.53609 105.72798 106.42845 107.37075
Bajo:50 96.53213 4.117371 4 90.46573 99.49227 95.81672 98.08526 98.80066
$comparison
NULL
$groups
Re1 groups
Bajo:25 106.67029 a
Alto:50 101.60886 ab
Bajo:0 101.35500 ab
Alto:0 99.80117 ab
Alto:25 98.03444 ab
Bajo:50 96.53213 b
attr(,"class")
[1] "group"
bar.err(out3$means, variation ="SE", ylim=c(0,120), xlab="Riego por Solinure", ylab="Rto")

interaction.plot(Soli,Riego,Re1, fixed=T, xlab="Aplicacion de Solinure", ylab="Rto", pch = c(20,21),type = "b")

### Si se observa que hay una interaccion entre el Rendimiento del Aguacate Hass por causa de la Aplicacion del Fertilzante Solinure y el tipo de Riego.
# Con la grafica obtenida de los datos manejados se puede concluir que los mayores rendimientos se dan con la Aplicacion de la Dosis de 25g y el tipo de riego bajo, siendo mas eficientes con los recursos y con costos mas bajos.
# Por otro lado, se confirma que la aplicacion de dosis de 50g para aguacate con riego bajo, causa una baja de rendimiento considerable, siendo el peor tratamiento de todos.
## Despues de analizar la interaccion entre los factores y el rendimiento, podemos ver el efecto de cada uno por separado.
A<-fran.anova$data
a<-nlevels(A$Soli)
b<-nlevels(A$Riego)
r<-nlevels(A$BLOF)
Ea<-fran.anova$Ea; Eb<-fran.anova$Eb; Ec<-fran.anova$Ec
gla<-fran.anova$gl.a; glb<-fran.anova$gl.b; glc<-fran.anova$gl.c
## Medias (Interacciones)
B <-tapply.stat(A[,4],A[,2:3],mean);B
NA
NA
# Error estandar de las medias de las interacciones
std<-tapply.stat(A[,4],A[,2:3],function(x) sd(x)/sqrt(length(x)));std
# Cabe resaltar que los datos fueron creados en Excel, con distribucion normal
LS0tDQp0aXRsZTogIkFuYWxpc2lzIGVzdGFkaXN0aWNvIC0gUGFyY2VsYXMgRGl2LiBSZW5kaW1pZW50byBBZ3VhY2F0ZSBIYXNzIC0gSnVhbiBTZWJhc3RpYW4gQ2FtZWxvIDAyLzEyIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQojIEVsIGFndWFjYXRlIG5lY2VzaXRhIGdyYW5kZXMgY2FudGlkYWRlcyBkZSBwb3Rhc2lvIHkgbWFuZ2FuZXNvLiBFc3RlIGN1bHRpdm8gZXMgc2Vuc2libGUgYWwgc29kaW8geSBhIGxvcyBjbG9ydXJvcy4gTGEgdG94aWNpZGFkIHBvciBjbG9ydXJvcyBkaXNtaW51eWUgZW5vcm1lbWVudGUgZWwgY3JlY2ltaWVudG8geSBlbmdvcmRlIGRlIGxhcyBmcnV0YXMsIHkgY2F1c2EgbmVjcm9zaXMgZGUgbG9zIG3DoXJnZW5lcyBkZSBsYXMgaG9qYXMuIExhIHRveGljaWRhZCBkZWwgc29kaW8gcHJvZHVjZSBjbG9yb3NpcyB5IG5lY3Jvc2lzIGVuIGxhcyBob2phcy4gRWwgw6FyYm9sIGRlbCBhZ3VhY2F0ZSBlcyBleHRyYW9yZGluYXJpYW1lbnRlIHZlcnPDoXRpbCBlbiBzdSBhZGFwdGFjacOzbiBhbCB0aXBvIGRlIHN1ZWxvLCBzZSBjb21wb3J0YSBiaWVuIGVuIGRpZmVyZW50ZXMgdGlwb3MsIGNvbW8gbG9zIGRlIGFyY2lsbGFzIHJvamFzLCBhcmVuYXMsIG1hcmdhcyB2b2xjw6FuaWNhcyBvIHN1ZWxvcyBjYWxjw6FyZW9zLiBFbCB2YWxvciBkZXNlYWJsZSBkZWwgcEggZW4gZWwgc3VlbG8gZXMsIHBvciBsbyBnZW5lcmFsLCBkZSBlbnRyZSA2IHkgNy4gTGEgcHJpb3JpZGFkIGRlbCDDoXJib2wgZXMgY29udGFyIGNvbiB1biBidWVuIGRyZW5hamUuIE5vIGFndWFudGEgbGEgaHVtZWRhZCBleGNlc2l2YSBkZWwgc3VlbG8gbmkgbGEgYW5lZ2FjacOzbiB0ZW1wb3JhbC4gKFRvbWFkbyBkZSBJQ0wgaHR0cHM6Ly9pY2wtc2YuY29tL2VzLWVzL3Byb2R1Y3QtZ3VpZGUvY3VsdGl2by1mcnV0YS10cm9waWNhbC9hZ3VhY2F0ZS8pDQoNCiMgUG9yIGxvIHRhbnRvLCBsYSBhcGxpY2FjaW9uIGRlIGZlcnRpbGl6YW50ZXMgZm9saWFyZXMgcXVlIGNvbnRyaWJ1eWFuIGEgcHJvbW92ZXIgdW4gYnVlbiBkZXNhcnJvbGxvIGRlbCBmcnV0bywgYXNpIGNvbW8gZWwgYnVlbiBtYW5lam8gZGVsIHJpZWdvLCBlcyBmdW5kYW1lbnRhbCBwYXJhIGFuYWxpemFyIGVsIHJlbmRpbWllbnRvIGRlbCBjdWx0aXZvLiBBIGNvbnRpbnVhY2lvbiBzZSBwcmVzZW50YSBlbCBhbmFsaXNpcyBlc3RhZGlzdGljbyBkZSB1biBkaXNlw7FvIGZhY3RvcmlhbCBpbmNvbXBsZXRvIGVuIHBhcmNlbGFzIGRpdmlkYXMsIHBhcmEgZXN0dWRpYXIgeSBjb25jbHVpciBlbCBlZmVjdG8gZGUgdmFyaW9zIGZhY3RvcmVzIChSaWVnbywgRmVydGlsaXphY2lvbikgc29icmUgbGEgdmFyaWFibGUgcmVzcHVlc3RhLg0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhdG9zX2hhc3MgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvVXNlci9EZXNrdG9wL0F2b0hhc3MueGxzeCIpDQoNCmRhdG9zX2hhc3MgPC0gd2l0aGluKGRhdG9zX2hhc3MsIFNvbGlGIDwtIGZhY3RvcihTb2xpKSkNCmhlYWQoZGF0b3NfaGFzcykNCmBgYA0KDQpgYGB7cn0NClNvbGkgPC0gZmFjdG9yKGRhdG9zX2hhc3MkU29saW51cmUpDQpSaWVnbyA8LSBmYWN0b3IoZGF0b3NfaGFzcyRSaWVnbykNCkJsb3F1ZSA8LWZhY3RvcihkYXRvc19oYXNzJEJsb3F1ZSkNClJ0byA8LWFzLnZlY3RvcihkYXRvc19oYXNzJFJ0bykNClJlMSA8LWFzLm51bWVyaWMoUnRvKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShjb2xsYXBzaWJsZVRyZWUpDQpSZTEgPSBkYXRvc19oYXNzJFJ0bw0KUmllZ28gPSBkYXRvc19oYXNzJFJpZWdvDQpTb2xpRj0gZGF0b3NfaGFzcyRTb2xpDQoNCmRmc3A8LWRhdGEuZnJhbWUoUnRvID0gZGF0b3NfaGFzcyRSdG8sUmllZ28gPSBkYXRvc19oYXNzJFJpZWdvLCBTb2xpRiA9IGRhdG9zX2hhc3MkU29saUYpDQpkZnNwDQpgYGANCg0KDQpgYGB7cn0NCmNvbGxhcHNpYmxlVHJlZTo6Y29sbGFwc2libGVUcmVlKGRmc3AsYygiUmllZ28iLCJTb2xpRiIpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkoYWdyaWNvbGFlKQ0KYGBgDQoNCmBgYHtyfQ0KZnJhbi5hbm92YSA8LXN0cmlwLnBsb3QoQmxvcXVlLCBTb2xpLCBSaWVnbywgUmUxKQ0KYGBgDQpgYGB7cn0NCmZyYW4uYW5vdmENCmBgYA0KYGBge3J9DQojIyMgU2Ugb2JzZXJ2YSBxdWUgY29tbyBlbCBQIHZhbG9yIGRlIGxhIGludGVyYWNjaW9uIGVzIG1lbm9yIGFsIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEsIDAuMDUgc2kgZXhpc3RlIHVuYSBpbnRlcmFjY2lvbiBlbnRyZSBsYSBmZXJ0aWxpemFjaW9uIGNvbiBTb2xpbnVyZSB5IGVsIHRpcG8gZGUgUmllZ28gKEFsdG8gbyBiYWpvKSwgcG9yIGxvIGN1YWwgYXBsaWNhbW9zIGVsIEhTRCBUZXN0IChUdWtleSkNCmBgYA0KDQpgYGB7cn0NCg0KRmFjdG9yMSA8LSBIU0QudGVzdChSZTEsIFNvbGksIGZyYW4uYW5vdmEkZ2wuYSwgZnJhbi5hbm92YSRFYSk7IEZhY3RvcjENCg0KIyBQYXJhIERvc2lzIGRlIEZlcnRpbGl6YWNpb24gY29uIFNvbGludXJlDQoNCmBgYA0KDQpgYGB7cn0NCg0KRmFjdG9yMiA8LSBIU0QudGVzdChSZTEsIFJpZWdvLCBmcmFuLmFub3ZhJGdsLmIsIGZyYW4uYW5vdmEkRWIpOyBGYWN0b3IyDQoNCiMgUGFyYSBEb3NpcyBkZSBGZXJ0aWxpemFjaW9uIGNvbiBOaXZlbGVzIGRlIFJpZWdvDQoNCmBgYA0KDQpgYGB7cn0NCiMgSW50ZXJhY2Npb25lcyBlbnRyZSBBcGxpY2FjaW9uZXMgZGUgU29saW51cmUgeSBUaXBvcyBkZSBSaWVnbyBwYXJhIEFndWFjYXRlIEhhc3MNCg0KRmFjdG9yMTI8LUhTRC50ZXN0KFJlMSxSaWVnbzpTb2xpLGZyYW4uYW5vdmEkZ2wuYyxmcmFuLmFub3ZhJEVjKTtGYWN0b3IxMg0KDQpgYGANCmBgYHtyfQ0KIyBDb21wYXJhY2lvbmVzIGRlIG1lZGlhcyB5IGdyYWZpY2FzIGRlIGJhcnJhcw0KDQojIyBUdWtlciBwYXJhIERvc2lzIGRlIFNvbGludXJlDQoNCg0Kb3V0MTwtd2l0aChmcmFuLmFub3ZhLEhTRC50ZXN0KFJlMSxTb2xpLGZyYW4uYW5vdmEkZ2wuYSxmcmFuLmFub3ZhJEVhKSk7b3V0MQ0KDQpgYGANCmBgYHtyfQ0KYmFyLmVycihvdXQxJG1lYW5zLCB2YXJpYXRpb24gPSJTRSIsIHlsaW09YygwLDEyMCksIHhsYWI9IkFwbGljYWNpb25lcyBkZSBTb2xpbnVyZSIsIHlsYWI9IlJ0byIpDQpgYGANCg0KYGBge3J9DQpvdXQyPC13aXRoKGZyYW4uYW5vdmEsSFNELnRlc3QoUmUxLFJpZWdvLGZyYW4uYW5vdmEkZ2wuYixmcmFuLmFub3ZhJEViKSk7b3V0Mg0KDQpiYXIuZXJyKG91dDIkbWVhbnMsIHZhcmlhdGlvbiA9IlNFIiwgeWxpbT1jKDAsMTIwKSwgeGxhYj0iUmllZ28iLCB5bGFiPSJSdG8iKQ0KYGBgDQoNCmBgYHtyfQ0KIyBQcnVlYmEgZGUgVHVrZXkgcGFyYSBJbnRlcmFjY2lvbg0KDQpvdXQzPC13aXRoKGZyYW4uYW5vdmEsSFNELnRlc3QoUmUxLFJpZWdvOlNvbGksZnJhbi5hbm92YSRnbC5jLGZyYW4uYW5vdmEkRWMpKTtvdXQzDQoNCmJhci5lcnIob3V0MyRtZWFucywgdmFyaWF0aW9uID0iU0UiLCB5bGltPWMoMCwxMjApLCB4bGFiPSJSaWVnbyBwb3IgU29saW51cmUiLCB5bGFiPSJSdG8iKQ0KDQpgYGANCmBgYHtyfQ0KaW50ZXJhY3Rpb24ucGxvdChTb2xpLFJpZWdvLFJlMSwgZml4ZWQ9VCwgeGxhYj0iQXBsaWNhY2lvbiBkZSBTb2xpbnVyZSIsIHlsYWI9IlJ0byIsIHBjaCA9IGMoMjAsMjEpLHR5cGUgPSAiYiIpIA0KYGBgDQoNCmBgYHtyfQ0KIyMjIFNpIHNlIG9ic2VydmEgcXVlIGhheSB1bmEgaW50ZXJhY2Npb24gZW50cmUgZWwgUmVuZGltaWVudG8gZGVsIEFndWFjYXRlIEhhc3MgcG9yIGNhdXNhIGRlIGxhIEFwbGljYWNpb24gZGVsIEZlcnRpbHphbnRlIFNvbGludXJlIHkgZWwgdGlwbyBkZSBSaWVnby4NCg0KIyAgQ29uIGxhIGdyYWZpY2Egb2J0ZW5pZGEgZGUgbG9zIGRhdG9zIG1hbmVqYWRvcyBzZSBwdWVkZSBjb25jbHVpciBxdWUgbG9zIG1heW9yZXMgcmVuZGltaWVudG9zIHNlIGRhbiBjb24gbGEgQXBsaWNhY2lvbiBkZSBsYSBEb3NpcyBkZSAyNWcgeSBlbCB0aXBvIGRlIHJpZWdvIGJham8sIHNpZW5kbyBtYXMgZWZpY2llbnRlcyBjb24gbG9zIHJlY3Vyc29zIHkgY29uIGNvc3RvcyBtYXMgYmFqb3MuIA0KDQojIFBvciBvdHJvIGxhZG8sIHNlIGNvbmZpcm1hIHF1ZSBsYSBhcGxpY2FjaW9uIGRlIGRvc2lzIGRlIDUwZyBwYXJhIGFndWFjYXRlIGNvbiByaWVnbyBiYWpvLCBjYXVzYSB1bmEgYmFqYSBkZSByZW5kaW1pZW50byBjb25zaWRlcmFibGUsIHNpZW5kbyBlbCBwZW9yIHRyYXRhbWllbnRvIGRlIHRvZG9zLg0KDQpgYGANCg0KDQpgYGB7cn0NCiMjIERlc3B1ZXMgZGUgYW5hbGl6YXIgbGEgaW50ZXJhY2Npb24gZW50cmUgbG9zIGZhY3RvcmVzIHkgZWwgcmVuZGltaWVudG8sIHBvZGVtb3MgdmVyIGVsIGVmZWN0byBkZSBjYWRhIHVubyBwb3Igc2VwYXJhZG8uDQpgYGANCg0KYGBge3J9DQpBPC1mcmFuLmFub3ZhJGRhdGENCmE8LW5sZXZlbHMoQSRTb2xpKQ0KYjwtbmxldmVscyhBJFJpZWdvKQ0KcjwtbmxldmVscyhBJEJMT0YpDQpFYTwtZnJhbi5hbm92YSRFYTsgRWI8LWZyYW4uYW5vdmEkRWI7IEVjPC1mcmFuLmFub3ZhJEVjDQpnbGE8LWZyYW4uYW5vdmEkZ2wuYTsgZ2xiPC1mcmFuLmFub3ZhJGdsLmI7IGdsYzwtZnJhbi5hbm92YSRnbC5jDQpgYGANCg0KYGBge3J9DQojIyBNZWRpYXMgKEludGVyYWNjaW9uZXMpDQpCIDwtdGFwcGx5LnN0YXQoQVssNF0sQVssMjozXSxtZWFuKTtCDQpgYGANCg0KYGBge3J9DQojIEVycm9yIGVzdGFuZGFyIGRlIGxhcyBtZWRpYXMgZGUgbGFzIGludGVyYWNjaW9uZXMNCnN0ZDwtdGFwcGx5LnN0YXQoQVssNF0sQVssMjozXSxmdW5jdGlvbih4KSBzZCh4KS9zcXJ0KGxlbmd0aCh4KSkpO3N0ZA0KYGBgDQoNCmBgYHtyfQ0KIyBDYWJlIHJlc2FsdGFyIHF1ZSBsb3MgZGF0b3MgZnVlcm9uIGNyZWFkb3MgZW4gRXhjZWwsIGNvbiBkaXN0cmlidWNpb24gbm9ybWFsDQoNCmBgYA0KDQo=