#Ejemplo en Clase: Poblacion

library(forecast)
library(tidyverse)
library(ggplot2)

##Descarga de archivo

#file.choose()
poblacion<- read.csv("C:/Users/ferna/Desktop/population.csv")

##Entender la base de datos

summary(poblacion)
##     state                year        population      
##  Length:6020        Min.   :1900   Min.   :   43000  
##  Class :character   1st Qu.:1930   1st Qu.:  901483  
##  Mode  :character   Median :1960   Median : 2359000  
##                     Mean   :1960   Mean   : 3726003  
##                     3rd Qu.:1990   3rd Qu.: 4541883  
##                     Max.   :2019   Max.   :39512223
str(poblacion)
## 'data.frame':    6020 obs. of  3 variables:
##  $ state     : chr  "AK" "AK" "AK" "AK" ...
##  $ year      : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ population: int  135000 158000 189000 205000 215000 222000 224000 231000 224000 224000 ...
head(poblacion)
##   state year population
## 1    AK 1950     135000
## 2    AK 1951     158000
## 3    AK 1952     189000
## 4    AK 1953     205000
## 5    AK 1954     215000
## 6    AK 1955     222000

##Serie de tiempo de Texas

poblacion_texas<-poblacion %>% filter(state=="TX")
poblacion_texas
##     state year population
## 1      TX 1900    3055000
## 2      TX 1901    3132000
## 3      TX 1902    3210000
## 4      TX 1903    3291000
## 5      TX 1904    3374000
## 6      TX 1905    3459000
## 7      TX 1906    3546000
## 8      TX 1907    3636000
## 9      TX 1908    3727000
## 10     TX 1909    3821000
## 11     TX 1910    3922000
## 12     TX 1911    4016000
## 13     TX 1912    4107000
## 14     TX 1913    4207000
## 15     TX 1914    4300000
## 16     TX 1915    4368000
## 17     TX 1916    4444000
## 18     TX 1917    4563000
## 19     TX 1918    4666000
## 20     TX 1919    4631000
## 21     TX 1920    4723000
## 22     TX 1921    4853000
## 23     TX 1922    4955000
## 24     TX 1923    5077000
## 25     TX 1924    5210000
## 26     TX 1925    5332000
## 27     TX 1926    5453000
## 28     TX 1927    5577000
## 29     TX 1928    5675000
## 30     TX 1929    5762000
## 31     TX 1930    5844000
## 32     TX 1931    5907000
## 33     TX 1932    5961000
## 34     TX 1933    6014000
## 35     TX 1934    6053000
## 36     TX 1935    6123000
## 37     TX 1936    6192000
## 38     TX 1937    6250000
## 39     TX 1938    6301000
## 40     TX 1939    6360000
## 41     TX 1940    6425000
## 42     TX 1941    6585000
## 43     TX 1942    6711000
## 44     TX 1943    7012000
## 45     TX 1944    6876000
## 46     TX 1945    6826000
## 47     TX 1946    7197000
## 48     TX 1947    7388000
## 49     TX 1948    7626000
## 50     TX 1949    7623000
## 51     TX 1950    7776000
## 52     TX 1951    8111000
## 53     TX 1952    8314000
## 54     TX 1953    8336000
## 55     TX 1954    8382000
## 56     TX 1955    8660000
## 57     TX 1956    8830000
## 58     TX 1957    9070000
## 59     TX 1958    9252000
## 60     TX 1959    9405000
## 61     TX 1960    9624000
## 62     TX 1961    9820000
## 63     TX 1962   10053000
## 64     TX 1963   10159000
## 65     TX 1964   10270000
## 66     TX 1965   10378000
## 67     TX 1966   10492000
## 68     TX 1967   10599000
## 69     TX 1968   10819000
## 70     TX 1969   11045000
## 71     TX 1970   11198655
## 72     TX 1971   11509848
## 73     TX 1972   11759148
## 74     TX 1973   12019543
## 75     TX 1974   12268629
## 76     TX 1975   12568843
## 77     TX 1976   12904089
## 78     TX 1977   13193050
## 79     TX 1978   13500429
## 80     TX 1979   13888371
## 81     TX 1980   14338208
## 82     TX 1981   14746318
## 83     TX 1982   15331415
## 84     TX 1983   15751676
## 85     TX 1984   16007086
## 86     TX 1985   16272734
## 87     TX 1986   16561113
## 88     TX 1987   16621791
## 89     TX 1988   16667022
## 90     TX 1989   16806735
## 91     TX 1990   17044714
## 92     TX 1991   17339904
## 93     TX 1992   17650479
## 94     TX 1993   17996764
## 95     TX 1994   18338319
## 96     TX 1995   18679706
## 97     TX 1996   19006240
## 98     TX 1997   19355427
## 99     TX 1998   19712389
## 100    TX 1999   20044141
## 101    TX 2000   20944499
## 102    TX 2001   21319622
## 103    TX 2002   21690325
## 104    TX 2003   22030931
## 105    TX 2004   22394023
## 106    TX 2005   22778123
## 107    TX 2006   23359580
## 108    TX 2007   23831983
## 109    TX 2008   24309039
## 110    TX 2009   24801761
## 111    TX 2010   25241971
## 112    TX 2011   25645629
## 113    TX 2012   26084481
## 114    TX 2013   26480266
## 115    TX 2014   26964333
## 116    TX 2015   27470056
## 117    TX 2016   27914410
## 118    TX 2017   28295273
## 119    TX 2018   28628666
## 120    TX 2019   28995881
ggplot(poblacion_texas, aes(x=year, y=population)) +
geom_line() +
  labs(tittle="Población de Texas ", x="Año", y="Poblacion")

