1. Compile la información disponible en la “Base de Datos de Comercio Exterior” del BCR, para los años 2018-2020.

#Cargamos datos
load("C:/Users/guada/Desktop/Jazz/CICLO II 2023/MAE118 2023/COMERCIO EXTERIOR/Data_Comercio_Exterior.RData")
#Cargar Paquetes
library(readr)
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
library(kableExtra)

Attaching package: ‘kableExtra’

The following object is masked from ‘package:dplyr’:

    group_rows
#Mostrar los primeros 10 elementos de la tabla Comercio Exterior
Data_Comercio_Exterior %>% head(10) %>%
  kable(caption = "Base de Comercio Exterior 2018-2020",
        align = "c") %>%
  add_footnote(label = "Elaboración propia con base en datos del BCR",
               notation = "symbol") %>%  kable_styling()
Base de Comercio Exterior 2018-2020
Pais Sac Anio Mes Valor_Cif Kilogramos_Import. Valor_Fob Kilogramos_Export.
Afganistan 0806200000 2018 6 6448.43 1463.92 0 0
Afganistan 6104220000 2018 10 3153.37 2407.61 0 0
Afganistan 6104620000 2018 10 946.01 722.28 0 0
Afganistan 6105100000 2018 10 9405.39 7181.03 0 0
Afganistan 6106100000 2018 10 1353.32 1725.55 0 0
Afganistan 6405900000 2018 10 2260.03 1725.55 0 0
Afganistan 8206000000 2018 10 6.56 5.02 0 0
Afganistan 6404110000 2019 2 7752.13 6748.03 0 0
Afganistan 6405100000 2019 2 508.03 442.24 0 0
Afganistan 6405900000 2019 2 12.45 10.85 0 0
* Elaboración propia con base en datos del BCR

2. Realice la actualización de la tabla anterior con toda la información disponible para 2023.

Importaciones Actualizadas de 2021 a 2023

#Cargamos paquetes
library(dplyr)
library(tidyr)
library(kableExtra)

setwd("C:/Users/guada/Desktop/Jazz/CICLO II 2023/MAE118 2023/COMERCIO EXTERIOR/ACTUALIZAR/IMPORTACIONES")

Archivos_Importar<-list.files()

Lista_Importaciones<-lapply(Archivos_Importar,
                            FUN = read_delim, delim = "|",
                            col_names=c("Pais",
                                       "Sac",
                                       "Anio", 
                                       "Mes",
                                       "Valor_Cif",
                                       "Kilogramos"),
                            col_types=cols(Pais="c",
                                           Sac="c",
                                           Anio="d",
                                           Mes="d",
                                           Valor_Cif="d",
                                           Kilogramos="d"),
                            skip=1)

#Unimos los archivos a un solo dataframe
Data_Importaciones_Actualizada<-bind_rows(Lista_Importaciones)

Exportaciones Actualizadas de 2021 a 2023

#Cargamos paquetes
library(dplyr)
library(tidyr)
library(kableExtra)

setwd("C:/Users/guada/Desktop/Jazz/CICLO II 2023/MAE118 2023/COMERCIO EXTERIOR/ACTUALIZAR/EXPORTACIONES")

Archivos_Exportaciones<-list.files()

Lista_Exportaciones<-lapply(Archivos_Exportaciones,
                            FUN = read_delim, delim = "|",
                            col_names=c("Pais",
                                       "Sac",
                                       "Anio", 
                                       "Mes",
                                       "Valor_Fob",
                                       "Kilogramos"),
                            col_types=cols(Pais="c",
                                           Sac="c",
                                           Anio="d",
                                           Mes="d",
                                           Valor_Fob="d",
                                           Kilogramos="d"),
                            skip=1)

#Unimos los archivos a un solo dataframe
Data_Exportaciones_Actualizada<-bind_rows(Lista_Exportaciones)
#Concatenamos tablas de importaciones y exportaciones
Data_Importaciones_Actualizada %>% full_join(
  Data_Exportaciones_Actualizada, by=c("Pais", "Sac", "Anio", "Mes"), 
  suffix=c("_Import", "_Export")
)-> Data_Comercio_Exterior_Actualizada

