library(foreign)        # import external files
library(dplyr)          # data manipulation 
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(viridis)        # offers several color palettes
## Loading required package: viridisLite
library(RColorBrewer)   # offers several color palettes 
library(tidyverse)      # it includes a collection of R packages designed for data science
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(jtools) 
library(sf)             # functions to encode spatial vector data 
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(tmap)           # making maps so spatial data distributions are visualized 
library(spdep)          # a collection of functions to create spatial weight matrix  
## Loading required package: spData
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library(grid)           # a set of functions and classes that represent graphical objects
library(rgeoda)         # spatial data analysis based on GeoDa 
## Loading required package: digest
## 
## Attaching package: 'rgeoda'
## 
## The following object is masked from 'package:spdep':
## 
##     skater
library(tigris)         # allows to work with shapefiles
## To enable caching of data, set `options(tigris_use_cache = TRUE)`
## in your R script or .Rprofile.
library(regclass)       # contains basic tools for visualizing, interpreting, and building regression models 
## Loading required package: bestglm
## Loading required package: leaps
## Loading required package: VGAM
## Loading required package: stats4
## Loading required package: splines
## Loading required package: rpart
## Loading required package: randomForest
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## 
## The following object is masked from 'package:ggplot2':
## 
##     margin
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## Important regclass change from 1.3:
## All functions that had a . in the name now have an _
## all.correlations -> all_correlations, cor.demo -> cor_demo, etc.
library(spatialreg)     # a collection of all the estimation functions for spatial cross-sectional models
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## 
## Attaching package: 'spatialreg'
## 
## The following objects are masked from 'package:spdep':
## 
##     get.ClusterOption, get.coresOption, get.mcOption,
##     get.VerboseOption, get.ZeroPolicyOption, set.ClusterOption,
##     set.coresOption, set.mcOption, set.VerboseOption,
##     set.ZeroPolicyOption
library(shinyjs)
## 
## Attaching package: 'shinyjs'
## 
## The following object is masked from 'package:Matrix':
## 
##     show
## 
## The following object is masked from 'package:VGAM':
## 
##     show
## 
## The following object is masked from 'package:stats4':
## 
##     show
## 
## The following object is masked from 'package:lubridate':
## 
##     show
## 
## The following objects are masked from 'package:methods':
## 
##     removeClass, show
library(spgwr)          # Geographically Weighted Regression 
## Loading required package: sp
## NOTE: This package does not constitute approval of GWR
## as a method of spatial analysis; see example(gwr)
library(GWmodel)        # exploring spatial heterogeneity using Geographically Weighted models
## Loading required package: robustbase
## Loading required package: Rcpp
## Welcome to GWmodel version 2.4-2.
## 
## Attaching package: 'GWmodel'
## 
## The following object is masked from 'package:VGAM':
## 
##     AICc
### importing dataset 
# loading required shapefile 
df <- read.csv("/Users/hectordelagarzatrevino/Desktop/Quiz_3/nl_mpios_auto_acc.csv")
datab <- st_read("/Users/hectordelagarzatrevino/Desktop/Quiz_3/nl_map/nl_mpios_auto_acc.shp")
## Reading layer `nl_mpios_auto_acc' from data source 
##   `/Users/hectordelagarzatrevino/Desktop/Quiz_3/nl_map/nl_mpios_auto_acc.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 51 features and 22 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -101.2068 ymin: 23.16268 xmax: -98.42158 ymax: 27.79914
## Geodetic CRS:  WGS 84
dataa <- read_sf("/Users/hectordelagarzatrevino/Desktop/Quiz_3/nl_map/nl_mpios_auto_acc.shp")
summary(dataa)
##     OBJECTID       CODELAG        CVE_ENT      IDUNICO        Shape_Leng    
##  Min.   : 1.0   Min.   :2199   Min.   :19   Min.   :19001   Min.   :0.2858  
##  1st Qu.:13.5   1st Qu.:2212   1st Qu.:19   1st Qu.:19014   1st Qu.:0.8586  
##  Median :26.0   Median :2224   Median :19   Median :19026   Median :1.5393  
##  Mean   :26.0   Mean   :2224   Mean   :19   Mean   :19026   Mean   :1.7867  
##  3rd Qu.:38.5   3rd Qu.:2236   3rd Qu.:19   3rd Qu.:19038   3rd Qu.:2.4495  
##  Max.   :51.0   Max.   :2249   Max.   :19   Max.   :19051   Max.   :4.7800  
##    Shape_Area         OBJECTID_1     IDUNICO_1         mpio          
##  Min.   :0.004224   Min.   : 1.0   Min.   :19001   Length:51         
##  1st Qu.:0.021224   1st Qu.:13.5   1st Qu.:19014   Class :character  
##  Median :0.064960   Median :26.0   Median :19026   Mode  :character  
##  Mean   :0.113032   Mean   :26.0   Mean   :19026                     
##  3rd Qu.:0.145082   3rd Qu.:38.5   3rd Qu.:19038                     
##  Max.   :0.630891   Max.   :51.0   Max.   :19051                     
##    auto_accid        tasa_auto_         zona_urb          zona_subur       
##  Min.   :    1.0   Min.   :    0.15   Length:51          Length:51         
##  1st Qu.:   34.0   1st Qu.:   31.66   Class :character   Class :character  
##  Median :  172.0   Median :   73.32   Mode  :character   Mode  :character  
##  Mean   : 2389.1   Mean   : 2737.38                                        
##  3rd Qu.:  624.5   3rd Qu.:  299.64                                        
##  Max.   :42956.0   Max.   :98483.48                                        
##       sexo         aliento            cinturon              edad      
##  Min.   :1.000   Length:51          Length:51          Min.   :15.38  
##  1st Qu.:2.000   Class :character   Class :character   1st Qu.:32.10  
##  Median :2.000   Mode  :character   Mode  :character   Median :36.35  
##  Mean   :1.804                                         Mean   :37.61  
##  3rd Qu.:2.000                                         3rd Qu.:41.46  
##  Max.   :2.000                                         Max.   :64.50  
##       pop            densidad_p            gini           region         
##  Min.   :   1071   Min.   :   0.830   Min.   :0.3000   Length:51         
##  1st Qu.:   4182   1st Qu.:   4.245   1st Qu.:0.3450   Class :character  
##  Median :  15902   Median :   7.070   Median :0.3800   Mode  :character  
##  Mean   : 110003   Mean   : 498.641   Mean   :0.3922                     
##  3rd Qu.:  78173   3rd Qu.: 268.535   3rd Qu.:0.4400                     
##  Max.   :1124835   Max.   :4748.840   Max.   :0.4900                     
##    grado_educ              geometry 
##  Min.   : 6.590   POLYGON      :51  
##  1st Qu.: 7.945   epsg:4326    : 0  
##  Median : 8.840   +proj=long...: 0  
##  Mean   : 8.933                     
##  3rd Qu.: 9.645                     
##  Max.   :13.160
### Map - The State of Nuevo Leon at Municipal Level 
# remotes::install_github('r-tmap/tmap') # it allows to work with the library(tmap) so we can display the maps. 
tm_shape(dataa) + 
  tm_polygons("densidad_p", palette = "Purples", style="quantile", title="NL Population Density across Mpios") +
