This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

1. Introducción

1.1. Introducción a R

R es un lenguaje de programación y un entorno de software libre utilizado principalmente para análisis estadístico y gráficos. Nació como una implementación del lenguaje S, desarrollado en los laboratorios Bell. A lo largo del tiempo, R ha evolucionado para convertirse en una herramienta indispensable para la ciencia de datos, la bioinformática, la investigación académica y más.

1.2. Introducción a RStudio

RStudio es un entorno de desarrollo integrado (IDE) para R. Proporciona una consola, un editor de scripts que soporta la ejecución directa de código, así como herramientas para la visualización de datos y la gestión del espacio de trabajo. RStudio ha facilitado el uso de R al ofrecer una interfaz más amigable y herramientas útiles para el análisis.

1.2.1. Interfaz de RStudio

Interfaz RStudio. En la consola se ejecuta el código R en tiempo real. Los usuarios pueden ingresar comandos directamente y ver los resultados al instante.

Editor de scripts: El editor de código permite escribir y editar scripts en R. Resalta la sintaxis del código. Proporciona sugerencias de código y autocompletado. Tiene botones para ejecutar líneas o bloques de código específicos. Es justo donde estoy escribiendo este script.

Environment: El Entorno o Environment muestra los objetos (vectores, matrices, data frames, etc.) que están en el entorno global. Ofrece la opción de importar conjuntos de datos. El “entorno global” se refiere al espacio de trabajo de nivel superior donde las variables, funciones y otros objetos que creas se almacenan de manera predeterminada durante una sesión interactiva. Es el lugar donde se guardan y se pueden acceder a las variables que defines y a los datos que cargas, a menos que se especifique o utilic un entorno diferente.

Historial: Muestra un registro de los comandos previamente ejecutados en la consola.

Archivos: Proporciona una vista del sistema de archivos, lo que permite navegar, abrir, y gestionar archivos y directorios.

Plots: Muestra gráficos generados por el código R. Permite navegar entre varios gráficos y exportarlos en diversos formatos.

Paquetes: Enumera todos los paquetes R instalados. Permite instalar, actualizar o cargar/descargar paquetes con facilidad.

Ayuda: Proporciona acceso a la documentación de funciones y paquetes de R. Permite buscar y consultar la documentación de funciones específicas.

Visor: Se utiliza para visualizar contenidos web, como mapas interactivos o documentos R Markdown renderizados.

1.3. Proyectos y Archivos, Notebooks y Documentos R Markdown

En RStudio se pueden crear archivos o proyectos. La diferencia entre un archivo y un proyecto es importante y tiene que ver con la organización, gestión y reproducibilidad de tu trabajo.

1.3.1. Archivos

-Un archivo en R suele tener una extensión .R o .Rmd (para R Markdown). Contiene código R, comentarios y, en el caso de R Markdown, también puede contener texto enriquecido, ecuaciones, etc. -Se utiliza para escribir, guardar y ejecutar código R.

-Un archivo es una entidad independiente. Puede moverse, compartirse o ejecutarse sin necesidad de otros archivos, a menos que explícitamente dependa de otros (por ejemplo, si carga datos de otro archivo).

Con RStudio se pueden crear diferentes tipos de archivos. Vamos a mencionar 3 que son muy comunes.

1.3.1.1. Script de R (*.R)

Archivos de código que contienen secuencias de comandos y funciones en R.

1.3.1.2. R Markdown (*.Rmd)

Documentos que integran código R con texto narrativo, permitiendo la creación de informes, presentaciones y otros documentos que pueden ser renderizados en diversos formatos como HTML, PDF y Word.Si bien los notebooks generalmente se visualizan mejor como documentos HTML, con R Markdown puedes fácilmente renderizar a múltiples formatos, incluidos PDF, Word o presentaciones. Flujo de Trabajo Lineal: En un documento R Markdown tradicional, normalmente trabaja en el código y el contenido, y luego renderiza todo el documento de una vez para ver los resultados. Esto es útil cuando ya tiene un análisis establecido que desea ejecutar de principio a fin. Se usan si se requiere generar informes que documenten el código.

1.3.1.3.R Notebook (formato .Rmd)

Una variante de R Markdown donde puede ejecutar y ver resultados en línea. Permiten ejecutar bloques de código individualmente e inmediatamente ver los resultados debajo de ese bloque, similar a cómo funcionan los Jupyter Notebooks en Python. Es útil para un análisis exploratorio donde desea iterar rápidamente y ver los resultados al instante. Es decir que puede ver el código, los resultados y el texto en un formato casi final mientras trabaja, por lo que resulta útil para construir y refinar análisis y documentarlos simultáneamente ¡Esto es un notebook!

Ambas opciones, Notebook y R Markdown, tienen sus fortalezas y son adecuadas para diferentes escenarios. Si está en una fase exploratoria, iterativa y deseas ver resultados al instante, un notebook puede ser la mejor opción. Si está trabajando en un informe, artículo o análisis más estructurado y formal que requiere un flujo deAmbas opciones, Notebook y R Markdown, tienen sus fortalezas y son adecuadas para diferentes escenarios. Si está en una fase exploratoria, iterativa y desea ver resultados al instante, un notebook puede ser la mejor opción. Si está trabajando en un informe, artículo o análisis más estructurado y formal que requiere un flujo de trabajo más lineal y opcidcones de salida diversificadas, un documento R Markdown podría ser más adecuado. En cualquier caso, recuerde que puedes cambiar entre las experiencias de Notebook y Documento en RStudio con facilidad, por lo que no está estrictamente limitado a una elección u otra.

1.3.2. Proyectos

-Un proyecto en RStudio no es solo un archivo, sino un entorno de trabajo completo. Cuando crea un proyecto, RStudio genera un archivo con extensión .Rproj que guarda las configuraciones y el estado del proyecto.

-Los proyectos se utilizan para organizar conjuntos relacionados de archivos y datos. Facilitan la gestión de directorios de trabajo, rutas relativas y otras configuraciones específicas del proyecto.

-Entorno de trabajo: Cuando abre un proyecto, RStudio automáticamente configura el directorio de trabajo en la ubicación del proyecto. Esto es útil para garantizar que el código sea reproducible, ya que puede usar rutas relativas en lugar de rutas absolutas.

-Los proyectos de RStudio se integran bien con sistemas de control de versiones como Git, facilitando la gestión de versiones y colaboración.

-Al trabajar en un proyecto más grande, es posible que tengas múltiples scripts, conjuntos de datos y otros archivos relacionados. Los proyectos te ayudan a mantener todo organizado en un solo lugar.

-Un proyecto puede tener configuraciones específicas, como opciones de codificación, que no afectan a otros proyectos o scripts fuera del proyecto.

En resumen, mientras que un archivo en R es simplemente un documento que contiene código R, un proyecto en RStudio es un entorno de trabajo organizativo que facilita la gestión y reproducibilidad de trabajos más complejos y multifacéticos. Es especialmente útil cuando está trabajando en análisis más grandes o colaborativos.

2. Primeros pasos en R

2.1.Instalar Paquetes o Librerías

EEn R, las funcionalidades se amplían mediante paquetes o librerías. Algunos paquetes actuales para el manejo de datos espaciales incluyen:

  • sf: manejo y análisis de datos espaciales vectoriales mediante el estándar de simple features.
  • terra: manejo y análisis eficiente de datos raster y vectoriales.

Históricamente se utilizaron paquetes como sp, raster y rgdal, pero gran parte de su funcionalidad ha sido reemplazada por sf y terra, que son los paquetes recomendados para proyectos nuevos.

Observará que cuando trabajamos en un notebook, el código que se puede ejecutar se escribe así ** {r} código**. Puede ejecutarlo haciendo click sobre el símbolo de play. - Si la versión de R con la que trabaja es antigua, puede que se generen errores y requiera descargar un paquete de herramientas para la versión de R con la que trabajan. Puede descargar esta última versión en https://cran.rstudio.com/bin/windows/Rtools/.


# Ejecute este chunk una sola vez 
pkgs <- c("sf", "terra", "dplyr", "ggplot2", "readr")
to_install <- setdiff(pkgs, rownames(installed.packages()))
if (length(to_install)) install.packages(to_install, dependencies = TRUE)

Ojo, solo puede ejecutar los códigos desde el editor de código de RStudio, no desde la visualización (renderización) en html.


Así se ve un bloque de código en el editor de código de Rstudio
¿A propósito, ya sabe cómo agregar una imagen a su notebook?. ¿Ya identificó cómo agregar color al texto que use para documentar su código?.
Ahora cargaremos las librerías. No es suficiente instalarlas, tenemos que decir explícitamente que vamos a traerlas a nuestro código.

