# Cargar las librerías primero
library(sf)
library(dplyr)
library(ggplot2)
library(ggspatial)
# Obtener los archivos que están en la carpeta del cuaderno
list.files("C:\\Users\\suare\\OneDrive\\Documentos\\GB2\\Proyecto1\\Datos\\MGN2025_MPIO_GRAFICO")
[1] "MGN_ADM_MPIO_GRAFICO.cpg"     "MGN_ADM_MPIO_GRAFICO.dbf"    
[3] "MGN_ADM_MPIO_GRAFICO.prj"     "MGN_ADM_MPIO_GRAFICO.sbn"    
[5] "MGN_ADM_MPIO_GRAFICO.sbx"     "MGN_ADM_MPIO_GRAFICO.shp"    
[7] "MGN_ADM_MPIO_GRAFICO.shp.xml" "MGN_ADM_MPIO_GRAFICO.shx"    
# Leer el shapefile de Municipios como un objeto sf
colombia <- st_read("C:\\Users\\suare\\OneDrive\\Documentos\\GB2\\Proyecto1\\Datos\\MGN2025_MPIO_GRAFICO\\MGN_ADM_MPIO_GRAFICO.shp")
Reading layer `MGN_ADM_MPIO_GRAFICO' from data source 
  `C:\Users\suare\OneDrive\Documentos\GB2\Proyecto1\Datos\MGN2025_MPIO_GRAFICO\MGN_ADM_MPIO_GRAFICO.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 1122 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  WGS 84
head(colombia)
Simple feature collection with 6 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -76.18451 ymin: 5.664284 xmax: -74.83629 ymax: 7.29255
Geodetic CRS:  WGS 84
  dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr mpio_cnmbr
1         05        001      05001  ANTIOQUIA   MEDELLÍN
2         05        002      05002  ANTIOQUIA  ABEJORRAL
3         05        004      05004  ANTIOQUIA   ABRIAQUÍ
4         05        021      05021  ANTIOQUIA ALEJANDRÍA
5         05        030      05030  ANTIOQUIA      AMAGÁ
6         05        031      05031  ANTIOQUIA     AMALFI
                         mpio_crslc mpio_tipo mpio_narea mpio_nano
1                              1965 MUNICIPIO  374.74148      2025
2                              1814 MUNICIPIO  506.95978      2024
3                              1912 MUNICIPIO  296.97419      2025
4 Decreto departamental 304 de 1907 MUNICIPIO  128.85643      2024
5                              1912 MUNICIPIO   84.11714      2024
6                              1843 MUNICIPIO 1208.34619      2025
  shape_Leng  shape_Area                       geometry