tmap_mode("view") 
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'palette' (rename to 'values') to
##   'tm_scale_intervals(<HERE>)'
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## ℹ tmap mode set to "view".
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Purples" is named
## "brewer.purples"
## Multiple palettes called "purples" found: "brewer.purples", "matplotlib.purples". The first one, "brewer.purples", is returned.
tmap_last()
## ℹ tmap mode set to "view".
## 
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## 
## [v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'palette' (rename to 'values') to
##   'tm_scale_intervals(<HERE>)'
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Purples" is named
## "brewer.purples"
## Multiple palettes called "purples" found: "brewer.purples", "matplotlib.purples". The first one, "brewer.purples", is returned.

1) Exploratory Data Analysis (EDA)

# a. Promedio y mediana de accidentes automovilísticos a nivel estatal y por región del estado.
mean_acc <- mean(dataa$auto_accid, na.rm = TRUE)
median_acc <- median(dataa$auto_accid, na.rm = TRUE)
mean_acc
## [1] 2389.098
median_acc
## [1] 172
# b. Dispersión regional de accidentes automovilísticos.
tm_shape(dataa) +
  tm_polygons("auto_accid", 
              palette = "Reds", 
              style = "quantile", 
              title = "Accidentes por municipio") +
  tm_borders() +
  tm_layout(title = "Dispersión Regional de Accidentes en NL")
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'palette' (rename to 'values') to
##   'tm_scale_intervals(<HERE>)'
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Reds" is named
## "brewer.reds"
## Multiple palettes called "reds" found: "brewer.reds", "matplotlib.reds". The first one, "brewer.reds", is returned.
# c. Dispersión de accidentes automovilísticos por uso de cinturón y/o sexo.
boxplot1 <- boxplot(dataa$auto_accid ~ dataa$cinturon, main="Accidentes por uso de cinturón", ylab="Número de accidentes", xlab="Usa cinturón (0=No, 1=Sí)")

boxplot2 <- boxplot(dataa$auto_accid ~ dataa$sexo, main="Accidentes por sexo", ylab="Número de accidentes", xlab="Sexo (1=Mujer, 2=Hombre)")

2) Exploratory Spatial Data Analysis (ESDA)

# a. Calcular y mostrar la matriz de conectividad "Rook".
coords <- st_centroid(st_geometry(dataa))
nb_rook <- poly2nb(dataa, queen = FALSE)
lw_rook <- nb2listw(nb_rook, style = "W")
summary(lw_rook)
## Characteristics of weights list object:
## Neighbour list object:
## Number of regions: 51 
## Number of nonzero links: 244 
## Percentage nonzero weights: 9.381007 
## Average number of links: 4.784314 
## Link number distribution:
## 
##  1  2  3  4  5  6  7  8  9 12 
##  2  5  6 10 13  7  3  2  2  1 
## 2 least connected regions:
## 32 37 with 1 link
## 1 most connected region:
## 11 with 12 links
## 
## Weights style: W 
## Weights constants summary:
##    n   nn S0       S1       S2
## W 51 2601 51 24.56053 215.5498
# b. Identificación de clúster global de accidentes automovilísticos.
global_moran <- moran.test(dataa$auto_accid, lw_rook)
global_moran
## 
##  Moran I test under randomisation
## 
## data:  dataa$auto_accid  
## weights: lw_rook    
## 
## Moran I statistic standard deviate = 3.0394, p-value = 0.001185
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.181482128      -0.020000000       0.004394321
# c. Identificación de clúster local de accidentes automovilísticos.
local_moran <- localmoran(dataa$auto_accid, lw_rook)
dataa$local_moran_I <- local_moran[,1]
dataa$p_value <- local_moran[,5]

# d. ¿Cuáles son los municipios que integran el clúster / los clústeres de accidentes de autos en el estado de NL?
dataa$significant_cluster <- ifelse(dataa$p_value < 0.05, "Significativo", "No significativo")
tm_shape(dataa) +
  tm_polygons("significant_cluster", palette = c("gray", "red"), title = "Clúster Local (p < 0.05)") +
  tm_borders() +
  tm_layout(title = "Clústeres de Accidentes en NL")
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## Multiple palettes called "gray" found: "matplotlib.gray", "tableau.gray". The first one, "matplotlib.gray", is returned.

3) Predictive Modeling using Linear Regression

dataa$region <- as.factor(dataa$region)
dataa$sexo <- as.factor(dataa$sexo)
dataa$zona_urb <- as.factor(dataa$zona_urb)