El paquete sf (simple features) ofrece una amplia variedad de funcionalidades para trabajar con datos espaciales tipo vector como representación de datos espaciales, leere y escribir en variedad de formatos (ej. shp, GeoJSON, KML, entre otros), integración con librerías como GDAL que permite gestionar datos geoespaciale; manipular geometrías para calcular área, longitudes, etc; realizar operaciones topológicas, manipulación de sistemas de coordenadas; integración con otros paquetes de R; realizar operaciones de geoprocesamiento como buffer, clip, entre otras; así como manipulación de atributos (agregar, eliminar, modificar.

Representación de Datos Espaciales:

library(sf)
Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(dplyr)

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

2.2. Identificar directorio de trabajo

Primero revise cuál es la ubicación de s directorio de trabajo actual usando getwd.

getwd()
[1] "/Users/macbook/Library/CloudStorage/OneDrive-UniversidadNacionaldeColombia/1_Periodos_Asignaturas/Cursos_2025_2/Geomatica_Basica_20252/Practical/Interpolacion/R_Introduction_20252"

2.3. Variables

En programación, a menudo se requiere almacenar información para usarla más adelante. Aquí es donde entran las variables. Una variable puede ser imaginada como una caja en la que se guarda alguna información. Esta “caja” tiene un nombre, y siempre que quiera acceder a la información, simplemente usa el nombre de la variable. En R, se usa el símbolo <- para asignar un valor a una variable. Lo primero que vamos a hacer es instalar las librerías o paquetes con los que podremos realizar las operaciones y análisis.
La variable shp_ruta almacenará la ruta al archivo shp. Reemplace la ruta de ejemplo por la ruta correspondiente en su propio computador, donde haya guardado la carpeta del curso.

# Usa la ruta relativa al shapefile con los datos
shp_ruta <- "./datos/SHP_MGN2018_INTGRD_MPIO/MGN_ANM_MPIOS.shp"
vector_municipios <- st_read(shp_ruta)
Reading layer `MGN_ANM_MPIOS' from data source 
  `/Users/macbook/Library/CloudStorage/OneDrive-UniversidadNacionaldeColombia/1_Periodos_Asignaturas/Cursos_2025_2/Geomatica_Basica_20252/Practical/Interpolacion/R_Introduction_20252/datos/SHP_MGN2018_INTGRD_MPIO/MGN_ANM_MPIOS.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS

Notará que en la medida en que se crean variables, estás empiezan a aparecer en el panel Global Environment.

2.4. Leyendo datos espaciales y visualizando sus propiedades

La siguiente línea usa funcionalidades de la librería sf para leer el shapefile disponible en la ruta shp_ruta como un archivo espacial y lo almacena en la variable vector_municipios.

vector_municipios <- st_read(shp_ruta)
Reading layer `MGN_ANM_MPIOS' from data source 
  `/Users/macbook/Library/CloudStorage/OneDrive-UniversidadNacionaldeColombia/1_Periodos_Asignaturas/Cursos_2025_2/Geomatica_Basica_20252/Practical/Interpolacion/R_Introduction_20252/datos/SHP_MGN2018_INTGRD_MPIO/MGN_ANM_MPIOS.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS

La línea siguiente simplemente imprime la información de la variable vector_municipios en la consola. Como es un objeto espacial mostrará un resumen de ese objeto, así como todos los atributos y registros. ¿Qué información puede identificar ?.

vector_municipios
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS
First 10 features:
   DPTO_CCDGO MPIO_CCDGO             MPIO_CNMBR MPIO_CDPMP VERSION       AREA  LATITUD  LONGITUD STCTNENCUE STP3_1_SI
1          18        001              FLORENCIA      18001    2018 2547637532 1.749139 -75.55824      71877        32
2          18        029                ALBANIA      18029    2018  414122070 1.227865 -75.88233       2825        24
3          18        094 BELÉN DE LOS ANDAQUÍES      18094    2018 1191618572 1.500923 -75.87565       4243        54
4          18        247            EL DONCELLO      18247    2018 1106076151 1.791386 -75.19394       8809         0
5          18        256              EL PAUJÍL      18256    2018 1234734145 1.617746 -75.23404       5795         0
6          18        410           LA MONTAÑITA      18410    2018 1701061430 1.302860 -75.23573       5113        15
7          18        460                  MILÁN      18460    2018 1220575999 1.146693 -75.38665       3462       363
8          18        479                MORELIA      18479    2018  462479591 1.382996 -75.67381       1907         0
9          18        610    SAN JOSÉ DEL FRAGUA      18610    2018 1304769006 1.304702 -76.11001       5756        83
10         18        860             VALPARAÍSO      18860    2018 1330210015 1.061292 -75.62705       3958         0
   STP3_2_NO STP3A_RI STP3B_TCN STP4_1_SI STP4_2_NO STP9_1_USO STP9_2_USO STP9_3_USO STP9_4_USO STP9_2_1_M STP9_2_2_M
1      71845       32         0         0     71877      61176       2178       8436         87         39       1550
2       2801       24         0         0      2825       1826         49        948          2          3         34
3       4189       54         0         1      4242       3223        109        900         11          4         99
4       8809        0         0         0      8809       6598        357       1850          4         11        259
5       5795        0         0         0      5795       4891        204        695          5          4        161
6       5098       15         0         0      5113       4077        241        786          9          2        205
7       3099      363         0         0      3462       2594        118        745          5          1        104
8       1907        0         0         0      1907       1221         36        650          0          0         36
9       5673       83         0        27      5729       4493        302        955          6          1        273
10      3958        0         0         0      3958       2308         40       1602          8          0         29
   STP9_2_3_M STP9_2_4_M STP9_2_9_M STP9_3_1_N STP9_3_2_N STP9_3_3_N STP9_3_4_N STP9_3_5_N STP9_3_6_N STP9_3_7_N
1         566         18          5         54       2591       1061        535        368       3172        233
2          12          0          0          3         21         32        728         53         92          5
3           6          0          0          8         88          6          2         61        626          8
4          87          0          0         21        334        124        807         89        361         42
5          38          1          0          5        239        104          4         70        211         16
6          32          2          0          3        103        123         17         84        362         30
7          12          1          0          0         75         41         39         24        514          8
8           0          0          0          1         27         16        442         31        114          8
9          28          0          0          4        242         82          0        101        307         55
10         11          0          0          4         35         42        441         56        982         19
   STP9_3_8_N STP9_3_9_N STP9_3_10 STP9_3_99 STVIVIENDA STP14_1_TI STP14_2_TI STP14_3_TI STP14_4_TI STP14_5_TI STP14_6_TI
1           7         19       371        25      63354      47817      13764       1624         21          8        120
2           0          0        14         0       1875       1793         40         22         17          0          3
3           0          8        93         0       3332       3189        113         24          2          2          2
4           0         27        39         6       6955       6006        775        160          1          1         12
5           0          0        45         1       5095       4700        145        188          4          1         57
6           0          0        58         6       4318       3890        224        161          6          2         35
7           0          8        35         1       2712       2204         85         33        386          0          4
8           0          2         9         0       1257       1160         81         15          0          0          1
9           0          1       159         4       4795       4372        262        135          9          0         17
10          0          3        15         5       2348       2197         52         82          1          2         14
   STP15_1_OC STP15_2_OC STP15_3_OC STP15_4_OC TSP16_HOG STP19_EC_1 STP19_ES_2 STP19_EE_1 STP19_EE_2 STP19_EE_3
1       49809       2681       2150       8714     51430      48638       1171      34851      10343       2169
2        1409         13         55        398      1559       1300        109       1184        106          1
3        2883          2        107        340      3161       2595        288       2118        366         17
4        5767        304        388        496      6129       5375        392       3548        962        793
5        4568          5        323        199      5848       4195        373       3330        770         84
6        3553        151        308        306      3748       2159       1394       1964        144          9
7        1985          4        399        324      2182       1152        833       1098         31          0
8        1013          0         70        174      1233        923         90        719        187          9
9        3444          1        875        475      3873       2794        650       2486        283          7
10       1813          3        199        333      1881       1697        116       1624         68          2
   STP19_EE_4 STP19_EE_5 STP19_EE_6 STP19_EE_9 STP19_ACU1 STP19_ACU2 STP19_ALC1 STP19_ALC2 STP19_GAS1 STP19_GAS2
1         509         13          3        750      45179       4630      41138       8671      37028      12074
2           0          0          0          9        808        601        703        706         26       1371
3           2          1          0         91       2017        866       1806       1077         52       2796
4           1          1          1         69       4175       1592       4323       1444         57       5549
5           0          1          1          9       2505       2063       2359       2209       1463       3041
6           1          0          0         41       1441       2112       1329       2224         67       3454
7           1          0          1         21        359       1626        595       1390         20       1950
8           0          0          0          8        588        425        573        440         15        982
9           0          1          0         17       2576        868       2121       1323       1329       2078
10          0          0          0          3        775       1038        842        971         22       1772
   STP19_GAS9 STP19_REC1 STP19_REC2 STP19_INT1 STP19_INT2 STP19_INT9 STP27_PERS STPERSON_L STPERSON_S STP32_1_SE
1         707      45491       4318      13362      35727        720     156789       4315     152474      77620
2          12        727        682         27       1370         12       4514        151       4363       2323
3          35       1905        978         73       2775         35       9075        346       8729       4551
4         161       4348       1419        211       5395        161      17775        203      17572       8790
5          64       2414       2154        125       4379         64      13014        192      12822       6601
6          32       1273       2280         64       3457         32      12128        604      11524       6437
7          15        661       1324         39       1931         15       7507        527       6980       3953
8          16        588        425          6        991         16       3350          0       3350       1709
9          37       2559        885        131       3276         37      11364        399      10965       5812
10         19        816        997         48       1739         26       6082        404       5678       3204
   STP32_2_SE STP34_1_ED STP34_2_ED STP34_3_ED STP34_4_ED STP34_5_ED STP34_6_ED STP34_7_ED STP34_8_ED STP34_9_ED
1       79169      25503      30249      29951      23602      17235      14349       8969       4687       2244
2        2191        725       1016        717        568        536        445        253        162         92
3        4524       1592       2254       1388       1121        986        816        487        286        145
4        8985       3047       3811       2601       2302       2032       1792       1135        707        348
5        6413       2346       2882       2170       1587       1460       1188        703        430        248
6        5691       2229       3022       1836       1563       1441       1010        578        323        126
7        3554       1550       2018       1125        912        736        562        356        172         76
8        1641        562        678        570        428        431        304        212        114         51
9        5552       2129       2822       1757       1494       1267        933        542        275        145
10       2878       1013       1592        836        696        742        608        308        187        100
   STP51_PRIM STP51_SECU STP51_SUPE STP51_POST STP51_13_E STP51_99_E Shape_Leng Shape_Area                       geometry
1       48848      59610      21898       4592       5892       3799   2.942508 0.20692777 MULTIPOLYGON (((-75.42074 2...
2        1940       1712        231         41        215         46   1.112829 0.03361758 MULTIPOLYGON (((-75.89506 1...
3        3541       3340        490        119        720        123   2.234657 0.09674460 MULTIPOLYGON (((-75.78705 1...
4        7571       6287       1029        228       1095        171   3.154370 0.08986744 MULTIPOLYGON (((-75.36167 2...
5        6072       4066        639        108        916         99   3.529316 0.10030928 MULTIPOLYGON (((-75.36638 2...
6        5932       3870        407         94        724        182   3.402939 0.13817351 MULTIPOLYGON (((-75.40346 1...
7        3344       2669        239         38        465         86   1.863197 0.09912782 MULTIPOLYGON (((-75.39362 1...
8        1433       1194        215         16        181         32   1.518688 0.03755356 MULTIPOLYGON (((-75.77185 1...
9        4952       4155        516         87        579         94   2.040837 0.10589313 MULTIPOLYGON (((-76.16722 1...
10       2601       2292        241         31        368        108   2.313848 0.10800551 MULTIPOLYGON (((-75.73128 1...

A veces solo requerimos ver los primeros registros para conocer la estructura general de la tabla de atributos. Podemos limitar el número de registros que se muestran al llamar la variable vector_municipios incluyendo una línea de texto en la que especificamos cuántos registros queremos que se presenten.

# Establecer el número máximo de filas a imprimir
options(sf_max_print = 5)
vector_municipios
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS
First 5 features:
  DPTO_CCDGO MPIO_CCDGO             MPIO_CNMBR MPIO_CDPMP VERSION       AREA  LATITUD  LONGITUD STCTNENCUE STP3_1_SI
1         18        001              FLORENCIA      18001    2018 2547637532 1.749139 -75.55824      71877        32
2         18        029                ALBANIA      18029    2018  414122070 1.227865 -75.88233       2825        24
3         18        094 BELÉN DE LOS ANDAQUÍES      18094    2018 1191618572 1.500923 -75.87565       4243        54
4         18        247            EL DONCELLO      18247    2018 1106076151 1.791386 -75.19394       8809         0
5         18        256              EL PAUJÍL      18256    2018 1234734145 1.617746 -75.23404       5795         0
  STP3_2_NO STP3A_RI STP3B_TCN STP4_1_SI STP4_2_NO STP9_1_USO STP9_2_USO STP9_3_USO STP9_4_USO STP9_2_1_M STP9_2_2_M
1     71845       32         0         0     71877      61176       2178       8436         87         39       1550
2      2801       24         0         0      2825       1826         49        948          2          3         34
3      4189       54         0         1      4242       3223        109        900         11          4         99
4      8809        0         0         0      8809       6598        357       1850          4         11        259
5      5795        0         0         0      5795       4891        204        695          5          4        161
  STP9_2_3_M STP9_2_4_M STP9_2_9_M STP9_3_1_N STP9_3_2_N STP9_3_3_N STP9_3_4_N STP9_3_5_N STP9_3_6_N STP9_3_7_N
1        566         18          5         54       2591       1061        535        368       3172        233
2         12          0          0          3         21         32        728         53         92          5
3          6          0          0          8         88          6          2         61        626          8
4         87          0          0         21        334        124        807         89        361         42
5         38          1          0          5        239        104          4         70        211         16
  STP9_3_8_N STP9_3_9_N STP9_3_10 STP9_3_99 STVIVIENDA STP14_1_TI STP14_2_TI STP14_3_TI STP14_4_TI STP14_5_TI STP14_6_TI
1          7         19       371        25      63354      47817      13764       1624         21          8        120
2          0          0        14         0       1875       1793         40         22         17          0          3
3          0          8        93         0       3332       3189        113         24          2          2          2
4          0         27        39         6       6955       6006        775        160          1          1         12
5          0          0        45         1       5095       4700        145        188          4          1         57
  STP15_1_OC STP15_2_OC STP15_3_OC STP15_4_OC TSP16_HOG STP19_EC_1 STP19_ES_2 STP19_EE_1 STP19_EE_2 STP19_EE_3 STP19_EE_4
1      49809       2681       2150       8714     51430      48638       1171      34851      10343       2169        509
2       1409         13         55        398      1559       1300        109       1184        106          1          0
3       2883          2        107        340      3161       2595        288       2118        366         17          2
4       5767        304        388        496      6129       5375        392       3548        962        793          1
5       4568          5        323        199      5848       4195        373       3330        770         84          0
  STP19_EE_5 STP19_EE_6 STP19_EE_9 STP19_ACU1 STP19_ACU2 STP19_ALC1 STP19_ALC2 STP19_GAS1 STP19_GAS2 STP19_GAS9
1         13          3        750      45179       4630      41138       8671      37028      12074        707
2          0          0          9        808        601        703        706         26       1371         12
3          1          0         91       2017        866       1806       1077         52       2796         35
4          1          1         69       4175       1592       4323       1444         57       5549        161
5          1          1          9       2505       2063       2359       2209       1463       3041         64
  STP19_REC1 STP19_REC2 STP19_INT1 STP19_INT2 STP19_INT9 STP27_PERS STPERSON_L STPERSON_S STP32_1_SE STP32_2_SE
1      45491       4318      13362      35727        720     156789       4315     152474      77620      79169
2        727        682         27       1370         12       4514        151       4363       2323       2191
3       1905        978         73       2775         35       9075        346       8729       4551       4524
4       4348       1419        211       5395        161      17775        203      17572       8790       8985
5       2414       2154        125       4379         64      13014        192      12822       6601       6413
  STP34_1_ED STP34_2_ED STP34_3_ED STP34_4_ED STP34_5_ED STP34_6_ED STP34_7_ED STP34_8_ED STP34_9_ED STP51_PRIM
1      25503      30249      29951      23602      17235      14349       8969       4687       2244      48848
2        725       1016        717        568        536        445        253        162         92       1940
3       1592       2254       1388       1121        986        816        487        286        145       3541
4       3047       3811       2601       2302       2032       1792       1135        707        348       7571
5       2346       2882       2170       1587       1460       1188        703        430        248       6072
  STP51_SECU STP51_SUPE STP51_POST STP51_13_E STP51_99_E Shape_Leng Shape_Area                       geometry
1      59610      21898       4592       5892       3799   2.942508 0.20692777 MULTIPOLYGON (((-75.42074 2...
2       1712        231         41        215         46   1.112829 0.03361758 MULTIPOLYGON (((-75.89506 1...
3       3340        490        119        720        123   2.234657 0.09674460 MULTIPOLYGON (((-75.78705 1...
4       6287       1029        228       1095        171   3.154370 0.08986744 MULTIPOLYGON (((-75.36167 2...
5       4066        639        108        916         99   3.529316 0.10030928 MULTIPOLYGON (((-75.36638 2...

También podemos visualizar el listado de campos (atributos o columnas) a través de:

names(vector_municipios)
 [1] "DPTO_CCDGO" "MPIO_CCDGO" "MPIO_CNMBR" "MPIO_CDPMP" "VERSION"    "AREA"       "LATITUD"    "LONGITUD"   "STCTNENCUE"
[10] "STP3_1_SI"  "STP3_2_NO"  "STP3A_RI"   "STP3B_TCN"  "STP4_1_SI"  "STP4_2_NO"  "STP9_1_USO" "STP9_2_USO" "STP9_3_USO"
[19] "STP9_4_USO" "STP9_2_1_M" "STP9_2_2_M" "STP9_2_3_M" "STP9_2_4_M" "STP9_2_9_M" "STP9_3_1_N" "STP9_3_2_N" "STP9_3_3_N"
[28] "STP9_3_4_N" "STP9_3_5_N" "STP9_3_6_N" "STP9_3_7_N" "STP9_3_8_N" "STP9_3_9_N" "STP9_3_10"  "STP9_3_99"  "STVIVIENDA"
[37] "STP14_1_TI" "STP14_2_TI" "STP14_3_TI" "STP14_4_TI" "STP14_5_TI" "STP14_6_TI" "STP15_1_OC" "STP15_2_OC" "STP15_3_OC"
[46] "STP15_4_OC" "TSP16_HOG"  "STP19_EC_1" "STP19_ES_2" "STP19_EE_1" "STP19_EE_2" "STP19_EE_3" "STP19_EE_4" "STP19_EE_5"
[55] "STP19_EE_6" "STP19_EE_9" "STP19_ACU1" "STP19_ACU2" "STP19_ALC1" "STP19_ALC2" "STP19_GAS1" "STP19_GAS2" "STP19_GAS9"
[64] "STP19_REC1" "STP19_REC2" "STP19_INT1" "STP19_INT2" "STP19_INT9" "STP27_PERS" "STPERSON_L" "STPERSON_S" "STP32_1_SE"
[73] "STP32_2_SE" "STP34_1_ED" "STP34_2_ED" "STP34_3_ED" "STP34_4_ED" "STP34_5_ED" "STP34_6_ED" "STP34_7_ED" "STP34_8_ED"
[82] "STP34_9_ED" "STP51_PRIM" "STP51_SECU" "STP51_SUPE" "STP51_POST" "STP51_13_E" "STP51_99_E" "Shape_Leng" "Shape_Area"
[91] "geometry"  

2.5. Visualizar su primer mapa

La siguiente línea utiliza la función plot() para visualizar el objeto espacial almacenado en la variable vector_municipios.

El primer argumento es el objeto espacial que desea trazar, en este caso vector_municipios. El segundo argumento contiene el atributo (columna) “DPTO_CCDGO”.La función plot() utilizará los valores de esa columna para determinar cómo colorear las entidades en el mapa. Como “DPTO_CCDGO” es una columna que representa diferentes departamentos, cada departamento se coloreará de forma diferente según los valores de esta columna.

plot(vector_municipios)
Warning: plotting the first 10 out of 90 attributes; use max.plot = 90 to plot all

Si le resulta muy pesado cargar todo el mapa completo, pruebe con el archivo mun_santander_boyaca.shp

¿Qué diferencia evidencia en la siguiente salida con respecto a la anterior? ¿Qué cambió en el código?

plot(vector_municipios["DPTO_CCDGO"])

Ahora usted cree su propia visualización por municipios. Es decir use otra variable para representar.

#Escriba su código acá

2.6. Sistemas de Coordenadas y reproyecciones los datos

Verifique el sistema coordenado de la capa vector_municipios

st_crs(vector_municipios)

La salida se interpreta así:

PROJCRS[“MAGNA-SIRGAS 2018 / Origen-Nacional”]: Indica que está utilizando el sistema de referencia proyectado “MAGNA-SIRGAS 2018 / Origen-Nacional”.

BASEGEOGCRS[“MAGNA-SIRGAS 2018”]: Define el sistema de coordenadas geográficas subyacente llamado “MAGNA-SIRGAS 2018”.

DATUM[…]: Proporciona detalles sobre el datum que está siendo utilizado.

ELLIPOSOID[“GRS 1980”,…]: Detalles sobre el elipsoide utilizado.

CONVERSION[“Colombia Transverse Mercator”]: Detalles sobre cómo se convierten las coordenadas geográficas a coordenadas planas. Aquí se utiliza la proyección “Transverse Mercator”.

PARAMETER[…]: Estos son parámetros específicos de la proyección. Por ejemplo, “Latitude of natural origin” y “Longitude of natural origin” son las coordenadas en las que la proyección tiene cero distorsión. “False easting” y “False northing” son desplazamientos añadidos para evitar coordenadas negativas.

CS[Cartesian,2], AXIS[…], AXIS[…]: Indica que se trata de un sistema de coordenadas cartesianas bidimensional, con un eje norte y un eje este.

USAGE[…], AREA[…]: Proporciona detalles sobre el uso y la área de aplicabilidad del sistema de referencia.

ID[“EPSG”..]: Es un identificador único para este sistema de coordenadas. En este caso, el EPSG 9377 corresponde al sistema “MAGNA-SIRGAS 2018 / Origen-Nacional” que se utiliza en Colombia.

2.5.1.

Sistemas de Coordenadas y reproyecciones los datos #### La función st_transform hace parte del paquete sf y reproyecta las coordenadas de un conjunto de datos espaciales,

vector_municipios_reproject <- st_transform(vector_municipios, 9377)

Escriba la línea para revisar el sistema de coordenadas de su capa reproyectada

#Esto es importante para documentar el código
st_crs(vector_municipios_reproject)

2.7. Exportar datos almacenados en una variable a un archivo

Felicitaciones, usted ya ha reproyectado su conjunto de datos. Sin embargo, solo se encuentran almacenados en la memoria de R bajo el nombre de la variable vector_municipios_reproject. Si usted quiere guardar sus capa reproyectada en el almacenamiento de su computador requiere exportarlo aun archivo ( por ejemplo shapefile). Modifique el código ejemplo presentado y escriba una ruta válida para almacenar sus archivo shapfile. ¿A propósito, ya sabe en qué casos coloca ./ al inicio de su ruta?.

st_write(vector_municipios_reproject, "./mi_capa_reproyectada.shp")

2.8.Filtrando por atributos

Realice una selección del departamento con el codigo 18 unicamente (Pista DPTO_CCDGO == 18)

%>% es un operador del paquete dplyr. Toma el objeto o resultado de la izquierda y lo “pasa” como el primer argumento a la función de la derecha. Es una manera concisa y legible de encadenar operaciones en R.

La función filter() del paquete dplyr se utiliza para filtrar filas en un dataframe (tabla con encabezados) o, en este caso, en un objeto sf basado en una condición.

DPTO_CCDGO == 18 es la condición que se usa para filtrar. Esta condición seleccionará todas las filas donde el valor de la columna DPTO_CCDGO es igual a 18.

depto_18 <- vector_municipios_reproject %>% 
  filter( DPTO_CCDGO == 18)

Visualice el mapa de municipios de depto_18

#Escriba acá su código
plot(depto_18["MPIO_CNMBR"])

Ahora guarde en un archivo shapefile en su computador el contenido de depto_18

#Escriba acá su código

2.8. Revise sus resultados en QGIS

Abra en QGIS su capa original de municipios y su capa reproyectada. Haga lo mismo con la capa del municipio 18. Verifique los sistemas de referencia de cada capa. Son diferentes los sistemas de referencia? Cuál procedimiento le resulta más interesante para reproyectar datos espaciales QGIS o líneas de código en R?

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLgpXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4KCiMgKioxLiBJbnRyb2R1Y2Npw7NuKioKCiMjICoqMS4xLiBJbnRyb2R1Y2Npw7NuIGEgUioqCgpSIGVzIHVuIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24geSB1biBlbnRvcm5vIGRlIHNvZnR3YXJlIGxpYnJlIHV0aWxpemFkbyBwcmluY2lwYWxtZW50ZSBwYXJhIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28geSBncsOhZmljb3MuCk5hY2nDsyBjb21vIHVuYSBpbXBsZW1lbnRhY2nDs24gZGVsIGxlbmd1YWplIFMsIGRlc2Fycm9sbGFkbyBlbiBsb3MgbGFib3JhdG9yaW9zIEJlbGwuCkEgbG8gbGFyZ28gZGVsIHRpZW1wbywgUiBoYSBldm9sdWNpb25hZG8gcGFyYSBjb252ZXJ0aXJzZSBlbiB1bmEgaGVycmFtaWVudGEgaW5kaXNwZW5zYWJsZSBwYXJhIGxhIGNpZW5jaWEgZGUgZGF0b3MsIGxhIGJpb2luZm9ybcOhdGljYSwgbGEgaW52ZXN0aWdhY2nDs24gYWNhZMOpbWljYSB5IG3DoXMuCgojIyAqKjEuMi4gSW50cm9kdWNjacOzbiBhIFJTdHVkaW8qKgoKUlN0dWRpbyBlcyB1biBlbnRvcm5vIGRlIGRlc2Fycm9sbG8gaW50ZWdyYWRvIChJREUpIHBhcmEgUi4KUHJvcG9yY2lvbmEgdW5hIGNvbnNvbGEsIHVuIGVkaXRvciBkZSBzY3JpcHRzIHF1ZSBzb3BvcnRhIGxhIGVqZWN1Y2nDs24gZGlyZWN0YSBkZSBjw7NkaWdvLCBhc8OtIGNvbW8gaGVycmFtaWVudGFzIHBhcmEgbGEgdmlzdWFsaXphY2nDs24gZGUgZGF0b3MgeSBsYSBnZXN0acOzbiBkZWwgZXNwYWNpbyBkZSB0cmFiYWpvLgpSU3R1ZGlvIGhhIGZhY2lsaXRhZG8gZWwgdXNvIGRlIFIgYWwgb2ZyZWNlciB1bmEgaW50ZXJmYXogbcOhcyBhbWlnYWJsZSB5IGhlcnJhbWllbnRhcyDDunRpbGVzIHBhcmEgZWwgYW7DoWxpc2lzLgoKIyMjICoqMS4yLjEuIEludGVyZmF6IGRlIFJTdHVkaW8qKgoKIVtJbnRlcmZheiBSU3R1ZGlvLl0oLi9pbWFnZW5lcy9pbnRlcmZhei5wbmcpIEVuIGxhICoqY29uc29sYSoqIHNlIGVqZWN1dGEgZWwgY8OzZGlnbyBSIGVuIHRpZW1wbyByZWFsLgpMb3MgdXN1YXJpb3MgcHVlZGVuIGluZ3Jlc2FyIGNvbWFuZG9zIGRpcmVjdGFtZW50ZSB5IHZlciBsb3MgcmVzdWx0YWRvcyBhbCBpbnN0YW50ZS4KCioqRWRpdG9yIGRlIHNjcmlwdHM6KiogRWwgZWRpdG9yIGRlIGPDs2RpZ28gcGVybWl0ZSBlc2NyaWJpciB5IGVkaXRhciBzY3JpcHRzIGVuIFIuClJlc2FsdGEgbGEgc2ludGF4aXMgZGVsIGPDs2RpZ28uClByb3BvcmNpb25hIHN1Z2VyZW5jaWFzIGRlIGPDs2RpZ28geSBhdXRvY29tcGxldGFkby4KVGllbmUgYm90b25lcyBwYXJhIGVqZWN1dGFyIGzDrW5lYXMgbyBibG9xdWVzIGRlIGPDs2RpZ28gZXNwZWPDrWZpY29zLgpFcyBqdXN0byBkb25kZSBlc3RveSBlc2NyaWJpZW5kbyBlc3RlIHNjcmlwdC4KCioqRW52aXJvbm1lbnQ6KiogRWwgRW50b3JubyBvIEVudmlyb25tZW50IG11ZXN0cmEgbG9zIG9iamV0b3MgKHZlY3RvcmVzLCBtYXRyaWNlcywgZGF0YSBmcmFtZXMsIGV0Yy4pIHF1ZSBlc3TDoW4gZW4gZWwgZW50b3JubyBnbG9iYWwuCk9mcmVjZSBsYSBvcGNpw7NuIGRlIGltcG9ydGFyIGNvbmp1bnRvcyBkZSBkYXRvcy4KRWwgImVudG9ybm8gZ2xvYmFsIiBzZSByZWZpZXJlIGFsIGVzcGFjaW8gZGUgdHJhYmFqbyBkZSBuaXZlbCBzdXBlcmlvciBkb25kZSBsYXMgdmFyaWFibGVzLCBmdW5jaW9uZXMgeSBvdHJvcyBvYmpldG9zIHF1ZSBjcmVhcyBzZSBhbG1hY2VuYW4gZGUgbWFuZXJhIHByZWRldGVybWluYWRhIGR1cmFudGUgdW5hIHNlc2nDs24gaW50ZXJhY3RpdmEuCkVzIGVsIGx1Z2FyIGRvbmRlIHNlIGd1YXJkYW4geSBzZSBwdWVkZW4gYWNjZWRlciBhIGxhcyB2YXJpYWJsZXMgcXVlIGRlZmluZXMgeSBhIGxvcyBkYXRvcyBxdWUgY2FyZ2FzLCBhIG1lbm9zIHF1ZSBzZSBlc3BlY2lmaXF1ZSBvIHV0aWxpYyB1biBlbnRvcm5vIGRpZmVyZW50ZS4KCioqSGlzdG9yaWFsOioqIE11ZXN0cmEgdW4gcmVnaXN0cm8gZGUgbG9zIGNvbWFuZG9zIHByZXZpYW1lbnRlIGVqZWN1dGFkb3MgZW4gbGEgY29uc29sYS4KCioqQXJjaGl2b3M6KiogUHJvcG9yY2lvbmEgdW5hIHZpc3RhIGRlbCBzaXN0ZW1hIGRlIGFyY2hpdm9zLCBsbyBxdWUgcGVybWl0ZSBuYXZlZ2FyLCBhYnJpciwgeSBnZXN0aW9uYXIgYXJjaGl2b3MgeSBkaXJlY3Rvcmlvcy4KCioqUGxvdHM6KiogTXVlc3RyYSBncsOhZmljb3MgZ2VuZXJhZG9zIHBvciBlbCBjw7NkaWdvIFIuClBlcm1pdGUgbmF2ZWdhciBlbnRyZSB2YXJpb3MgZ3LDoWZpY29zIHkgZXhwb3J0YXJsb3MgZW4gZGl2ZXJzb3MgZm9ybWF0b3MuCgoqKlBhcXVldGVzOioqIEVudW1lcmEgdG9kb3MgbG9zIHBhcXVldGVzIFIgaW5zdGFsYWRvcy4KUGVybWl0ZSBpbnN0YWxhciwgYWN0dWFsaXphciBvIGNhcmdhci9kZXNjYXJnYXIgcGFxdWV0ZXMgY29uIGZhY2lsaWRhZC4KCioqQXl1ZGE6KiogUHJvcG9yY2lvbmEgYWNjZXNvIGEgbGEgZG9jdW1lbnRhY2nDs24gZGUgZnVuY2lvbmVzIHkgcGFxdWV0ZXMgZGUgUi4KUGVybWl0ZSBidXNjYXIgeSBjb25zdWx0YXIgbGEgZG9jdW1lbnRhY2nDs24gZGUgZnVuY2lvbmVzIGVzcGVjw61maWNhcy4KCioqVmlzb3I6KiogU2UgdXRpbGl6YSBwYXJhIHZpc3VhbGl6YXIgY29udGVuaWRvcyB3ZWIsIGNvbW8gbWFwYXMgaW50ZXJhY3Rpdm9zIG8gZG9jdW1lbnRvcyBSIE1hcmtkb3duIHJlbmRlcml6YWRvcy4KCiMjIDEuMy4gUHJveWVjdG9zIHkgQXJjaGl2b3MsIE5vdGVib29rcyB5IERvY3VtZW50b3MgUiBNYXJrZG93bgoKRW4gUlN0dWRpbyBzZSBwdWVkZW4gY3JlYXIgYXJjaGl2b3MgbyBwcm95ZWN0b3MuCkxhIGRpZmVyZW5jaWEgZW50cmUgdW4gYXJjaGl2byB5IHVuIHByb3llY3RvIGVzIGltcG9ydGFudGUgeSB0aWVuZSBxdWUgdmVyIGNvbiBsYSBvcmdhbml6YWNpw7NuLCBnZXN0acOzbiB5IHJlcHJvZHVjaWJpbGlkYWQgZGUgdHUgdHJhYmFqby4KCiMjIyAxLjMuMS4gQXJjaGl2b3MKCi1VbiBhcmNoaXZvIGVuIFIgc3VlbGUgdGVuZXIgdW5hIGV4dGVuc2nDs24gLlIgbyAuUm1kIChwYXJhIFIgTWFya2Rvd24pLgpDb250aWVuZSBjw7NkaWdvIFIsIGNvbWVudGFyaW9zIHksIGVuIGVsIGNhc28gZGUgUiBNYXJrZG93biwgdGFtYmnDqW4gcHVlZGUgY29udGVuZXIgdGV4dG8gZW5yaXF1ZWNpZG8sIGVjdWFjaW9uZXMsIGV0Yy4gLVNlIHV0aWxpemEgcGFyYSBlc2NyaWJpciwgZ3VhcmRhciB5IGVqZWN1dGFyIGPDs2RpZ28gUi4KCi1VbiBhcmNoaXZvIGVzIHVuYSBlbnRpZGFkIGluZGVwZW5kaWVudGUuClB1ZWRlIG1vdmVyc2UsIGNvbXBhcnRpcnNlIG8gZWplY3V0YXJzZSBzaW4gbmVjZXNpZGFkIGRlIG90cm9zIGFyY2hpdm9zLCBhIG1lbm9zIHF1ZSBleHBsw61jaXRhbWVudGUgZGVwZW5kYSBkZSBvdHJvcyAocG9yIGVqZW1wbG8sIHNpIGNhcmdhIGRhdG9zIGRlIG90cm8gYXJjaGl2bykuCgpDb24gUlN0dWRpbyBzZSBwdWVkZW4gY3JlYXIgZGlmZXJlbnRlcyB0aXBvcyBkZSBhcmNoaXZvcy4KVmFtb3MgYSBtZW5jaW9uYXIgMyBxdWUgc29uIG11eSBjb211bmVzLgoKIyMjIyAxLjMuMS4xLiBTY3JpcHQgZGUgUiAoXCouUikKCkFyY2hpdm9zIGRlIGPDs2RpZ28gcXVlIGNvbnRpZW5lbiBzZWN1ZW5jaWFzIGRlIGNvbWFuZG9zIHkgZnVuY2lvbmVzIGVuIFIuCgojIyMjIyAxLjMuMS4yLiBSIE1hcmtkb3duIChcKi5SbWQpCgpEb2N1bWVudG9zIHF1ZSBpbnRlZ3JhbiBjw7NkaWdvIFIgY29uIHRleHRvIG5hcnJhdGl2bywgcGVybWl0aWVuZG8gbGEgY3JlYWNpw7NuIGRlIGluZm9ybWVzLCBwcmVzZW50YWNpb25lcyB5IG90cm9zIGRvY3VtZW50b3MgcXVlIHB1ZWRlbiBzZXIgcmVuZGVyaXphZG9zIGVuIGRpdmVyc29zIGZvcm1hdG9zIGNvbW8gSFRNTCwgUERGIHkgV29yZC5TaSBiaWVuIGxvcyBub3RlYm9va3MgZ2VuZXJhbG1lbnRlIHNlIHZpc3VhbGl6YW4gbWVqb3IgY29tbyBkb2N1bWVudG9zIEhUTUwsIGNvbiBSIE1hcmtkb3duIHB1ZWRlcyBmw6FjaWxtZW50ZSByZW5kZXJpemFyIGEgbcO6bHRpcGxlcyBmb3JtYXRvcywgaW5jbHVpZG9zIFBERiwgV29yZCBvIHByZXNlbnRhY2lvbmVzLgpGbHVqbyBkZSBUcmFiYWpvIExpbmVhbDogRW4gdW4gZG9jdW1lbnRvIFIgTWFya2Rvd24gdHJhZGljaW9uYWwsIG5vcm1hbG1lbnRlIHRyYWJhamEgZW4gZWwgY8OzZGlnbyB5IGVsIGNvbnRlbmlkbywgeSBsdWVnbyByZW5kZXJpemEgdG9kbyBlbCBkb2N1bWVudG8gZGUgdW5hIHZleiBwYXJhIHZlciBsb3MgcmVzdWx0YWRvcy4KRXN0byBlcyDDunRpbCBjdWFuZG8geWEgdGllbmUgdW4gYW7DoWxpc2lzIGVzdGFibGVjaWRvIHF1ZSBkZXNlYSBlamVjdXRhciBkZSBwcmluY2lwaW8gYSBmaW4uClNlIHVzYW4gc2kgc2UgcmVxdWllcmUgZ2VuZXJhciBpbmZvcm1lcyBxdWUgZG9jdW1lbnRlbiBlbCBjw7NkaWdvLgoKIyMjIyMgMS4zLjEuMy5SIE5vdGVib29rIChmb3JtYXRvIC5SbWQpCgpVbmEgdmFyaWFudGUgZGUgUiBNYXJrZG93biBkb25kZSBwdWVkZSBlamVjdXRhciB5IHZlciByZXN1bHRhZG9zIGVuIGzDrW5lYS4KUGVybWl0ZW4gZWplY3V0YXIgYmxvcXVlcyBkZSBjw7NkaWdvIGluZGl2aWR1YWxtZW50ZSBlIGlubWVkaWF0YW1lbnRlIHZlciBsb3MgcmVzdWx0YWRvcyBkZWJham8gZGUgZXNlIGJsb3F1ZSwgc2ltaWxhciBhIGPDs21vIGZ1bmNpb25hbiBsb3MgSnVweXRlciBOb3RlYm9va3MgZW4gUHl0aG9uLgpFcyDDunRpbCBwYXJhIHVuIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8gZG9uZGUgZGVzZWEgaXRlcmFyIHLDoXBpZGFtZW50ZSB5IHZlciBsb3MgcmVzdWx0YWRvcyBhbCBpbnN0YW50ZS4KRXMgZGVjaXIgcXVlIHB1ZWRlIHZlciBlbCBjw7NkaWdvLCBsb3MgcmVzdWx0YWRvcyB5IGVsIHRleHRvIGVuIHVuIGZvcm1hdG8gY2FzaSBmaW5hbCBtaWVudHJhcyB0cmFiYWphLCBwb3IgbG8gcXVlIHJlc3VsdGEgw7p0aWwgcGFyYSBjb25zdHJ1aXIgeSByZWZpbmFyIGFuw6FsaXNpcyB5IGRvY3VtZW50YXJsb3Mgc2ltdWx0w6FuZWFtZW50ZSAqKsKhRXN0byBlcyB1biBub3RlYm9vayEqKgoKQW1iYXMgb3BjaW9uZXMsIE5vdGVib29rIHkgUiBNYXJrZG93biwgdGllbmVuIHN1cyBmb3J0YWxlemFzIHkgc29uIGFkZWN1YWRhcyBwYXJhIGRpZmVyZW50ZXMgZXNjZW5hcmlvcy4KU2kgZXN0w6EgZW4gdW5hIGZhc2UgZXhwbG9yYXRvcmlhLCBpdGVyYXRpdmEgeSBkZXNlYXMgdmVyIHJlc3VsdGFkb3MgYWwgaW5zdGFudGUsIHVuIG5vdGVib29rIHB1ZWRlIHNlciBsYSBtZWpvciBvcGNpw7NuLgpTaSBlc3TDoSB0cmFiYWphbmRvIGVuIHVuIGluZm9ybWUsIGFydMOtY3VsbyBvIGFuw6FsaXNpcyBtw6FzIGVzdHJ1Y3R1cmFkbyB5IGZvcm1hbCBxdWUgcmVxdWllcmUgdW4gZmx1am8gZGVBbWJhcyBvcGNpb25lcywgTm90ZWJvb2sgeSBSIE1hcmtkb3duLCB0aWVuZW4gc3VzIGZvcnRhbGV6YXMgeSBzb24gYWRlY3VhZGFzIHBhcmEgZGlmZXJlbnRlcyBlc2NlbmFyaW9zLgpTaSBlc3TDoSBlbiB1bmEgZmFzZSBleHBsb3JhdG9yaWEsIGl0ZXJhdGl2YSB5IGRlc2VhIHZlciByZXN1bHRhZG9zIGFsIGluc3RhbnRlLCB1biBub3RlYm9vayBwdWVkZSBzZXIgbGEgbWVqb3Igb3BjacOzbi4KU2kgZXN0w6EgdHJhYmFqYW5kbyBlbiB1biBpbmZvcm1lLCBhcnTDrWN1bG8gbyBhbsOhbGlzaXMgbcOhcyBlc3RydWN0dXJhZG8geSBmb3JtYWwgcXVlIHJlcXVpZXJlIHVuIGZsdWpvIGRlIHRyYWJham8gbcOhcyBsaW5lYWwgeSBvcGNpZGNvbmVzIGRlIHNhbGlkYSBkaXZlcnNpZmljYWRhcywgdW4gZG9jdW1lbnRvIFIgTWFya2Rvd24gcG9kcsOtYSBzZXIgbcOhcyBhZGVjdWFkby4KRW4gY3VhbHF1aWVyIGNhc28sIHJlY3VlcmRlIHF1ZSBwdWVkZXMgY2FtYmlhciBlbnRyZSBsYXMgZXhwZXJpZW5jaWFzIGRlIE5vdGVib29rIHkgRG9jdW1lbnRvIGVuIFJTdHVkaW8gY29uIGZhY2lsaWRhZCwgcG9yIGxvIHF1ZSBubyBlc3TDoSBlc3RyaWN0YW1lbnRlIGxpbWl0YWRvIGEgdW5hIGVsZWNjacOzbiB1IG90cmEuCgojIyMgKioxLjMuMi4gUHJveWVjdG9zKioKCi1VbiBwcm95ZWN0byBlbiBSU3R1ZGlvIG5vIGVzIHNvbG8gdW4gYXJjaGl2bywgc2lubyB1biBlbnRvcm5vIGRlIHRyYWJham8gY29tcGxldG8uCkN1YW5kbyBjcmVhIHVuIHByb3llY3RvLCBSU3R1ZGlvIGdlbmVyYSB1biBhcmNoaXZvIGNvbiBleHRlbnNpw7NuIC5ScHJvaiBxdWUgZ3VhcmRhIGxhcyBjb25maWd1cmFjaW9uZXMgeSBlbCBlc3RhZG8gZGVsIHByb3llY3RvLgoKLUxvcyBwcm95ZWN0b3Mgc2UgdXRpbGl6YW4gcGFyYSBvcmdhbml6YXIgY29uanVudG9zIHJlbGFjaW9uYWRvcyBkZSBhcmNoaXZvcyB5IGRhdG9zLgpGYWNpbGl0YW4gbGEgZ2VzdGnDs24gZGUgZGlyZWN0b3Jpb3MgZGUgdHJhYmFqbywgcnV0YXMgcmVsYXRpdmFzIHkgb3RyYXMgY29uZmlndXJhY2lvbmVzIGVzcGVjw61maWNhcyBkZWwgcHJveWVjdG8uCgotRW50b3JubyBkZSB0cmFiYWpvOiBDdWFuZG8gYWJyZSB1biBwcm95ZWN0bywgUlN0dWRpbyBhdXRvbcOhdGljYW1lbnRlIGNvbmZpZ3VyYSBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gZW4gbGEgdWJpY2FjacOzbiBkZWwgcHJveWVjdG8uCkVzdG8gZXMgw7p0aWwgcGFyYSBnYXJhbnRpemFyIHF1ZSBlbCBjw7NkaWdvIHNlYSByZXByb2R1Y2libGUsIHlhIHF1ZSBwdWVkZSB1c2FyIHJ1dGFzIHJlbGF0aXZhcyBlbiBsdWdhciBkZSBydXRhcyBhYnNvbHV0YXMuCgotTG9zIHByb3llY3RvcyBkZSBSU3R1ZGlvIHNlIGludGVncmFuIGJpZW4gY29uIHNpc3RlbWFzIGRlIGNvbnRyb2wgZGUgdmVyc2lvbmVzIGNvbW8gR2l0LCBmYWNpbGl0YW5kbyBsYSBnZXN0acOzbiBkZSB2ZXJzaW9uZXMgeSBjb2xhYm9yYWNpw7NuLgoKLUFsIHRyYWJhamFyIGVuIHVuIHByb3llY3RvIG3DoXMgZ3JhbmRlLCBlcyBwb3NpYmxlIHF1ZSB0ZW5nYXMgbcO6bHRpcGxlcyBzY3JpcHRzLCBjb25qdW50b3MgZGUgZGF0b3MgeSBvdHJvcyBhcmNoaXZvcyByZWxhY2lvbmFkb3MuCkxvcyBwcm95ZWN0b3MgdGUgYXl1ZGFuIGEgbWFudGVuZXIgdG9kbyBvcmdhbml6YWRvIGVuIHVuIHNvbG8gbHVnYXIuCgotVW4gcHJveWVjdG8gcHVlZGUgdGVuZXIgY29uZmlndXJhY2lvbmVzIGVzcGVjw61maWNhcywgY29tbyBvcGNpb25lcyBkZSBjb2RpZmljYWNpw7NuLCBxdWUgbm8gYWZlY3RhbiBhIG90cm9zIHByb3llY3RvcyBvIHNjcmlwdHMgZnVlcmEgZGVsIHByb3llY3RvLgoKKipFbiByZXN1bWVuLCBtaWVudHJhcyBxdWUgdW4gYXJjaGl2byBlbiBSIGVzIHNpbXBsZW1lbnRlIHVuIGRvY3VtZW50byBxdWUgY29udGllbmUgY8OzZGlnbyBSLCB1biBwcm95ZWN0byBlbiBSU3R1ZGlvIGVzIHVuIGVudG9ybm8gZGUgdHJhYmFqbyBvcmdhbml6YXRpdm8gcXVlIGZhY2lsaXRhIGxhIGdlc3Rpw7NuIHkgcmVwcm9kdWNpYmlsaWRhZCBkZSB0cmFiYWpvcyBtw6FzIGNvbXBsZWpvcyB5IG11bHRpZmFjw6l0aWNvcy4gRXMgZXNwZWNpYWxtZW50ZSDDunRpbCBjdWFuZG8gZXN0w6EgdHJhYmFqYW5kbyBlbiBhbsOhbGlzaXMgbcOhcyBncmFuZGVzIG8gY29sYWJvcmF0aXZvcy4qKgoKIyAqKjIuIFByaW1lcm9zIHBhc29zIGVuIFIqKgoKIyMgMi4xLkluc3RhbGFyIFBhcXVldGVzIG8gTGlicmVyw61hcwoKRUVuIFIsIGxhcyBmdW5jaW9uYWxpZGFkZXMgc2UgYW1wbMOtYW4gbWVkaWFudGUgcGFxdWV0ZXMgbyBsaWJyZXLDrWFzLiAKQWxndW5vcyBwYXF1ZXRlcyBhY3R1YWxlcyBwYXJhIGVsIG1hbmVqbyBkZSBkYXRvcyBlc3BhY2lhbGVzIGluY2x1eWVuOgoKLSAqKnNmKio6IG1hbmVqbyB5IGFuw6FsaXNpcyBkZSBkYXRvcyBlc3BhY2lhbGVzIHZlY3RvcmlhbGVzIG1lZGlhbnRlIGVsIGVzdMOhbmRhciBkZSAqc2ltcGxlIGZlYXR1cmVzKi4KLSAqKnRlcnJhKio6IG1hbmVqbyB5IGFuw6FsaXNpcyBlZmljaWVudGUgZGUgZGF0b3MgcmFzdGVyIHkgdmVjdG9yaWFsZXMuCgpIaXN0w7NyaWNhbWVudGUgc2UgdXRpbGl6YXJvbiBwYXF1ZXRlcyBjb21vICoqc3AqKiwgKipyYXN0ZXIqKiB5ICoqcmdkYWwqKiwgcGVybyBncmFuIHBhcnRlIGRlIHN1IGZ1bmNpb25hbGlkYWQgaGEgc2lkbyByZWVtcGxhemFkYSBwb3IgKipzZioqIHkgKip0ZXJyYSoqLCBxdWUgc29uIGxvcyBwYXF1ZXRlcyByZWNvbWVuZGFkb3MgcGFyYSBwcm95ZWN0b3MgbnVldm9zLgoKIE9ic2VydmFyw6EgcXVlIGN1YW5kbyB0cmFiYWphbW9zIGVuIHVuIG5vdGVib29rLCBlbCBjw7NkaWdvIHF1ZSBzZSBwdWVkZSBlamVjdXRhciBzZSBlc2NyaWJlIGFzw60gXCpcKiBge3J9IGPDs2RpZ29gXCpcKi4gUHVlZGUgZWplY3V0YXJsbyBoYWNpZW5kbyBjbGljayBzb2JyZSBlbCBzw61tYm9sbyBkZSBwbGF5LgotICAgU2kgbGEgdmVyc2nDs24gZGUgUiBjb24gbGEgcXVlIHRyYWJhamEgZXMgYW50aWd1YSwgcHVlZGUgcXVlIHNlIGdlbmVyZW4gZXJyb3JlcyB5IHJlcXVpZXJhIGRlc2NhcmdhciB1biBwYXF1ZXRlIGRlIGhlcnJhbWllbnRhcyBwYXJhIGxhIHZlcnNpw7NuIGRlIFIgY29uIGxhIHF1ZSB0cmFiYWphbi4gUHVlZGUgZGVzY2FyZ2FyIGVzdGEgw7psdGltYSB2ZXJzacOzbiBlbiA8aHR0cHM6Ly9jcmFuLnJzdHVkaW8uY29tL2Jpbi93aW5kb3dzL1J0b29scy8+LgoKYGBge3J9CgojIEVqZWN1dGUgZXN0ZSBjaHVuayB1bmEgc29sYSB2ZXogCnBrZ3MgPC0gYygic2YiLCAidGVycmEiLCAiZHBseXIiLCAiZ2dwbG90MiIsICJyZWFkciIpCgojIElkZW50aWZpY2EgY3XDoWxlcyBkZSBlc3RvcyBwYXF1ZXRlcyBOTyBlc3TDoW4gaW5zdGFsYWRvcwp0b19pbnN0YWxsIDwtIHNldGRpZmYocGtncywgcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpKQoKIyBTaSBmYWx0YSBhbGd1bm8sIGxvIGluc3RhbGEgZGVzZGUgQ1JBTiAoanVudG8gY29uIHN1cyBkZXBlbmRlbmNpYXMpCmlmIChsZW5ndGgodG9faW5zdGFsbCkpIGluc3RhbGwucGFja2FnZXModG9faW5zdGFsbCwgZGVwZW5kZW5jaWVzID0gVFJVRSkKCmBgYAoKW09qbywgc29sbyBwdWVkZSBlamVjdXRhciBsb3MgY8OzZGlnb3MgZGVzZGUgZWwgZWRpdG9yIGRlIGPDs2RpZ28gZGUgUlN0dWRpbywgbm8gZGVzZGUgbGEgdmlzdWFsaXphY2nDs24gKHJlbmRlcml6YWNpw7NuKSBlbiBodG1sLl17c3R5bGU9ImNvbG9yOmJsdWUifQoKXAoKIVtBc8OtIHNlIHZlIHVuIGJsb3F1ZSBkZSBjw7NkaWdvIGVuIGVsIGVkaXRvciBkZSBjw7NkaWdvIGRlIFJzdHVkaW9dKC4vaW1hZ2VuZXMvY29kaWdvLnBuZylcClvCv0EgcHJvcMOzc2l0bywgeWEgc2FiZSBjw7NtbyBhZ3JlZ2FyIHVuYSBpbWFnZW4gYSBzdSBub3RlYm9vaz8uXXtzdHlsZT0iY29sb3I6cmVkIn0gW8K/WWEgaWRlbnRpZmljw7MgY8OzbW8gYWdyZWdhciBjb2xvciBhbCB0ZXh0byBxdWUgdXNlIHBhcmEgZG9jdW1lbnRhciBzdSBjw7NkaWdvP117c3R5bGU9ImNvbG9yOnJlZCJ9LlwKQWhvcmEgY2FyZ2FyZW1vcyBsYXMgbGlicmVyw61hcy4KTm8gZXMgc3VmaWNpZW50ZSBpbnN0YWxhcmxhcywgdGVuZW1vcyBxdWUgZGVjaXIgZXhwbMOtY2l0YW1lbnRlIHF1ZSB2YW1vcyBhIHRyYWVybGFzIGEgbnVlc3RybyBjw7NkaWdvLgoKRWwgcGFxdWV0ZSBzZiAoc2ltcGxlIGZlYXR1cmVzKSBvZnJlY2UgdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBmdW5jaW9uYWxpZGFkZXMgcGFyYSB0cmFiYWphciBjb24gZGF0b3MgZXNwYWNpYWxlcyB0aXBvIHZlY3RvciBjb21vIHJlcHJlc2VudGFjacOzbiBkZSBkYXRvcyBlc3BhY2lhbGVzLCBsZWVyZSB5IGVzY3JpYmlyIGVuIHZhcmllZGFkIGRlIGZvcm1hdG9zIChlai4gc2hwLCBHZW9KU09OLCBLTUwsIGVudHJlIG90cm9zKSwgaW50ZWdyYWNpw7NuIGNvbiBsaWJyZXLDrWFzIGNvbW8gR0RBTCBxdWUgcGVybWl0ZSBnZXN0aW9uYXIgZGF0b3MgZ2VvZXNwYWNpYWxlOyBtYW5pcHVsYXIgZ2VvbWV0csOtYXMgcGFyYSBjYWxjdWxhciDDoXJlYSwgbG9uZ2l0dWRlcywgZXRjOyByZWFsaXphciBvcGVyYWNpb25lcyB0b3BvbMOzZ2ljYXMsIG1hbmlwdWxhY2nDs24gZGUgc2lzdGVtYXMgZGUgY29vcmRlbmFkYXM7IGludGVncmFjacOzbiBjb24gb3Ryb3MgcGFxdWV0ZXMgZGUgUjsgcmVhbGl6YXIgb3BlcmFjaW9uZXMgZGUgZ2VvcHJvY2VzYW1pZW50byBjb21vIGJ1ZmZlciwgY2xpcCwgZW50cmUgb3RyYXM7IGFzw60gY29tbyBtYW5pcHVsYWNpw7NuIGRlIGF0cmlidXRvcyAoYWdyZWdhciwgZWxpbWluYXIsIG1vZGlmaWNhci4KClJlcHJlc2VudGFjacOzbiBkZSBEYXRvcyBFc3BhY2lhbGVzOgoKYGBge3J9CmxpYnJhcnkoc2YpCmxpYnJhcnkoZHBseXIpCmBgYAoKIyMgMi4yLiBJZGVudGlmaWNhciBkaXJlY3RvcmlvIGRlIHRyYWJham8KClByaW1lcm8gcmV2aXNlIGN1w6FsIGVzIGxhIHViaWNhY2nDs24gZGUgcyBkaXJlY3RvcmlvIGRlIHRyYWJham8gYWN0dWFsIHVzYW5kbyBnZXR3ZC4KCmBgYHtyfQpnZXR3ZCgpCmBgYAoKIyMgMi4zLiBWYXJpYWJsZXMKCkVuIHByb2dyYW1hY2nDs24sIGEgbWVudWRvIHNlIHJlcXVpZXJlIGFsbWFjZW5hciBpbmZvcm1hY2nDs24gcGFyYSB1c2FybGEgbcOhcyBhZGVsYW50ZS4KQXF1w60gZXMgZG9uZGUgZW50cmFuIGxhcyB2YXJpYWJsZXMuClVuYSB2YXJpYWJsZSBwdWVkZSBzZXIgaW1hZ2luYWRhIGNvbW8gdW5hIGNhamEgZW4gbGEgcXVlIHNlIGd1YXJkYSBhbGd1bmEgaW5mb3JtYWNpw7NuLgpFc3RhICJjYWphIiB0aWVuZSB1biBub21icmUsIHkgc2llbXByZSBxdWUgcXVpZXJhIGFjY2VkZXIgYSBsYSBpbmZvcm1hY2nDs24sIHNpbXBsZW1lbnRlIHVzYSBlbCBub21icmUgZGUgbGEgdmFyaWFibGUuCkVuIFIsIHNlIHVzYSBlbCBzw61tYm9sbyBcPC0gcGFyYSBhc2lnbmFyIHVuIHZhbG9yIGEgdW5hIHZhcmlhYmxlLgpMbyBwcmltZXJvIHF1ZSB2YW1vcyBhIGhhY2VyIGVzIGluc3RhbGFyIGxhcyBsaWJyZXLDrWFzIG8gcGFxdWV0ZXMgY29uIGxvcyBxdWUgcG9kcmVtb3MgcmVhbGl6YXIgbGFzIG9wZXJhY2lvbmVzIHkgYW7DoWxpc2lzLlwKTGEgdmFyaWFibGUgc2hwX3J1dGEgYWxtYWNlbmFyw6EgbGEgcnV0YSBhbCBhcmNoaXZvIHNocC4gUmVlbXBsYWNlIGxhIHJ1dGEgZGUgZWplbXBsbyBwb3IgbGEgcnV0YSBjb3JyZXNwb25kaWVudGUgZW4gc3UgcHJvcGlvIGNvbXB1dGFkb3IsIGRvbmRlIGhheWEgZ3VhcmRhZG8gbGEgY2FycGV0YSBkZWwgY3Vyc28uCgpgYGB7cn0KIyBVc2EgbGEgcnV0YSByZWxhdGl2YSBhbCBzaGFwZWZpbGUgY29uIGxvcyBkYXRvcwpzaHBfcnV0YSA8LSAiLi9kYXRvcy9TSFBfTUdOMjAxOF9JTlRHUkRfTVBJTy9NR05fQU5NX01QSU9TLnNocCIKdmVjdG9yX211bmljaXBpb3MgPC0gc3RfcmVhZChzaHBfcnV0YSkKCmBgYAoKTm90YXLDoSBxdWUgZW4gbGEgbWVkaWRhIGVuIHF1ZSBzZSBjcmVhbiB2YXJpYWJsZXMsIGVzdMOhcyBlbXBpZXphbiBhIGFwYXJlY2VyIGVuIGVsIHBhbmVsIEdsb2JhbCBFbnZpcm9ubWVudC4KCiMjIyAyLjQuIExleWVuZG8gZGF0b3MgZXNwYWNpYWxlcyB5IHZpc3VhbGl6YW5kbyBzdXMgcHJvcGllZGFkZXMKCkxhIHNpZ3VpZW50ZSBsw61uZWEgdXNhIGZ1bmNpb25hbGlkYWRlcyBkZSBsYSBsaWJyZXLDrWEgc2YgcGFyYSBsZWVyIGVsIHNoYXBlZmlsZSBkaXNwb25pYmxlIGVuIGxhIHJ1dGEgKipzaHBfcnV0YSoqIGNvbW8gdW4gYXJjaGl2byBlc3BhY2lhbCB5IGxvIGFsbWFjZW5hIGVuIGxhIHZhcmlhYmxlICoqdmVjdG9yX211bmljaXBpb3MqKi4KCmBgYHtyfQp2ZWN0b3JfbXVuaWNpcGlvcyA8LSBzdF9yZWFkKHNocF9ydXRhKQpgYGAKCkxhIGzDrW5lYSBzaWd1aWVudGUgc2ltcGxlbWVudGUgaW1wcmltZSBsYSBpbmZvcm1hY2nDs24gZGUgbGEgdmFyaWFibGUgdmVjdG9yX211bmljaXBpb3MgZW4gbGEgY29uc29sYS4KQ29tbyBlcyB1biBvYmpldG8gZXNwYWNpYWwgbW9zdHJhcsOhIHVuIHJlc3VtZW4gZGUgZXNlIG9iamV0bywgYXPDrSBjb21vIHRvZG9zIGxvcyBhdHJpYnV0b3MgeSByZWdpc3Ryb3MuClvCv1F1w6kgaW5mb3JtYWNpw7NuIHB1ZWRlIGlkZW50aWZpY2FyID8uXXtzdHlsZT0iY29sb3I6cmVkIn0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CgpgYGB7cn0KdmVjdG9yX211bmljaXBpb3MKYGBgCgpBIHZlY2VzIHNvbG8gcmVxdWVyaW1vcyB2ZXIgbG9zIHByaW1lcm9zIHJlZ2lzdHJvcyBwYXJhIGNvbm9jZXIgbGEgZXN0cnVjdHVyYSBnZW5lcmFsIGRlIGxhIHRhYmxhIGRlIGF0cmlidXRvcy4KUG9kZW1vcyBsaW1pdGFyIGVsIG7Dum1lcm8gZGUgcmVnaXN0cm9zIHF1ZSBzZSBtdWVzdHJhbiBhbCBsbGFtYXIgbGEgdmFyaWFibGUgKip2ZWN0b3JfbXVuaWNpcGlvcyoqIGluY2x1eWVuZG8gdW5hIGzDrW5lYSBkZSB0ZXh0byBlbiBsYSBxdWUgZXNwZWNpZmljYW1vcyBjdcOhbnRvcyByZWdpc3Ryb3MgcXVlcmVtb3MgcXVlIHNlIHByZXNlbnRlbi4KCmBgYHtyfQojIEVzdGFibGVjZXIgZWwgbsO6bWVybyBtw6F4aW1vIGRlIGZpbGFzIGEgaW1wcmltaXIKb3B0aW9ucyhzZl9tYXhfcHJpbnQgPSA1KQp2ZWN0b3JfbXVuaWNpcGlvcwpgYGAKClRhbWJpw6luIHBvZGVtb3MgdmlzdWFsaXphciBlbCBsaXN0YWRvIGRlIGNhbXBvcyAoYXRyaWJ1dG9zIG8gY29sdW1uYXMpIGEgdHJhdsOpcyBkZToKCmBgYHtyfQpuYW1lcyh2ZWN0b3JfbXVuaWNpcGlvcykKYGBgCgojIyMgMi41LiBWaXN1YWxpemFyIHN1IHByaW1lciBtYXBhCgpMYSBzaWd1aWVudGUgbMOtbmVhIHV0aWxpemEgbGEgZnVuY2nDs24gcGxvdCgpIHBhcmEgdmlzdWFsaXphciBlbCBvYmpldG8gZXNwYWNpYWwgYWxtYWNlbmFkbyBlbiBsYSB2YXJpYWJsZSB2ZWN0b3JfbXVuaWNpcGlvcy4KCkVsIHByaW1lciBhcmd1bWVudG8gZXMgZWwgb2JqZXRvIGVzcGFjaWFsIHF1ZSBkZXNlYSB0cmF6YXIsIGVuIGVzdGUgY2FzbyB2ZWN0b3JfbXVuaWNpcGlvcy4KRWwgc2VndW5kbyBhcmd1bWVudG8gY29udGllbmUgZWwgYXRyaWJ1dG8gKGNvbHVtbmEpICJEUFRPX0NDREdPIi5MYSBmdW5jacOzbiBwbG90KCkgdXRpbGl6YXLDoSBsb3MgdmFsb3JlcyBkZSBlc2EgY29sdW1uYSBwYXJhIGRldGVybWluYXIgY8OzbW8gY29sb3JlYXIgbGFzIGVudGlkYWRlcyBlbiBlbCBtYXBhLgpDb21vICJEUFRPX0NDREdPIiBlcyB1bmEgY29sdW1uYSBxdWUgcmVwcmVzZW50YSBkaWZlcmVudGVzIGRlcGFydGFtZW50b3MsIGNhZGEgZGVwYXJ0YW1lbnRvIHNlIGNvbG9yZWFyw6EgZGUgZm9ybWEgZGlmZXJlbnRlIHNlZ8O6biBsb3MgdmFsb3JlcyBkZSBlc3RhIGNvbHVtbmEuCgpgYGB7cn0KcGxvdCh2ZWN0b3JfbXVuaWNpcGlvcykKYGBgCgpTaSBsZSByZXN1bHRhIG11eSBwZXNhZG8gY2FyZ2FyIHRvZG8gZWwgbWFwYSBjb21wbGV0bywgcHJ1ZWJlIGNvbiBlbCBhcmNoaXZvIG11bl9zYW50YW5kZXJfYm95YWNhLnNocAoKwr9RdcOpIGRpZmVyZW5jaWEgZXZpZGVuY2lhIGVuIGxhIHNpZ3VpZW50ZSBzYWxpZGEgY29uIHJlc3BlY3RvIGEgbGEgYW50ZXJpb3I/CsK/UXXDqSBjYW1iacOzIGVuIGVsIGPDs2RpZ28/CgpgYGB7cn0KcGxvdCh2ZWN0b3JfbXVuaWNpcGlvc1siRFBUT19DQ0RHTyJdKQpgYGAKCkFob3JhIHVzdGVkIGNyZWUgc3UgcHJvcGlhIHZpc3VhbGl6YWNpw7NuIHBvciBtdW5pY2lwaW9zLiBFcyBkZWNpciB1c2Ugb3RyYSB2YXJpYWJsZSBwYXJhIHJlcHJlc2VudGFyLgoKYGBge3J9CiNFc2NyaWJhIHN1IGPDs2RpZ28gYWPDoQpgYGAKCiMjIyAyLjYuIFNpc3RlbWFzIGRlIENvb3JkZW5hZGFzIHkgcmVwcm95ZWNjaW9uZXMgbG9zIGRhdG9zCgpWZXJpZmlxdWUgZWwgc2lzdGVtYSBjb29yZGVuYWRvIGRlIGxhIGNhcGEgKip2ZWN0b3JfbXVuaWNpcGlvcyoqCgpgYGB7cn0Kc3RfY3JzKHZlY3Rvcl9tdW5pY2lwaW9zKQpgYGAKCkxhIHNhbGlkYSBzZSBpbnRlcnByZXRhIGFzw606CgpQUk9KQ1JTWyJNQUdOQS1TSVJHQVMgMjAxOCAvIE9yaWdlbi1OYWNpb25hbCJdOiBJbmRpY2EgcXVlIGVzdMOhIHV0aWxpemFuZG8gZWwgc2lzdGVtYSBkZSByZWZlcmVuY2lhIHByb3llY3RhZG8gIk1BR05BLVNJUkdBUyAyMDE4IC8gT3JpZ2VuLU5hY2lvbmFsIi4KCkJBU0VHRU9HQ1JTWyJNQUdOQS1TSVJHQVMgMjAxOCJdOiBEZWZpbmUgZWwgc2lzdGVtYSBkZSBjb29yZGVuYWRhcyBnZW9ncsOhZmljYXMgc3VieWFjZW50ZSBsbGFtYWRvICJNQUdOQS1TSVJHQVMgMjAxOCIuCgpEQVRVTVsuLi5dOiBQcm9wb3JjaW9uYSBkZXRhbGxlcyBzb2JyZSBlbCBkYXR1bSBxdWUgZXN0w6Egc2llbmRvIHV0aWxpemFkby4KCkVMTElQT1NPSURbIkdSUyAxOTgwIiwuLi5dOiBEZXRhbGxlcyBzb2JyZSBlbCBlbGlwc29pZGUgdXRpbGl6YWRvLgoKQ09OVkVSU0lPTlsiQ29sb21iaWEgVHJhbnN2ZXJzZSBNZXJjYXRvciJdOiBEZXRhbGxlcyBzb2JyZSBjw7NtbyBzZSBjb252aWVydGVuIGxhcyBjb29yZGVuYWRhcyBnZW9ncsOhZmljYXMgYSBjb29yZGVuYWRhcyBwbGFuYXMuCkFxdcOtIHNlIHV0aWxpemEgbGEgcHJveWVjY2nDs24gIlRyYW5zdmVyc2UgTWVyY2F0b3IiLgoKUEFSQU1FVEVSWy4uLl06IEVzdG9zIHNvbiBwYXLDoW1ldHJvcyBlc3BlY8OtZmljb3MgZGUgbGEgcHJveWVjY2nDs24uClBvciBlamVtcGxvLCAiTGF0aXR1ZGUgb2YgbmF0dXJhbCBvcmlnaW4iIHkgIkxvbmdpdHVkZSBvZiBuYXR1cmFsIG9yaWdpbiIgc29uIGxhcyBjb29yZGVuYWRhcyBlbiBsYXMgcXVlIGxhIHByb3llY2Npw7NuIHRpZW5lIGNlcm8gZGlzdG9yc2nDs24uCiJGYWxzZSBlYXN0aW5nIiB5ICJGYWxzZSBub3J0aGluZyIgc29uIGRlc3BsYXphbWllbnRvcyBhw7FhZGlkb3MgcGFyYSBldml0YXIgY29vcmRlbmFkYXMgbmVnYXRpdmFzLgoKQ1NbQ2FydGVzaWFuLDJdLCBBWElTWy4uLl0sIEFYSVNbLi4uXTogSW5kaWNhIHF1ZSBzZSB0cmF0YSBkZSB1biBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGNhcnRlc2lhbmFzIGJpZGltZW5zaW9uYWwsIGNvbiB1biBlamUgbm9ydGUgeSB1biBlamUgZXN0ZS4KClVTQUdFWy4uLl0sIEFSRUFbLi4uXTogUHJvcG9yY2lvbmEgZGV0YWxsZXMgc29icmUgZWwgdXNvIHkgbGEgw6FyZWEgZGUgYXBsaWNhYmlsaWRhZCBkZWwgc2lzdGVtYSBkZSByZWZlcmVuY2lhLgoKSURbIkVQU0ciLi5dOiBFcyB1biBpZGVudGlmaWNhZG9yIMO6bmljbyBwYXJhIGVzdGUgc2lzdGVtYSBkZSBjb29yZGVuYWRhcy4KRW4gZXN0ZSBjYXNvLCBlbCBFUFNHIDkzNzcgY29ycmVzcG9uZGUgYWwgc2lzdGVtYSAiTUFHTkEtU0lSR0FTIDIwMTggLyBPcmlnZW4tTmFjaW9uYWwiIHF1ZSBzZSB1dGlsaXphIGVuIENvbG9tYmlhLgoKIyMjIyAyLjUuMS4KClNpc3RlbWFzIGRlIENvb3JkZW5hZGFzIHkgcmVwcm95ZWNjaW9uZXMgbG9zIGRhdG9zIFwjIyMjIExhIGZ1bmNpw7NuIHN0X3RyYW5zZm9ybSBoYWNlIHBhcnRlIGRlbCBwYXF1ZXRlIHNmIHkgcmVwcm95ZWN0YSBsYXMgY29vcmRlbmFkYXMgZGUgdW4gY29uanVudG8gZGUgZGF0b3MgZXNwYWNpYWxlcywKCmBgYHtyfQp2ZWN0b3JfbXVuaWNpcGlvc19yZXByb2plY3QgPC0gc3RfdHJhbnNmb3JtKHZlY3Rvcl9tdW5pY2lwaW9zLCA5Mzc3KQpgYGAKCkVzY3JpYmEgbGEgbMOtbmVhIHBhcmEgcmV2aXNhciBlbCBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGRlIHN1IGNhcGEgcmVwcm95ZWN0YWRhCgpgYGB7cn0KI0VzdG8gZXMgaW1wb3J0YW50ZSBwYXJhIGRvY3VtZW50YXIgZWwgY8OzZGlnbwpzdF9jcnModmVjdG9yX211bmljaXBpb3NfcmVwcm9qZWN0KQpgYGAKCiMjIyAyLjcuIEV4cG9ydGFyIGRhdG9zIGFsbWFjZW5hZG9zIGVuIHVuYSB2YXJpYWJsZSBhIHVuIGFyY2hpdm8KCkZlbGljaXRhY2lvbmVzLCB1c3RlZCB5YSBoYSByZXByb3llY3RhZG8gc3UgY29uanVudG8gZGUgZGF0b3MuClNpbiBlbWJhcmdvLCBzb2xvIHNlIGVuY3VlbnRyYW4gYWxtYWNlbmFkb3MgZW4gbGEgbWVtb3JpYSBkZSBSIGJham8gZWwgbm9tYnJlIGRlIGxhIHZhcmlhYmxlICoqdmVjdG9yX211bmljaXBpb3NfcmVwcm9qZWN0KiouClNpIHVzdGVkIHF1aWVyZSBndWFyZGFyIHN1cyBjYXBhIHJlcHJveWVjdGFkYSBlbiBlbCBhbG1hY2VuYW1pZW50byBkZSBzdSBjb21wdXRhZG9yIHJlcXVpZXJlIGV4cG9ydGFybG8gYXVuIGFyY2hpdm8gKCBwb3IgZWplbXBsbyBzaGFwZWZpbGUpLgpNb2RpZmlxdWUgZWwgY8OzZGlnbyBlamVtcGxvIHByZXNlbnRhZG8geSBlc2NyaWJhIHVuYSBydXRhIHbDoWxpZGEgcGFyYSBhbG1hY2VuYXIgc3VzIGFyY2hpdm8gc2hhcGZpbGUuClvCv0EgcHJvcMOzc2l0bywgeWEgc2FiZSBlbiBxdcOpIGNhc29zIGNvbG9jYSAqKi4vKiogYWwgaW5pY2lvIGRlIHN1IHJ1dGE/XXtzdHlsZT0iY29sb3I6cmVkIn0uCgpgYGB7cn0Kc3Rfd3JpdGUodmVjdG9yX211bmljaXBpb3NfcmVwcm9qZWN0LCAiLi9taV9jYXBhX3JlcHJveWVjdGFkYS5zaHAiKQpgYGAKCiMjIyAyLjguRmlsdHJhbmRvIHBvciBhdHJpYnV0b3MKClJlYWxpY2UgdW5hIHNlbGVjY2nDs24gZGVsIGRlcGFydGFtZW50byBjb24gZWwgY29kaWdvIDE4IHVuaWNhbWVudGUgKFBpc3RhIERQVE9fQ0NER08gPT0gMTgpCgolXD4lIGVzIHVuIG9wZXJhZG9yIGRlbCBwYXF1ZXRlIGRwbHlyLgpUb21hIGVsIG9iamV0byBvIHJlc3VsdGFkbyBkZSBsYSBpenF1aWVyZGEgeSBsbyAicGFzYSIgY29tbyBlbCBwcmltZXIgYXJndW1lbnRvIGEgbGEgZnVuY2nDs24gZGUgbGEgZGVyZWNoYS4KRXMgdW5hIG1hbmVyYSBjb25jaXNhIHkgbGVnaWJsZSBkZSBlbmNhZGVuYXIgb3BlcmFjaW9uZXMgZW4gUi4KCkxhIGZ1bmNpw7NuIGZpbHRlcigpIGRlbCBwYXF1ZXRlIGRwbHlyIHNlIHV0aWxpemEgcGFyYSBmaWx0cmFyIGZpbGFzIGVuIHVuIGRhdGFmcmFtZSAodGFibGEgY29uIGVuY2FiZXphZG9zKSBvLCBlbiBlc3RlIGNhc28sIGVuIHVuIG9iamV0byBzZiBiYXNhZG8gZW4gdW5hIGNvbmRpY2nDs24uCgpEUFRPX0NDREdPID09IDE4IGVzIGxhIGNvbmRpY2nDs24gcXVlIHNlIHVzYSBwYXJhIGZpbHRyYXIuCkVzdGEgY29uZGljacOzbiBzZWxlY2Npb25hcsOhIHRvZGFzIGxhcyBmaWxhcyBkb25kZSBlbCB2YWxvciBkZSBsYSBjb2x1bW5hIERQVE9fQ0NER08gZXMgaWd1YWwgYSAxOC4KCmBgYHtyfQpkZXB0b18xOCA8LSB2ZWN0b3JfbXVuaWNpcGlvc19yZXByb2plY3QgJT4lIAogIGZpbHRlciggRFBUT19DQ0RHTyA9PSAxOCkKYGBgCgpWaXN1YWxpY2UgZWwgbWFwYSBkZSBtdW5pY2lwaW9zIGRlIGRlcHRvXzE4CgpgYGB7cn0KI0VzY3JpYmEgYWPDoSBzdSBjw7NkaWdvCgpgYGAKCkFob3JhIGd1YXJkZSBlbiB1biBhcmNoaXZvIHNoYXBlZmlsZSBlbiBzdSBjb21wdXRhZG9yIGVsIGNvbnRlbmlkbyBkZSBkZXB0b18xOAoKYGBge3J9CiNFc2NyaWJhIGFjw6Egc3UgY8OzZGlnbwpgYGAKCiMjIyAyLjguIFJldmlzZSBzdXMgcmVzdWx0YWRvcyBlbiBRR0lTCgpBYnJhIGVuIFFHSVMgc3UgY2FwYSBvcmlnaW5hbCBkZSBtdW5pY2lwaW9zIHkgc3UgY2FwYSByZXByb3llY3RhZGEuCkhhZ2EgbG8gbWlzbW8gY29uIGxhIGNhcGEgZGVsIG11bmljaXBpbyAxOC4KVmVyaWZpcXVlIGxvcyBzaXN0ZW1hcyBkZSByZWZlcmVuY2lhIGRlIGNhZGEgY2FwYS4KU29uIGRpZmVyZW50ZXMgbG9zIHNpc3RlbWFzIGRlIHJlZmVyZW5jaWE/CkN1w6FsIHByb2NlZGltaWVudG8gbGUgcmVzdWx0YSBtw6FzIGludGVyZXNhbnRlIHBhcmEgcmVwcm95ZWN0YXIgZGF0b3MgZXNwYWNpYWxlcyBRR0lTIG8gbMOtbmVhcyBkZSBjw7NkaWdvIGVuIFI/Cg==