Actividad 2. Generación de escenarios futuros con modelos de pronósticos en series de tiempo.

2024-02-28

Alexa Mariana Marin Villar A00831342

Actividad en clase

Concepto

Una serie de tiempo es una colección de observaciones sobre un determinado fenómeno, efectuadas en momentos sucesivos, usualmente equiespaciados.

Ejemplos de series de tiempo:

  1. Precios de acciones

  2. Niveles de inventario

  3. Rotación de personal

  4. Ventas

  5. PIB(GDP)

Mas información: libro

Instalar y llamar paquetes

library(readr)
library(forecast)

Crear la serie de tiempo

Ejemplo: Los siguientes datos de produccion trimestral inician en el primer trimestre del 2020.

Se busca pronosticar la producción de los siguientes 5 trimestres.

produccion <- c(50,53,55,57,55,60)
ts <- ts(data= produccion, start= c(2020,3),frequency = 4)
ts 
##      Qtr1 Qtr2 Qtr3 Qtr4
## 2020             50   53
## 2021   55   57   55   60

Crear un modelo ARIMA

ARIMA significa Autoregressive Integraded moving average o Modelo Autorregresivo integrado de promedio movil.

arima <- auto.arima(ts, D=1)

summary(arima)
## Series: ts 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
## 
## Training set error measures:
##                      ME      RMSE       MAE        MPE      MAPE       MASE
## Training set 0.03333332 0.5787923 0.3666667 0.03685269 0.6429133 0.06111111
##                    ACF1
## Training set -0.5073047

AIC (Akaike Information Criterion) es una medida que se utiliza en estadísticas y modelado para seleccionar el mejor modelo entre un conjunto de modelos candidatos en este caso es de 9.68.

Generar el pronóstico

  • Si el ejercicio no especifica se utiliza un 95% de confianza

  • h = el numero de años,meses,trimestres que se buscan pronosticar

pronostico <- forecast(arima,level=c(95), h=5)
pronostico
##         Point Forecast    Lo 95    Hi 95
## 2022 Q1             61 58.22127 63.77873
## 2022 Q2             63 60.22127 65.77873
## 2022 Q3             61 58.22127 63.77873
## 2022 Q4             66 63.22127 68.77873
## 2023 Q1             67 63.07028 70.92972
plot(pronostico)

En este ejercicio de práctica se puede observar un crecimiento dentro de los siguientes trimestres del 2022 y el primer trimestre del 2023 con distintas fluctuaciones de la producción.

Actividad 2 - Hershey’s

Hershey’s México empresa chocolatera con más de 100 años de historia a nivel global (fundación 1903) y establecida en México desde 1969, como una de confitería entre Hershey Food Corporation y Anderson Clayton & Co. S.A. formando Nacional de Dulces S.A. de C.V. en el Distrito Federal y después de 12 años cambiando sus instalaciones a El Salto, Jalisco e iniciando operaciones en el mes de febrero de 1981.

Fuente: Hypofutures en Pixabay, 2017

Datos proporcionados:

Ventas históricas de leche saborizada Hershey México (Miles de dólares) mensuales del 2017 al 2019.

Importar base de datos

lechitas <- read_csv("C:/Users/alexa/OneDrive/YO/Ventas_Históricas_Lechitas.csv")
ts1 <- ts(data = lechitas$Ventas, start=c(2017,1),frequency = 12)
ts1
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2017 25520.51 23740.11 26253.58 25868.43 27072.87 27150.50 27067.10 28145.25
## 2018 28463.69 26996.11 29768.20 29292.51 29950.68 30099.17 30851.26 32271.76
## 2019 32496.44 31287.28 33376.02 32949.77 34004.11 33757.89 32927.30 34324.12
##           Sep      Oct      Nov      Dec
## 2017 27546.29 28400.37 27441.98 27852.47
## 2018 31940.74 32995.93 32197.12 31984.82
## 2019 35151.28 36133.07 34799.91 34846.17

Crear un modelo ARIMA

ARIMA significa Autoregressive Integraded moving average o Modelo Autorregresivo integrado de promedio movil. PQD

arima2 <- auto.arima(ts1, D=1)
summary(arima2)
## Series: ts1 
## 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

AIC (Akaike Information Criterion) de 371

Generar el pronóstico

pronostico2 <- forecast(arima2,level=c(95), h=12)
pronostico2
##          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
plot(pronostico2)

En este caso, se puede observar un crecimiento positivo con distintas fluctuaciones entre los meses pronosticados para el 2020. El valor esperado de ventas, como ejemplo para enero de 2020, es de 35498.90, con un crecimiento del 1.87% en comparación con las ventas de diciembre de 2019. El valor pesimista es de 34616.48 y el valor optimista es de 36381.32.

Actividad 3 -Finanzas corporativas

Información disponible

Con la función finreportr podemos obtener la siguiente información:

  • CompanyInfo() = brinda información general como Nombre,Ubicación,ZIP etc.

  • AnnualReports() = Brinda el nombre, fecha y número de acceso.

  • GetIncome() = (Estado de resultados) Brinda el estado de resultados

  • GetBalanceSheet = Brinda el Balance general.

  • GetCashFlow() = Brinda el Flujo de efectivo.

Ejemplo de clase

