Serie de tiempo

Instalar paquetes y llamar librerías

#install.packages("forecast")
library(forecast)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("maps")
library(maps)

Importar la base de datos

poblacion <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\Generación de escenarios futuros_MOD1\\population.csv")

Análisis descriptivo

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 en Texas

poblacion_texas <- poblacion %>% filter(state == "TX")
ggplot(poblacion_texas, aes(x=year, y=population)) + geom_line() +
  labs (title = "Población de Texas", x = "Año", y = "Población")

ts_texas <- ts(poblacion_texas$population, start=1900, frequency=1) #Cada año un dato # Formato serie de tiempo
               
# ts_texas <- ts(poblacion_texas$population, start=c (1900,4), frequency = 4 #La serie arranca en el trimestre 4 y cada año hay 4 registros 

# ts_texas <- ts(poblacion_texas$population, start=c (1900,8), frequency = 12 #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) #h = num predicciones

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")

Mapa

Instalar paquetes y llamar librerías

#install.packages("forecast")
library(forecast)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("maps")
library(maps)
#install.packages("readxl")
library ("readxl")

Análisis descriptivo

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

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)

Actividad 2. Leche Saborizada Hershey’s

Instalar paquetes y llamar librerías

#install.packages("forecast")
library(forecast)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("maps")
library(maps)

Importar la base de datos

ventas <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\Generación de escenarios futuros_MOD1\\Ventas_Históricas_Lechitas.csv")

1. Modelo AUTO.ARIMA

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 Dólares")

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_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="Tiempo", 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 Leche Saborizada Hershey's", xlab="Tiempo", ylab="Miles de Dólares")
abline(regresion_ventas, col ="blue")
points(siguiente_anio$mes, prediccion_regresion, col = "red")

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

3. Conclusiones

El mejor modelo que se adapta a la serie es el SARIMA con un MAPE de 0.70, comparado con la Regresión Lineal que su MAPE es de 2.01%.

