1. Introducción

Este cuaderno corresponde al tecer anexo del informe final correspondiente a la asignatura Geomática Básica, en el se ilustra el metodo de la distancia inversa ponderada para los datos de precipitación

2. Uso del método de la distancia inversa ponderada para la interpolación de los datos de precipitación

Primero, se crea una cuadricula vacia , con un total de 100000 celdas y se le asigna información de proyección

grd              <- as.data.frame(spsample(ptos_train, "regular", n=100000))
names(grd)       <- c("X", "Y")
coordinates(grd) <- c("X", "Y")
gridded(grd)     <- TRUE  
fullgrid(grd)    <- TRUE  
proj4string(grd) <- proj4string(ptos_train)

Posteriormente, se realiza la terea de interpolación con ayuda de la función idw de la libreria gstat .Para la interpolación de los datos , será empleada una potencia de 3 (idp=3.0) , luego el resultado de esta interpolación se convierte a un objeto ráster y se recorta a la extensión de la zona de estudio (En este caso a la extensión del objeto “Vichada 2”)

P.idw <- gstat::idw(precipitacion ~ 1, ptos_train, newdata=grd, idp=3.0)
[inverse distance weighted interpolation]
r       <- raster(P.idw)
(r.m   <- raster::mask(r, Vichada2))
class      : RasterLayer 
dimensions : 313, 320, 100160  (nrow, ncol, ncell)
resolution : 1249.511, 1249.511  (x, y)
extent     : 1333284, 1733127, 799447.3, 1190544  (xmin, xmax, ymin, ymax)
crs        : +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
source     : memory
names      : var1.pred 
values     : 0.5035295, 84.58405  (min, max)

Ahora, se plotea el resultado de la interpolación.Primero se realiza el gráfico con tmap y posteriormente se hace uso de la libreria leaflet para lograr una mejor visualización

tm_shape(r.m) + tm_raster(n=10,palette = "RdBu", midpoint = 43, title="Interpolación IDW \n para precipitación \n(mm)") + 
  tm_shape(ptrain) + tm_dots(size = 0.03, col = "#c4f0f5") +
  tm_legend(legend.outside=TRUE, title.size=1.2, text.size= 0.8)

library(leaflet)
library(RColorBrewer)
pal <- colorNumeric(c("#B2182B", "#FFE4A9", "#afc9a9", "#86bbdb", "#2e0091"), values(r.m),
  na.color = "transparent")

leaflet() %>% addTiles() %>%addRasterImage(r.m, colors = pal, opacity = 0.6) %>%addLegend(pal = pal, values = values(r.m), title = "Interpolación IDW para precipitación en Vichada del 26.04 al 30.04 en 2020 [mm]")

2.1 Validación Cruzada

Ahora, se realizará una tarea de validación (Leave-one-out cross-validation) para medir el error en los valores interpolados y usar esta información para perfeccionar la tarea de interopolación , pues , a través de esta tarea de validación se puede conocer cual potencia se debe usar para tener una mejor aproximación a los datos

Esta tarea de validación ,consiste en extraer un objeto de la muestra y usar los valores de los objetos restantes para tratar de estimar su valor .Este proceso se realiza n veces , es decir se realiza una vez por cada objeto de la muestra.

P <- ptrain
IDW.out <- vector(length = length(P))
for (i in 1:length(P)) {IDW.out[i] <- gstat::idw(precipitacion ~ 1, P[-i,], P[i,], idp=3.0)$var1.pred}

El siguiente gráfico , corresponde a un diagrama de dispersión entre los datos observados, es decir los valores reales del punto que fue omitido en cada caso y los datos de precipitación pronósticados o estimados

OP <- par(pty="s", mar=c(4,3,0,0))
  plot(IDW.out ~ P$precipitacion, asp=1, xlab="Observado", ylab="Pronosticado", pch=20,col=rgb(0,0,0,0.5))
abline(lm(IDW.out ~ P$precipitacion), col="red", lw=2,lty=3)
abline(0,1)