# Nombre, correo
options(HTTPUserAgent ="a a@gmail.com")
CompanyInfo("TGT")
##       company        CIK  SIC state state.inc FY.end     street.address
## 1 TARGET CORP 0000027419 5331    MN        MN   0201 1000 NICOLLET MALL
##             city.state
## 1 MINNEAPOLIS MN 55403
AnnualReports("BABA", foreign = TRUE)
##    filing.name filing.date         accession.no
## 1       20-F/A  2024-02-23 0001193125-24-044480
## 2         20-F  2023-07-21 0000950170-23-033752
## 3         20-F  2022-07-26 0001104659-22-082622
## 4         20-F  2021-07-27 0001104659-21-096092
## 5         20-F  2020-07-09 0001104659-20-082409
## 6         20-F  2019-06-05 0001047469-19-003492
## 7         20-F  2018-07-27 0001047469-18-005257
## 8         20-F  2017-06-15 0001047469-17-004019
## 9         20-F  2016-05-24 0001047469-16-013400
## 10        20-F  2015-06-25 0001047469-15-005768
#Viene de tres años (se pueden juntar los años y hacer una bd para hacer una serie de tiempo)
google_income <- GetIncome("AMZN", 2016)
amazon_balance <- GetBalanceSheet("AMZN", 2015)
apple_cash <- GetCashFlow("AAPL", 2014)

Análisis Financiero de Empresa

EQUIPO 6

  • Alexa Mariana Marin Villar A00831342

  • Diego Martínez Ruibal A01740559

  • Oscar Emiliano Melendez Chavez A01276802

Amazon

Se busca encontrar una variable de interés dentro de la información del estado de resultados, balance general y el flujo de efectivo de la empresa Amazon dentro de un rango de años desde 2010 hasta 2016.

options(HTTPUserAgent ="a a@gmail.com")
#CompanyInfo("AMZN")
#AnnualReports("AMZN")
amazon_income1 <- GetIncome("AMZN", 2013)
amazon_income2 <- GetIncome("AMZN", 2015)
amazon_income3 <- GetIncome("AMZN", 2017)
#amazon_balance1 <- GetBalanceSheet("AMZN", 2013)
#amazon_balance2 <- GetBalanceSheet("AMZN", 2015)
#amazon_balance3 <- GetBalanceSheet("AMZN", 2017)
#amazon_cash1 <- GetCashFlow("AMZN", 2013)
#amazon_cash2 <- GetCashFlow("AMZN", 2015)
#amazon_cash3 <- GetCashFlow("AMZN", 2017)

Decidimos utilizar el estado de resultados ya que creemos que al mostrar información financiera en general sobre el estado de las ganancias,pérdidas y gastos de la empresa podemos llegar a comprender cómo es el negocio en el ámbito operacional.

Unir estado de resultados de los años 2010-2016 y elegir la variable de interés a modelar y pronosticar

amzn_income_completo <- rbind(amazon_income1,amazon_income2)
amzn_income_completo2 <- rbind(amzn_income_completo,amazon_income3)

La variable de interés elegida es la de Marketing expenses que se encuentra dentro del estado de resultados.

Crear un modelo ARIMA

En este caso, se decidío crear un modelo ARIMA especificamente sobre los gastos de publicidad. Sucesivamente, se busca analizar las tendencias recurrentes de esta variable y predecir durante los próximos 3 años cuál es el pronóstico de estos gastos.

amzn_income_completo2 <- filter(amzn_income_completo2, Metric == "Marketing Expense")
amzn_income_completo2
##              Metric       Units     Amount  startDate    endDate
## 1 Marketing Expense iso4217_USD 1029000000 2010-01-01 2010-12-31
## 2 Marketing Expense iso4217_USD 1630000000 2011-01-01 2011-12-31
## 3 Marketing Expense iso4217_USD 2408000000 2012-01-01 2012-12-31
## 4 Marketing Expense         usd 2408000000 2012-01-01 2012-12-31
## 5 Marketing Expense         usd 3133000000 2013-01-01 2013-12-31
## 6 Marketing Expense         usd 4332000000 2014-01-01 2014-12-31
## 7 Marketing Expense         usd 4332000000 2014-01-01 2014-12-31
## 8 Marketing Expense         usd 5254000000 2015-01-01 2015-12-31
## 9 Marketing Expense         usd 7233000000 2016-01-01 2016-12-31

Crear modelo de series de tiempo

Se decidio primeramente analizar la información anual para identificar de mejor manera el crecimiento del gasto de publicidad.

amzn_income_completo2$Amount <- as.numeric(amzn_income_completo2$Amount)
tsestado <- ts(data = amzn_income_completo2$Amount, start=c(2010,1),end=c(2016,1),frequency=1)
tsestado
## Time Series:
## Start = 2010 
## End = 2016 
## Frequency = 1 
## [1] 1.029e+09 1.630e+09 2.408e+09 2.408e+09 3.133e+09 4.332e+09 4.332e+09

Modelo ARIMA

arimaestado <- auto.arima(tsestado, D=1)
summary(arimaestado)
## Series: tsestado 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##           drift
##       550500000
## s.e.  181203314
## 
## sigma^2 = 2.223e+17:  log likelihood = -127.79
## AIC=259.59   AICc=263.59   BIC=259.17
## 
## Training set error measures:
##                    ME      RMSE       MAE        MPE     MAPE      MASE
## Training set 68357.11 398463070 314639786 -0.3481406 9.814446 0.5715527
##                    ACF1
## Training set -0.4081859

AIC (Akaike Information Criterion) de 259.59. (anual)

Generar el pronóstico

pronosticoestado <- forecast(arimaestado,level=c(95), h=5)
pronosticoestado
##      Point Forecast      Lo 95      Hi 95
## 2017     4882500000 3958439969 5806560031
## 2018     5433000000 4126181771 6739818229
## 2019     5983500000 4382981077 7584018923
## 2020     6534000000 4685879938 8382120062
## 2021     7084500000 5018238955 9150761045
plot(pronosticoestado)

Generar el pronóstico trimestral

Se decidio analizar además la información por trimestres debido a que es una manera más sencilla de identificar patrones y tendencias, además para una mejor comparación entre distintos períodos de tiempo.