#Sustituimos Valores Nulos
Data_Comercio_Exterior_Actualizada %>% replace_na(
  list(
    Valor_Cif=0,
    Valor_Fob=0,
    Kilogramos_Import=0,
    Kilogramos_Export=0
  )
) %>% 
  arrange(Pais,Anio,Mes,Sac)->Data_Comercio_Exterior_Actualizada
#Unir tabla de Comercio Exterior y su Actualización
Data_Comercio_Exterior %>% 
  bind_rows(Data_Comercio_Exterior_Actualizada) %>% 
  arrange(Pais,Anio,Mes,Sac)->Data_Comercio_Exterior

#Guardamos la actualización con otro nombre
save(Data_Comercio_Exterior,file = "C:/Users/guada/Desktop/Jazz/CICLO II 2023/MAE118 2023/COMERCIO EXTERIOR/Data_Comercio_Exterior_Actualizada.RData")

3. Agregue la información estandarizada de los países.

library(dplyr)
library(readxl)
library(kableExtra)
#Datos
load("C:/Users/guada/Desktop/Jazz/CICLO II 2023/MAE118 2023/COMERCIO EXTERIOR/Data_Comercio_Exterior_Actualizada.RData")

# nombres paises
Archivo_Nombres <-"C:/Users/guada/Desktop/Jazz/CICLO II 2023/MAE118 2023/TAREAS PORTAFOLIO/nombres_iso_paises.xlsx"

Nombres_ISO_Paises <- read_excel(Archivo_Nombres)
New names:
Data_Comercio_Exterior %>%
  left_join(Nombres_ISO_Paises, 
            by=c("Pais" = "nom_pais_esp"))->Data_Comercio_Exterior

#Mostrar los primeros 10 elementos de la tabla Comercio Exterior
Data_Comercio_Exterior %>% head(10) %>%
  kable(caption = "Base de Comercio Exterior 2018-2023",
        align = "c") %>%
  add_footnote(label = "Elaboración propia con base en datos del BCR",
               notation = "symbol") %>%  kable_styling()
Base de Comercio Exterior 2018-2023
Pais Sac Anio Mes Valor_Cif Kilogramos_Import. Valor_Fob Kilogramos_Export. Kilogramos_Import Kilogramos_Export nom_pais_ingles iso_2 iso_3 codigo_pais...5 codigo_pais...6 region cod_region sub_region cod_sub_region region_intermedia cod_region_intermedia ...13
Afganistan 0806200000 2018 6 6448.43 1463.92 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6104220000 2018 10 3153.37 2407.61 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6104620000 2018 10 946.01 722.28 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6105100000 2018 10 9405.39 7181.03 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6106100000 2018 10 1353.32 1725.55 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6405900000 2018 10 2260.03 1725.55 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 8206000000 2018 10 6.56 5.02 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6404110000 2019 2 7752.13 6748.03 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6405100000 2019 2 508.03 442.24 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
Afganistan 6405900000 2019 2 12.45 10.85 0 0 NA NA Afghanistan AF AFG 4 Asia 142 Asia Meridional 34 NA NA Asia 142
* Elaboración propia con base en datos del BCR

4. Obtenga un ranking, anual, de los 5 principales socios comerciales de El Salvador, para el periodo 2018-2023.

options(scipen = 999)
library(dplyr)
library(readxl)

#Seleccionar años para el periodo 2018 a 2023
Años_Ranking<-2018:2023
Data_Comercio_Exterior %>% 
  filter(Anio %in% Años_Ranking)->Data_Ranking

#Calculo de ranking y porcentajes
Data_Ranking %>% 
  group_by(Anio,iso_3) %>%
  summarise(Total=sum(Valor_Fob)) %>%
  mutate(Porcentaje=round(prop.table(Total)*100,2)) %>%
  slice_max(n=5,order_by = Total) %>%
  as.data.frame() %>%
  group_by(Anio) %>%
  mutate(Ranking=row_number(),
         Data=paste(iso_3, "|", Porcentaje,sep="")) %>%
  select(Anio, Data, Ranking) %>% 
  as.data.frame()->Insumo_Reporte