ts_texas<- ts(poblacion_texas$population, start = 1900, frequency=1) #serie de tiempo anual 

# ts_texas<- ts(poblacion_texas$population, start = c(1900,4) frecuency=4) 
#Serie de tiempo trimestral

# ts_texas<- ts(poblacion_texas$population, start = c(1900,8) frecuency=12) 
#Serie de tiempo mensual

arima_texas<-auto.arima(ts_texas)
summary(arima_texas)
## Series: ts_texas 
## ARIMA(0,2,2) 
## 
## Coefficients:
##           ma1      ma2
##       -0.5950  -0.1798
## s.e.   0.0913   0.0951
## 
## sigma^2 = 1.031e+10:  log likelihood = -1527.14
## AIC=3060.28   AICc=3060.5   BIC=3068.6
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE      MAPE      MASE
## Training set 12147.62 99818.31 59257.39 0.1046163 0.5686743 0.2672197
##                     ACF1
## Training set -0.02136734
pronostico_texas<-(forecast(arima_texas,level=95,h=10)) #Pronostico a 10 años h
pronostico_texas
##      Point Forecast    Lo 95    Hi 95
## 2020       29398472 29199487 29597457
## 2021       29806827 29463665 30149990
## 2022       30215183 29742956 30687410
## 2023       30623538 30024100 31222977
## 2024       31031894 30303359 31760429
## 2025       31440249 30579246 32301253
## 2026       31848605 30851090 32846119
## 2027       32256960 31118581 33395339
## 2028       32665316 31381587 33949044
## 2029       33073671 31640070 34507272
plot(pronostico_texas, main="Población en Texas")

##Ejercicio en clase Lunes 17: Mapa

#install.packages("forecast")
library(forecast)
library(tidyverse)
library(ggplot2)
#install.packages("maps")
library(maps)
#file.choose()
poblacion<- read.csv("C:/Users/ferna/Desktop/population.csv")

##Entender la base de datos

summary(poblacion)
##     state                year        population      
##  Length:6020        Min.   :1900   Min.   :   43000  
##  Class :character   1st Qu.:1930   1st Qu.:  901483  
##  Mode  :character   Median :1960   Median : 2359000  
##                     Mean   :1960   Mean   : 3726003  
##                     3rd Qu.:1990   3rd Qu.: 4541883  
##                     Max.   :2019   Max.   :39512223
str(poblacion)
## 'data.frame':    6020 obs. of  3 variables:
##  $ state     : chr  "AK" "AK" "AK" "AK" ...
##  $ year      : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ population: int  135000 158000 189000 205000 215000 222000 224000 231000 224000 224000 ...
head(poblacion)
##   state year population
## 1    AK 1950     135000
## 2    AK 1951     158000
## 3    AK 1952     189000
## 4    AK 1953     205000
## 5    AK 1954     215000
## 6    AK 1955     222000

