# 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==