También , se puede elegir la potencia en función del error cuadratico medio, pues aquella que tiene un valor menor en este parámetro se considera un mejor estimador ,por tanto , los valores estimados estarán mas cercanos a los valores observados

sqrt( sum((IDW.out - P$precipitacion)^2) / length(P))
[1] 2.234104

2.2 Intervalos de Confianza para la interpolación IDW

Otra medida que puede ser empleada para conocer la presición del metodo de interpolación aplicado es el cálculo de los intervalos de confianza con ayuda de la técnica de validación cruzada para cada pixel. Si, el rango de valores es muy alto no podemos estar seguros del valor que fue estimado, en cambio si el rango de valores para el intervalo de confianza es mas bajo se tendra mas seguridad del valor obtenido en la interpolación pues nos indica que este ultimo no es tan sensible a la presencia o ausencia de un punto de muestra

Este proceso se ilustrará para el 5% de los datos , pues el cálculo de intervalo de confianza para cada valor estimado puede tardarse mucho

index = sample(1:nrow(ptos_train), 0.05 * nrow(ptos_train))
(P <- ptos_train[index, ])
class       : SpatialPointsDataFrame 
features    : 81 
extent      : 1339270, 1695656, 821295.6, 1183910  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
variables   : 4
names       :         MUNIC, CODIGO,            lluvia, precipitacion 
min values  :      CUMARIBO,  99001, 0.674332559108734,           0.7 
max values  : SANTA ROSALÍA,  99773,  80.6951599121094,          80.7 

Se crea la superficie interpolada

img <- gstat::idw(precipitacion~1, P, newdata=grd, idp=3.0)
n   <- length(P)
Zi  <- matrix(nrow = length(img$var1.pred), ncol = n)

Luego,se aplica el método de validación cruzada

st <- stack()
for (i in 1:n){
  Z1 <- gstat::idw(precipitacion~1, P[-i,], newdata=grd, idp=3.0)
  st <- addLayer(st,raster(Z1,layer=1))   
  Zi[,i] <- n * img$var1.pred - (n-1) * Z1$var1.pred}

Se calcula el intervalo de confianza

Se crea un raster a partir del intervalo de confianza y la predicción de la variable

img.sig   <- img
img.sig$v <- CI /img$var1.pred 

Posteriormente , se recorta este ráster a la extensión del departamento de Vichada

r1 <- raster(img.sig, layer="v")
r.m1 <- raster::mask(r1, Vichada2)

Se plotea el mapa correspondiente a los intervalos de confianza

tm_shape(r.m1) + tm_raster(palette = "Reds" , n=7,title="IDW\nIntervalo de confianza (95%) \n(mm)") +
  tm_shape(P) + tm_dots(size=0.02) +
  
  tm_legend(legend.outside=TRUE)
CRS object has comment, which is lost in output