##Crear un mapa

#Crear un mapa de EUA por década, con un gradiente verde-rojo de la población pos estado, desde 1950 hasta 2050
map(database="state")
map(database = "state",regions = "Texas", col = "red", fill=TRUE,add=TRUE)
map(database = "state",regions = "New York", col = "green", fill=TRUE,add=TRUE)

# Cargar librerías necesarias
library(ggplot2)
library(dplyr)
library(maps)
library(viridis)
## Loading required package: viridisLite
## 
## Attaching package: 'viridis'
## The following object is masked from 'package:maps':
## 
##     unemp
library(tidyr)
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:viridis':
## 
##     viridis_pal
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
# Simulación de datos de población (si no tienes datos reales)
set.seed(123)
años <- seq(1950, 2050, by = 10)
estados <- unique(map_data("state")$region)

poblacion <- expand.grid(region = estados, year = años) %>%
  mutate(population = round(runif(n(), min = 500000, max = 40000000), 0))

# Obtener datos del mapa de EE. UU.
states_map <- map_data("state")

# Unir datos de población con el mapa
map_data_pop <- left_join(states_map, poblacion, by = "region")
## Warning in left_join(states_map, poblacion, by = "region"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 1 of `x` matches multiple rows in `y`.
## ℹ Row 1 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
# Crear el mapa con la escala de colores de rojo a verde (mayor a menor población)
ggplot(map_data_pop, aes(x = long, y = lat, group = group, fill = population)) +
  geom_polygon(color = "white") +
  coord_fixed(1.3) +
  scale_fill_gradient(low = "green", high = "red", 
                      name = "Población", labels = scales::comma) + 
  facet_wrap(~year) +
  labs(title = "Población de EE. UU. por Estado (1950-2050)",
       subtitle = "Los estados más poblados están en rojo y los menos poblados en verde",
       x = "Longitud", y = "Latitud") +
  theme_minimal()

Actividad 2. Leche Saborizada Hershey’s

Instalamos paquetes necesarios

library(forecast)
library(tidyverse)
library(ggplot2)

Importar la base de datos

ventas<- read.csv("C:/Users/ferna/Desktop/Ventas_Históricas_Lechitas.csv")
View(ventas)

1. Modelo AutoARIMA

ts_ventas<-ts(ventas$Ventas, start = c(2017,1), frequency=12) 
autoplot(ts_ventas) + labs(title= "Ventas de Leche Saborizada Hershey's", x="Tiempo", y=" Miles de dolares")

arima_ventas<-auto.arima(ts_ventas)
summary(arima_ventas)
## Series: ts_ventas 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8980
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202700:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
## 
## Training set error measures:
##                    ME    RMSE      MAE        MPE      MAPE       MASE
## Training set 25.22163 343.863 227.1699 0.08059942 0.7069541 0.06491041
##                   ACF1
## Training set 0.2081043
pronostico_ventas<-(forecast(arima_ventas,level=95,h=12)) #Pronostico a 10 años h
pronostico_ventas
##          Point Forecast    Lo 95    Hi 95
## Jan 2020       35498.90 34616.48 36381.32
## Feb 2020       34202.17 33155.29 35249.05
## Mar 2020       36703.01 35596.10 37809.92
## Apr 2020       36271.90 35141.44 37402.36
## May 2020       37121.98 35982.07 38261.90
## Jun 2020       37102.65 35958.91 38246.40
## Jul 2020       37151.04 36005.74 38296.35
## Aug 2020       38564.65 37418.71 39710.59
## Sep 2020       38755.23 37609.03 39901.42
## Oct 2020       39779.03 38632.73 40925.33
## Nov 2020       38741.63 37595.29 39887.97
## Dec 2020       38645.86 37499.50 39792.22
autoplot(pronostico_ventas) + labs(title= "Pronóstico de ventas 2020 de Leche Saborizada Hershey's", x="Timepo", y="Miles de Dólares")

2. Modelo regresión lineal