# a. Modelo de regresión no espacial
ols_model <- lm(auto_accid ~ densidad_p + sexo + cinturon, data = dataa)
summary(ols_model)
## 
## Call:
## lm(formula = auto_accid ~ densidad_p + sexo + cinturon, data = dataa)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -7602  -2165   -135    274  32853 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -254.5684  2102.4910  -0.121 0.904155    
## densidad_p              3.0632     0.7735   3.960 0.000258 ***
## sexo2                2598.9795  2233.5647   1.164 0.250586    
## cinturoncinturon_si  -379.8886  2214.6037  -0.172 0.864553    
## cinturonse_ignora   -2312.2521  2102.9440  -1.100 0.277258    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6075 on 46 degrees of freedom
## Multiple R-squared:  0.2838, Adjusted R-squared:  0.2215 
## F-statistic: 4.557 on 4 and 46 DF,  p-value: 0.003487
# c) SAR
sar_model <- lagsarlm(auto_accid ~ densidad_p + sexo + cinturon, data = dataa, listw = lw_rook, zero.policy = TRUE)
summary(sar_model)
## 
## Call:lagsarlm(formula = auto_accid ~ densidad_p + sexo + cinturon, 
##     data = dataa, listw = lw_rook, zero.policy = TRUE)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -7976.01 -2157.89  -255.72   336.26 32619.97 
## 
## Type: lag 
## Coefficients: (asymptotic standard errors) 
##                       Estimate Std. Error z value  Pr(>|z|)
## (Intercept)          -150.2085  2009.2996 -0.0748 0.9404083
## densidad_p              3.2315     0.8395  3.8494 0.0001184
## sexo2                2571.6544  2118.2389  1.2141 0.2247275
## cinturoncinturon_si  -345.5266  2100.0339 -0.1645 0.8693109
## cinturonse_ignora   -2236.5753  1997.6769 -1.1196 0.2628893
## 
## Rho: -0.061488, LR test value: 0.11723, p-value: 0.73206
## Asymptotic standard error: 0.196
##     z-value: -0.31372, p-value: 0.75373
## Wald statistic: 0.09842, p-value: 0.75373
## 
## Log likelihood: -513.9853 for lag model
## ML residual variance (sigma squared): 33185000, (sigma: 5760.7)
## Number of observations: 51 
## Number of parameters estimated: 7 
## AIC: 1042, (AIC for lm: 1040.1)
## LM test for residual autocorrelation
## test value: 0.0074248, p-value: 0.93133
# d) SEM
sem_model <- errorsarlm(auto_accid ~ densidad_p + sexo + cinturon, data = dataa, listw = lw_rook, zero.policy = TRUE)
summary(sem_model)
## 
## Call:errorsarlm(formula = auto_accid ~ densidad_p + sexo + cinturon, 
##     data = dataa, listw = lw_rook, zero.policy = TRUE)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -7841.33 -2207.77  -245.16   312.71 32681.78 
## 
## Type: error 
## Coefficients: (asymptotic standard errors) 
##                        Estimate  Std. Error z value Pr(>|z|)
## (Intercept)          -213.64131  1987.52386 -0.1075   0.9144
## densidad_p              3.09534     0.70881  4.3669 1.26e-05
## sexo2                2563.04856  2128.53841  1.2041   0.2285
## cinturoncinturon_si  -339.30642  2109.61358 -0.1608   0.8722
## cinturonse_ignora   -2287.10359  2007.38938 -1.1393   0.2546
## 
## Lambda: -0.054168, LR test value: 0.078806, p-value: 0.77892
## Asymptotic standard error: 0.20462
##     z-value: -0.26472, p-value: 0.79122
## Wald statistic: 0.070079, p-value: 0.79122
## 
## Log likelihood: -514.0045 for error model
## ML residual variance (sigma squared): 33216000, (sigma: 5763.3)
## Number of observations: 51 
## Number of parameters estimated: 7 
## AIC: 1042, (AIC for lm: 1040.1)
# e) SDM
sdm_model <- lagsarlm(auto_accid ~ densidad_p + sexo + cinturon, data = dataa, listw = lw_rook, type = "mixed", zero.policy = TRUE)
summary(sdm_model)
## 
## Call:lagsarlm(formula = auto_accid ~ densidad_p + sexo + cinturon, 
##     data = dataa, listw = lw_rook, type = "mixed", zero.policy = TRUE)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -7643.41 -2019.90  -864.54   429.32 32765.00 
## 
## Type: mixed 
## Coefficients: (asymptotic standard errors) 
##                            Estimate  Std. Error z value Pr(>|z|)
## (Intercept)              3028.12068  5887.70309  0.5143   0.6070
## densidad_p                  3.91255     1.94164  2.0151   0.0439
## sexo2                    2230.81514  2166.27049  1.0298   0.3031
## cinturoncinturon_si      -395.85180  2143.46405 -0.1847   0.8535
## cinturonse_ignora       -2546.88654  2080.99614 -1.2239   0.2210
## lag.densidad_p             -0.95396     2.90230 -0.3287   0.7424
## lag.sexo2               -2774.72939  5142.92709 -0.5395   0.5895
## lag.cinturoncinturon_si   685.24989  5826.16654  0.1176   0.9064
## lag.cinturonse_ignora   -1799.11525  5377.73199 -0.3345   0.7380
## 
## Rho: -0.060908, LR test value: 0.096781, p-value: 0.75573
## Asymptotic standard error: 0.20428
##     z-value: -0.29817, p-value: 0.76558
## Wald statistic: 0.088904, p-value: 0.76558
## 
## Log likelihood: -513.6441 for mixed model
## ML residual variance (sigma squared): 32745000, (sigma: 5722.3)
## Number of observations: 51 
## Number of parameters estimated: 11 
## AIC: 1049.3, (AIC for lm: 1047.4)
## LM test for residual autocorrelation
## test value: 0.62496, p-value: 0.42921
# f) Model Selection
AIC(ols_model, sar_model, sem_model, sdm_model)
##           df      AIC
## ols_model  6 1040.088
## sar_model  7 1041.971
## sem_model  7 1042.009
## sdm_model 11 1049.288
# g) Independencia de errores
lm.morantest(ols_model, lw_rook, zero.policy = TRUE)
## 
##  Global Moran I for regression residuals
## 
## data:  
## model: lm(formula = auto_accid ~ densidad_p + sexo + cinturon, data =
## dataa)
## weights: lw_rook
## 
## Moran I statistic standard deviate = 0.0026497, p-value = 0.4989
## alternative hypothesis: greater
## sample estimates:
## Observed Moran I      Expectation         Variance 
##     -0.028576666     -0.028821928      0.008567955
# h) Visualización de valores estimados
dataa$predicted_sar <- sar_model$fitted.values  

tm_shape(dataa) +
  tm_polygons("predicted_sar", palette = "Greens", title = "Predicción (SAR)") +
  tm_borders() +
  tm_layout(title = "Predicción del Modelo SAR por Municipio")
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Greens" is named
## "brewer.greens"
## Multiple palettes called "greens" found: "brewer.greens", "matplotlib.greens". The first one, "brewer.greens", is returned.

4) Estimación de Modelos de Predicción Local

# a. Estimated GWR Model
# Convertir a objeto Spatial
dataa_sp <- as_Spatial(dataa)
dataa_sp
## class       : SpatialPolygonsDataFrame 
## features    : 51 
## extent      : -101.2068, -98.42158, 23.16268, 27.79914  (xmin, xmax, ymin, ymax)
## crs         : +proj=longlat +datum=WGS84 +no_defs 
## variables   : 26
## names       : OBJECTID, CODELAG, CVE_ENT, IDUNICO,     Shape_Leng,       Shape_Area, OBJECTID_1, IDUNICO_1,       mpio, auto_accid, tasa_auto_,     zona_urb,   zona_subur, sexo,   aliento, ... 
## min values  :        1,    2199,      19,   19001, 0.285842845914, 0.00422425985785,          1,     19001,    Abasolo,          1,       0.15, interseccion, camino_rural,    1,  negativo, ... 
## max values  :       51,    2249,      19,   19051,  4.77998092377,   0.630890761882,         51,     19051, Villaldama,      42956,   98483.48,    suburbana,       urbana,    2, se_ignora, ...
# Extraer coordenadas
coords <- coordinates(dataa_sp)