`summarise()` has grouped output by 'Anio'. You can override using the `.groups` argument.
print(Insumo_Reporte)

Tabla en formato “RAW”

library(tidyr)
Insumo_Reporte %>% 
  pivot_wider(names_from = Ranking, values_from = Data)->Mi_Tabla
print(Mi_Tabla)

Tabla en formato requerido

library(kableExtra)
Mi_Tabla %>% 
  kable(caption = paste("Top",5,"de Exportaciones periodo", 
                        min(Años_Ranking),"-",max(Años_Ranking))) %>% 
  add_footnote(label = "Elaboración propia con base en datos del BCR")
Top 5 de Exportaciones periodo 2018 - 2023
Anio 1 2 3 4 5
2018 NA|47.09 HND|15.34 GTM|14.36 NIC|6.87 CRI|4.39
2019 NA|44.41 GTM|15.92 HND|15.9 NIC|6.66 CRI|4.46
2020 NA|43.91 GTM|16.42 HND|15.56 NIC|7.1 CRI|4.49
2021 NA|43.83 GTM|16.78 HND|16.49 NIC|7.2 CRI|4.11
2022 NA|41.17 GTM|17.05 HND|16.65 NIC|6.98 CRI|4.27
2023 NA|38.49 GTM|17.93 HND|15.94 NIC|7.39 CRI|4.62
a Elaboración propia con base en datos del BCR
LS0tDQp0aXRsZTogIkd1w61hIGRlIHRyYWJham8gc29icmUgYmFzZSBkZSBkYXRvcyBkZSBDb21lcmNpbyBFeHRlcmlvciINCmF1dGhvcjogIkphem1pbiBHdWFkYWx1cGUgRmxvcmVzIEdhcmPDrWEgLSBGRzIwMDE5Ig0KZGF0ZTogIjIwMjMtMTAtMDEiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQotLS0NCg0KIyAxLiAgQ29tcGlsZSBsYSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSBlbiBsYSAiQmFzZSBkZSBEYXRvcyBkZSBDb21lcmNpbyBFeHRlcmlvciIgZGVsIEJDUiwgcGFyYSBsb3MgYcOxb3MgMjAxOC0yMDIwLg0KDQpgYGB7cn0NCiNDYXJnYW1vcyBkYXRvcw0KbG9hZCgiQzovVXNlcnMvZ3VhZGEvRGVza3RvcC9KYXp6L0NJQ0xPIElJIDIwMjMvTUFFMTE4IDIwMjMvQ09NRVJDSU8gRVhURVJJT1IvRGF0YV9Db21lcmNpb19FeHRlcmlvci5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojQ2FyZ2FyIFBhcXVldGVzDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KI01vc3RyYXIgbG9zIHByaW1lcm9zIDEwIGVsZW1lbnRvcyBkZSBsYSB0YWJsYSBDb21lcmNpbyBFeHRlcmlvcg0KRGF0YV9Db21lcmNpb19FeHRlcmlvciAlPiUgaGVhZCgxMCkgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiQmFzZSBkZSBDb21lcmNpbyBFeHRlcmlvciAyMDE4LTIwMjAiLA0KICAgICAgICBhbGlnbiA9ICJjIikgJT4lDQogIGFkZF9mb290bm90ZShsYWJlbCA9ICJFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBiYXNlIGVuIGRhdG9zIGRlbCBCQ1IiLA0KICAgICAgICAgICAgICAgbm90YXRpb24gPSAic3ltYm9sIikgJT4lICBrYWJsZV9zdHlsaW5nKCkNCmBgYA0KDQojIDIuIFJlYWxpY2UgbGEgYWN0dWFsaXphY2nDs24gZGUgbGEgdGFibGEgYW50ZXJpb3IgY29uIHRvZGEgbGEgaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUgcGFyYSAyMDIzLg0KDQoqKkltcG9ydGFjaW9uZXMgQWN0dWFsaXphZGFzIGRlIDIwMjEgYSAyMDIzKioNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KI0NhcmdhbW9zIHBhcXVldGVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0Kc2V0d2QoIkM6L1VzZXJzL2d1YWRhL0Rlc2t0b3AvSmF6ei9DSUNMTyBJSSAyMDIzL01BRTExOCAyMDIzL0NPTUVSQ0lPIEVYVEVSSU9SL0FDVFVBTElaQVIvSU1QT1JUQUNJT05FUyIpDQoNCkFyY2hpdm9zX0ltcG9ydGFyPC1saXN0LmZpbGVzKCkNCg0KTGlzdGFfSW1wb3J0YWNpb25lczwtbGFwcGx5KEFyY2hpdm9zX0ltcG9ydGFyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IHJlYWRfZGVsaW0sIGRlbGltID0gInwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcz1jKCJQYWlzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbG9yX0NpZiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2lsb2dyYW1vcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcz1jb2xzKFBhaXM9ImMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhYz0iYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbz0iZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzPSJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxvcl9DaWY9ImQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbG9ncmFtb3M9ImQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTEpDQoNCiNVbmltb3MgbG9zIGFyY2hpdm9zIGEgdW4gc29sbyBkYXRhZnJhbWUNCkRhdGFfSW1wb3J0YWNpb25lc19BY3R1YWxpemFkYTwtYmluZF9yb3dzKExpc3RhX0ltcG9ydGFjaW9uZXMpDQpgYGANCg0KKipFeHBvcnRhY2lvbmVzIEFjdHVhbGl6YWRhcyBkZSAyMDIxIGEgMjAyMyoqDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCiNDYXJnYW1vcyBwYXF1ZXRlcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnNldHdkKCJDOi9Vc2Vycy9ndWFkYS9EZXNrdG9wL0phenovQ0lDTE8gSUkgMjAyMy9NQUUxMTggMjAyMy9DT01FUkNJTyBFWFRFUklPUi9BQ1RVQUxJWkFSL0VYUE9SVEFDSU9ORVMiKQ0KDQpBcmNoaXZvc19FeHBvcnRhY2lvbmVzPC1saXN0LmZpbGVzKCkNCg0KTGlzdGFfRXhwb3J0YWNpb25lczwtbGFwcGx5KEFyY2hpdm9zX0V4cG9ydGFjaW9uZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gcmVhZF9kZWxpbSwgZGVsaW0gPSAifCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX25hbWVzPWMoIlBhaXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5pbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsb3JfRm9iIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLaWxvZ3JhbW9zIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzPWNvbHMoUGFpcz0iYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FjPSJjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmlvPSJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXM9ImQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbG9yX0ZvYj0iZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2lsb2dyYW1vcz0iZCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MSkNCg0KI1VuaW1vcyBsb3MgYXJjaGl2b3MgYSB1biBzb2xvIGRhdGFmcmFtZQ0KRGF0YV9FeHBvcnRhY2lvbmVzX0FjdHVhbGl6YWRhPC1iaW5kX3Jvd3MoTGlzdGFfRXhwb3J0YWNpb25lcykNCmBgYA0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCiNDb25jYXRlbmFtb3MgdGFibGFzIGRlIGltcG9ydGFjaW9uZXMgeSBleHBvcnRhY2lvbmVzDQpEYXRhX0ltcG9ydGFjaW9uZXNfQWN0dWFsaXphZGEgJT4lIGZ1bGxfam9pbigNCiAgRGF0YV9FeHBvcnRhY2lvbmVzX0FjdHVhbGl6YWRhLCBieT1jKCJQYWlzIiwgIlNhYyIsICJBbmlvIiwgIk1lcyIpLCANCiAgc3VmZml4PWMoIl9JbXBvcnQiLCAiX0V4cG9ydCIpDQopLT4gRGF0YV9Db21lcmNpb19FeHRlcmlvcl9BY3R1YWxpemFkYQ0KDQojU3VzdGl0dWltb3MgVmFsb3JlcyBOdWxvcw0KRGF0YV9Db21lcmNpb19FeHRlcmlvcl9BY3R1YWxpemFkYSAlPiUgcmVwbGFjZV9uYSgNCiAgbGlzdCgNCiAgICBWYWxvcl9DaWY9MCwNCiAgICBWYWxvcl9Gb2I9MCwNCiAgICBLaWxvZ3JhbW9zX0ltcG9ydD0wLA0KICAgIEtpbG9ncmFtb3NfRXhwb3J0PTANCiAgKQ0KKSAlPiUgDQogIGFycmFuZ2UoUGFpcyxBbmlvLE1lcyxTYWMpLT5EYXRhX0NvbWVyY2lvX0V4dGVyaW9yX0FjdHVhbGl6YWRhDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQojVW5pciB0YWJsYSBkZSBDb21lcmNpbyBFeHRlcmlvciB5IHN1IEFjdHVhbGl6YWNpw7NuDQpEYXRhX0NvbWVyY2lvX0V4dGVyaW9yICU+JSANCiAgYmluZF9yb3dzKERhdGFfQ29tZXJjaW9fRXh0ZXJpb3JfQWN0dWFsaXphZGEpICU+JSANCiAgYXJyYW5nZShQYWlzLEFuaW8sTWVzLFNhYyktPkRhdGFfQ29tZXJjaW9fRXh0ZXJpb3INCg0KI0d1YXJkYW1vcyBsYSBhY3R1YWxpemFjacOzbiBjb24gb3RybyBub21icmUNCnNhdmUoRGF0YV9Db21lcmNpb19FeHRlcmlvcixmaWxlID0gIkM6L1VzZXJzL2d1YWRhL0Rlc2t0b3AvSmF6ei9DSUNMTyBJSSAyMDIzL01BRTExOCAyMDIzL0NPTUVSQ0lPIEVYVEVSSU9SL0RhdGFfQ29tZXJjaW9fRXh0ZXJpb3JfQWN0dWFsaXphZGEuUkRhdGEiKQ0KYGBgDQoNCiMgMy4gQWdyZWd1ZSBsYSBpbmZvcm1hY2nDs24gZXN0YW5kYXJpemFkYSBkZSBsb3MgcGHDrXNlcy4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQojRGF0b3MNCmxvYWQoIkM6L1VzZXJzL2d1YWRhL0Rlc2t0b3AvSmF6ei9DSUNMTyBJSSAyMDIzL01BRTExOCAyMDIzL0NPTUVSQ0lPIEVYVEVSSU9SL0RhdGFfQ29tZXJjaW9fRXh0ZXJpb3JfQWN0dWFsaXphZGEuUkRhdGEiKQ0KDQojIG5vbWJyZXMgcGFpc2VzDQpBcmNoaXZvX05vbWJyZXMgPC0iQzovVXNlcnMvZ3VhZGEvRGVza3RvcC9KYXp6L0NJQ0xPIElJIDIwMjMvTUFFMTE4IDIwMjMvVEFSRUFTIFBPUlRBRk9MSU8vbm9tYnJlc19pc29fcGFpc2VzLnhsc3giDQoNCk5vbWJyZXNfSVNPX1BhaXNlcyA8LSByZWFkX2V4Y2VsKEFyY2hpdm9fTm9tYnJlcykNCkRhdGFfQ29tZXJjaW9fRXh0ZXJpb3IgJT4lDQogIGxlZnRfam9pbihOb21icmVzX0lTT19QYWlzZXMsIA0KICAgICAgICAgICAgYnk9YygiUGFpcyIgPSAibm9tX3BhaXNfZXNwIikpLT5EYXRhX0NvbWVyY2lvX0V4dGVyaW9yDQoNCiNNb3N0cmFyIGxvcyBwcmltZXJvcyAxMCBlbGVtZW50b3MgZGUgbGEgdGFibGEgQ29tZXJjaW8gRXh0ZXJpb3INCkRhdGFfQ29tZXJjaW9fRXh0ZXJpb3IgJT4lIGhlYWQoMTApICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIkJhc2UgZGUgQ29tZXJjaW8gRXh0ZXJpb3IgMjAxOC0yMDIzIiwNCiAgICAgICAgYWxpZ24gPSAiYyIpICU+JQ0KICBhZGRfZm9vdG5vdGUobGFiZWwgPSAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gYmFzZSBlbiBkYXRvcyBkZWwgQkNSIiwNCiAgICAgICAgICAgICAgIG5vdGF0aW9uID0gInN5bWJvbCIpICU+JSAga2FibGVfc3R5bGluZygpDQpgYGANCg0KIyA0LiBPYnRlbmdhIHVuIHJhbmtpbmcsIGFudWFsLCBkZSBsb3MgNSBwcmluY2lwYWxlcyBzb2Npb3MgY29tZXJjaWFsZXMgZGUgRWwgU2FsdmFkb3IsIHBhcmEgZWwgcGVyaW9kbyAyMDE4LTIwMjMuDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyZWFkeGwpDQoNCiNTZWxlY2Npb25hciBhw7FvcyBwYXJhIGVsIHBlcmlvZG8gMjAxOCBhIDIwMjMNCkHDsW9zX1Jhbmtpbmc8LTIwMTg6MjAyMw0KRGF0YV9Db21lcmNpb19FeHRlcmlvciAlPiUgDQogIGZpbHRlcihBbmlvICVpbiUgQcOxb3NfUmFua2luZyktPkRhdGFfUmFua2luZw0KDQojQ2FsY3VsbyBkZSByYW5raW5nIHkgcG9yY2VudGFqZXMNCkRhdGFfUmFua2luZyAlPiUgDQogIGdyb3VwX2J5KEFuaW8saXNvXzMpICU+JQ0KICBzdW1tYXJpc2UoVG90YWw9c3VtKFZhbG9yX0ZvYikpICU+JQ0KICBtdXRhdGUoUG9yY2VudGFqZT1yb3VuZChwcm9wLnRhYmxlKFRvdGFsKSoxMDAsMikpICU+JQ0KICBzbGljZV9tYXgobj01LG9yZGVyX2J5ID0gVG90YWwpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KEFuaW8pICU+JQ0KICBtdXRhdGUoUmFua2luZz1yb3dfbnVtYmVyKCksDQogICAgICAgICBEYXRhPXBhc3RlKGlzb18zLCAifCIsIFBvcmNlbnRhamUsc2VwPSIiKSkgJT4lDQogIHNlbGVjdChBbmlvLCBEYXRhLCBSYW5raW5nKSAlPiUgDQogIGFzLmRhdGEuZnJhbWUoKS0+SW5zdW1vX1JlcG9ydGUNCnByaW50KEluc3Vtb19SZXBvcnRlKQ0KYGBgDQoNCioqVGFibGEgZW4gZm9ybWF0byAiUkFXIioqDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5cikNCkluc3Vtb19SZXBvcnRlICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFJhbmtpbmcsIHZhbHVlc19mcm9tID0gRGF0YSktPk1pX1RhYmxhDQpwcmludChNaV9UYWJsYSkNCmBgYA0KDQoqKlRhYmxhIGVuIGZvcm1hdG8gcmVxdWVyaWRvKioNCg0KYGBge3J9DQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpNaV9UYWJsYSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiVG9wIiw1LCJkZSBFeHBvcnRhY2lvbmVzIHBlcmlvZG8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbihBw7Fvc19SYW5raW5nKSwiLSIsbWF4KEHDsW9zX1JhbmtpbmcpKSkgJT4lIA0KICBhZGRfZm9vdG5vdGUobGFiZWwgPSAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gYmFzZSBlbiBkYXRvcyBkZWwgQkNSIikNCmBgYA0KDQoNCg0KDQo=