ventas$mes <- 1:36
regresion_ventas<-lm(Ventas ~ mes, data = ventas)
summary(regresion_ventas)
## 
## Call:
## lm(formula = Ventas ~ mes, data = ventas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2075.79  -326.41    33.74   458.41  1537.04 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 24894.67     275.03   90.52   <2e-16 ***
## mes           298.37      12.96   23.02   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 808 on 34 degrees of freedom
## Multiple R-squared:  0.9397, Adjusted R-squared:  0.9379 
## F-statistic: 529.8 on 1 and 34 DF,  p-value: < 2.2e-16
siguiente_anio<-data.frame(mes=37:48)
prediccion_regresion<-predict(regresion_ventas, siguiente_anio)
prediccion_regresion
##        1        2        3        4        5        6        7        8 
## 35934.49 36232.86 36531.23 36829.61 37127.98 37426.35 37724.73 38023.10 
##        9       10       11       12 
## 38321.47 38619.85 38918.22 39216.59
plot(ventas$mes,ventas$Ventas,main = "Pronóstico de ventas 2020 de Leches Saborizadas Hershey's", xlabs="Tiempo", ylab = "Miles de Dólares") 
abline(regresion_ventas,col="blue")
points(siguiente_anio$mes, prediccion_regresion, col="red")

prediccion_reales<- predict(regresion_ventas, ventas)
MAPE <- mean(abs((ventas$Ventas - 
                    prediccion_reales)/ventas$Ventas))*100
MAPE
## [1] 2.011298

3. Conlusiones

El modelo más adecuado para la serie es SARIMA, con un MAPE de 0.70%. En contraste, la regresión lineal presenta un MAPE de 2.01%, indicando un menor ajuste a los datos.

Para el próximo año, la proyección de ventas es la siguiente:

Mes y Año Escenario Esperado Escenario Pesimista Esceneraio Optimista
Jan 2020 35498.90 34616.48 36381.32
Feb 2020 34202.17 33155.28 35249.05
Mar 2020 36703.01 35596.10 37809.92
Apr 2020 36271.90 35141.44 37402.36
May 2020 37121.98 35982.07 38261.90
Jun 2020 37102.65 35958.90 38246.40
Jul 2020 37151.04 36005.73 38296.34
Aug 2020 38564.64 37418.70 39710.58
Sep 2020 38755.22 37609.03 39901.42
Oct 2020 39779.02 38632.72 40925.32
ventas_anio<- read.csv("C:/Users/ferna/Desktop/ventas_por_anio.csv")
#ventas_anio<- read_csv("Desktop/Calses_8/R/DB/ventas_anio.csv")
ggplot(ventas_anio, aes(x=mes,y= ventas, col=as.factor(anio),group = anio )) + 
  geom_line() + 
  labs(title= "Ventas de Leche Saborizada Hershey's por Año", x="Mes", y="Miles de Doláres")