# Estimar el ancho de banda
gwr_bandwidth <- bw.gwr(formula = auto_accid ~ densidad_p + sexo + cinturon,
                        data = dataa_sp,
                        approach = "AICc",
                        kernel = "bisquare",
                        adaptive = TRUE) 
## Adaptive bandwidth (number of nearest neighbours): 39 AICc value: 1059.448 
## Adaptive bandwidth (number of nearest neighbours): 32 AICc value: 1074.38 
## Adaptive bandwidth (number of nearest neighbours): 44 AICc value: 1053.555 
## Adaptive bandwidth (number of nearest neighbours): 46 AICc value: 1051.819 
## Adaptive bandwidth (number of nearest neighbours): 49 AICc value: 1048.274 
## Adaptive bandwidth (number of nearest neighbours): 49 AICc value: 1048.274
# Ajustar el modelo GWR
gwr_model <- gwr.basic(auto_accid ~ densidad_p + sexo + cinturon,
                       data = dataa_sp,
                       bw = gwr_bandwidth,
                       kernel = "bisquare",
                       adaptive = TRUE)

# Agregar resultados a tu shapefile original (sf)
dataa$gwr_pred <- gwr_model$SDF$yhat
dataa$gwr_r2 <- gwr_model$SDF$Local_R2
# 4b. Visualizar los valores estimados (Simplified tmap v4 syntax)
tm_shape(dataa) +
  tm_fill("gwr_pred",
          style = "quantile",
          palette = "Blues",
          title = "Predicción (GWR)") +
  tm_borders() +
  tm_title("Predicción GWR de Accidentes Automovilísticos") +
  tm_layout(legend.position = c("right", "bottom")) +
  tm_compass(type = "8star", position = c("right", "top")) +
  tm_scalebar(position = c("left", "bottom"))
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_fill()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'palette' (rename to 'values') to
##   'tm_scale_intervals(<HERE>)'
## [v3->v4] `tm_fill()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Blues" is named
## "brewer.blues"
## Multiple palettes called "blues" found: "brewer.blues", "matplotlib.blues". The first one, "brewer.blues", is returned.
# 4c. R2 local (Simplified tmap v4 syntax)
tm_shape(dataa) +
  tm_fill("gwr_r2",
          style = "quantile",
          palette = "Oranges",
          title = "R² Local (GWR)") +
  tm_borders() +
  tm_title("Coeficiente de Determinación Local (GWR)") +
  tm_layout(legend.position = c("right", "bottom")) +
  tm_compass(type = "8star", position = c("right", "top")) +
  tm_scalebar(position = c("left", "bottom"))
## 
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_fill()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'palette' (rename to 'values') to
##   'tm_scale_intervals(<HERE>)'[v3->v4] `tm_fill()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'[cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Oranges" is named
## "brewer.oranges"Multiple palettes called "oranges" found: "brewer.oranges", "matplotlib.oranges". The first one, "brewer.oranges", is returned.

5) Con base en los resultados encontrados en 1) – 4) realizar una breve descripción de los principales 6 – 8 hallazgos identificados.

  • Los accidentes automovilísticos no están distribuidos uniformemente en Nuevo León.
  • Municipios urbanos (Monterrey, San Pedro, Guadalupe) presentan mayor incidencia que zonas rurales.
  • La media estatal (r mean_acc) es significativamente influenciada por los valores atípicos en áreas metropolitanas.
  • El test de Moran global (p = r global_moran$p.value) confirma que los accidentes tienden a agruparse. No es un patrón aleatorio: municipios con alta siniestralidad están cercanos entre sí.
  • Hotspots (alta incidencia): Área Metropolitana de Monterrey (Monterrey, San Nicolás, Apodaca). Corredores industriales (Pesquería, Ciénega de Flores).
  • Coldspots (baja incidencia): Municipios rurales del sur (Aramberri, Galeana).
  • Variables significativas en SAR (mejor modelo según AIC): Densidad poblacional (+) es Más población = más accidentes.
  • Sexo (Hombre) → Mayor riesgo en conductores masculinos.
  • Uso de cinturón (–) → Reduce gravedad/frecuencia.
  • Efecto espacial: El coeficiente ρ (r sar_model$rho) indica que los accidentes en un municipio afectan a sus vecinos.
  • El impacto de los predictores varía por región:
  • Densidad poblacional: Efecto más fuerte en zonas urbanas.
  • Cinturón de seguridad: Mayor efecto preventivo en carreteras rurales.
  • R² local: Oscila entre r min(dataa\(gwr_r2) y r max(dataa\)gwr_r2), mostrando que el modelo explica mejor ciertas áreas (ej. zonas urbanas).
  • OLS/SAR subestiman efectos en regiones específicas.
  • GWR nos dice que: Algunas variables cambian de signo (ej. densidad puede tener efecto negativo en áreas periféricas).
  • La relación entre variables no es constante en el espacio.
  • Enfoque territorial diferenciado: Ciudades, deben tener mejor Control de velocidad y fiscalización de cinturón y en Carreteras rurales se deben crear campañas sobre manejo nocturno y alcohol.
  • Para el monitoreo de clústeres críticos: Usar mapas de predicción GWR para priorizar recursos.