1  1.0353795 0.030607649 MULTIPOLYGON (((-75.4857 6....
2  1.1585036 0.041383896 MULTIPOLYGON (((-75.46938 5...
3  0.8106670 0.024253315 MULTIPOLYGON (((-76.09047 6...
4  0.7051995 0.010534527 MULTIPOLYGON (((-75.0332 6....
5  0.4455330 0.006866507 MULTIPOLYGON (((-75.67587 6...
6  2.0584824 0.098921100 MULTIPOLYGON (((-74.91364 7...
st_write(colombia, "municipios.gpkg", driver = "GPKG", append = F)
Writing layer `municipios' to data source `municipios.gpkg' using driver `GPKG'
Writing 1122 features with 11 fields and geometry type Multi Polygon.
# Verificar que el nuevo archivo GeoPackage se haya creado correctamente
list.files(pattern="gpkg")
[1] "municipios.gpkg"
# Leer el geopackage de Municipios como un objeto sf
colombia2 <- st_read("./municipios.gpkg")
Reading layer `municipios' from data source 
  `C:\Users\suare\OneDrive\Documentos\municipios.gpkg' using driver `GPKG'
Simple feature collection with 1122 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  WGS 84
(magdalena <- dplyr::filter(colombia, dpto_cnmbr == "MAGDALENA"))
Simple feature collection with 30 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -74.9466 ymin: 8.936489 xmax: -73.54184 ymax: 11.34891
Geodetic CRS:  WGS 84
First 10 features:
   dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr           mpio_cnmbr
1          47        001      47001  MAGDALENA          SANTA MARTA
2          47        030      47030  MAGDALENA            ALGARROBO
3          47        053      47053  MAGDALENA            ARACATACA
4          47        058      47058  MAGDALENA             ARIGUANÍ
5          47        161      47161  MAGDALENA CERRO DE SAN ANTONIO
6          47        170      47170  MAGDALENA              CHIVOLO
7          47        189      47189  MAGDALENA              CIÉNAGA
8          47        205      47205  MAGDALENA            CONCORDIA
9          47        245      47245  MAGDALENA             EL BANCO
10         47        258      47258  MAGDALENA             EL PIÑÓN
                                 mpio_crslc mpio_tipo mpio_narea mpio_nano
1                                      1525 MUNICIPIO  2343.9033      2025
2         Ordenanza 008 de Junio 24 de 1999 MUNICIPIO   405.8850      2024
3      Ordenanza 47 del 28 de Abril de 1915 MUNICIPIO  1738.4243      2025
4  Ordenanza 14 Bis de Noviembre 30 de 1966 MUNICIPIO  1130.3299      2024
5                    Ordenanza 3038 de 1912 MUNICIPIO   177.0656      2024
6            Decreto 107 de Marzo 8 de 1974 MUNICIPIO   536.0309      2024
7                          Ley 0339 de 1876 MUNICIPIO  1329.3560      2025
8     Ordenanza 007 del 24 de Junio de 1999 MUNICIPIO   109.3953      2024
9                          Ley 0182 de 1871 MUNICIPIO   813.8018      2025
10    Ordenanza 032 del 20 de Abril de 1815 MUNICIPIO   556.6568      2024
   shape_Leng  shape_Area                       geometry
1   3.1304030 0.194233447 MULTIPOLYGON (((-73.64265 1...
2   1.2656799 0.033536941 MULTIPOLYGON (((-74.08572 1...
3   2.6435461 0.143834703 MULTIPOLYGON (((-73.59859 1...
4   1.9928810 0.093278409 MULTIPOLYGON (((-74.03381 9...
5   0.7004114 0.014623054 MULTIPOLYGON (((-74.85084 1...
6   1.3253970 0.044254975 MULTIPOLYGON (((-74.50895 1...
7   2.6311586 0.110066127 MULTIPOLYGON (((-73.76511 1...
8   0.5443263 0.009033178 MULTIPOLYGON (((-74.81188 1...
9   1.6767358 0.067024887 MULTIPOLYGON (((-73.79896 9...
10  1.1771096 0.045985558 MULTIPOLYGON (((-74.67476 1...
# Dibujar los límites de los municipios del Magdalena
plot(st_geometry(magdalena), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)

# Añadir un punto rojo en el centro (centroide) de cada municipio
plot(st_geometry(st_centroid(magdalena)), pch = 3, col = 'red', add = TRUE)

# Guardar las entidades seleccionadas en un nuevo archivo GeoPackage para su uso posterior
st_write(magdalena, "C:/Users/suare/OneDrive/Documentos/GB2/Proyecto1/Datos/magdalena_munic.gpkg", driver = "GPKG", append = F)
Writing layer `magdalena_munic' to data source 
  `C:/Users/suare/OneDrive/Documentos/GB2/Proyecto1/Datos/magdalena_munic.gpkg' using driver `GPKG'
Writing 30 features with 11 fields and geometry type Multi Polygon.
# Leer el archivo CSV con ciudades del mundo usando la ruta larga
# (Usamos %>% para convertirlo de inmediato en un objeto espacial)
ciudades <- read.csv("C:/Users/suare/OneDrive/Documentos/GB2/Proyecto1/Datos/worldcities.csv") %>% 
  st_as_sf(coords = c("lng", "lat"), crs = 4326)
# Seleccionar por ubicación: ciudades que están dentro del Magdalena
ciudades_magdalena <- ciudades[magdalena, , op = st_within]

# Ver la tabla de resultados en el notebook
ciudades_magdalena
Simple feature collection with 29 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -74.8589 ymin: 8.9983 xmax: -73.9747 ymax: 11.2419
Geodetic CRS:  WGS 84
First 10 features:
             city  city_ascii  country iso2 iso3 admin_name capital
1401  Santa Marta Santa Marta Colombia   CO  COL  Magdalena   admin
4828      Ciénaga     Cienaga Colombia   CO  COL  Magdalena   minor
6651    Fundación   Fundacion Colombia   CO  COL  Magdalena   minor
8151     El Banco    El Banco Colombia   CO  COL  Magdalena   minor
9381        Plato       Plato Colombia   CO  COL  Magdalena   minor
13575   Aracataca   Aracataca Colombia   CO  COL  Magdalena   minor
16193     Pivijay     Pivijay Colombia   CO  COL  Magdalena   minor
16262 Puebloviejo Puebloviejo Colombia   CO  COL  Magdalena   minor
16438  El Difícil  El Dificil Colombia   CO  COL  Magdalena   minor
16848  Sitionuevo  Sitionuevo Colombia   CO  COL  Magdalena   minor
      population         id                 geometry
1401      515556 1170715594 POINT (-74.2053 11.2419)
4828      129414 1170825751   POINT (-74.25 11.0069)
6651       90514 1170906059 POINT (-74.1867 10.5214)
8151       72131 1170111607  POINT (-73.9747 8.9983)
9381       61856 1170202938  POINT (-74.7872 9.7919)
13575      40400 1170335661 POINT (-74.1928 10.5937)
16193      33225 1170978231 POINT (-74.6167 10.4667)
16262      33030 1170245441 POINT (-74.2833 10.9942)
16438      32637 1170207587    POINT (-74.2386 9.85)
16848      31706 1170226891 POINT (-74.7167 10.7833)
# Dibujar el mapa base de los municipios del Magdalena
plot(st_geometry(magdalena), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)

# Superponer las ciudades encontradas como puntos rojos enteros
plot(st_geometry(ciudades_magdalena), pch = 20, col = 'red', add = TRUE)

# # Mapa Magdalena
ggplot() +
  # 1. Municipios de fondo gris
  geom_sf(data = magdalena, fill = "#EAEAEA", color = "grey60", alpha = 0.9) +
  
  # 2. Puntos de ciudades de colores
  geom_sf(data = ciudades_magdalena, aes(color = city), size = 3.5) +
  
  # 3. Títulos y etiquetas 
  labs(
    title = "Ciudades del Magdalena\n", 
    subtitle = "Selección por ubicación espacial (CRS WGS 84)\n",
    x = "Longitud", 
    y = "Latitud",
    color = "Ciudad",
    caption = "Fuente: Base de datos mundial de ciudades & DANE"
  ) +
  
  # 4. Estilo 
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 15, hjust = 0.0),
    plot.subtitle = element_text(size = 10, face = "italic", color = "grey30"),
    axis.text = element_text(color = "grey40"),
    #  Rotamos los textos del eje X a 45 grados para que no se choquen
    axis.text.x = element_text(angle = 45, hjust = 1), 
    panel.grid.major = element_line(color = "grey92"),
    legend.text = element_text(size = 9),
    legend.title = element_text(face = "bold"),
    # Añadimos un pequeño margen arriba de la leyenda para separarla del título
    legend.box.margin = margin(t = 20) 
  )

NA
library(ggplot2)
library(ggspatial)
library(grid)

ggplot() +
  # 1. Cargar el mapa base con los municipios del Magdalena
  geom_sf(data = magdalena) +
  
  # 2. Dibujar las ciudades como puntos usando colores diferentes para cada una
  geom_sf(data = ciudades_magdalena, aes(color = city, label = city), size = 3) +
  
  # 3. Agregar la barra de escala abajo a la izquierda
  annotation_scale(
    location = "bl", 
    height = unit(.25, "cm"), 
    pad_x = unit(0.3, "in"), 
    pad_y = unit(0.1, "in")
  ) +
  
 # 4. Agregar la flecha del norte arriba a la izquierda
  annotation_north_arrow(
    height = unit(1, "cm"), 
    width = unit(1, "cm"),
    which_north = "true", 
    location = "bl", 
    pad_x = unit(0.1, "in"), 
    pad_y = unit(2.6, "in") 
    
  ) +
  
 # 5. Configurar títulos de los ejes y el principal
  labs(x = "Longitud", y = "Latitud", title = "Ciudades Magdalena",color = "Ciudades") +
  
  # 6. Aplicar el tema con cuadrícula y fondo blanco
  theme_bw() +
  
  # 7. Inclinar los números del eje X a 90 grados para que no se amontonen
  theme(
    axis.text.x = element_text(angle = 90, hjust = 3, vjust = 3)
  )

LS0tDQp0aXRsZTogIkludHJvZHVjY2nDs24gYWwgTWFuZWpvIGRlIE9iamV0b3MgR2VvZ3LDoWZpY29zIChTaW1wbGUgRmVhdHVyZXMpIGVuIFI6IENhc28gRGVwYXJ0YW1lbnRvIGRlbCBNYWdkYWxlbmEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQojIENhcmdhciBsYXMgbGlicmVyw61hcyBwcmltZXJvDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dzcGF0aWFsKQ0KIyBPYnRlbmVyIGxvcyBhcmNoaXZvcyBxdWUgZXN0w6FuIGVuIGxhIGNhcnBldGEgZGVsIGN1YWRlcm5vDQpsaXN0LmZpbGVzKCJDOlxcVXNlcnNcXHN1YXJlXFxPbmVEcml2ZVxcRG9jdW1lbnRvc1xcR0IyXFxQcm95ZWN0bzFcXERhdG9zXFxNR04yMDI1X01QSU9fR1JBRklDTyIpDQoNCg0KYGBgDQpgYGB7cn0NCiMgTGVlciBlbCBzaGFwZWZpbGUgZGUgTXVuaWNpcGlvcyBjb21vIHVuIG9iamV0byBzZg0KY29sb21iaWEgPC0gc3RfcmVhZCgiQzpcXFVzZXJzXFxzdWFyZVxcT25lRHJpdmVcXERvY3VtZW50b3NcXEdCMlxcUHJveWVjdG8xXFxEYXRvc1xcTUdOMjAyNV9NUElPX0dSQUZJQ09cXE1HTl9BRE1fTVBJT19HUkFGSUNPLnNocCIpDQpgYGANCmBgYHtyfQ0KaGVhZChjb2xvbWJpYSkNCg0KYGBgDQpgYGB7cn0NCnN0X3dyaXRlKGNvbG9tYmlhLCAibXVuaWNpcGlvcy5ncGtnIiwgZHJpdmVyID0gIkdQS0ciLCBhcHBlbmQgPSBGKQ0KYGBgDQpgYGB7cn0NCiMgVmVyaWZpY2FyIHF1ZSBlbCBudWV2byBhcmNoaXZvIEdlb1BhY2thZ2Ugc2UgaGF5YSBjcmVhZG8gY29ycmVjdGFtZW50ZQ0KbGlzdC5maWxlcyhwYXR0ZXJuPSJncGtnIikNCg0KYGBgDQpgYGB7cn0NCiMgTGVlciBlbCBnZW9wYWNrYWdlIGRlIE11bmljaXBpb3MgY29tbyB1biBvYmpldG8gc2YNCmNvbG9tYmlhMiA8LSBzdF9yZWFkKCIuL211bmljaXBpb3MuZ3BrZyIpDQoNCmBgYA0KYGBge3J9DQoobWFnZGFsZW5hIDwtIGRwbHlyOjpmaWx0ZXIoY29sb21iaWEsIGRwdG9fY25tYnIgPT0gIk1BR0RBTEVOQSIpKQ0KDQpgYGANCmBgYHtyfQ0KIyBEaWJ1amFyIGxvcyBsw61taXRlcyBkZSBsb3MgbXVuaWNpcGlvcyBkZWwgTWFnZGFsZW5hDQpwbG90KHN0X2dlb21ldHJ5KG1hZ2RhbGVuYSksIGNvbCA9IHNmLmNvbG9ycygxMiwgY2F0ZWdvcmljYWwgPSBUUlVFKSwgYm9yZGVyID0gJ2dyZXknLCBheGVzID0gVFJVRSkNCg0KIyBBw7FhZGlyIHVuIHB1bnRvIHJvam8gZW4gZWwgY2VudHJvIChjZW50cm9pZGUpIGRlIGNhZGEgbXVuaWNpcGlvDQpwbG90KHN0X2dlb21ldHJ5KHN0X2NlbnRyb2lkKG1hZ2RhbGVuYSkpLCBwY2ggPSAzLCBjb2wgPSAncmVkJywgYWRkID0gVFJVRSkNCmBgYA0KYGBge3J9DQojIEd1YXJkYXIgbGFzIGVudGlkYWRlcyBzZWxlY2Npb25hZGFzIGVuIHVuIG51ZXZvIGFyY2hpdm8gR2VvUGFja2FnZSBwYXJhIHN1IHVzbyBwb3N0ZXJpb3INCnN0X3dyaXRlKG1hZ2RhbGVuYSwgIkM6L1VzZXJzL3N1YXJlL09uZURyaXZlL0RvY3VtZW50b3MvR0IyL1Byb3llY3RvMS9EYXRvcy9tYWdkYWxlbmFfbXVuaWMuZ3BrZyIsIGRyaXZlciA9ICJHUEtHIiwgYXBwZW5kID0gRikNCmBgYA0KYGBge3J9DQojIExlZXIgZWwgYXJjaGl2byBDU1YgY29uIGNpdWRhZGVzIGRlbCBtdW5kbyB1c2FuZG8gbGEgcnV0YSBsYXJnYQ0KIyAoVXNhbW9zICU+JSBwYXJhIGNvbnZlcnRpcmxvIGRlIGlubWVkaWF0byBlbiB1biBvYmpldG8gZXNwYWNpYWwpDQpjaXVkYWRlcyA8LSByZWFkLmNzdigiQzovVXNlcnMvc3VhcmUvT25lRHJpdmUvRG9jdW1lbnRvcy9HQjIvUHJveWVjdG8xL0RhdG9zL3dvcmxkY2l0aWVzLmNzdiIpICU+JSANCiAgc3RfYXNfc2YoY29vcmRzID0gYygibG5nIiwgImxhdCIpLCBjcnMgPSA0MzI2KQ0KYGBgDQoNCmBgYHtyfQ0KIyBTZWxlY2Npb25hciBwb3IgdWJpY2FjacOzbjogY2l1ZGFkZXMgcXVlIGVzdMOhbiBkZW50cm8gZGVsIE1hZ2RhbGVuYQ0KY2l1ZGFkZXNfbWFnZGFsZW5hIDwtIGNpdWRhZGVzW21hZ2RhbGVuYSwgLCBvcCA9IHN0X3dpdGhpbl0NCg0KIyBWZXIgbGEgdGFibGEgZGUgcmVzdWx0YWRvcyBlbiBlbCBub3RlYm9vaw0KY2l1ZGFkZXNfbWFnZGFsZW5hDQpgYGANCmBgYHtyfQ0KIyBEaWJ1amFyIGVsIG1hcGEgYmFzZSBkZSBsb3MgbXVuaWNpcGlvcyBkZWwgTWFnZGFsZW5hDQpwbG90KHN0X2dlb21ldHJ5KG1hZ2RhbGVuYSksIGNvbCA9IHNmLmNvbG9ycygxMiwgY2F0ZWdvcmljYWwgPSBUUlVFKSwgYm9yZGVyID0gJ2dyZXknLCBheGVzID0gVFJVRSkNCg0KIyBTdXBlcnBvbmVyIGxhcyBjaXVkYWRlcyBlbmNvbnRyYWRhcyBjb21vIHB1bnRvcyByb2pvcyBlbnRlcm9zDQpwbG90KHN0X2dlb21ldHJ5KGNpdWRhZGVzX21hZ2RhbGVuYSksIHBjaCA9IDIwLCBjb2wgPSAncmVkJywgYWRkID0gVFJVRSkNCmBgYA0KYGBge3J9DQojICMgTWFwYSBNYWdkYWxlbmENCmdncGxvdCgpICsNCiAgIyAxLiBNdW5pY2lwaW9zIGRlIGZvbmRvIGdyaXMNCiAgZ2VvbV9zZihkYXRhID0gbWFnZGFsZW5hLCBmaWxsID0gIiNFQUVBRUEiLCBjb2xvciA9ICJncmV5NjAiLCBhbHBoYSA9IDAuOSkgKw0KICANCiAgIyAyLiBQdW50b3MgZGUgY2l1ZGFkZXMgZGUgY29sb3Jlcw0KICBnZW9tX3NmKGRhdGEgPSBjaXVkYWRlc19tYWdkYWxlbmEsIGFlcyhjb2xvciA9IGNpdHkpLCBzaXplID0gMy41KSArDQogIA0KICAjIDMuIFTDrXR1bG9zIHkgZXRpcXVldGFzIA0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNpdWRhZGVzIGRlbCBNYWdkYWxlbmFcbiIsIA0KICAgIHN1YnRpdGxlID0gIlNlbGVjY2nDs24gcG9yIHViaWNhY2nDs24gZXNwYWNpYWwgKENSUyBXR1MgODQpXG4iLA0KICAgIHggPSAiTG9uZ2l0dWQiLCANCiAgICB5ID0gIkxhdGl0dWQiLA0KICAgIGNvbG9yID0gIkNpdWRhZCIsDQogICAgY2FwdGlvbiA9ICJGdWVudGU6IEJhc2UgZGUgZGF0b3MgbXVuZGlhbCBkZSBjaXVkYWRlcyAmIERBTkUiDQogICkgKw0KICANCiAgIyA0LiBFc3RpbG8gDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1LCBoanVzdCA9IDAuMCksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiaXRhbGljIiwgY29sb3IgPSAiZ3JleTMwIiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyZXk0MCIpLA0KICAgICMgIFJvdGFtb3MgbG9zIHRleHRvcyBkZWwgZWplIFggYSA0NSBncmFkb3MgcGFyYSBxdWUgbm8gc2UgY2hvcXVlbg0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksIA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTkyIiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAjIEHDsWFkaW1vcyB1biBwZXF1ZcOxbyBtYXJnZW4gYXJyaWJhIGRlIGxhIGxleWVuZGEgcGFyYSBzZXBhcmFybGEgZGVsIHTDrXR1bG8NCiAgICBsZWdlbmQuYm94Lm1hcmdpbiA9IG1hcmdpbih0ID0gMjApIA0KICApDQogIA0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3NwYXRpYWwpDQpsaWJyYXJ5KGdyaWQpDQoNCmdncGxvdCgpICsNCiAgIyAxLiBDYXJnYXIgZWwgbWFwYSBiYXNlIGNvbiBsb3MgbXVuaWNpcGlvcyBkZWwgTWFnZGFsZW5hDQogIGdlb21fc2YoZGF0YSA9IG1hZ2RhbGVuYSkgKw0KICANCiAgIyAyLiBEaWJ1amFyIGxhcyBjaXVkYWRlcyBjb21vIHB1bnRvcyB1c2FuZG8gY29sb3JlcyBkaWZlcmVudGVzIHBhcmEgY2FkYSB1bmENCiAgZ2VvbV9zZihkYXRhID0gY2l1ZGFkZXNfbWFnZGFsZW5hLCBhZXMoY29sb3IgPSBjaXR5LCBsYWJlbCA9IGNpdHkpLCBzaXplID0gMykgKw0KICANCiAgIyAzLiBBZ3JlZ2FyIGxhIGJhcnJhIGRlIGVzY2FsYSBhYmFqbyBhIGxhIGl6cXVpZXJkYQ0KICBhbm5vdGF0aW9uX3NjYWxlKA0KICAgIGxvY2F0aW9uID0gImJsIiwgDQogICAgaGVpZ2h0ID0gdW5pdCguMjUsICJjbSIpLCANCiAgICBwYWRfeCA9IHVuaXQoMC4zLCAiaW4iKSwgDQogICAgcGFkX3kgPSB1bml0KDAuMSwgImluIikNCiAgKSArDQogIA0KICMgNC4gQWdyZWdhciBsYSBmbGVjaGEgZGVsIG5vcnRlIGFycmliYSBhIGxhIGl6cXVpZXJkYQ0KICBhbm5vdGF0aW9uX25vcnRoX2Fycm93KA0KICAgIGhlaWdodCA9IHVuaXQoMSwgImNtIiksIA0KICAgIHdpZHRoID0gdW5pdCgxLCAiY20iKSwNCiAgICB3aGljaF9ub3J0aCA9ICJ0cnVlIiwgDQogICAgbG9jYXRpb24gPSAiYmwiLCANCiAgICBwYWRfeCA9IHVuaXQoMC4xLCAiaW4iKSwgDQogICAgcGFkX3kgPSB1bml0KDIuNiwgImluIikgDQogICAgDQogICkgKw0KICANCiAjIDUuIENvbmZpZ3VyYXIgdMOtdHVsb3MgZGUgbG9zIGVqZXMgeSBlbCBwcmluY2lwYWwNCiAgbGFicyh4ID0gIkxvbmdpdHVkIiwgeSA9ICJMYXRpdHVkIiwgdGl0bGUgPSAiQ2l1ZGFkZXMgTWFnZGFsZW5hIixjb2xvciA9ICJDaXVkYWRlcyIpICsNCiAgDQogICMgNi4gQXBsaWNhciBlbCB0ZW1hIGNvbiBjdWFkcsOtY3VsYSB5IGZvbmRvIGJsYW5jbw0KICB0aGVtZV9idygpICsNCiAgDQogICMgNy4gSW5jbGluYXIgbG9zIG7Dum1lcm9zIGRlbCBlamUgWCBhIDkwIGdyYWRvcyBwYXJhIHF1ZSBubyBzZSBhbW9udG9uZW4NCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAzLCB2anVzdCA9IDMpDQogICkNCmBgYA0KDQoNCg==