summary(arimaestado2)
## Series: tsestado2 
## ARIMA(0,0,0)(0,1,0)[4] 
## 
## sigma^2 = 9.63e+18:  log likelihood = -558.59
## AIC=1119.18   AICc=1119.36   BIC=1120.36
## 
## Training set error measures:
##                     ME       RMSE        MAE       MPE     MAPE      MASE
## Training set 370731250 2872959327 2560374107 -38.45881 99.51503 0.8572322
##                   ACF1
## Training set 0.3460414
## **Modelo ARIMA**
pronosticoestado2 <- forecast(arimaestado2,level=c(95), h=12)
pronosticoestado2
##         Point Forecast       Lo 95       Hi 95
## 2017 Q1      4.332e+09 -1750063688 10414063688
## 2017 Q2      5.254e+09  -828063688 11336063688
## 2017 Q3      7.233e+09  1150936312 13315063688
## 2017 Q4      1.029e+09 -5053063688  7111063688
## 2018 Q1      4.332e+09 -4269336955 12933336955
## 2018 Q2      5.254e+09 -3347336955 13855336955
## 2018 Q3      7.233e+09 -1368336955 15834336955
## 2018 Q4      1.029e+09 -7572336955  9630336955
## 2019 Q1      4.332e+09 -6202443323 14866443323
## 2019 Q2      5.254e+09 -5280443323 15788443323
## 2019 Q3      7.233e+09 -3301443323 17767443323
## 2019 Q4      1.029e+09 -9505443323 11563443323
plot(pronosticoestado2)

Hallazgos

-En cuanto la tendencia anual podemos observar una tendencía líneal positiva, esto quiere decir que año con año el gasto de marketing ha ido aumentando. En el contexto preciso de Amazon tiene todo el sentido debido a que Amazon durante los ultimos 20 años ha sido una de la empresas con mayor creciemiento de ventas . Por lo tanto entre mayores ventas, mayor presupesto destinado al marketing.

-En cuanto al analisis por trimestres con este pronóstico, podemos tener una idea sobre lo que puede llegar a ocurrir en los próximos trimestres dentro de 3 años. Los resultados tiene un 95% de confianza pero pueden llegar a variar entre más altos o bajo. Tomando en cuenta el Point forecast se puede observar que dentro de los meses en el cuartil 4 existe una tendencia a que los gastos de mercadotecnia bajen. Esto puede ser porque son los meses de Octubre, Noviembre y Diciembre, cuando empiezan las compras navideñas, festividades, y eventos como el Black Friday y el Cyber Monday. En algunas empresas, puede ser el caso que recurran a un aumento en los gastos de mercadotecnia y publicidad. Pero específicamente en el caso de Amazon, al ser una de las plataformas más grandes y reconocidas de ecommerce, pueden llegar a reducir sus gastos de marketing durante este período porque la demanda es naturalmente alta y no requiere tanto impulso publicitario.

-A su vez los gastos de marketing aumentan significativamente durante el primer cuartil, y esto puede ser que, al pasar las festividades y los gastos más fuertes, los clientes compran relativamente menos, lo que afecta directamente los gastos de la empresa. Por lo tanto, deben invertir más en sus gastos de publicidad.

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAyLiBHZW5lcmFjacOzbiBkZSBlc2NlbmFyaW9zIGZ1dHVyb3MgY29uIG1vZGVsb3MgZGUgcHJvbsOzc3RpY29zIGVuIHNlcmllcyBkZSB0aWVtcG8uIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpkb3duY3V0ZToNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIGRlZmF1bHRfc3R5bGU6ICJsaWdodCINCiAgICBkb3duY3V0ZV90aGVtZTogImRlZmF1bHQiDQogICAgY29kZV9kb3dubG9hZCA6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KKipBbGV4YSBNYXJpYW5hIE1hcmluIFZpbGxhciBBMDA4MzEzNDIqKg0KDQohW10oZ2lwaHklMjAoMikuZ2lmKQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMjIEdsb2JhbCBvcHRpb25zDQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGUgPSBUUlVFLGVjaG8gPSBUUlVFLHdhcm5pbmcgPSBGQUxTRSxtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KIyAqKkFjdGl2aWRhZCBlbiBjbGFzZSoqDQoNCiMjICoqQ29uY2VwdG8qKg0KDQpVbmEgKipzZXJpZSBkZSB0aWVtcG8qKiBlcyB1bmEgY29sZWNjacOzbiBkZSBvYnNlcnZhY2lvbmVzIHNvYnJlIHVuIGRldGVybWluYWRvIGZlbsOzbWVubywgZWZlY3R1YWRhcyBlbiBtb21lbnRvcyBzdWNlc2l2b3MsIHVzdWFsbWVudGUgZXF1aWVzcGFjaWFkb3MuDQoNCkVqZW1wbG9zIGRlIHNlcmllcyBkZSB0aWVtcG86DQoNCjEuICBQcmVjaW9zIGRlIGFjY2lvbmVzDQoNCjIuICBOaXZlbGVzIGRlIGludmVudGFyaW8NCg0KMy4gIFJvdGFjacOzbiBkZSBwZXJzb25hbA0KDQo0LiAgVmVudGFzDQoNCjUuICBQSUIoKkdEUCopDQoNCk1hcyBpbmZvcm1hY2nDs246IFsqKmxpYnJvKipdKGh0dHBzOi8vcjRkcy5oYWRsZXkubnovKQ0KDQojIyAqKkluc3RhbGFyIHkgbGxhbWFyIHBhcXVldGVzKioNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmBgYA0KDQojIyAqKkNyZWFyIGxhIHNlcmllIGRlIHRpZW1wbyoqDQoNCioqRWplbXBsbyoqOiBMb3Mgc2lndWllbnRlcyBkYXRvcyBkZSBwcm9kdWNjaW9uIHRyaW1lc3RyYWwgaW5pY2lhbiBlbiBlbCBwcmltZXIgdHJpbWVzdHJlIGRlbCAyMDIwLg0KDQpTZSBidXNjYSBwcm9ub3N0aWNhciBsYSBwcm9kdWNjacOzbiBkZSBsb3Mgc2lndWllbnRlcyA1IHRyaW1lc3RyZXMuDQoNCmBgYHtyfQ0KcHJvZHVjY2lvbiA8LSBjKDUwLDUzLDU1LDU3LDU1LDYwKQ0KdHMgPC0gdHMoZGF0YT0gcHJvZHVjY2lvbiwgc3RhcnQ9IGMoMjAyMCwzKSxmcmVxdWVuY3kgPSA0KQ0KdHMgDQpgYGANCg0KIyMgKipDcmVhciB1biBtb2RlbG8gQVJJTUEqKg0KDQoqKkFSSU1BKiogc2lnbmlmaWNhICoqQXV0b3JlZ3Jlc3NpdmUgSW50ZWdyYWRlZCBtb3ZpbmcgYXZlcmFnZSoqIG8gTW9kZWxvIEF1dG9ycmVncmVzaXZvIGludGVncmFkbyBkZSBwcm9tZWRpbyBtb3ZpbC4NCg0KYGBge3J9DQphcmltYSA8LSBhdXRvLmFyaW1hKHRzLCBEPTEpDQoNCnN1bW1hcnkoYXJpbWEpDQoNCmBgYA0KDQpBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pIGVzIHVuYSBtZWRpZGEgcXVlIHNlIHV0aWxpemEgZW4gZXN0YWTDrXN0aWNhcyB5IG1vZGVsYWRvIHBhcmEgc2VsZWNjaW9uYXIgZWwgbWVqb3IgbW9kZWxvIGVudHJlIHVuIGNvbmp1bnRvIGRlIG1vZGVsb3MgY2FuZGlkYXRvcyBlbiBlc3RlIGNhc28gZXMgZGUgOS42OC4NCg0KIyMgKipHZW5lcmFyIGVsIHByb27Ds3N0aWNvKioNCg0KLSAgIFNpIGVsIGVqZXJjaWNpbyBubyBlc3BlY2lmaWNhIHNlIHV0aWxpemEgdW4gOTUlIGRlIGNvbmZpYW56YQ0KDQotICAgaCA9IGVsIG51bWVybyBkZSBhw7FvcyxtZXNlcyx0cmltZXN0cmVzIHF1ZSBzZSBidXNjYW4gcHJvbm9zdGljYXINCg0KYGBge3J9DQpwcm9ub3N0aWNvIDwtIGZvcmVjYXN0KGFyaW1hLGxldmVsPWMoOTUpLCBoPTUpDQpwcm9ub3N0aWNvDQpwbG90KHByb25vc3RpY28pDQpgYGANCg0KDQoNCkVuIGVzdGUgZWplcmNpY2lvIGRlIHByw6FjdGljYSBzZSBwdWVkZSBvYnNlcnZhciB1biBjcmVjaW1pZW50byBkZW50cm8gZGUgbG9zIHNpZ3VpZW50ZXMgdHJpbWVzdHJlcyBkZWwgMjAyMiB5IGVsIHByaW1lciB0cmltZXN0cmUgZGVsIDIwMjMgY29uIGRpc3RpbnRhcyBmbHVjdHVhY2lvbmVzIGRlIGxhIHByb2R1Y2Npw7NuLg0KDQoNCiMgKipBY3RpdmlkYWQgMiAtIEhlcnNoZXkncyoqDQoNCiFbXShnaXBoeSUyMCgzKS5naWYpe3dpZHRoPSIzMDAifQ0KDQoqKkhlcnNoZXnigJlzIE3DqXhpY28qKiBlbXByZXNhIGNob2NvbGF0ZXJhIGNvbiBtw6FzIGRlIDEwMCBhw7FvcyBkZSBoaXN0b3JpYSBhIG5pdmVsIGdsb2JhbCAoZnVuZGFjacOzbiAxOTAzKSB5IGVzdGFibGVjaWRhIGVuIE3DqXhpY28gZGVzZGUgMTk2OSwgY29tbyB1bmEgZGUgY29uZml0ZXLDrWEgZW50cmUgSGVyc2hleSBGb29kIENvcnBvcmF0aW9uIHkgQW5kZXJzb24gQ2xheXRvbiAmIENvLiBTLkEuIGZvcm1hbmRvIE5hY2lvbmFsIGRlIER1bGNlcyBTLkEuIGRlIEMuVi4gZW4gZWwgRGlzdHJpdG8gRmVkZXJhbCB5IGRlc3B1w6lzIGRlIDEyIGHDsW9zIGNhbWJpYW5kbyBzdXMgaW5zdGFsYWNpb25lcyBhIEVsIFNhbHRvLCBKYWxpc2NvIGUgaW5pY2lhbmRvIG9wZXJhY2lvbmVzIGVuIGVsIG1lcyBkZSBmZWJyZXJvIGRlIDE5ODEuDQoNCioqRnVlbnRlKio6IEh5cG9mdXR1cmVzIGVuIFBpeGFiYXksIDIwMTcNCg0KRGF0b3MgcHJvcG9yY2lvbmFkb3M6DQoNCipWZW50YXMgaGlzdMOzcmljYXMgZGUgbGVjaGUgc2Fib3JpemFkYSBIZXJzaGV5IE3DqXhpY28gKE1pbGVzIGRlIGTDs2xhcmVzKSBtZW5zdWFsZXMgZGVsIDIwMTcgYWwgMjAxOS4qDQoNCiMjICoqSW1wb3J0YXIgYmFzZSBkZSBkYXRvcyoqDQoNCmBgYHtyfQ0KbGVjaGl0YXMgPC0gcmVhZF9jc3YoIkM6L1VzZXJzL2FsZXhhL09uZURyaXZlL1lPL1ZlbnRhc19IaXN0w7NyaWNhc19MZWNoaXRhcy5jc3YiKQ0KdHMxIDwtIHRzKGRhdGEgPSBsZWNoaXRhcyRWZW50YXMsIHN0YXJ0PWMoMjAxNywxKSxmcmVxdWVuY3kgPSAxMikNCnRzMQ0KYGBgDQoNCiMjICoqQ3JlYXIgdW4gbW9kZWxvIEFSSU1BKioNCg0KKipBUklNQSoqIHNpZ25pZmljYSAqKkF1dG9yZWdyZXNzaXZlIEludGVncmFkZWQgbW92aW5nIGF2ZXJhZ2UqKiBvIE1vZGVsbyBBdXRvcnJlZ3Jlc2l2byBpbnRlZ3JhZG8gZGUgcHJvbWVkaW8gbW92aWwuIFBRRA0KDQpgYGB7cn0NCmFyaW1hMiA8LSBhdXRvLmFyaW1hKHRzMSwgRD0xKQ0Kc3VtbWFyeShhcmltYTIpDQoNCmBgYA0KDQpBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pIGRlIDM3MQ0KDQojIyAqKkdlbmVyYXIgZWwgcHJvbsOzc3RpY28qKg0KDQpgYGB7cn0NCnByb25vc3RpY28yIDwtIGZvcmVjYXN0KGFyaW1hMixsZXZlbD1jKDk1KSwgaD0xMikNCnByb25vc3RpY28yDQpwbG90KHByb25vc3RpY28yKQ0KYGBgDQoNCkVuIGVzdGUgY2Fzbywgc2UgcHVlZGUgb2JzZXJ2YXIgdW4gY3JlY2ltaWVudG8gcG9zaXRpdm8gY29uIGRpc3RpbnRhcyBmbHVjdHVhY2lvbmVzIGVudHJlIGxvcyBtZXNlcyBwcm9ub3N0aWNhZG9zIHBhcmEgZWwgMjAyMC4gRWwgdmFsb3IgZXNwZXJhZG8gZGUgdmVudGFzLCBjb21vIGVqZW1wbG8gcGFyYSBlbmVybyBkZSAyMDIwLCBlcyBkZSAzNTQ5OC45MCwgY29uIHVuIGNyZWNpbWllbnRvIGRlbCAxLjg3JSBlbiBjb21wYXJhY2nDs24gY29uIGxhcyB2ZW50YXMgZGUgZGljaWVtYnJlIGRlIDIwMTkuIEVsIHZhbG9yIHBlc2ltaXN0YSBlcyBkZSAzNDYxNi40OCB5IGVsIHZhbG9yIG9wdGltaXN0YSBlcyBkZSAzNjM4MS4zMi4NCg0KIyAqKkFjdGl2aWRhZCAzIC1GaW5hbnphcyBjb3Jwb3JhdGl2YXMqKg0KDQohW10oZ2lwaHklMjAoNCkuZ2lmKXt3aWR0aD0iMjkxIn0NCg0KYGBge3IsaW5jbHVkZT1GQUxTRX0NCiMjICoqSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyoqDQojaW5zdGFsbC5wYWNrYWdlcygiZmlucmVwb3J0ciIpDQpsaWJyYXJ5KGZpbnJlcG9ydHIpDQpgYGANCg0KIyMgKipJbmZvcm1hY2nDs24gZGlzcG9uaWJsZSoqDQoNCkNvbiBsYSBmdW5jacOzbiAqZmlucmVwb3J0ciogcG9kZW1vcyBvYnRlbmVyIGxhIHNpZ3VpZW50ZSBpbmZvcm1hY2nDs246DQoNCi0gICAqQ29tcGFueUluZm8oKSogPSBicmluZGEgaW5mb3JtYWNpw7NuIGdlbmVyYWwgY29tbyBOb21icmUsVWJpY2FjacOzbixaSVAgZXRjLg0KDQotICAgKkFubnVhbFJlcG9ydHMoKSogPSBCcmluZGEgZWwgbm9tYnJlLCBmZWNoYSB5IG7Dum1lcm8gZGUgYWNjZXNvLg0KDQotICAgKkdldEluY29tZSgpKiA9IChFc3RhZG8gZGUgcmVzdWx0YWRvcykgQnJpbmRhIGVsIGVzdGFkbyBkZSByZXN1bHRhZG9zDQoNCi0gICAqR2V0QmFsYW5jZVNoZWV0KiA9IEJyaW5kYSBlbCBCYWxhbmNlIGdlbmVyYWwuDQoNCi0gICAqR2V0Q2FzaEZsb3coKSogPSBCcmluZGEgZWwgRmx1am8gZGUgZWZlY3Rpdm8uDQoNCiMjIyAqKkVqZW1wbG8gZGUgY2xhc2UqKg0KDQpgYGB7cn0NCiMgTm9tYnJlLCBjb3JyZW8NCm9wdGlvbnMoSFRUUFVzZXJBZ2VudCA9ImEgYUBnbWFpbC5jb20iKQ0KQ29tcGFueUluZm8oIlRHVCIpDQpBbm51YWxSZXBvcnRzKCJCQUJBIiwgZm9yZWlnbiA9IFRSVUUpDQojVmllbmUgZGUgdHJlcyBhw7FvcyAoc2UgcHVlZGVuIGp1bnRhciBsb3MgYcOxb3MgeSBoYWNlciB1bmEgYmQgcGFyYSBoYWNlciB1bmEgc2VyaWUgZGUgdGllbXBvKQ0KZ29vZ2xlX2luY29tZSA8LSBHZXRJbmNvbWUoIkFNWk4iLCAyMDE2KQ0KYW1hem9uX2JhbGFuY2UgPC0gR2V0QmFsYW5jZVNoZWV0KCJBTVpOIiwgMjAxNSkNCmFwcGxlX2Nhc2ggPC0gR2V0Q2FzaEZsb3coIkFBUEwiLCAyMDE0KQ0KDQpgYGANCg0KDQojICoqQW7DoWxpc2lzIEZpbmFuY2llcm8gZGUgRW1wcmVzYSoqDQoNCiMjICoqRVFVSVBPIDYqKg0KDQotICAgQWxleGEgTWFyaWFuYSBNYXJpbiBWaWxsYXIgQTAwODMxMzQyDQoNCi0gICBEaWVnbyBNYXJ0w61uZXogUnVpYmFsIEEwMTc0MDU1OQ0KDQotICAgT3NjYXIgRW1pbGlhbm8gTWVsZW5kZXogQ2hhdmV6IEEwMTI3NjgwMg0KDQpgYGB7cixpbmNsdWRlPUZBTFNFfQ0KI2xpYnJlcsOtYXMNCmxpYnJhcnkoZmlucmVwb3J0cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShkcGx5cikNCmBgYA0KDQojIyMgKipBbWF6b24qKg0KDQohW10oZ2lwaHklMjAoNikuZ2lmKXt3aWR0aD0iNDQ5In0NCg0KU2UgYnVzY2EgZW5jb250cmFyIHVuYSB2YXJpYWJsZSBkZSBpbnRlcsOpcyBkZW50cm8gZGUgbGEgaW5mb3JtYWNpw7NuIGRlbCBlc3RhZG8gZGUgcmVzdWx0YWRvcywgYmFsYW5jZSBnZW5lcmFsIHkgZWwgZmx1am8gZGUgZWZlY3Rpdm8gZGUgbGEgZW1wcmVzYSAqQW1hem9uKiBkZW50cm8gZGUgdW4gcmFuZ28gZGUgYcOxb3MgZGVzZGUgMjAxMCBoYXN0YSAyMDE2Lg0KDQpgYGB7cn0NCm9wdGlvbnMoSFRUUFVzZXJBZ2VudCA9ImEgYUBnbWFpbC5jb20iKQ0KI0NvbXBhbnlJbmZvKCJBTVpOIikNCiNBbm51YWxSZXBvcnRzKCJBTVpOIikNCmFtYXpvbl9pbmNvbWUxIDwtIEdldEluY29tZSgiQU1aTiIsIDIwMTMpDQphbWF6b25faW5jb21lMiA8LSBHZXRJbmNvbWUoIkFNWk4iLCAyMDE1KQ0KYW1hem9uX2luY29tZTMgPC0gR2V0SW5jb21lKCJBTVpOIiwgMjAxNykNCiNhbWF6b25fYmFsYW5jZTEgPC0gR2V0QmFsYW5jZVNoZWV0KCJBTVpOIiwgMjAxMykNCiNhbWF6b25fYmFsYW5jZTIgPC0gR2V0QmFsYW5jZVNoZWV0KCJBTVpOIiwgMjAxNSkNCiNhbWF6b25fYmFsYW5jZTMgPC0gR2V0QmFsYW5jZVNoZWV0KCJBTVpOIiwgMjAxNykNCiNhbWF6b25fY2FzaDEgPC0gR2V0Q2FzaEZsb3coIkFNWk4iLCAyMDEzKQ0KI2FtYXpvbl9jYXNoMiA8LSBHZXRDYXNoRmxvdygiQU1aTiIsIDIwMTUpDQojYW1hem9uX2Nhc2gzIDwtIEdldENhc2hGbG93KCJBTVpOIiwgMjAxNykNCg0KYGBgDQoNCkRlY2lkaW1vcyB1dGlsaXphciBlbCBlc3RhZG8gZGUgcmVzdWx0YWRvcyB5YSBxdWUgY3JlZW1vcyBxdWUgYWwgbW9zdHJhciBpbmZvcm1hY2nDs24gZmluYW5jaWVyYSBlbiBnZW5lcmFsIHNvYnJlIGVsIGVzdGFkbyBkZSBsYXMgZ2FuYW5jaWFzLHDDqXJkaWRhcyB5IGdhc3RvcyBkZSBsYSBlbXByZXNhIHBvZGVtb3MgbGxlZ2FyIGEgY29tcHJlbmRlciBjw7NtbyBlcyBlbCBuZWdvY2lvIGVuIGVsIMOhbWJpdG8gb3BlcmFjaW9uYWwuDQoNCiMjICoqVW5pciBlc3RhZG8gZGUgcmVzdWx0YWRvcyBkZSBsb3MgYcOxb3MgMjAxMC0yMDE2IHkgZWxlZ2lyIGxhIHZhcmlhYmxlIGRlIGludGVyw6lzIGEgbW9kZWxhciB5IHByb25vc3RpY2FyKioNCg0KYGBge3J9DQphbXpuX2luY29tZV9jb21wbGV0byA8LSByYmluZChhbWF6b25faW5jb21lMSxhbWF6b25faW5jb21lMikNCmFtem5faW5jb21lX2NvbXBsZXRvMiA8LSByYmluZChhbXpuX2luY29tZV9jb21wbGV0byxhbWF6b25faW5jb21lMykNCmBgYA0KDQpMYSB2YXJpYWJsZSBkZSBpbnRlcsOpcyBlbGVnaWRhIGVzIGxhIGRlICoqTWFya2V0aW5nIGV4cGVuc2VzKiogcXVlIHNlIGVuY3VlbnRyYSBkZW50cm8gZGVsIGVzdGFkbyBkZSByZXN1bHRhZG9zLg0KDQojIyAqKkNyZWFyIHVuIG1vZGVsbyBBUklNQSoqDQoNCkVuIGVzdGUgY2Fzbywgc2UgZGVjaWTDrW8gY3JlYXIgdW4gbW9kZWxvIEFSSU1BIGVzcGVjaWZpY2FtZW50ZSBzb2JyZSBsb3MgZ2FzdG9zIGRlIHB1YmxpY2lkYWQuIFN1Y2VzaXZhbWVudGUsIHNlIGJ1c2NhIGFuYWxpemFyIGxhcyB0ZW5kZW5jaWFzIHJlY3VycmVudGVzIGRlIGVzdGEgdmFyaWFibGUgeSBwcmVkZWNpciBkdXJhbnRlIGxvcyBwcsOzeGltb3MgMyBhw7FvcyBjdcOhbCBlcyBlbCBwcm9uw7NzdGljbyBkZSBlc3RvcyBnYXN0b3MuDQoNCmBgYHtyfQ0KYW16bl9pbmNvbWVfY29tcGxldG8yIDwtIGZpbHRlcihhbXpuX2luY29tZV9jb21wbGV0bzIsIE1ldHJpYyA9PSAiTWFya2V0aW5nIEV4cGVuc2UiKQ0KYW16bl9pbmNvbWVfY29tcGxldG8yDQoNCmBgYA0KDQojIyAqKkNyZWFyIG1vZGVsbyBkZSBzZXJpZXMgZGUgdGllbXBvKioNCg0KU2UgZGVjaWRpbyBwcmltZXJhbWVudGUgYW5hbGl6YXIgbGEgaW5mb3JtYWNpw7NuIGFudWFsIHBhcmEgaWRlbnRpZmljYXIgZGUgbWVqb3IgbWFuZXJhIGVsIGNyZWNpbWllbnRvIGRlbCBnYXN0byBkZSBwdWJsaWNpZGFkLg0KDQpgYGB7cn0NCmFtem5faW5jb21lX2NvbXBsZXRvMiRBbW91bnQgPC0gYXMubnVtZXJpYyhhbXpuX2luY29tZV9jb21wbGV0bzIkQW1vdW50KQ0KdHNlc3RhZG8gPC0gdHMoZGF0YSA9IGFtem5faW5jb21lX2NvbXBsZXRvMiRBbW91bnQsIHN0YXJ0PWMoMjAxMCwxKSxlbmQ9YygyMDE2LDEpLGZyZXF1ZW5jeT0xKQ0KdHNlc3RhZG8NCmBgYA0KDQojIyAqKk1vZGVsbyBBUklNQSoqDQoNCmBgYHtyfQ0KYXJpbWFlc3RhZG8gPC0gYXV0by5hcmltYSh0c2VzdGFkbywgRD0xKQ0Kc3VtbWFyeShhcmltYWVzdGFkbykNCg0KYGBgDQoNCkFJQyAoQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbikgZGUgMjU5LjU5LiAoYW51YWwpDQoNCiMjICoqR2VuZXJhciBlbCBwcm9uw7NzdGljbyoqDQoNCmBgYHtyfQ0KcHJvbm9zdGljb2VzdGFkbyA8LSBmb3JlY2FzdChhcmltYWVzdGFkbyxsZXZlbD1jKDk1KSwgaD01KQ0KcHJvbm9zdGljb2VzdGFkbw0KcGxvdChwcm9ub3N0aWNvZXN0YWRvKQ0KYGBgDQoNCmBgYHtyLGluY2x1ZGU9RkFMU0V9DQp0c2VzdGFkbzIgPC0gdHMoZGF0YSA9IGFtem5faW5jb21lX2NvbXBsZXRvMiRBbW91bnQsIHN0YXJ0PWMoMjAxMCwxKSxlbmQ9YygyMDE2LDQpLGZyZXF1ZW5jeT00KQ0KdHNlc3RhZG8yDQpgYGANCg0KYGBge3IsaW5jbHVkZT1GQUxTRX0NCmFyaW1hZXN0YWRvMiA8LSBhdXRvLmFyaW1hKHRzZXN0YWRvMiwgRD0xKQ0Kc3VtbWFyeShhcmltYWVzdGFkbzIpDQoNCmBgYA0KDQojIyAqKkdlbmVyYXIgZWwgcHJvbsOzc3RpY28gdHJpbWVzdHJhbCoqDQoNClNlIGRlY2lkaW8gYW5hbGl6YXIgYWRlbcOhcyBsYSBpbmZvcm1hY2nDs24gcG9yIHRyaW1lc3RyZXMgZGViaWRvIGEgcXVlIGVzIHVuYSBtYW5lcmEgbcOhcyBzZW5jaWxsYSBkZSBpZGVudGlmaWNhciBwYXRyb25lcyB5IHRlbmRlbmNpYXMsIGFkZW3DoXMgcGFyYSB1bmEgbWVqb3IgY29tcGFyYWNpw7NuIGVudHJlIGRpc3RpbnRvcyBwZXLDrW9kb3MgZGUgdGllbXBvLg0KDQpgYGB7cn0NCnN1bW1hcnkoYXJpbWFlc3RhZG8yKQ0KYGBgDQoNCmBgYHtyfQ0KIyMgKipNb2RlbG8gQVJJTUEqKg0KcHJvbm9zdGljb2VzdGFkbzIgPC0gZm9yZWNhc3QoYXJpbWFlc3RhZG8yLGxldmVsPWMoOTUpLCBoPTEyKQ0KcHJvbm9zdGljb2VzdGFkbzINCnBsb3QocHJvbm9zdGljb2VzdGFkbzIpDQpgYGANCg0KIyMgKipIYWxsYXpnb3MqKg0KDQotRW4gY3VhbnRvIGxhIHRlbmRlbmNpYSBhbnVhbCBwb2RlbW9zIG9ic2VydmFyIHVuYSB0ZW5kZW5jw61hIGzDrW5lYWwgcG9zaXRpdmEsIGVzdG8gcXVpZXJlIGRlY2lyIHF1ZSBhw7FvIGNvbiBhw7FvIGVsIGdhc3RvIGRlIG1hcmtldGluZyBoYSBpZG8gYXVtZW50YW5kby4gRW4gZWwgY29udGV4dG8gcHJlY2lzbyBkZSBBbWF6b24gdGllbmUgdG9kbyBlbCBzZW50aWRvIGRlYmlkbyBhIHF1ZSBBbWF6b24gZHVyYW50ZSBsb3MgdWx0aW1vcyAyMCBhw7FvcyBoYSBzaWRvIHVuYSBkZSBsYSBlbXByZXNhcyBjb24gbWF5b3IgY3JlY2llbWllbnRvIGRlIHZlbnRhcyAuIFBvciBsbyB0YW50byBlbnRyZSBtYXlvcmVzIHZlbnRhcywgbWF5b3IgcHJlc3VwZXN0byBkZXN0aW5hZG8gYWwgbWFya2V0aW5nLg0KDQotRW4gY3VhbnRvIGFsIGFuYWxpc2lzIHBvciB0cmltZXN0cmVzIGNvbiBlc3RlIHByb27Ds3N0aWNvLCBwb2RlbW9zIHRlbmVyIHVuYSBpZGVhIHNvYnJlIGxvIHF1ZSBwdWVkZSBsbGVnYXIgYSBvY3VycmlyIGVuIGxvcyBwcsOzeGltb3MgdHJpbWVzdHJlcyBkZW50cm8gZGUgMyBhw7Fvcy4gTG9zIHJlc3VsdGFkb3MgdGllbmUgdW4gOTUlIGRlIGNvbmZpYW56YSBwZXJvIHB1ZWRlbiBsbGVnYXIgYSB2YXJpYXIgZW50cmUgbcOhcyBhbHRvcyBvIGJham8uIFRvbWFuZG8gZW4gY3VlbnRhIGVsICoqUG9pbnQgZm9yZWNhc3QqKiBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZGVudHJvIGRlIGxvcyBtZXNlcyBlbiBlbCBjdWFydGlsIDQgZXhpc3RlIHVuYSB0ZW5kZW5jaWEgYSBxdWUgbG9zIGdhc3RvcyBkZSBtZXJjYWRvdGVjbmlhIGJhamVuLiBFc3RvIHB1ZWRlIHNlciBwb3JxdWUgc29uIGxvcyBtZXNlcyBkZSBPY3R1YnJlLCBOb3ZpZW1icmUgeSBEaWNpZW1icmUsIGN1YW5kbyBlbXBpZXphbiBsYXMgY29tcHJhcyBuYXZpZGXDsWFzLCBmZXN0aXZpZGFkZXMsIHkgZXZlbnRvcyBjb21vIGVsIEJsYWNrIEZyaWRheSB5IGVsIEN5YmVyIE1vbmRheS4gRW4gYWxndW5hcyBlbXByZXNhcywgcHVlZGUgc2VyIGVsIGNhc28gcXVlIHJlY3VycmFuIGEgdW4gYXVtZW50byBlbiBsb3MgZ2FzdG9zIGRlIG1lcmNhZG90ZWNuaWEgeSBwdWJsaWNpZGFkLiBQZXJvIGVzcGVjw61maWNhbWVudGUgZW4gZWwgY2FzbyBkZSBBbWF6b24sIGFsIHNlciB1bmEgZGUgbGFzIHBsYXRhZm9ybWFzIG3DoXMgZ3JhbmRlcyB5IHJlY29ub2NpZGFzIGRlIGVjb21tZXJjZSwgcHVlZGVuIGxsZWdhciBhIHJlZHVjaXIgc3VzIGdhc3RvcyBkZSBtYXJrZXRpbmcgZHVyYW50ZSBlc3RlIHBlcsOtb2RvIHBvcnF1ZSBsYSBkZW1hbmRhIGVzIG5hdHVyYWxtZW50ZSBhbHRhIHkgbm8gcmVxdWllcmUgdGFudG8gaW1wdWxzbyBwdWJsaWNpdGFyaW8uDQoNCi1BIHN1IHZleiBsb3MgZ2FzdG9zIGRlIG1hcmtldGluZyBhdW1lbnRhbiBzaWduaWZpY2F0aXZhbWVudGUgZHVyYW50ZSBlbCBwcmltZXIgY3VhcnRpbCwgeSBlc3RvIHB1ZWRlIHNlciBxdWUsIGFsIHBhc2FyIGxhcyBmZXN0aXZpZGFkZXMgeSBsb3MgZ2FzdG9zIG3DoXMgZnVlcnRlcywgbG9zIGNsaWVudGVzIGNvbXByYW4gcmVsYXRpdmFtZW50ZSBtZW5vcywgbG8gcXVlIGFmZWN0YSBkaXJlY3RhbWVudGUgbG9zIGdhc3RvcyBkZSBsYSBlbXByZXNhLiBQb3IgbG8gdGFudG8sIGRlYmVuIGludmVydGlyIG3DoXMgZW4gc3VzIGdhc3RvcyBkZSBwdWJsaWNpZGFkLg0K