ventas_por_anio <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\Generación de escenarios futuros_MOD1\\ventas_por_anio (2).csv")
ggplot(ventas_por_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 Dólares")

Nuestra recomendación sería realizar campañas publicitarias para aumentar el consumo de leche saborizada Hershey’s en el primer semestre del año.

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAyIHwgTW9kdWxvIDEiDQphdXRob3I6ICJLYXRoaWEgR2VyYWxkaW5lIFJ1aXogQ2FzdGVsw6FuIC0gQTAxNTcxMDk0Ig0KZGF0ZTogIjIwMjUtMDItMTgiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogY2VydWxlYW4NCi0tLQ0KDQohW10oQzpcXFVzZXJzXFxrYXRoaVxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXEdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvc19NT0QxXFx1c2EuZ2lmKQ0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5TZXJpZSBkZSB0aWVtcG88L3NwYW4+DQoNCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikNCmxpYnJhcnkoZm9yZWNhc3QpDQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoIm1hcHMiKQ0KbGlicmFyeShtYXBzKQ0KYGBgDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBvYmxhY2lvbiA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxrYXRoaVxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXEdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvc19NT0QxXFxwb3B1bGF0aW9uLmNzdiIpDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkFuw6FsaXNpcyBkZXNjcmlwdGl2bzwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzdW1tYXJ5KHBvYmxhY2lvbikNCnN0cihwb2JsYWNpb24pDQpoZWFkKHBvYmxhY2lvbikNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+U2VyaWUgZGUgdGllbXBvIGVuIFRleGFzPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBvYmxhY2lvbl90ZXhhcyA8LSBwb2JsYWNpb24gJT4lIGZpbHRlcihzdGF0ZSA9PSAiVFgiKQ0KZ2dwbG90KHBvYmxhY2lvbl90ZXhhcywgYWVzKHg9eWVhciwgeT1wb3B1bGF0aW9uKSkgKyBnZW9tX2xpbmUoKSArDQogIGxhYnMgKHRpdGxlID0gIlBvYmxhY2nDs24gZGUgVGV4YXMiLCB4ID0gIkHDsW8iLCB5ID0gIlBvYmxhY2nDs24iKQ0KDQp0c190ZXhhcyA8LSB0cyhwb2JsYWNpb25fdGV4YXMkcG9wdWxhdGlvbiwgc3RhcnQ9MTkwMCwgZnJlcXVlbmN5PTEpICNDYWRhIGHDsW8gdW4gZGF0byAjIEZvcm1hdG8gc2VyaWUgZGUgdGllbXBvDQogICAgICAgICAgICAgICANCiMgdHNfdGV4YXMgPC0gdHMocG9ibGFjaW9uX3RleGFzJHBvcHVsYXRpb24sIHN0YXJ0PWMgKDE5MDAsNCksIGZyZXF1ZW5jeSA9IDQgI0xhIHNlcmllIGFycmFuY2EgZW4gZWwgdHJpbWVzdHJlIDQgeSBjYWRhIGHDsW8gaGF5IDQgcmVnaXN0cm9zIA0KDQojIHRzX3RleGFzIDwtIHRzKHBvYmxhY2lvbl90ZXhhcyRwb3B1bGF0aW9uLCBzdGFydD1jICgxOTAwLDgpLCBmcmVxdWVuY3kgPSAxMiAjTWVuc3VhbA0KDQphcmltYV90ZXhhcyA8LSBhdXRvLmFyaW1hICh0c190ZXhhcykNCnN1bW1hcnkoYXJpbWFfdGV4YXMpDQoNCnByb25vc3RpY29fdGV4YXMgPC0gZm9yZWNhc3QoYXJpbWFfdGV4YXMsIGxldmVsPTk1LCBoPTEwKSAjaCA9IG51bSBwcmVkaWNjaW9uZXMNCg0KcHJvbm9zdGljb190ZXhhcw0KcGxvdChwcm9ub3N0aWNvX3RleGFzLCBtYWluID0gIlBvYmxhY2nDs24gZW4gVGV4YXMiKQ0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5NYXBhPC9zcGFuPg0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoZ2dwbG90MikNCiNpbnN0YWxsLnBhY2thZ2VzKCJtYXBzIikNCmxpYnJhcnkobWFwcykNCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQ0KbGlicmFyeSAoInJlYWR4bCIpDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+QW7DoWxpc2lzIGRlc2NyaXB0aXZvPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnN1bW1hcnkocG9ibGFjaW9uKQ0Kc3RyKHBvYmxhY2lvbikNCmhlYWQocG9ibGFjaW9uKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkNyZWFyIHVuIG1hcGE8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbWFwKGRhdGFiYXNlID0gInN0YXRlIikNCm1hcChkYXRhYmFzZSA9ICJzdGF0ZSIsIHJlZ2lvbnMgPSAiVGV4YXMiLCBjb2wgPSAicmVkIiwgZmlsbCA9IFRSVUUsIGFkZCA9IFRSVUUpDQptYXAoZGF0YWJhc2UgPSAic3RhdGUiLCByZWdpb25zID0gIk5ldyBZb3JrIiwgY29sID0gImdyZWVuIiwgZmlsbCA9IFRSVUUsIGFkZCA9IFRSVUUpDQpgYGANCg0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBicm93bjsiPkFjdGl2aWRhZCAyLiBMZWNoZSBTYWJvcml6YWRhIEhlcnNoZXknczwvc3Bhbj4NCg0KDQohW10oQzpcXFVzZXJzXFxrYXRoaVxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXEdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvc19NT0QxXFxjaG9jb21pbGsuZ2lmKQ0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBicm93bjsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikNCmxpYnJhcnkoZm9yZWNhc3QpDQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoIm1hcHMiKQ0KbGlicmFyeShtYXBzKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij5JbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnZlbnRhcyA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxrYXRoaVxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXEdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvc19NT0QxXFxWZW50YXNfSGlzdMOzcmljYXNfTGVjaGl0YXMuY3N2IikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+MS4gTW9kZWxvIEFVVE8uQVJJTUE8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdHNfdmVudGFzIDwtIHRzKHZlbnRhcyRWZW50YXMsIHN0YXJ0PWMoMjAxNywxKSwgZnJlcXVlbmN5PTEyKQ0KYXV0b3Bsb3QodHNfdmVudGFzKSArIGxhYnModGl0bGU9ICJWZW50YXMgZGUgTGVjaGUgU2Fib3JpemFkYSBIZXJzaGV5J3MiLCB4PSJUaWVtcG8iLCB5PSJNaWxlcyBkZSBEw7NsYXJlcyIpDQoNCmFyaW1hX3ZlbnRhcyA8LSBhdXRvLmFyaW1hKHRzX3ZlbnRhcykNCnN1bW1hcnkoYXJpbWFfdmVudGFzKQ0KDQpwcm9ub3N0aWNvX3ZlbnRhcyA8LSBmb3JlY2FzdChhcmltYV92ZW50YXMsIGxldmVsPTk1LCBoPTEyKQ0KcHJvbm9zdGljb192ZW50YXMNCg0KYXV0b3Bsb3QocHJvbm9zdGljb192ZW50YXMpICsgbGFicyh0aXRsZT0gIlByb27Ds3N0aWNvIGRlIFZlbnRhcyAyMDIwIGRlIExlY2hlIFNhYm9yaXphZGEgSGVyc2hleSdzIiwgeD0iVGllbXBvIiwgeT0iTWlsZXMgZGUgRMOzbGFyZXMiKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij4yLiBNb2RlbG8gUmVncmVzacOzbiBMaW5lYWw8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdmVudGFzJG1lcyA8LSAxOjM2DQpyZWdyZXNpb25fdmVudGFzIDwtIGxtKFZlbnRhcyB+IG1lcywgZGF0YT12ZW50YXMpDQpzdW1tYXJ5KHJlZ3Jlc2lvbl92ZW50YXMpDQpzaWd1aWVudGVfYW5pbyA8LSBkYXRhLmZyYW1lKG1lcz0zNzo0OCkNCnByZWRpY2Npb25fcmVncmVzaW9uIDwtIHByZWRpY3QocmVncmVzaW9uX3ZlbnRhcywgc2lndWllbnRlX2FuaW8pDQpwcmVkaWNjaW9uX3JlZ3Jlc2lvbg0KcGxvdCh2ZW50YXMkbWVzLCB2ZW50YXMkVmVudGFzLCBtYWluPSJQcm9uw7NzdGljbyBkZSBWZW50YXMgMjAyMCBkZSBMZWNoZSBTYWJvcml6YWRhIEhlcnNoZXkncyIsIHhsYWI9IlRpZW1wbyIsIHlsYWI9Ik1pbGVzIGRlIETDs2xhcmVzIikNCmFibGluZShyZWdyZXNpb25fdmVudGFzLCBjb2wgPSJibHVlIikNCnBvaW50cyhzaWd1aWVudGVfYW5pbyRtZXMsIHByZWRpY2Npb25fcmVncmVzaW9uLCBjb2wgPSAicmVkIikNCg0KcHJlZGljY2lvbmVzX3JlYWxlcyA8LSBwcmVkaWN0KHJlZ3Jlc2lvbl92ZW50YXMsIHZlbnRhcykNCk1BUEUgPC0gbWVhbihhYnMoKHZlbnRhcyRWZW50YXMgLSBwcmVkaWNjaW9uZXNfcmVhbGVzKS92ZW50YXMkVmVudGFzKSkqMTAwDQpNQVBFDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBicm93bjsiPjMuIENvbmNsdXNpb25lczwvc3Bhbj4NCkVsIG1lam9yIG1vZGVsbyBxdWUgc2UgYWRhcHRhIGEgbGEgc2VyaWUgZXMgZWwgKlNBUklNQSogY29uIHVuIE1BUEUgZGUgMC43MCwgY29tcGFyYWRvIGNvbiBsYSBSZWdyZXNpw7NuIExpbmVhbCBxdWUgc3UgTUFQRSBlcyBkZSAyLjAxJS4gIA0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnZlbnRhc19wb3JfYW5pbyA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxrYXRoaVxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXEdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvc19NT0QxXFx2ZW50YXNfcG9yX2FuaW8gKDIpLmNzdiIpDQpnZ3Bsb3QodmVudGFzX3Bvcl9hbmlvLCBhZXMoeD1tZXMsIHk9dmVudGFzLA0KY29sPWFzLmZhY3RvcihhbmlvKSwgZ3JvdXA9YW5pbykpICsgDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJWZW50YXMgZGUgTGVjaGUgU2Fib3JpemFkYSBIZXJzaGV5J3MgcG9yIEHDsW8iLCB4PSJNZXMiLCB5PSJNaWxlcyBkZSBEw7NsYXJlcyIpDQpgYGANCg0KTnVlc3RyYSByZWNvbWVuZGFjacOzbiBzZXLDrWEgcmVhbGl6YXIgY2FtcGHDsWFzIHB1YmxpY2l0YXJpYXMgcGFyYSBhdW1lbnRhciBlbCBjb25zdW1vIGRlIGxlY2hlIHNhYm9yaXphZGEgSGVyc2hleSdzIGVuIGVsIHByaW1lciBzZW1lc3RyZSBkZWwgYcOxby4NCg0K