Nuestra recomendación sería realizar campañas publicitarias para aumentar el consumo de leche saborizada hershey’s para los meses de invierno que es cuando menos se consume. Para estos meses en cuestión, se puede ofrecer leche en polvo para consumir leche caliente.

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAyIg0KYXV0aG9yOiAiRmVybmFuZGEgU2FuY2hleiBHdXRpZXJyZXoiDQpkYXRlOiAiMjAyNS0wMi0xOSINCm91dHB1dDoNCiBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRSANCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFIA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KLS0tDQoNCiNFamVtcGxvIGVuIENsYXNlOiBQb2JsYWNpb24gDQohW10oQzovVXNlcnMvZmVybmEvRGVza3RvcC9wZXJzb25pdGFzLmdpZikNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmBgYA0KDQojI0Rlc2NhcmdhIGRlIGFyY2hpdm8NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojZmlsZS5jaG9vc2UoKQ0KcG9ibGFjaW9uPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2Zlcm5hL0Rlc2t0b3AvcG9wdWxhdGlvbi5jc3YiKQ0KYGBgDQoNCiMjRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcw0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnN1bW1hcnkocG9ibGFjaW9uKQ0Kc3RyKHBvYmxhY2lvbikNCmhlYWQocG9ibGFjaW9uKQ0KYGBgDQoNCg0KIyNTZXJpZSBkZSB0aWVtcG8gZGUgVGV4YXMNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwb2JsYWNpb25fdGV4YXM8LXBvYmxhY2lvbiAlPiUgZmlsdGVyKHN0YXRlPT0iVFgiKQ0KcG9ibGFjaW9uX3RleGFzDQoNCmdncGxvdChwb2JsYWNpb25fdGV4YXMsIGFlcyh4PXllYXIsIHk9cG9wdWxhdGlvbikpICsNCmdlb21fbGluZSgpICsNCiAgbGFicyh0aXR0bGU9IlBvYmxhY2nDs24gZGUgVGV4YXMgIiwgeD0iQcOxbyIsIHk9IlBvYmxhY2lvbiIpDQp0c190ZXhhczwtIHRzKHBvYmxhY2lvbl90ZXhhcyRwb3B1bGF0aW9uLCBzdGFydCA9IDE5MDAsIGZyZXF1ZW5jeT0xKSAjc2VyaWUgZGUgdGllbXBvIGFudWFsIA0KDQojIHRzX3RleGFzPC0gdHMocG9ibGFjaW9uX3RleGFzJHBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDQpIGZyZWN1ZW5jeT00KSANCiNTZXJpZSBkZSB0aWVtcG8gdHJpbWVzdHJhbA0KDQojIHRzX3RleGFzPC0gdHMocG9ibGFjaW9uX3RleGFzJHBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDgpIGZyZWN1ZW5jeT0xMikgDQojU2VyaWUgZGUgdGllbXBvIG1lbnN1YWwNCg0KYXJpbWFfdGV4YXM8LWF1dG8uYXJpbWEodHNfdGV4YXMpDQpzdW1tYXJ5KGFyaW1hX3RleGFzKQ0KcHJvbm9zdGljb190ZXhhczwtKGZvcmVjYXN0KGFyaW1hX3RleGFzLGxldmVsPTk1LGg9MTApKSAjUHJvbm9zdGljbyBhIDEwIGHDsW9zIGgNCnByb25vc3RpY29fdGV4YXMNCnBsb3QocHJvbm9zdGljb190ZXhhcywgbWFpbj0iUG9ibGFjacOzbiBlbiBUZXhhcyIpDQpgYGANCg0KDQojI0VqZXJjaWNpbyBlbiBjbGFzZSBMdW5lcyAxNzogTWFwYQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojaW5zdGFsbC5wYWNrYWdlcygiZm9yZWNhc3QiKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoIm1hcHMiKQ0KbGlicmFyeShtYXBzKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojZmlsZS5jaG9vc2UoKQ0KcG9ibGFjaW9uPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2Zlcm5hL0Rlc2t0b3AvcG9wdWxhdGlvbi5jc3YiKQ0KYGBgDQoNCiMjRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcw0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnN1bW1hcnkocG9ibGFjaW9uKQ0Kc3RyKHBvYmxhY2lvbikNCmhlYWQocG9ibGFjaW9uKQ0KYGBgDQoNCiMjQ3JlYXIgdW4gbWFwYQ0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNDcmVhciB1biBtYXBhIGRlIEVVQSBwb3IgZMOpY2FkYSwgY29uIHVuIGdyYWRpZW50ZSB2ZXJkZS1yb2pvIGRlIGxhIHBvYmxhY2nDs24gcG9zIGVzdGFkbywgZGVzZGUgMTk1MCBoYXN0YSAyMDUwDQptYXAoZGF0YWJhc2U9InN0YXRlIikNCm1hcChkYXRhYmFzZSA9ICJzdGF0ZSIscmVnaW9ucyA9ICJUZXhhcyIsIGNvbCA9ICJyZWQiLCBmaWxsPVRSVUUsYWRkPVRSVUUpDQptYXAoZGF0YWJhc2UgPSAic3RhdGUiLHJlZ2lvbnMgPSAiTmV3IFlvcmsiLCBjb2wgPSAiZ3JlZW4iLCBmaWxsPVRSVUUsYWRkPVRSVUUpDQoNCmBgYA0KYGBge3J9DQojIENhcmdhciBsaWJyZXLDrWFzIG5lY2VzYXJpYXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hcHMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShzY2FsZXMpDQoNCiMgU2ltdWxhY2nDs24gZGUgZGF0b3MgZGUgcG9ibGFjacOzbiAoc2kgbm8gdGllbmVzIGRhdG9zIHJlYWxlcykNCnNldC5zZWVkKDEyMykNCmHDsW9zIDwtIHNlcSgxOTUwLCAyMDUwLCBieSA9IDEwKQ0KZXN0YWRvcyA8LSB1bmlxdWUobWFwX2RhdGEoInN0YXRlIikkcmVnaW9uKQ0KDQpwb2JsYWNpb24gPC0gZXhwYW5kLmdyaWQocmVnaW9uID0gZXN0YWRvcywgeWVhciA9IGHDsW9zKSAlPiUNCiAgbXV0YXRlKHBvcHVsYXRpb24gPSByb3VuZChydW5pZihuKCksIG1pbiA9IDUwMDAwMCwgbWF4ID0gNDAwMDAwMDApLCAwKSkNCg0KIyBPYnRlbmVyIGRhdG9zIGRlbCBtYXBhIGRlIEVFLiBVVS4NCnN0YXRlc19tYXAgPC0gbWFwX2RhdGEoInN0YXRlIikNCg0KIyBVbmlyIGRhdG9zIGRlIHBvYmxhY2nDs24gY29uIGVsIG1hcGENCm1hcF9kYXRhX3BvcCA8LSBsZWZ0X2pvaW4oc3RhdGVzX21hcCwgcG9ibGFjaW9uLCBieSA9ICJyZWdpb24iKQ0KDQojIENyZWFyIGVsIG1hcGEgY29uIGxhIGVzY2FsYSBkZSBjb2xvcmVzIGRlIHJvam8gYSB2ZXJkZSAobWF5b3IgYSBtZW5vciBwb2JsYWNpw7NuKQ0KZ2dwbG90KG1hcF9kYXRhX3BvcCwgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gcG9wdWxhdGlvbikpICsNCiAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9maXhlZCgxLjMpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JlZW4iLCBoaWdoID0gInJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUG9ibGFjacOzbiIsIGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsgDQogIGZhY2V0X3dyYXAofnllYXIpICsNCiAgbGFicyh0aXRsZSA9ICJQb2JsYWNpw7NuIGRlIEVFLiBVVS4gcG9yIEVzdGFkbyAoMTk1MC0yMDUwKSIsDQogICAgICAgc3VidGl0bGUgPSAiTG9zIGVzdGFkb3MgbcOhcyBwb2JsYWRvcyBlc3TDoW4gZW4gcm9qbyB5IGxvcyBtZW5vcyBwb2JsYWRvcyBlbiB2ZXJkZSIsDQogICAgICAgeCA9ICJMb25naXR1ZCIsIHkgPSAiTGF0aXR1ZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij4gQWN0aXZpZGFkIDIuIExlY2hlIFNhYm9yaXphZGEgSGVyc2hleSdzPC9zcGFuPg0KDQoNCiFbXShDOi9Vc2Vycy9mZXJuYS9EZXNrdG9wL2xlY2hpdGEuZ2lmKQ0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+SW5zdGFsYW1vcyBwYXF1ZXRlcyBuZWNlc2FyaW9zPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+SW1wb3J0YXIgbGEgYmFzZSBkZSBkYXRvczwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp2ZW50YXM8LSByZWFkLmNzdigiQzovVXNlcnMvZmVybmEvRGVza3RvcC9WZW50YXNfSGlzdMOzcmljYXNfTGVjaGl0YXMuY3N2IikNClZpZXcodmVudGFzKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij4xLiBNb2RlbG8gQXV0b0FSSU1BPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRzX3ZlbnRhczwtdHModmVudGFzJFZlbnRhcywgc3RhcnQgPSBjKDIwMTcsMSksIGZyZXF1ZW5jeT0xMikgDQphdXRvcGxvdCh0c192ZW50YXMpICsgbGFicyh0aXRsZT0gIlZlbnRhcyBkZSBMZWNoZSBTYWJvcml6YWRhIEhlcnNoZXkncyIsIHg9IlRpZW1wbyIsIHk9IiBNaWxlcyBkZSBkb2xhcmVzIikNCg0KYXJpbWFfdmVudGFzPC1hdXRvLmFyaW1hKHRzX3ZlbnRhcykNCnN1bW1hcnkoYXJpbWFfdmVudGFzKQ0KcHJvbm9zdGljb192ZW50YXM8LShmb3JlY2FzdChhcmltYV92ZW50YXMsbGV2ZWw9OTUsaD0xMikpICNQcm9ub3N0aWNvIGEgMTAgYcOxb3MgaA0KcHJvbm9zdGljb192ZW50YXMNCmF1dG9wbG90KHByb25vc3RpY29fdmVudGFzKSArIGxhYnModGl0bGU9ICJQcm9uw7NzdGljbyBkZSB2ZW50YXMgMjAyMCBkZSBMZWNoZSBTYWJvcml6YWRhIEhlcnNoZXkncyIsIHg9IlRpbWVwbyIsIHk9Ik1pbGVzIGRlIETDs2xhcmVzIikNCg0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBicm93bjsiPjIuIE1vZGVsbyByZWdyZXNpw7NuIGxpbmVhbDwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp2ZW50YXMkbWVzIDwtIDE6MzYNCnJlZ3Jlc2lvbl92ZW50YXM8LWxtKFZlbnRhcyB+IG1lcywgZGF0YSA9IHZlbnRhcykNCnN1bW1hcnkocmVncmVzaW9uX3ZlbnRhcykNCnNpZ3VpZW50ZV9hbmlvPC1kYXRhLmZyYW1lKG1lcz0zNzo0OCkNCnByZWRpY2Npb25fcmVncmVzaW9uPC1wcmVkaWN0KHJlZ3Jlc2lvbl92ZW50YXMsIHNpZ3VpZW50ZV9hbmlvKQ0KcHJlZGljY2lvbl9yZWdyZXNpb24NCnBsb3QodmVudGFzJG1lcyx2ZW50YXMkVmVudGFzLG1haW4gPSAiUHJvbsOzc3RpY28gZGUgdmVudGFzIDIwMjAgZGUgTGVjaGVzIFNhYm9yaXphZGFzIEhlcnNoZXkncyIsIHhsYWJzPSJUaWVtcG8iLCB5bGFiID0gIk1pbGVzIGRlIETDs2xhcmVzIikgDQphYmxpbmUocmVncmVzaW9uX3ZlbnRhcyxjb2w9ImJsdWUiKQ0KcG9pbnRzKHNpZ3VpZW50ZV9hbmlvJG1lcywgcHJlZGljY2lvbl9yZWdyZXNpb24sIGNvbD0icmVkIikNCg0KcHJlZGljY2lvbl9yZWFsZXM8LSBwcmVkaWN0KHJlZ3Jlc2lvbl92ZW50YXMsIHZlbnRhcykNCk1BUEUgPC0gbWVhbihhYnMoKHZlbnRhcyRWZW50YXMgLSANCiAgICAgICAgICAgICAgICAgICAgcHJlZGljY2lvbl9yZWFsZXMpL3ZlbnRhcyRWZW50YXMpKSoxMDANCk1BUEUNCmBgYA0KDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij4zLiBDb25sdXNpb25lczwvc3Bhbj4NCg0KRWwgbW9kZWxvIG3DoXMgYWRlY3VhZG8gcGFyYSBsYSBzZXJpZSBlcyBTQVJJTUEsIGNvbiB1biBNQVBFIGRlIDAuNzAlLiBFbiBjb250cmFzdGUsIGxhIHJlZ3Jlc2nDs24gbGluZWFsIHByZXNlbnRhIHVuIE1BUEUgZGUgMi4wMSUsIGluZGljYW5kbyB1biBtZW5vciBhanVzdGUgYSBsb3MgZGF0b3MuDQoNClBhcmEgZWwgcHLDs3hpbW8gYcOxbywgbGEgcHJveWVjY2nDs24gZGUgdmVudGFzIGVzIGxhIHNpZ3VpZW50ZToNCg0KDQp8IE1lcyB5IEHDsW8gfCBFc2NlbmFyaW8gRXNwZXJhZG8gfCBFc2NlbmFyaW8gUGVzaW1pc3RhfCBFc2NlbmVyYWlvIE9wdGltaXN0YSB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogSmFuIDIwMjAJICB8ICAzNTQ5OC45MAkgICAgICAgICAgfCAgMzQ2MTYuNDgJICAgICAgICAgfCAzNjM4MS4zMgkNCiBGZWIgMjAyMAkgIHwgIDM0MjAyLjE3CSAgICAgICAgICB8ICAzMzE1NS4yOAkgICAgICAgICB8IDM1MjQ5LjA1CQ0KIE1hciAyMDIwCSAgfCAgMzY3MDMuMDEJICAgICAgICAgIHwgIDM1NTk2LjEwCSAgICAgICAgIHwgMzc4MDkuOTIJDQogQXByIDIwMjAJICB8ICAzNjI3MS45MAkgICAgICAgICAgfCAgMzUxNDEuNDQJICAgICAgICAgfCAzNzQwMi4zNgkNCiBNYXkgMjAyMAkgIHwgIDM3MTIxLjk4CSAgICAgICAgICB8ICAzNTk4Mi4wNwkgICAgICAgICB8IDM4MjYxLjkwCQ0KIEp1biAyMDIwCSAgfCAgMzcxMDIuNjUJICAgICAgICAgIHwgIDM1OTU4LjkwCSAgICAgICAgIHwgMzgyNDYuNDAJDQogSnVsIDIwMjAJICB8ICAzNzE1MS4wNAkgICAgICAgICAgfCAgMzYwMDUuNzMJICAgICAgICAgfCAzODI5Ni4zNAkNCiBBdWcgMjAyMAkgIHwgIDM4NTY0LjY0CSAgICAgICAgICB8ICAzNzQxOC43MAkgICAgICAgICB8IDM5NzEwLjU4CQ0KIFNlcCAyMDIwCSAgfCAgMzg3NTUuMjIJICAgICAgICAgIHwgIDM3NjA5LjAzCSAgICAgICAgIHwgMzk5MDEuNDIJDQogT2N0IDIwMjAJICB8ICAzOTc3OS4wMgkgICAgICAgICAgfCAgMzg2MzIuNzIJICAgICAgICAgfCA0MDkyNS4zMgkNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnZlbnRhc19hbmlvPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2Zlcm5hL0Rlc2t0b3AvdmVudGFzX3Bvcl9hbmlvLmNzdiIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiN2ZW50YXNfYW5pbzwtIHJlYWRfY3N2KCJEZXNrdG9wL0NhbHNlc184L1IvREIvdmVudGFzX2FuaW8uY3N2IikNCmdncGxvdCh2ZW50YXNfYW5pbywgYWVzKHg9bWVzLHk9IHZlbnRhcywgY29sPWFzLmZhY3RvcihhbmlvKSxncm91cCA9IGFuaW8gKSkgKyANCiAgZ2VvbV9saW5lKCkgKyANCiAgbGFicyh0aXRsZT0gIlZlbnRhcyBkZSBMZWNoZSBTYWJvcml6YWRhIEhlcnNoZXkncyBwb3IgQcOxbyIsIHg9Ik1lcyIsIHk9Ik1pbGVzIGRlIERvbMOhcmVzIikNCmBgYA0KDQpOdWVzdHJhIHJlY29tZW5kYWNpw7NuIHNlcsOtYSByZWFsaXphciBjYW1wYcOxYXMgcHVibGljaXRhcmlhcyBwYXJhIGF1bWVudGFyIGVsIGNvbnN1bW8gZGUgbGVjaGUgc2Fib3JpemFkYSBoZXJzaGV5J3MgcGFyYSBsb3MgbWVzZXMgZGUgaW52aWVybm8gcXVlIGVzIGN1YW5kbyBtZW5vcyBzZSBjb25zdW1lLiBQYXJhIGVzdG9zIG1lc2VzIGVuIGN1ZXN0acOzbiwgc2UgcHVlZGUgb2ZyZWNlciBsZWNoZSBlbiBwb2x2byBwYXJhIGNvbnN1bWlyIGxlY2hlIGNhbGllbnRlLg0KDQo=