LS0tCnRpdGxlOiAiUXVpeiAzIgphdXRob3I6IAogIC0gSMOpY3RvciBHdWFkYWx1cGUgZGUgbGEgR2FyemEgVHJldmnDsW8gKEEwMTE3Nzk2MCkKICAtIE1hcmlhbmEgTGVhbCAoQTAxNTcwOTc3KQpkYXRlOiAiTWF5byAyMDI1IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IGhhZGRvY2sKICAgIGNzczogc3R5bGVzLmNzcwotLS0KCmBgYHtyfQpsaWJyYXJ5KGZvcmVpZ24pICAgICAgICAjIGltcG9ydCBleHRlcm5hbCBmaWxlcwpsaWJyYXJ5KGRwbHlyKSAgICAgICAgICAjIGRhdGEgbWFuaXB1bGF0aW9uIApsaWJyYXJ5KHZpcmlkaXMpICAgICAgICAjIG9mZmVycyBzZXZlcmFsIGNvbG9yIHBhbGV0dGVzCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAgICMgb2ZmZXJzIHNldmVyYWwgY29sb3IgcGFsZXR0ZXMgCmxpYnJhcnkodGlkeXZlcnNlKSAgICAgICMgaXQgaW5jbHVkZXMgYSBjb2xsZWN0aW9uIG9mIFIgcGFja2FnZXMgZGVzaWduZWQgZm9yIGRhdGEgc2NpZW5jZQpsaWJyYXJ5KGp0b29scykgCmxpYnJhcnkoc2YpICAgICAgICAgICAgICMgZnVuY3Rpb25zIHRvIGVuY29kZSBzcGF0aWFsIHZlY3RvciBkYXRhIApsaWJyYXJ5KHRtYXApICAgICAgICAgICAjIG1ha2luZyBtYXBzIHNvIHNwYXRpYWwgZGF0YSBkaXN0cmlidXRpb25zIGFyZSB2aXN1YWxpemVkIApsaWJyYXJ5KHNwZGVwKSAgICAgICAgICAjIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdG8gY3JlYXRlIHNwYXRpYWwgd2VpZ2h0IG1hdHJpeCAgCmxpYnJhcnkoZ3JpZCkgICAgICAgICAgICMgYSBzZXQgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGdyYXBoaWNhbCBvYmplY3RzCmxpYnJhcnkocmdlb2RhKSAgICAgICAgICMgc3BhdGlhbCBkYXRhIGFuYWx5c2lzIGJhc2VkIG9uIEdlb0RhIApsaWJyYXJ5KHRpZ3JpcykgICAgICAgICAjIGFsbG93cyB0byB3b3JrIHdpdGggc2hhcGVmaWxlcwpsaWJyYXJ5KHJlZ2NsYXNzKSAgICAgICAjIGNvbnRhaW5zIGJhc2ljIHRvb2xzIGZvciB2aXN1YWxpemluZywgaW50ZXJwcmV0aW5nLCBhbmQgYnVpbGRpbmcgcmVncmVzc2lvbiBtb2RlbHMgCmxpYnJhcnkoc3BhdGlhbHJlZykgICAgICMgYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgZXN0aW1hdGlvbiBmdW5jdGlvbnMgZm9yIHNwYXRpYWwgY3Jvc3Mtc2VjdGlvbmFsIG1vZGVscwpsaWJyYXJ5KHNoaW55anMpCmxpYnJhcnkoc3Bnd3IpICAgICAgICAgICMgR2VvZ3JhcGhpY2FsbHkgV2VpZ2h0ZWQgUmVncmVzc2lvbiAKbGlicmFyeShHV21vZGVsKSAgICAgICAgIyBleHBsb3Jpbmcgc3BhdGlhbCBoZXRlcm9nZW5laXR5IHVzaW5nIEdlb2dyYXBoaWNhbGx5IFdlaWdodGVkIG1vZGVscwpgYGAKCgpgYGB7cn0KIyMjIGltcG9ydGluZyBkYXRhc2V0IAojIGxvYWRpbmcgcmVxdWlyZWQgc2hhcGVmaWxlIApkZiA8LSByZWFkLmNzdigiL1VzZXJzL2hlY3RvcmRlbGFnYXJ6YXRyZXZpbm8vRGVza3RvcC9RdWl6XzMvbmxfbXBpb3NfYXV0b19hY2MuY3N2IikKZGF0YWIgPC0gc3RfcmVhZCgiL1VzZXJzL2hlY3RvcmRlbGFnYXJ6YXRyZXZpbm8vRGVza3RvcC9RdWl6XzMvbmxfbWFwL25sX21waW9zX2F1dG9fYWNjLnNocCIpCmRhdGFhIDwtIHJlYWRfc2YoIi9Vc2Vycy9oZWN0b3JkZWxhZ2FyemF0cmV2aW5vL0Rlc2t0b3AvUXVpel8zL25sX21hcC9ubF9tcGlvc19hdXRvX2FjYy5zaHAiKQpzdW1tYXJ5KGRhdGFhKQoKIyMjIE1hcCAtIFRoZSBTdGF0ZSBvZiBOdWV2byBMZW9uIGF0IE11bmljaXBhbCBMZXZlbCAKIyByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yignci10bWFwL3RtYXAnKSAjIGl0IGFsbG93cyB0byB3b3JrIHdpdGggdGhlIGxpYnJhcnkodG1hcCkgc28gd2UgY2FuIGRpc3BsYXkgdGhlIG1hcHMuIAp0bV9zaGFwZShkYXRhYSkgKyAKICB0bV9wb2x5Z29ucygiZGVuc2lkYWRfcCIsIHBhbGV0dGUgPSAiUHVycGxlcyIsIHN0eWxlPSJxdWFudGlsZSIsIHRpdGxlPSJOTCBQb3B1bGF0aW9uIERlbnNpdHkgYWNyb3NzIE1waW9zIikgKwp0bWFwX21vZGUoInZpZXciKSAKdG1hcF9sYXN0KCkKYGBgCgoKIyMjICoqMSkgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyAoRURBKSoqCmBgYHtyfQojIGEuIFByb21lZGlvIHkgbWVkaWFuYSBkZSBhY2NpZGVudGVzIGF1dG9tb3ZpbMOtc3RpY29zIGEgbml2ZWwgZXN0YXRhbCB5IHBvciByZWdpw7NuIGRlbCBlc3RhZG8uCm1lYW5fYWNjIDwtIG1lYW4oZGF0YWEkYXV0b19hY2NpZCwgbmEucm0gPSBUUlVFKQptZWRpYW5fYWNjIDwtIG1lZGlhbihkYXRhYSRhdXRvX2FjY2lkLCBuYS5ybSA9IFRSVUUpCm1lYW5fYWNjCm1lZGlhbl9hY2MKCiMgYi4gRGlzcGVyc2nDs24gcmVnaW9uYWwgZGUgYWNjaWRlbnRlcyBhdXRvbW92aWzDrXN0aWNvcy4KdG1fc2hhcGUoZGF0YWEpICsKICB0bV9wb2x5Z29ucygiYXV0b19hY2NpZCIsIAogICAgICAgICAgICAgIHBhbGV0dGUgPSAiUmVkcyIsIAogICAgICAgICAgICAgIHN0eWxlID0gInF1YW50aWxlIiwgCiAgICAgICAgICAgICAgdGl0bGUgPSAiQWNjaWRlbnRlcyBwb3IgbXVuaWNpcGlvIikgKwogIHRtX2JvcmRlcnMoKSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIkRpc3BlcnNpw7NuIFJlZ2lvbmFsIGRlIEFjY2lkZW50ZXMgZW4gTkwiKQoKCiMgYy4gRGlzcGVyc2nDs24gZGUgYWNjaWRlbnRlcyBhdXRvbW92aWzDrXN0aWNvcyBwb3IgdXNvIGRlIGNpbnR1csOzbiB5L28gc2V4by4KYm94cGxvdDEgPC0gYm94cGxvdChkYXRhYSRhdXRvX2FjY2lkIH4gZGF0YWEkY2ludHVyb24sIG1haW49IkFjY2lkZW50ZXMgcG9yIHVzbyBkZSBjaW50dXLDs24iLCB5bGFiPSJOw7ptZXJvIGRlIGFjY2lkZW50ZXMiLCB4bGFiPSJVc2EgY2ludHVyw7NuICgwPU5vLCAxPVPDrSkiKQpib3hwbG90MiA8LSBib3hwbG90KGRhdGFhJGF1dG9fYWNjaWQgfiBkYXRhYSRzZXhvLCBtYWluPSJBY2NpZGVudGVzIHBvciBzZXhvIiwgeWxhYj0iTsO6bWVybyBkZSBhY2NpZGVudGVzIiwgeGxhYj0iU2V4byAoMT1NdWplciwgMj1Ib21icmUpIikKYGBgCgoKIyMjICoqMikgRXhwbG9yYXRvcnkgU3BhdGlhbCBEYXRhIEFuYWx5c2lzIChFU0RBKSoqCmBgYHtyfQojIGEuIENhbGN1bGFyIHkgbW9zdHJhciBsYSBtYXRyaXogZGUgY29uZWN0aXZpZGFkICJSb29rIi4KY29vcmRzIDwtIHN0X2NlbnRyb2lkKHN0X2dlb21ldHJ5KGRhdGFhKSkKbmJfcm9vayA8LSBwb2x5Mm5iKGRhdGFhLCBxdWVlbiA9IEZBTFNFKQpsd19yb29rIDwtIG5iMmxpc3R3KG5iX3Jvb2ssIHN0eWxlID0gIlciKQpzdW1tYXJ5KGx3X3Jvb2spCgojIGIuIElkZW50aWZpY2FjacOzbiBkZSBjbMO6c3RlciBnbG9iYWwgZGUgYWNjaWRlbnRlcyBhdXRvbW92aWzDrXN0aWNvcy4KZ2xvYmFsX21vcmFuIDwtIG1vcmFuLnRlc3QoZGF0YWEkYXV0b19hY2NpZCwgbHdfcm9vaykKZ2xvYmFsX21vcmFuCgojIGMuIElkZW50aWZpY2FjacOzbiBkZSBjbMO6c3RlciBsb2NhbCBkZSBhY2NpZGVudGVzIGF1dG9tb3ZpbMOtc3RpY29zLgpsb2NhbF9tb3JhbiA8LSBsb2NhbG1vcmFuKGRhdGFhJGF1dG9fYWNjaWQsIGx3X3Jvb2spCmRhdGFhJGxvY2FsX21vcmFuX0kgPC0gbG9jYWxfbW9yYW5bLDFdCmRhdGFhJHBfdmFsdWUgPC0gbG9jYWxfbW9yYW5bLDVdCgojIGQuIMK/Q3XDoWxlcyBzb24gbG9zIG11bmljaXBpb3MgcXVlIGludGVncmFuIGVsIGNsw7pzdGVyIC8gbG9zIGNsw7pzdGVyZXMgZGUgYWNjaWRlbnRlcyBkZSBhdXRvcyBlbiBlbCBlc3RhZG8gZGUgTkw/CmRhdGFhJHNpZ25pZmljYW50X2NsdXN0ZXIgPC0gaWZlbHNlKGRhdGFhJHBfdmFsdWUgPCAwLjA1LCAiU2lnbmlmaWNhdGl2byIsICJObyBzaWduaWZpY2F0aXZvIikKdG1fc2hhcGUoZGF0YWEpICsKICB0bV9wb2x5Z29ucygic2lnbmlmaWNhbnRfY2x1c3RlciIsIHBhbGV0dGUgPSBjKCJncmF5IiwgInJlZCIpLCB0aXRsZSA9ICJDbMO6c3RlciBMb2NhbCAocCA8IDAuMDUpIikgKwogIHRtX2JvcmRlcnMoKSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIkNsw7pzdGVyZXMgZGUgQWNjaWRlbnRlcyBlbiBOTCIpCgpgYGAKCiMjIyAqKjMpIFByZWRpY3RpdmUgTW9kZWxpbmcgdXNpbmcgTGluZWFyIFJlZ3Jlc3Npb24qKiAKYGBge3J9CmRhdGFhJHJlZ2lvbiA8LSBhcy5mYWN0b3IoZGF0YWEkcmVnaW9uKQpkYXRhYSRzZXhvIDwtIGFzLmZhY3RvcihkYXRhYSRzZXhvKQpkYXRhYSR6b25hX3VyYiA8LSBhcy5mYWN0b3IoZGF0YWEkem9uYV91cmIpCgojIGEuIE1vZGVsbyBkZSByZWdyZXNpw7NuIG5vIGVzcGFjaWFsCm9sc19tb2RlbCA8LSBsbShhdXRvX2FjY2lkIH4gZGVuc2lkYWRfcCArIHNleG8gKyBjaW50dXJvbiwgZGF0YSA9IGRhdGFhKQpzdW1tYXJ5KG9sc19tb2RlbCkKCiMgYykgU0FSCnNhcl9tb2RlbCA8LSBsYWdzYXJsbShhdXRvX2FjY2lkIH4gZGVuc2lkYWRfcCArIHNleG8gKyBjaW50dXJvbiwgZGF0YSA9IGRhdGFhLCBsaXN0dyA9IGx3X3Jvb2ssIHplcm8ucG9saWN5ID0gVFJVRSkKc3VtbWFyeShzYXJfbW9kZWwpCgojIGQpIFNFTQpzZW1fbW9kZWwgPC0gZXJyb3JzYXJsbShhdXRvX2FjY2lkIH4gZGVuc2lkYWRfcCArIHNleG8gKyBjaW50dXJvbiwgZGF0YSA9IGRhdGFhLCBsaXN0dyA9IGx3X3Jvb2ssIHplcm8ucG9saWN5ID0gVFJVRSkKc3VtbWFyeShzZW1fbW9kZWwpCgojIGUpIFNETQpzZG1fbW9kZWwgPC0gbGFnc2FybG0oYXV0b19hY2NpZCB+IGRlbnNpZGFkX3AgKyBzZXhvICsgY2ludHVyb24sIGRhdGEgPSBkYXRhYSwgbGlzdHcgPSBsd19yb29rLCB0eXBlID0gIm1peGVkIiwgemVyby5wb2xpY3kgPSBUUlVFKQpzdW1tYXJ5KHNkbV9tb2RlbCkKCiMgZikgTW9kZWwgU2VsZWN0aW9uCkFJQyhvbHNfbW9kZWwsIHNhcl9tb2RlbCwgc2VtX21vZGVsLCBzZG1fbW9kZWwpCgojIGcpIEluZGVwZW5kZW5jaWEgZGUgZXJyb3JlcwpsbS5tb3JhbnRlc3Qob2xzX21vZGVsLCBsd19yb29rLCB6ZXJvLnBvbGljeSA9IFRSVUUpCgoKIyBoKSBWaXN1YWxpemFjacOzbiBkZSB2YWxvcmVzIGVzdGltYWRvcwpkYXRhYSRwcmVkaWN0ZWRfc2FyIDwtIHNhcl9tb2RlbCRmaXR0ZWQudmFsdWVzICAKCnRtX3NoYXBlKGRhdGFhKSArCiAgdG1fcG9seWdvbnMoInByZWRpY3RlZF9zYXIiLCBwYWxldHRlID0gIkdyZWVucyIsIHRpdGxlID0gIlByZWRpY2Npw7NuIChTQVIpIikgKwogIHRtX2JvcmRlcnMoKSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIlByZWRpY2Npw7NuIGRlbCBNb2RlbG8gU0FSIHBvciBNdW5pY2lwaW8iKQoKYGBgCgoKIyMjICoqNCkgRXN0aW1hY2nDs24gZGUgTW9kZWxvcyBkZSBQcmVkaWNjacOzbiBMb2NhbCoqCmBgYHtyfQojIGEuIEVzdGltYXRlZCBHV1IgTW9kZWwKIyBDb252ZXJ0aXIgYSBvYmpldG8gU3BhdGlhbApkYXRhYV9zcCA8LSBhc19TcGF0aWFsKGRhdGFhKQpkYXRhYV9zcAoKIyBFeHRyYWVyIGNvb3JkZW5hZGFzCmNvb3JkcyA8LSBjb29yZGluYXRlcyhkYXRhYV9zcCkKCiMgRXN0aW1hciBlbCBhbmNobyBkZSBiYW5kYQpnd3JfYmFuZHdpZHRoIDwtIGJ3Lmd3cihmb3JtdWxhID0gYXV0b19hY2NpZCB+IGRlbnNpZGFkX3AgKyBzZXhvICsgY2ludHVyb24sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhYV9zcCwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm9hY2ggPSAiQUlDYyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCA9ICJiaXNxdWFyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0aXZlID0gVFJVRSkgCgojIEFqdXN0YXIgZWwgbW9kZWxvIEdXUgpnd3JfbW9kZWwgPC0gZ3dyLmJhc2ljKGF1dG9fYWNjaWQgfiBkZW5zaWRhZF9wICsgc2V4byArIGNpbnR1cm9uLAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhYV9zcCwKICAgICAgICAgICAgICAgICAgICAgICBidyA9IGd3cl9iYW5kd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAga2VybmVsID0gImJpc3F1YXJlIiwKICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGl2ZSA9IFRSVUUpCgojIEFncmVnYXIgcmVzdWx0YWRvcyBhIHR1IHNoYXBlZmlsZSBvcmlnaW5hbCAoc2YpCmRhdGFhJGd3cl9wcmVkIDwtIGd3cl9tb2RlbCRTREYkeWhhdApkYXRhYSRnd3JfcjIgPC0gZ3dyX21vZGVsJFNERiRMb2NhbF9SMgpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgNGIuIFZpc3VhbGl6YXIgbG9zIHZhbG9yZXMgZXN0aW1hZG9zIChTaW1wbGlmaWVkIHRtYXAgdjQgc3ludGF4KQp0bV9zaGFwZShkYXRhYSkgKwogIHRtX2ZpbGwoImd3cl9wcmVkIiwKICAgICAgICAgIHN0eWxlID0gInF1YW50aWxlIiwKICAgICAgICAgIHBhbGV0dGUgPSAiQmx1ZXMiLAogICAgICAgICAgdGl0bGUgPSAiUHJlZGljY2nDs24gKEdXUikiKSArCiAgdG1fYm9yZGVycygpICsKICB0bV90aXRsZSgiUHJlZGljY2nDs24gR1dSIGRlIEFjY2lkZW50ZXMgQXV0b21vdmlsw61zdGljb3MiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoInJpZ2h0IiwgImJvdHRvbSIpKSArCiAgdG1fY29tcGFzcyh0eXBlID0gIjhzdGFyIiwgcG9zaXRpb24gPSBjKCJyaWdodCIsICJ0b3AiKSkgKwogIHRtX3NjYWxlYmFyKHBvc2l0aW9uID0gYygibGVmdCIsICJib3R0b20iKSkKCiMgNGMuIFIyIGxvY2FsIChTaW1wbGlmaWVkIHRtYXAgdjQgc3ludGF4KQp0bV9zaGFwZShkYXRhYSkgKwogIHRtX2ZpbGwoImd3cl9yMiIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBwYWxldHRlID0gIk9yYW5nZXMiLAogICAgICAgICAgdGl0bGUgPSAiUsKyIExvY2FsIChHV1IpIikgKwogIHRtX2JvcmRlcnMoKSArCiAgdG1fdGl0bGUoIkNvZWZpY2llbnRlIGRlIERldGVybWluYWNpw7NuIExvY2FsIChHV1IpIikgKwogIHRtX2xheW91dChsZWdlbmQucG9zaXRpb24gPSBjKCJyaWdodCIsICJib3R0b20iKSkgKwogIHRtX2NvbXBhc3ModHlwZSA9ICI4c3RhciIsIHBvc2l0aW9uID0gYygicmlnaHQiLCAidG9wIikpICsKICB0bV9zY2FsZWJhcihwb3NpdGlvbiA9IGMoImxlZnQiLCAiYm90dG9tIikpCmBgYAoKCiMjIyAqKjUpIENvbiBiYXNlIGVuIGxvcyByZXN1bHRhZG9zIGVuY29udHJhZG9zIGVuIDEpIOKAkyA0KSByZWFsaXphciB1bmEgYnJldmUgZGVzY3JpcGNpw7NuIGRlIGxvcyBwcmluY2lwYWxlcyA2IOKAkyA4IGhhbGxhemdvcyBpZGVudGlmaWNhZG9zLioqCi0JTG9zIGFjY2lkZW50ZXMgYXV0b21vdmlsw61zdGljb3Mgbm8gZXN0w6FuIGRpc3RyaWJ1aWRvcyB1bmlmb3JtZW1lbnRlIGVuIE51ZXZvIExlw7NuLgotCU11bmljaXBpb3MgdXJiYW5vcyAoTW9udGVycmV5LCBTYW4gUGVkcm8sIEd1YWRhbHVwZSkgcHJlc2VudGFuIG1heW9yIGluY2lkZW5jaWEgcXVlIHpvbmFzIHJ1cmFsZXMuCi0JTGEgbWVkaWEgZXN0YXRhbCAociBtZWFuX2FjYykgZXMgc2lnbmlmaWNhdGl2YW1lbnRlIGluZmx1ZW5jaWFkYSBwb3IgbG9zIHZhbG9yZXMgYXTDrXBpY29zIGVuIMOhcmVhcyBtZXRyb3BvbGl0YW5hcy4KLQlFbCB0ZXN0IGRlIE1vcmFuIGdsb2JhbCAocCA9IHIgZ2xvYmFsX21vcmFuJHAudmFsdWUpIGNvbmZpcm1hIHF1ZSBsb3MgYWNjaWRlbnRlcyB0aWVuZGVuIGEgYWdydXBhcnNlLiBObyBlcyB1biBwYXRyw7NuIGFsZWF0b3JpbzogbXVuaWNpcGlvcyBjb24gYWx0YSBzaW5pZXN0cmFsaWRhZCBlc3TDoW4gY2VyY2Fub3MgZW50cmUgc8OtLgotCUhvdHNwb3RzIChhbHRhIGluY2lkZW5jaWEpOiDDgXJlYSBNZXRyb3BvbGl0YW5hIGRlIE1vbnRlcnJleSAoTW9udGVycmV5LCBTYW4gTmljb2zDoXMsIEFwb2RhY2EpLiBDb3JyZWRvcmVzIGluZHVzdHJpYWxlcyAoUGVzcXVlcsOtYSwgQ2nDqW5lZ2EgZGUgRmxvcmVzKS4KLQlDb2xkc3BvdHMgKGJhamEgaW5jaWRlbmNpYSk6IE11bmljaXBpb3MgcnVyYWxlcyBkZWwgc3VyIChBcmFtYmVycmksIEdhbGVhbmEpLgotCVZhcmlhYmxlcyBzaWduaWZpY2F0aXZhcyBlbiBTQVIgKG1lam9yIG1vZGVsbyBzZWfDum4gQUlDKTogRGVuc2lkYWQgcG9ibGFjaW9uYWwgKCspIGVzIE3DoXMgcG9ibGFjacOzbiA9IG3DoXMgYWNjaWRlbnRlcy4KLQlTZXhvIChIb21icmUpIOKGkiBNYXlvciByaWVzZ28gZW4gY29uZHVjdG9yZXMgbWFzY3VsaW5vcy4KLQlVc28gZGUgY2ludHVyw7NuICjigJMpIOKGkiBSZWR1Y2UgZ3JhdmVkYWQvZnJlY3VlbmNpYS4KLQlFZmVjdG8gZXNwYWNpYWw6IEVsIGNvZWZpY2llbnRlIM+BIChyIHNhcl9tb2RlbCRyaG8pIGluZGljYSBxdWUgbG9zIGFjY2lkZW50ZXMgZW4gdW4gbXVuaWNpcGlvIGFmZWN0YW4gYSBzdXMgdmVjaW5vcy4KLQlFbCBpbXBhY3RvIGRlIGxvcyBwcmVkaWN0b3JlcyB2YXLDrWEgcG9yIHJlZ2nDs246CiAgLSBEZW5zaWRhZCBwb2JsYWNpb25hbDogRWZlY3RvIG3DoXMgZnVlcnRlIGVuIHpvbmFzIHVyYmFuYXMuCiAgLSBDaW50dXLDs24gZGUgc2VndXJpZGFkOiBNYXlvciBlZmVjdG8gcHJldmVudGl2byBlbiBjYXJyZXRlcmFzIHJ1cmFsZXMuCi0JUsKyIGxvY2FsOiBPc2NpbGEgZW50cmUgciBtaW4oZGF0YWEkZ3dyX3IyKSB5IHIgbWF4KGRhdGFhJGd3cl9yMiksIG1vc3RyYW5kbyBxdWUgZWwgbW9kZWxvIGV4cGxpY2EgbWVqb3IgY2llcnRhcyDDoXJlYXMgKGVqLiB6b25hcyB1cmJhbmFzKS4KLQlPTFMvU0FSIHN1YmVzdGltYW4gZWZlY3RvcyBlbiByZWdpb25lcyBlc3BlY8OtZmljYXMuCi0JR1dSIG5vcyBkaWNlIHF1ZTogQWxndW5hcyB2YXJpYWJsZXMgY2FtYmlhbiBkZSBzaWdubyAoZWouIGRlbnNpZGFkIHB1ZWRlIHRlbmVyIGVmZWN0byBuZWdhdGl2byBlbiDDoXJlYXMgcGVyaWbDqXJpY2FzKS4KLQlMYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG5vIGVzIGNvbnN0YW50ZSBlbiBlbCBlc3BhY2lvLgotCUVuZm9xdWUgdGVycml0b3JpYWwgZGlmZXJlbmNpYWRvOiBDaXVkYWRlcywgZGViZW4gdGVuZXIgbWVqb3IgQ29udHJvbCBkZSB2ZWxvY2lkYWQgeSBmaXNjYWxpemFjacOzbiBkZSBjaW50dXLDs24geSBlbiBDYXJyZXRlcmFzIHJ1cmFsZXMgc2UgZGViZW4gY3JlYXIgY2FtcGHDsWFzIHNvYnJlIG1hbmVqbyBub2N0dXJubyB5IGFsY29ob2wuCi0JUGFyYSBlbCBtb25pdG9yZW8gZGUgY2zDunN0ZXJlcyBjcsOtdGljb3M6IFVzYXIgbWFwYXMgZGUgcHJlZGljY2nDs24gR1dSIHBhcmEgcHJpb3JpemFyIHJlY3Vyc29zLgoKCg==