LS0tCnRpdGxlOiAiSW50ZXJwb2xhY2nDs24gSURXIHBhcmEgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gZW4gVmljaGFkYSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIDEuIEludHJvZHVjY2nDs24KRXN0ZSBjdWFkZXJubyBjb3JyZXNwb25kZSBhbCB0ZWNlciBhbmV4byBkZWwgaW5mb3JtZSBmaW5hbCBjb3JyZXNwb25kaWVudGUgYSBsYSBhc2lnbmF0dXJhIEdlb23DoXRpY2EgQsOhc2ljYSwgZW4gZWwgc2UgaWx1c3RyYSBlbCBtZXRvZG8gZGUgbGEgZGlzdGFuY2lhIGludmVyc2EgcG9uZGVyYWRhIHBhcmEgbG9zIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuCgojIyMgMi4gVXNvIGRlbCBtw6l0b2RvIGRlIGxhIGRpc3RhbmNpYSBpbnZlcnNhIHBvbmRlcmFkYSBwYXJhIGxhIGludGVycG9sYWNpw7NuIGRlIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiAKClByaW1lcm8sIHNlIGNyZWEgdW5hIGN1YWRyaWN1bGEgdmFjaWEgLCBjb24gdW4gdG90YWwgZGUgMTAwMDAwIGNlbGRhcyB5IHNlIGxlIGFzaWduYSBpbmZvcm1hY2nDs24gZGUgcHJveWVjY2nDs24gCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmdyZCAgICAgICAgICAgICAgPC0gYXMuZGF0YS5mcmFtZShzcHNhbXBsZShwdG9zX3RyYWluLCAicmVndWxhciIsIG49MTAwMDAwKSkKbmFtZXMoZ3JkKSAgICAgICA8LSBjKCJYIiwgIlkiKQpjb29yZGluYXRlcyhncmQpIDwtIGMoIlgiLCAiWSIpCmdyaWRkZWQoZ3JkKSAgICAgPC0gVFJVRSAgCmZ1bGxncmlkKGdyZCkgICAgPC0gVFJVRSAgCnByb2o0c3RyaW5nKGdyZCkgPC0gcHJvajRzdHJpbmcocHRvc190cmFpbikKYGBgClBvc3Rlcmlvcm1lbnRlLCBzZSByZWFsaXphIGxhIHRlcmVhIGRlIGludGVycG9sYWNpw7NuIGNvbiBheXVkYSBkZSBsYSBmdW5jacOzbiBpZHcgZGUgbGEgbGlicmVyaWEgZ3N0YXQgLlBhcmEgbGEgaW50ZXJwb2xhY2nDs24gZGUgbG9zIGRhdG9zICwgc2Vyw6EgZW1wbGVhZGEgdW5hIHBvdGVuY2lhIGRlIDMgKGlkcD0zLjApICwgbHVlZ28gZWwgcmVzdWx0YWRvIGRlIGVzdGEgaW50ZXJwb2xhY2nDs24gc2UgY29udmllcnRlIGEgdW4gb2JqZXRvIHLDoXN0ZXIgeSBzZSByZWNvcnRhIGEgbGEgZXh0ZW5zacOzbiBkZSBsYSB6b25hIGRlIGVzdHVkaW8gKEVuIGVzdGUgY2FzbyBhIGxhIGV4dGVuc2nDs24gZGVsIG9iamV0byAiVmljaGFkYSAyIikKYGBge3Igd2FybmluZz1GQUxTRX0KUC5pZHcgPC0gZ3N0YXQ6OmlkdyhwcmVjaXBpdGFjaW9uIH4gMSwgcHRvc190cmFpbiwgbmV3ZGF0YT1ncmQsIGlkcD0zLjApCnIgICAgICAgPC0gcmFzdGVyKFAuaWR3KQooci5tICAgPC0gcmFzdGVyOjptYXNrKHIsIFZpY2hhZGEyKSkKYGBgCkFob3JhLCBzZSBwbG90ZWEgZWwgcmVzdWx0YWRvIGRlIGxhIGludGVycG9sYWNpw7NuLlByaW1lcm8gc2UgcmVhbGl6YSBlbCBncsOhZmljbyBjb24gdG1hcCB5IHBvc3Rlcmlvcm1lbnRlIHNlIGhhY2UgdXNvIGRlIGxhIGxpYnJlcmlhIGxlYWZsZXQgcGFyYSBsb2dyYXIgdW5hIG1lam9yIHZpc3VhbGl6YWNpw7NuCmBgYHtyfQp0bV9zaGFwZShyLm0pICsgdG1fcmFzdGVyKG49MTAscGFsZXR0ZSA9ICJSZEJ1IiwgbWlkcG9pbnQgPSA0MywgdGl0bGU9IkludGVycG9sYWNpw7NuIElEVyBcbiBwYXJhIHByZWNpcGl0YWNpw7NuIFxuKG1tKSIpICsgCiAgdG1fc2hhcGUocHRyYWluKSArIHRtX2RvdHMoc2l6ZSA9IDAuMDMsIGNvbCA9ICIjYzRmMGY1IikgKwogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFLCB0aXRsZS5zaXplPTEuMiwgdGV4dC5zaXplPSAwLjgpCmBgYApgYGB7cn0KbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcGFsIDwtIGNvbG9yTnVtZXJpYyhjKCIjQjIxODJCIiwgIiNGRkU0QTkiLCAiI2FmYzlhOSIsICIjODZiYmRiIiwgIiMyZTAwOTEiKSwgdmFsdWVzKHIubSksCiAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQoKbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JWFkZFJhc3RlckltYWdlKHIubSwgY29sb3JzID0gcGFsLCBvcGFjaXR5ID0gMC42KSAlPiVhZGRMZWdlbmQocGFsID0gcGFsLCB2YWx1ZXMgPSB2YWx1ZXMoci5tKSwgdGl0bGUgPSAiSW50ZXJwb2xhY2nDs24gSURXIHBhcmEgcHJlY2lwaXRhY2nDs24gZW4gVmljaGFkYSBkZWwgMjYuMDQgYWwgMzAuMDQgZW4gMjAyMCBbbW1dIikKYGBgCiMjIyMgMi4xIFZhbGlkYWNpw7NuIENydXphZGEKCkFob3JhLCBzZSByZWFsaXphcsOhIHVuYSB0YXJlYSBkZSB2YWxpZGFjacOzbiAoTGVhdmUtb25lLW91dCBjcm9zcy12YWxpZGF0aW9uKSBwYXJhIG1lZGlyIGVsIGVycm9yIGVuIGxvcyB2YWxvcmVzIGludGVycG9sYWRvcyB5IHVzYXIgZXN0YSBpbmZvcm1hY2nDs24gcGFyYSBwZXJmZWNjaW9uYXIgbGEgdGFyZWEgZGUgaW50ZXJvcG9sYWNpw7NuICwgcHVlcyAsIGEgdHJhdsOpcyBkZSBlc3RhIHRhcmVhIGRlIHZhbGlkYWNpw7NuIHNlIHB1ZWRlIGNvbm9jZXIgY3VhbCBwb3RlbmNpYSBzZSBkZWJlIHVzYXIgcGFyYSB0ZW5lciB1bmEgbWVqb3IgYXByb3hpbWFjacOzbiBhIGxvcyBkYXRvcwoKRXN0YSB0YXJlYSBkZSB2YWxpZGFjacOzbiAsY29uc2lzdGUgZW4gZXh0cmFlciB1biBvYmpldG8gZGUgbGEgbXVlc3RyYSB5IHVzYXIgbG9zIHZhbG9yZXMgZGUgbG9zIG9iamV0b3MgcmVzdGFudGVzIHBhcmEgdHJhdGFyIGRlIGVzdGltYXIgc3UgdmFsb3IgLkVzdGUgcHJvY2VzbyBzZSByZWFsaXphIG4gdmVjZXMgLCBlcyBkZWNpciBzZSByZWFsaXphIHVuYSB2ZXogcG9yIGNhZGEgb2JqZXRvIGRlIGxhIG11ZXN0cmEuCmBgYHtyfQpQIDwtIHB0cmFpbgpJRFcub3V0IDwtIHZlY3RvcihsZW5ndGggPSBsZW5ndGgoUCkpCmZvciAoaSBpbiAxOmxlbmd0aChQKSkge0lEVy5vdXRbaV0gPC0gZ3N0YXQ6OmlkdyhwcmVjaXBpdGFjaW9uIH4gMSwgUFstaSxdLCBQW2ksXSwgaWRwPTMuMCkkdmFyMS5wcmVkfQpgYGAKRWwgc2lndWllbnRlIGdyw6FmaWNvICwgY29ycmVzcG9uZGUgYSB1biBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiBlbnRyZSBsb3MgZGF0b3Mgb2JzZXJ2YWRvcywgZXMgZGVjaXIgbG9zIHZhbG9yZXMgcmVhbGVzIGRlbCBwdW50byBxdWUgZnVlIG9taXRpZG8gZW4gY2FkYSBjYXNvIHkgbG9zIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuIHByb27Ds3N0aWNhZG9zIG8gZXN0aW1hZG9zCmBgYHtyfQpPUCA8LSBwYXIocHR5PSJzIiwgbWFyPWMoNCwzLDAsMCkpCiAgcGxvdChJRFcub3V0IH4gUCRwcmVjaXBpdGFjaW9uLCBhc3A9MSwgeGxhYj0iT2JzZXJ2YWRvIiwgeWxhYj0iUHJvbm9zdGljYWRvIiwgcGNoPTIwLGNvbD1yZ2IoMCwwLDAsMC41KSkKYWJsaW5lKGxtKElEVy5vdXQgfiBQJHByZWNpcGl0YWNpb24pLCBjb2w9InJlZCIsIGx3PTIsbHR5PTMpCmFibGluZSgwLDEpCmBgYApUYW1iacOpbiAsIHNlIHB1ZWRlIGVsZWdpciBsYSBwb3RlbmNpYSBlbiBmdW5jacOzbiBkZWwgZXJyb3IgY3VhZHJhdGljbyBtZWRpbywgcHVlcyBhcXVlbGxhIHF1ZSB0aWVuZSB1biB2YWxvciBtZW5vciBlbiBlc3RlIHBhcsOhbWV0cm8gc2UgY29uc2lkZXJhIHVuIG1lam9yIGVzdGltYWRvciAscG9yIHRhbnRvICwgbG9zIHZhbG9yZXMgZXN0aW1hZG9zIGVzdGFyw6FuIG1hcyBjZXJjYW5vcyBhIGxvcyB2YWxvcmVzIG9ic2VydmFkb3MKYGBge3J9CnNxcnQoIHN1bSgoSURXLm91dCAtIFAkcHJlY2lwaXRhY2lvbileMikgLyBsZW5ndGgoUCkpCmBgYAojIyMjIDIuMiBJbnRlcnZhbG9zIGRlIENvbmZpYW56YSBwYXJhIGxhIGludGVycG9sYWNpw7NuIElEVwoKT3RyYSBtZWRpZGEgcXVlIHB1ZWRlIHNlciBlbXBsZWFkYSBwYXJhIGNvbm9jZXIgbGEgcHJlc2ljacOzbiBkZWwgbWV0b2RvIGRlIGludGVycG9sYWNpw7NuIGFwbGljYWRvIGVzIGVsIGPDoWxjdWxvIGRlIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBjb24gYXl1ZGEgZGUgbGEgdMOpY25pY2EgZGUgdmFsaWRhY2nDs24gY3J1emFkYSBwYXJhIGNhZGEgcGl4ZWwuIFNpLCBlbCByYW5nbyBkZSB2YWxvcmVzIGVzIG11eSBhbHRvIG5vIHBvZGVtb3MgZXN0YXIgc2VndXJvcyBkZWwgdmFsb3IgcXVlIGZ1ZSBlc3RpbWFkbywgZW4gY2FtYmlvIHNpIGVsIHJhbmdvIGRlIHZhbG9yZXMgcGFyYSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGVzIG1hcyBiYWpvIHNlIHRlbmRyYSBtYXMgc2VndXJpZGFkICBkZWwgdmFsb3Igb2J0ZW5pZG8gZW4gbGEgaW50ZXJwb2xhY2nDs24gcHVlcyBub3MgaW5kaWNhIHF1ZSBlc3RlIHVsdGltbyBubyBlcyB0YW4gc2Vuc2libGUgYSBsYSBwcmVzZW5jaWEgbyBhdXNlbmNpYSBkZSB1biBwdW50byBkZSBtdWVzdHJhIAoKRXN0ZSBwcm9jZXNvIHNlIGlsdXN0cmFyw6EgcGFyYSBlbCA1JSBkZSBsb3MgZGF0b3MgLCBwdWVzIGVsIGPDoWxjdWxvIGRlIGludGVydmFsbyBkZSBjb25maWFuemEgcGFyYSBjYWRhIHZhbG9yIGVzdGltYWRvIHB1ZWRlIHRhcmRhcnNlIG11Y2hvCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmluZGV4ID0gc2FtcGxlKDE6bnJvdyhwdG9zX3RyYWluKSwgMC4wNSAqIG5yb3cocHRvc190cmFpbikpCihQIDwtIHB0b3NfdHJhaW5baW5kZXgsIF0pCmBgYApTZSBjcmVhIGxhIHN1cGVyZmljaWUgaW50ZXJwb2xhZGEKYGBge3J9CmltZyA8LSBnc3RhdDo6aWR3KHByZWNpcGl0YWNpb25+MSwgUCwgbmV3ZGF0YT1ncmQsIGlkcD0zLjApCm4gICA8LSBsZW5ndGgoUCkKWmkgIDwtIG1hdHJpeChucm93ID0gbGVuZ3RoKGltZyR2YXIxLnByZWQpLCBuY29sID0gbikKYGBgCkx1ZWdvLHNlIGFwbGljYSBlbCBtw6l0b2RvIGRlIHZhbGlkYWNpw7NuIGNydXphZGEKYGBge3Igd2FybmluZz1GQUxTRX0Kc3QgPC0gc3RhY2soKQpmb3IgKGkgaW4gMTpuKXsKICBaMSA8LSBnc3RhdDo6aWR3KHByZWNpcGl0YWNpb25+MSwgUFstaSxdLCBuZXdkYXRhPWdyZCwgaWRwPTMuMCkKICBzdCA8LSBhZGRMYXllcihzdCxyYXN0ZXIoWjEsbGF5ZXI9MSkpICAgCiAgWmlbLGldIDwtIG4gKiBpbWckdmFyMS5wcmVkIC0gKG4tMSkgKiBaMSR2YXIxLnByZWR9CmBgYApTZSBjYWxjdWxhIGVsIGludGVydmFsbyBkZSBjb25maWFuemEKYGBge3Igd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9CiMgWmogPC0gYXMubWF0cml4KGFwcGx5KFppLCAxLCBzdW0sIG5hLnJtPVQpIC8gbiApCiMgYzEgPC0gYXBwbHkoWmksMiwnLScsWmopICAgICAgICAgICAgCiMgYzEgPC0gYXBwbHkoYzFeMiwgMSwgc3VtLCBuYS5ybT1UICkgCiNDSSA8LSBzcXJ0KCAxLyhuKihuLTEpKSAqIGMxKQpgYGAKU2UgY3JlYSB1biByYXN0ZXIgYSBwYXJ0aXIgZGVsIGludGVydmFsbyBkZSBjb25maWFuemEgeSBsYSBwcmVkaWNjacOzbiBkZSBsYSB2YXJpYWJsZQpgYGB7cn0KaW1nLnNpZyAgIDwtIGltZwppbWcuc2lnJHYgPC0gQ0kgL2ltZyR2YXIxLnByZWQgCmBgYApQb3N0ZXJpb3JtZW50ZSAsIHNlIHJlY29ydGEgZXN0ZSByw6FzdGVyIGEgbGEgZXh0ZW5zacOzbiBkZWwgZGVwYXJ0YW1lbnRvIGRlIFZpY2hhZGEKYGBge3J9CnIxIDwtIHJhc3RlcihpbWcuc2lnLCBsYXllcj0idiIpCnIubTEgPC0gcmFzdGVyOjptYXNrKHIxLCBWaWNoYWRhMikKYGBgClNlIHBsb3RlYSBlbCBtYXBhIGNvcnJlc3BvbmRpZW50ZSBhIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQpgYGB7cn0KdG1fc2hhcGUoci5tMSkgKyB0bV9yYXN0ZXIocGFsZXR0ZSA9ICJSZWRzIiAsIG49Nyx0aXRsZT0iSURXXG5JbnRlcnZhbG8gZGUgY29uZmlhbnphICg5NSUpIFxuKG1tKSIpICsKICB0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjAyKSArCiAgCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpCmBgYAoKCgo=