#LIBRERIAS
library(ade4)
library(adespatial)
library(cluster)
library(clustsig)
library(fdth)
library(gclus)
library(ggplot2)
library(labdsv)
library(lattice)
library(PerformanceAnalytics)
library(RColorBrewer)
library(readxl)
library(vegan)
#Cargar bases de datos

biol <- read_excel("~/jose_cruz/Clases y evaluaciones/base de datos/diatomeas.xlsx", 
                   sheet = "biol")

biol1 <- biol[-c(1,83,84)]

amb <- read_excel("~/jose_cruz/Clases y evaluaciones/base de datos/diatomeas.xlsx", 
                  sheet = "amb")

amb.mod <- amb[-c(1,10,11)] # SIN CARACTERES
amb1 <- amb[-c(13:16),] #SE ELIMINA EL MES DE NOVIEMBRE
amb2 <- amb1[-c(1,10,11)]#SIN CARACTERES

amb.std.mod <- decostand(amb.mod,"standardize")
amb.std <- decostand(amb2,"standardize") # SIN NOVIEMBRE

#Transformacion de los datos
biol.hell <- decostand(biol1, "hell")

Hipótesis 1. La descarga de aguas servidas genera cambios en la composición y diversidad de diatomeas, temporal y espacialmente

Si fuese posible determinar diferencias en la composición de diatomeas, indique cuales son las especies que aportan en un 60% a la diferencias detectadas. Apoye sus resultados con un análisis de ordenación, dando prioridad a la representación gráfica de sus resultados.

#espacialmente
simp_S <- simper(biol1, amb1$Sitio)
summary(simp_S)
#temporalmente
simp_T <- simper(biol1, amb1$Mes)
summary(simp_T)

Respuesta hipótesis 1:

La descarga de aguas servidas no genera cambios significativos en la composición y diversidad de diatomeas entre los sitios de muestreo (p > 0.05).

Por otro lado, la descarga de aguas servidas genera cambios significativos en la composición y diversidad de diatomeas temporalmente.

Entre agosto y febrero, las especies que aportan una diferencia del 60% son la 81, la 17, la 60 y la 6, sin embargo, las especies 17, y 6 no resultaron estadísticamente significativas (p >0.05).

Entre los meses de agosto y junio, las especies que aportan una diferencia del 60% son la 17, la 30, la 60, la 45, la 26, la 56, la 13, la 6 y la 15, sin embargo, las especies 17, 30, 45, 13 y 6 no resultaron estadísticamente significativas (p >0.05)

Finalmente, entre febrero y junio, las especies que aportan un 60% de la diferencia entre meses son la 81, la 30, la 6 y la 17. Las especies 81 y 30 explican significativamente el 52.9% de la diferencia.

Para la representación gráfica, se procedió con un análisis de ordenación DCA, para determinar si proceder con un CCA o un RDA. Los valores de Axis length (< 4) demostraron que es más conveniente proceder con un RDA.

#analisis de ordenacion
biol_dca <- decorana(biol.hell)
summary(biol_dca)
plot(biol_dca, scaling = 2, main = "DCA")

biol.rda <- rda(biol.hell ~ . , amb.std)
biol.rda

El análisis de RDA (figura 1) demuestra que la composición y la diversidad de diatomeas no están fuertemente asociadas a ninguna de las variables ambientales que se tomaron en cuenta, sin embargo el modelo resultó estadísticamente significativo (F = 2.479; df = 8,3 ; p < 0.05, R2adj = 0.5182).

Figura 1.Comparación de la diversidad de diatomeas por análisis de RDA:

plot(biol.rda)

(R2 <- RsquareAdj(biol.rda)$r.squared)
(R2adj <- RsquareAdj(biol.rda)$adj.r.squared)

Hipótesis 2. La descarga de aguas servidas genera cambios en los parámetros fisicoquímicos del agua.

Utilice la técnica de clúster para verificar si existen patrones de similitud temporales o espaciales en la composición de parámetros fisicoquímicos. Muestre sus resultados utilizando gráficas y complemente con los análisis estadísticos necesarios para justificar la conformación del clúster. Registre el proceso estadístico que utilizó para sus análisis.

#transformacion de datos
amb.hell.bray <- vegdist(amb.std.mod, "euclidean")
#Cluster metodo single
cluster_single <- hclust(amb.hell.bray, method = "single")
cluster_single
plot(cluster_single)
#Cluster metodo COMPLETE
cluster_complete <- hclust(amb.hell.bray, method = "complete")
cluster_complete
plot(cluster_complete)
#Cluster metodo Average

cluster_average <- hclust(amb.hell.bray, method = "average")
cluster_average
plot(cluster_average)
#Analisis del mejor modelo por la tecnica de cofenetica
coph_single <-  cophenetic(cluster_single)
cor(coph_single, amb.hell.bray) #0.8757353

coph_complete <-  cophenetic(cluster_complete)
cor(coph_complete, amb.hell.bray) #0.8900852

coph_average <-  cophenetic(cluster_average)
cor(coph_average, amb.hell.bray)  #0.8931573, mejor modelo
simprof.average <- simprof(amb.std.mod, method.cluster = "average", method.distance = "euclidean")

Respuesta hipótesis 2:

Procediendo con una técnica de clúster se compararon los valores cofeneticos para los modelos “single” “complete” y average”, los cuales resultaron 0.8757353, 0.8900852 y 0.8931573 respectivamente. Dado lo anterior, se decide proceder con el método “average” por presentar un mayor valor de cofenetica (figura 2).

Figura 2. Dendograma de variables ambientales por clúster (método average)

plot(cluster_average)

El simprof (figura 3) demuestra significativamente que hay cierto grado de similitud entre las variables fisico-quimicas de los cuatro sitios durante el mes de Agosto (muestreo de 1 a 4). Durante el mes de febrero (muestreos de 5 a 8) se puede apreciar una diferencia significativa entre los sitios ubicados antes y despues de la descarga y lo mismo aplica al mes de Junio (muestreos de 9 a 12). Por ultimo, el mes de noviembre explica que no hay diferencia entre los cuatro sitios independientemente de la posicion si antes o despues de la descarga.

Figura 3. Agrupación de variables ambientales por metodo simprof

simprof.plot(simprof.average)
'dendrogram' with 2 branches and 16 members total, at height 4.744403 

Hipótesis 3 Los parámetros físico químicos varían entre los sitios y fechas de muestreo en el área de estudio

Considere sus análisis al 95% y resuelva anotando la nomenclatura estadística formal.

adonis2(amb.mod ~ Sitio, amb) #no hay diferencia
adonis2(amb.mod ~ Mes, amb) #hay diferencia

Respuestas hipótesis tres: Según la prueba de Análisis de varianza usando matrices de distancia(Adonis), se determinó que existen diferencias estadísticamente significativas que indican que los parámetros fisicoquímicos varían entre las fechas de muestreo en el área de estudio (F = 49.135; df = 3,15 ; p < 0.05), no obstante, no existen diferencias estadísticamente significativas que indiquen un cambio en los parámetros fisicoquímicos con los sitios de muestreo (F = 0.1973; df 3,15 ; p > 0.05)

LS0tDQp0aXRsZTogIkVzdHVkaW8gZGUgY2FzbyAxOiBNYXJpcGF6LFNhc2hhLCBKYW1pZSwgUmFmYWVsIHkgSm9zZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KI0xJQlJFUklBUw0KbGlicmFyeShhZGU0KQ0KbGlicmFyeShhZGVzcGF0aWFsKQ0KbGlicmFyeShjbHVzdGVyKQ0KbGlicmFyeShjbHVzdHNpZykNCmxpYnJhcnkoZmR0aCkNCmxpYnJhcnkoZ2NsdXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGxhYmRzdikNCmxpYnJhcnkobGF0dGljZSkNCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh2ZWdhbikNCmBgYA0KDQpgYGB7cn0NCiNDYXJnYXIgYmFzZXMgZGUgZGF0b3MNCg0KYmlvbCA8LSByZWFkX2V4Y2VsKCJ+L2pvc2VfY3J1ei9DbGFzZXMgeSBldmFsdWFjaW9uZXMvYmFzZSBkZSBkYXRvcy9kaWF0b21lYXMueGxzeCIsIA0KICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gImJpb2wiKQ0KDQpiaW9sMSA8LSBiaW9sWy1jKDEsODMsODQpXQ0KDQphbWIgPC0gcmVhZF9leGNlbCgifi9qb3NlX2NydXovQ2xhc2VzIHkgZXZhbHVhY2lvbmVzL2Jhc2UgZGUgZGF0b3MvZGlhdG9tZWFzLnhsc3giLCANCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gImFtYiIpDQoNCmFtYi5tb2QgPC0gYW1iWy1jKDEsMTAsMTEpXSAjIFNJTiBDQVJBQ1RFUkVTDQphbWIxIDwtIGFtYlstYygxMzoxNiksXSAjU0UgRUxJTUlOQSBFTCBNRVMgREUgTk9WSUVNQlJFDQphbWIyIDwtIGFtYjFbLWMoMSwxMCwxMSldI1NJTiBDQVJBQ1RFUkVTDQoNCmFtYi5zdGQubW9kIDwtIGRlY29zdGFuZChhbWIubW9kLCJzdGFuZGFyZGl6ZSIpDQphbWIuc3RkIDwtIGRlY29zdGFuZChhbWIyLCJzdGFuZGFyZGl6ZSIpICMgU0lOIE5PVklFTUJSRQ0KDQojVHJhbnNmb3JtYWNpb24gZGUgbG9zIGRhdG9zDQpiaW9sLmhlbGwgPC0gZGVjb3N0YW5kKGJpb2wxLCAiaGVsbCIpDQoNCmBgYA0KDQpIaXDDs3Rlc2lzIDEuIExhIGRlc2NhcmdhIGRlIGFndWFzIHNlcnZpZGFzIGdlbmVyYSBjYW1iaW9zIGVuIGxhIGNvbXBvc2ljacOzbiB5IGRpdmVyc2lkYWQgZGUgZGlhdG9tZWFzLCB0ZW1wb3JhbCB5IGVzcGFjaWFsbWVudGUNCg0KU2kgZnVlc2UgcG9zaWJsZSBkZXRlcm1pbmFyIGRpZmVyZW5jaWFzIGVuIGxhIGNvbXBvc2ljacOzbiBkZSBkaWF0b21lYXMsIGluZGlxdWUgY3VhbGVzIHNvbiBsYXMgZXNwZWNpZXMgcXVlIGFwb3J0YW4gZW4gdW4gNjAlIGEgbGEgZGlmZXJlbmNpYXMgZGV0ZWN0YWRhcy4gQXBveWUgc3VzIHJlc3VsdGFkb3MgY29uIHVuIGFuw6FsaXNpcyBkZSBvcmRlbmFjacOzbiwgZGFuZG8gcHJpb3JpZGFkIGEgbGEgcmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIGRlIHN1cyByZXN1bHRhZG9zLg0KDQoNCmBgYHtyfQ0KI2VzcGFjaWFsbWVudGUNCnNpbXBfUyA8LSBzaW1wZXIoYmlvbDEsIGFtYjEkU2l0aW8pDQpzdW1tYXJ5KHNpbXBfUykNCg0KYGBgDQoNCg0KYGBge3J9DQojdGVtcG9yYWxtZW50ZQ0Kc2ltcF9UIDwtIHNpbXBlcihiaW9sMSwgYW1iMSRNZXMpDQpzdW1tYXJ5KHNpbXBfVCkNCmBgYA0KDQpSZXNwdWVzdGEgaGlww7N0ZXNpcyAxOg0KDQpMYSBkZXNjYXJnYSBkZSBhZ3VhcyBzZXJ2aWRhcyBubyBnZW5lcmEgY2FtYmlvcyBzaWduaWZpY2F0aXZvcyBlbiBsYSBjb21wb3NpY2nDs24geSBkaXZlcnNpZGFkIGRlIGRpYXRvbWVhcyBlbnRyZSBsb3Mgc2l0aW9zIGRlIG11ZXN0cmVvIChwID4gMC4wNSkuDQoNClBvciBvdHJvIGxhZG8sIGxhIGRlc2NhcmdhIGRlIGFndWFzIHNlcnZpZGFzIGdlbmVyYSBjYW1iaW9zIHNpZ25pZmljYXRpdm9zIGVuIGxhIGNvbXBvc2ljacOzbiB5IGRpdmVyc2lkYWQgZGUgZGlhdG9tZWFzIHRlbXBvcmFsbWVudGUuDQoNCkVudHJlIGFnb3N0byB5IGZlYnJlcm8sIGxhcyBlc3BlY2llcyBxdWUgYXBvcnRhbiB1bmEgZGlmZXJlbmNpYSBkZWwgNjAlIHNvbiBsYSA4MSwgbGEgMTcsIGxhIDYwIHkgbGEgNiwgc2luIGVtYmFyZ28sIGxhcyBlc3BlY2llcyAxNywgeSA2IG5vIHJlc3VsdGFyb24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgKHAgPjAuMDUpLg0KDQpFbnRyZSBsb3MgbWVzZXMgZGUgYWdvc3RvIHkganVuaW8sIGxhcyBlc3BlY2llcyBxdWUgYXBvcnRhbiB1bmEgZGlmZXJlbmNpYSBkZWwgNjAlIHNvbiBsYSAxNywgbGEgMzAsIGxhIDYwLCBsYSA0NSwgbGEgMjYsIGxhIDU2LCBsYSAxMywgbGEgNiB5IGxhIDE1LCBzaW4gZW1iYXJnbywgbGFzIGVzcGVjaWVzIDE3LCAzMCwgNDUsIDEzIHkgNiBubyByZXN1bHRhcm9uIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmFzIChwID4wLjA1KQ0KDQpGaW5hbG1lbnRlLCBlbnRyZSBmZWJyZXJvIHkganVuaW8sIGxhcyBlc3BlY2llcyBxdWUgYXBvcnRhbiB1biA2MCUgZGUgbGEgZGlmZXJlbmNpYSBlbnRyZSBtZXNlcyBzb24gbGEgODEsIGxhIDMwLCBsYSA2IHkgbGEgMTcuIExhcyBlc3BlY2llcyA4MSB5IDMwIGV4cGxpY2FuIHNpZ25pZmljYXRpdmFtZW50ZSBlbCA1Mi45JSBkZSBsYSBkaWZlcmVuY2lhLg0KDQoNClBhcmEgbGEgcmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhLCBzZSBwcm9jZWRpw7MgY29uIHVuIGFuw6FsaXNpcyBkZSBvcmRlbmFjacOzbiBEQ0EsIHBhcmEgZGV0ZXJtaW5hciBzaSBwcm9jZWRlciBjb24gdW4gQ0NBIG8gdW4gUkRBLiBMb3MgdmFsb3JlcyBkZSBBeGlzIGxlbmd0aCAoPCA0KSBkZW1vc3RyYXJvbiBxdWUgZXMgbcOhcyBjb252ZW5pZW50ZSBwcm9jZWRlciBjb24gdW4gUkRBLg0KDQpgYGB7cn0NCiNhbmFsaXNpcyBkZSBvcmRlbmFjaW9uDQpiaW9sX2RjYSA8LSBkZWNvcmFuYShiaW9sLmhlbGwpDQpzdW1tYXJ5KGJpb2xfZGNhKQ0KDQpgYGANCg0KYGBge3J9DQpwbG90KGJpb2xfZGNhLCBzY2FsaW5nID0gMiwgbWFpbiA9ICJEQ0EiKQ0KYGBgDQoNCmBgYHtyfQ0KYmlvbC5yZGEgPC0gcmRhKGJpb2wuaGVsbCB+IC4gLCBhbWIuc3RkKQ0KYmlvbC5yZGENCmBgYA0KDQpFbCBhbsOhbGlzaXMgZGUgUkRBIChmaWd1cmEgMSkgZGVtdWVzdHJhIHF1ZSBsYSBjb21wb3NpY2nDs24geSBsYSBkaXZlcnNpZGFkIGRlIGRpYXRvbWVhcyBubyBlc3TDoW4gZnVlcnRlbWVudGUgYXNvY2lhZGFzIGEgbmluZ3VuYSBkZSBsYXMgdmFyaWFibGVzIGFtYmllbnRhbGVzIHF1ZSBzZSB0b21hcm9uIGVuIGN1ZW50YSwgc2luIGVtYmFyZ28gZWwgbW9kZWxvIHJlc3VsdMOzIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdm8gKEYgPSAyLjQ3OTsgZGYgPSA4LDMgOyBwIDwgMC4wNSwgUjJhZGogPSAwLjUxODIpLg0KDQoNCkZpZ3VyYSAxLkNvbXBhcmFjacOzbiBkZSBsYSBkaXZlcnNpZGFkIGRlIGRpYXRvbWVhcyBwb3IgYW7DoWxpc2lzIGRlIFJEQToNCmBgYHtyfQ0KcGxvdChiaW9sLnJkYSkNCmBgYA0KDQpgYGB7cn0NCihSMiA8LSBSc3F1YXJlQWRqKGJpb2wucmRhKSRyLnNxdWFyZWQpDQooUjJhZGogPC0gUnNxdWFyZUFkaihiaW9sLnJkYSkkYWRqLnIuc3F1YXJlZCkNCg0KYGBgDQoNCkhpcMOzdGVzaXMgMi4gTGEgZGVzY2FyZ2EgZGUgYWd1YXMgc2VydmlkYXMgZ2VuZXJhIGNhbWJpb3MgZW4gbG9zIHBhcsOhbWV0cm9zIGZpc2ljb3F1w61taWNvcyBkZWwgYWd1YS4NCg0KVXRpbGljZSBsYSB0w6ljbmljYSBkZSBjbMO6c3RlciBwYXJhIHZlcmlmaWNhciBzaSBleGlzdGVuIHBhdHJvbmVzIGRlIHNpbWlsaXR1ZCB0ZW1wb3JhbGVzIG8gZXNwYWNpYWxlcyBlbiBsYSBjb21wb3NpY2nDs24gZGUgcGFyw6FtZXRyb3MgZmlzaWNvcXXDrW1pY29zLiBNdWVzdHJlIHN1cyByZXN1bHRhZG9zIHV0aWxpemFuZG8gZ3LDoWZpY2FzIHkgY29tcGxlbWVudGUgY29uIGxvcyBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyBuZWNlc2FyaW9zIHBhcmEganVzdGlmaWNhciBsYSBjb25mb3JtYWNpw7NuIGRlbCBjbMO6c3Rlci4gUmVnaXN0cmUgZWwgcHJvY2VzbyBlc3RhZMOtc3RpY28gcXVlIHV0aWxpesOzIHBhcmEgc3VzIGFuw6FsaXNpcy4NCg0KYGBge3J9DQojdHJhbnNmb3JtYWNpb24gZGUgZGF0b3MNCmFtYi5oZWxsLmJyYXkgPC0gdmVnZGlzdChhbWIuc3RkLm1vZCwgImV1Y2xpZGVhbiIpDQpgYGANCg0KYGBge3J9DQojQ2x1c3RlciBtZXRvZG8gc2luZ2xlDQpjbHVzdGVyX3NpbmdsZSA8LSBoY2x1c3QoYW1iLmhlbGwuYnJheSwgbWV0aG9kID0gInNpbmdsZSIpDQpjbHVzdGVyX3NpbmdsZQ0KcGxvdChjbHVzdGVyX3NpbmdsZSkNCmBgYA0KDQpgYGB7cn0NCiNDbHVzdGVyIG1ldG9kbyBDT01QTEVURQ0KY2x1c3Rlcl9jb21wbGV0ZSA8LSBoY2x1c3QoYW1iLmhlbGwuYnJheSwgbWV0aG9kID0gImNvbXBsZXRlIikNCmNsdXN0ZXJfY29tcGxldGUNCnBsb3QoY2x1c3Rlcl9jb21wbGV0ZSkNCg0KYGBgDQoNCmBgYHtyfQ0KI0NsdXN0ZXIgbWV0b2RvIEF2ZXJhZ2UNCg0KY2x1c3Rlcl9hdmVyYWdlIDwtIGhjbHVzdChhbWIuaGVsbC5icmF5LCBtZXRob2QgPSAiYXZlcmFnZSIpDQpjbHVzdGVyX2F2ZXJhZ2UNCnBsb3QoY2x1c3Rlcl9hdmVyYWdlKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNBbmFsaXNpcyBkZWwgbWVqb3IgbW9kZWxvIHBvciBsYSB0ZWNuaWNhIGRlIGNvZmVuZXRpY2ENCmNvcGhfc2luZ2xlIDwtICBjb3BoZW5ldGljKGNsdXN0ZXJfc2luZ2xlKQ0KY29yKGNvcGhfc2luZ2xlLCBhbWIuaGVsbC5icmF5KSAjMC44NzU3MzUzDQoNCmNvcGhfY29tcGxldGUgPC0gIGNvcGhlbmV0aWMoY2x1c3Rlcl9jb21wbGV0ZSkNCmNvcihjb3BoX2NvbXBsZXRlLCBhbWIuaGVsbC5icmF5KSAjMC44OTAwODUyDQoNCmNvcGhfYXZlcmFnZSA8LSAgY29waGVuZXRpYyhjbHVzdGVyX2F2ZXJhZ2UpDQpjb3IoY29waF9hdmVyYWdlLCBhbWIuaGVsbC5icmF5KSAgIzAuODkzMTU3MywgbWVqb3IgbW9kZWxvDQoNCmBgYA0KDQpgYGB7cn0NCnNpbXByb2YuYXZlcmFnZSA8LSBzaW1wcm9mKGFtYi5zdGQubW9kLCBtZXRob2QuY2x1c3RlciA9ICJhdmVyYWdlIiwgbWV0aG9kLmRpc3RhbmNlID0gImV1Y2xpZGVhbiIpDQpgYGANCg0KUmVzcHVlc3RhIGhpcMOzdGVzaXMgMjoNCg0KUHJvY2VkaWVuZG8gY29uIHVuYSB0w6ljbmljYSBkZSBjbMO6c3RlciBzZSBjb21wYXJhcm9uIGxvcyB2YWxvcmVzIGNvZmVuZXRpY29zIHBhcmEgbG9zIG1vZGVsb3MgInNpbmdsZSIgImNvbXBsZXRlIiB5IGF2ZXJhZ2UiLCBsb3MgY3VhbGVzIHJlc3VsdGFyb24gMC44NzU3MzUzLCAwLjg5MDA4NTIgeSAwLjg5MzE1NzMgcmVzcGVjdGl2YW1lbnRlLiBEYWRvIGxvIGFudGVyaW9yLCBzZSBkZWNpZGUgcHJvY2VkZXIgY29uIGVsIG3DqXRvZG8gImF2ZXJhZ2UiIHBvciBwcmVzZW50YXIgdW4gbWF5b3IgdmFsb3IgZGUgY29mZW5ldGljYSAoZmlndXJhIDIpLiANCg0KRmlndXJhIDIuIERlbmRvZ3JhbWEgZGUgdmFyaWFibGVzIGFtYmllbnRhbGVzIHBvciBjbMO6c3RlciAobcOpdG9kbyBhdmVyYWdlKQ0KDQpgYGB7cn0NCnBsb3QoY2x1c3Rlcl9hdmVyYWdlKQ0KYGBgDQoNCkVsIHNpbXByb2YgKGZpZ3VyYSAzKSBkZW11ZXN0cmEgc2lnbmlmaWNhdGl2YW1lbnRlIHF1ZSBoYXkgY2llcnRvIGdyYWRvIGRlIHNpbWlsaXR1ZCBlbnRyZSBsYXMgdmFyaWFibGVzIGZpc2ljby1xdWltaWNhcyBkZSBsb3MgY3VhdHJvIHNpdGlvcyBkdXJhbnRlIGVsIG1lcyBkZSBBZ29zdG8gKG11ZXN0cmVvIGRlIDEgYSA0KS4gRHVyYW50ZSBlbCBtZXMgZGUgZmVicmVybyAobXVlc3RyZW9zIGRlIDUgYSA4KSBzZSBwdWVkZSBhcHJlY2lhciB1bmEgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVudHJlIGxvcyBzaXRpb3MgdWJpY2Fkb3MgYW50ZXMgeSBkZXNwdWVzIGRlIGxhIGRlc2NhcmdhIHkgbG8gbWlzbW8gYXBsaWNhIGFsIG1lcyBkZSBKdW5pbyAobXVlc3RyZW9zIGRlIDkgYSAxMikuIFBvciB1bHRpbW8sIGVsIG1lcyBkZSBub3ZpZW1icmUgZXhwbGljYSBxdWUgbm8gaGF5IGRpZmVyZW5jaWEgZW50cmUgbG9zIGN1YXRybyBzaXRpb3MgaW5kZXBlbmRpZW50ZW1lbnRlIGRlIGxhIHBvc2ljaW9uIHNpIGFudGVzIG8gZGVzcHVlcyBkZSBsYSBkZXNjYXJnYS4NCg0KRmlndXJhIDMuIEFncnVwYWNpw7NuIGRlIHZhcmlhYmxlcyBhbWJpZW50YWxlcyBwb3IgbWV0b2RvIHNpbXByb2YNCg0KYGBge3J9DQpzaW1wcm9mLnBsb3Qoc2ltcHJvZi5hdmVyYWdlKQ0KYGBgDQoNCg0KSGlww7N0ZXNpcyAzIExvcyBwYXLDoW1ldHJvcyBmw61zaWNvIHF1w61taWNvcyB2YXLDrWFuIGVudHJlIGxvcyBzaXRpb3MgeSBmZWNoYXMgZGUgbXVlc3RyZW8gZW4gZWwgw6FyZWEgZGUgZXN0dWRpbw0KDQpDb25zaWRlcmUgc3VzIGFuw6FsaXNpcyBhbCA5NSUgeSByZXN1ZWx2YSBhbm90YW5kbyBsYSBub21lbmNsYXR1cmEgZXN0YWTDrXN0aWNhIGZvcm1hbC4NCg0KYGBge3J9DQphZG9uaXMyKGFtYi5tb2QgfiBTaXRpbywgYW1iKSAjbm8gaGF5IGRpZmVyZW5jaWENCmFkb25pczIoYW1iLm1vZCB+IE1lcywgYW1iKSAjaGF5IGRpZmVyZW5jaWENCg0KYGBgDQoNClJlc3B1ZXN0YXMgaGlww7N0ZXNpcyB0cmVzOiBTZWfDum4gbGEgcHJ1ZWJhIGRlIEFuw6FsaXNpcyBkZSB2YXJpYW56YSB1c2FuZG8gbWF0cmljZXMgZGUgZGlzdGFuY2lhKEFkb25pcyksIHNlIGRldGVybWluw7MgcXVlIGV4aXN0ZW4gZGlmZXJlbmNpYXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgcXVlIGluZGljYW4gcXVlIGxvcyBwYXLDoW1ldHJvcyBmaXNpY29xdcOtbWljb3MgdmFyw61hbiBlbnRyZSBsYXMgZmVjaGFzIGRlIG11ZXN0cmVvIGVuIGVsIMOhcmVhIGRlIGVzdHVkaW8gKEYgPSA0OS4xMzU7IGRmID0gMywxNSA7IHAgPCAwLjA1KSwgbm8gb2JzdGFudGUsIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgcXVlIGluZGlxdWVuIHVuIGNhbWJpbyBlbiBsb3MgcGFyw6FtZXRyb3MgZmlzaWNvcXXDrW1pY29zIGNvbiBsb3Mgc2l0aW9zIGRlIG11ZXN0cmVvIChGID0gMC4xOTczOyBkZiAzLDE1IDsgcCA+IDAuMDUpDQoNCg0K