Actividad - Series de Tiempo

Aplica la metodología Box-Jenkins a la serie de precios ajustados de una de las siguientes empresas del día 01/Enero/2013 al 31/Agosto/2025: - Amazon (AMZN) - Apple (APPL) - Alphabet (GOOG) - Meta (META) - Tesla (TSLA) - BitCoin (BTC-USD) - Samsung (005930.KS)

getSymbols("AAPL",from="2013/01/01", to="2025/08/31")
## [1] "AAPL"
?getSymbols
head(AAPL)
##            AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
## 2013-01-02  19.77929  19.82143 19.34393   19.60821   560518000      16.62831
## 2013-01-03  19.56714  19.63107 19.32143   19.36071   352965200      16.41842
## 2013-01-04  19.17750  19.23679 18.77964   18.82143   594333600      15.96109
## 2013-01-07  18.64286  18.90357 18.40000   18.71071   484156400      15.86721
## 2013-01-08  18.90036  18.99607 18.61607   18.76107   458707200      15.90991
## 2013-01-09  18.66071  18.75036 18.42821   18.46786   407604400      15.66126
start(AAPL)
## [1] "2013-01-02"
end(AAPL)
## [1] "2025-08-29"

Paso 1: Visualizar

Grafica la Serie de Tiempo, así como su descomposición en tendencia, estacionalidad y errores.

Y <- AAPL[,4]
plot(Y, main="AAPL de 2013 a 2025", ylab="Cierre", xlab="Fecha")

Yts <- ts(as.numeric(Y), frequency = 252)
plot(stl(Yts, s.window="periodic"))

Y.decomp = decompose(Yts, type = "additive")
plot(Y.decomp)

Paso 2: Estacionariza la serie

Encuentra el valor \(d\) y verifica que la \(d\)-ésima diferencia sea un proceso estacionario, también revisa si esta tiene o no una tendencia determinística.

ndiffs(Yts)
## [1] 1
acf(Yts)

pacf(Yts)

adf.test(Yts)
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##       lag  ADF p.value
##  [1,]   0 1.50   0.966
##  [2,]   1 1.49   0.965
##  [3,]   2 1.41   0.959
##  [4,]   3 1.52   0.968
##  [5,]   4 1.60   0.973
##  [6,]   5 1.63   0.975
##  [7,]   6 1.67   0.977
##  [8,]   7 1.70   0.978
##  [9,]   8 1.81   0.982
## Type 2: with drift no trend 
##       lag    ADF p.value
##  [1,]   0 0.0964   0.963
##  [2,]   1 0.0834   0.962
##  [3,]   2 0.0233   0.958
##  [4,]   3 0.1023   0.964
##  [5,]   4 0.1550   0.968
##  [6,]   5 0.1744   0.970
##  [7,]   6 0.2032   0.972
##  [8,]   7 0.2188   0.973
##  [9,]   8 0.2867   0.977
## Type 3: with drift and trend 
##       lag   ADF p.value
##  [1,]   0 -2.62   0.316
##  [2,]   1 -2.63   0.312
##  [3,]   2 -2.69   0.285
##  [4,]   3 -2.59   0.328
##  [5,]   4 -2.52   0.355
##  [6,]   5 -2.49   0.368
##  [7,]   6 -2.46   0.380
##  [8,]   7 -2.44   0.389
##  [9,]   8 -2.35   0.427
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
D1 <- diff(Yts, differences=1)
adf.test(D1)
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##       lag   ADF p.value
##  [1,]   0 -56.0    0.01
##  [2,]   1 -38.4    0.01
##  [3,]   2 -33.3    0.01
##  [4,]   3 -29.5    0.01
##  [5,]   4 -26.5    0.01
##  [6,]   5 -24.3    0.01
##  [7,]   6 -22.5    0.01
##  [8,]   7 -21.8    0.01
##  [9,]   8 -19.5    0.01
## Type 2: with drift no trend 
##       lag   ADF p.value
##  [1,]   0 -56.1    0.01
##  [2,]   1 -38.5    0.01
##  [3,]   2 -33.3    0.01
##  [4,]   3 -29.6    0.01
##  [5,]   4 -26.6    0.01
##  [6,]   5 -24.4    0.01
##  [7,]   6 -22.6    0.01
##  [8,]   7 -21.9    0.01
##  [9,]   8 -19.6    0.01
## Type 3: with drift and trend 
##       lag   ADF p.value
##  [1,]   0 -56.1    0.01
##  [2,]   1 -38.5    0.01
##  [3,]   2 -33.3    0.01
##  [4,]   3 -29.6    0.01
##  [5,]   4 -26.6    0.01
##  [6,]   5 -24.4    0.01
##  [7,]   6 -22.7    0.01
##  [8,]   7 -21.9    0.01
##  [9,]   8 -19.7    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
ndiffs(D1) #La diferencia es 1
## [1] 0

Paso 3: Identifica los valor \(p\) y \(q\)

Estima la función de autocorrelación y la función de autocorrelación parcial. A partir de sus correlogramas estima los valores de \(p\) y \(q\).

pacf(D1) #3, 0

# 3 porque hay 3 palos hacia atrás del primero que sale de la banda o porque hay 3 zonas con palos fuera de las bandas
# 0 porque las primeras líneas no salen.
acf(D1) # 0

# 0 porque solo hay 1 palo que sale pero ese no cuenta. los siguientes están dentro de las bandas.

Paso 4: Ajusta el Modelo ARIMA

Ajusta un modelo \(ARIMA(p,d,q)\) con los valores encontrados en los pasos previos. Revisa sus residuales, comparalos con el proceso estacionario (ruido blanco) que encontraste en el paso 2 y muestra su valor AIC.

arima.mod <- arima(Yts, order=c(3,1,0))
arima.mod$aic
## [1] 13623.88
arima.mod2 <- arima(Yts, order=c(0,1,0))
arima.mod2$aic
## [1] 13628.45
# Este modelo se elige en base a lo visto en clase. Por motivos de investigación decidimos quedarnos con el 3,1,0 

# Si la diferencia de AIC es menor a 2, los modelos son prácticamente indistinguibles en términos de calidad de ajuste, y ahí es donde debes elegir el más simple (parsimonia).
# Si AIC está entre 4 y 7, hay un soporte menor para el modelo con el AIC más alto.
# Si AIC es mayor a 10, esencialmente no hay soporte para el modelo con el AIC más alto.

# AIC=13628.45−13623.88=4.57

# Cualquiera de los primeros 2 modelos es utilizable en base a lo visto en clase y lo investigado. depende de que reglas o criterios se escojan para realizarlo 

# auto.arima(Y) (0,1,0)
arima.opt <- arima(Yts, order=c(3,1,0))
arima.opt$aic
## [1] 13623.88
plot(arima.mod$residuals)

pacf(arima.mod$residuals)

acf(arima.mod$residuals)

Paso 5: Proyecciones

Realiza predicciones para los próximos 2 años (la frecuencia de la serie es diaria) y muestra estas gráficamente. Para esto puedes utilizar el comando ‘predict’ o ‘forecast’.

end(Yts) 
## [1]  13 161
preds <- predict(arima.mod, n.ahead=504)
start(preds$pred)
## [1]  13 162
end(preds$pred)
## [1]  15 161
ts.plot(cbind(Yts,preds$pred),lty=c(1,3))

ts.plot(cbind(tail(Yts,169),preds$pred),lty=c(1,3))

proys <- preds$pred + rnorm(504, 0, sqrt(arima.mod$sigma2))
ts.plot(cbind(tail(Yts,169),proys),lty=c(1,3))

lowband <- preds$pred - 1.96*preds$se #1.96 porques se esta haciendo con el 95% de confianza
upband <- preds$pred + 1.96*preds$se #1.96 porques se esta haciendo con el 95% de confianza
ts.plot(cbind(Yts,preds$pred, lowband, upband),lty=c(1,3,3,3), col=c("black","blue","red","red"), main="Predicciones APPL 2013 - 2024")

ts.plot(cbind(tail(Yts,169),preds$pred, lowband, upband),lty=c(1,3,3,3), col=c("black","blue","red","red"), main="Predicciones APPL 2013 - 2024")

prons <- forecast::forecast(arima.mod, level=95, h=504)
plot(prons, main="Pronósticos APPL")

Imprimimos el SE para ver la volatilidad de la acción

preds$se
## Time Series:
## Start = c(13, 162) 
## End = c(15, 161) 
## Frequency = 252 
##   [1]  2.052856  2.915216  3.615594  4.153508  4.629658  5.058643  5.455623
##   [8]  5.825540  6.173477  6.502758  6.816158  7.115760  7.403251  7.679986
##  [15]  7.947092  8.205506  8.456028  8.699338  8.936026  9.166604  9.391523
##  [22]  9.611179  9.825927 10.036081 10.241923 10.443709 10.641670 10.836014
##  [29] 11.026934 11.214604 11.399185 11.580824 11.759658 11.935813 12.109406
##  [36] 12.280545 12.449331 12.615860 12.780219 12.942491 13.102753 13.261079
##  [43] 13.417537 13.572191 13.725102 13.876329 14.025925 14.173943 14.320430
##  [50] 14.465434 14.608999 14.751167 14.891978 15.031470 15.169679 15.306640
##  [57] 15.442386 15.576950 15.710361 15.842649 15.973841 16.103964 16.233044
##  [64] 16.361106 16.488174 16.614269 16.739415 16.863632 16.986941 17.109361
##  [71] 17.230911 17.351610 17.471475 17.590524 17.708772 17.826235 17.942930
##  [78] 18.058871 18.174072 18.288547 18.402310 18.515375 18.627753 18.739457
##  [85] 18.850499 18.960891 19.070644 19.179769 19.288276 19.396177 19.503481
##  [92] 19.610197 19.716336 19.821906 19.926918 20.031378 20.135297 20.238682
##  [99] 20.341542 20.443884 20.545717 20.647047 20.747882 20.848230 20.948097
## [106] 21.047490 21.146416 21.244881 21.342892 21.440455 21.537576 21.634261
## [113] 21.730516 21.826347 21.921758 22.016756 22.111346 22.205533 22.299322
## [120] 22.392719 22.485727 22.578352 22.670599 22.762472 22.853976 22.945115
## [127] 23.035893 23.126315 23.216384 23.306106 23.395483 23.484521 23.573222
## [134] 23.661590 23.749630 23.837345 23.924738 24.011813 24.098573 24.185022
## [141] 24.271163 24.357000 24.442535 24.527772 24.612713 24.697363 24.781723
## [148] 24.865797 24.949588 25.033098 25.116331 25.199289 25.281974 25.364390
## [155] 25.446540 25.528424 25.610047 25.691411 25.772518 25.853370 25.933970
## [162] 26.014321 26.094424 26.174282 26.253897 26.333271 26.412407 26.491306
## [169] 26.569972 26.648404 26.726607 26.804582 26.882330 26.959854 27.037156
## [176] 27.114238 27.191101 27.267747 27.344179 27.420397 27.496404 27.572202
## [183] 27.647792 27.723176 27.798355 27.873332 27.948107 28.022683 28.097061
## [190] 28.171242 28.245229 28.319023 28.392624 28.466036 28.539258 28.612293
## [197] 28.685143 28.757807 28.830289 28.902589 28.974708 29.046648 29.118411
## [204] 29.189997 29.261408 29.332645 29.403709 29.474603 29.545326 29.615880
## [211] 29.686267 29.756487 29.826541 29.896432 29.966159 30.035725 30.105130
## [218] 30.174375 30.243462 30.312391 30.381164 30.449782 30.518245 30.586555
## [225] 30.654713 30.722720 30.790576 30.858283 30.925842 30.993254 31.060519
## [232] 31.127639 31.194615 31.261447 31.328137 31.394685 31.461092 31.527359
## [239] 31.593487 31.659477 31.725330 31.791047 31.856628 31.922074 31.987386
## [246] 32.052565 32.117612 32.182528 32.247313 32.311967 32.376493 32.440891
## [253] 32.505160 32.569303 32.633320 32.697212 32.760979 32.824622 32.888142
## [260] 32.951540 33.014815 33.077970 33.141004 33.203919 33.266715 33.329392
## [267] 33.391952 33.454395 33.516721 33.578932 33.641028 33.703009 33.764877
## [274] 33.826631 33.888273 33.949803 34.011221 34.072529 34.133727 34.194815
## [281] 34.255795 34.316666 34.377429 34.438085 34.498634 34.559077 34.619415
## [288] 34.679648 34.739776 34.799801 34.859722 34.919540 34.979256 35.038870
## [295] 35.098383 35.157795 35.217107 35.276319 35.335432 35.394447 35.453363
## [302] 35.512181 35.570902 35.629526 35.688054 35.746486 35.804823 35.863065
## [309] 35.921212 35.979266 36.037226 36.095093 36.152867 36.210549 36.268139
## [316] 36.325638 36.383047 36.440364 36.497592 36.554730 36.611779 36.668739
## [323] 36.725611 36.782395 36.839091 36.895701 36.952223 37.008659 37.065010
## [330] 37.121274 37.177454 37.233549 37.289559 37.345486 37.401329 37.457088
## [337] 37.512765 37.568359 37.623871 37.679301 37.734650 37.789918 37.845105
## [344] 37.900211 37.955238 38.010185 38.065053 38.119841 38.174552 38.229183
## [351] 38.283737 38.338213 38.392612 38.446934 38.501179 38.555348 38.609441
## [358] 38.663459 38.717401 38.771267 38.825060 38.878777 38.932421 38.985991
## [365] 39.039487 39.092910 39.146260 39.199538 39.252743 39.305876 39.358938
## [372] 39.411928 39.464847 39.517695 39.570472 39.623179 39.675816 39.728384
## [379] 39.780882 39.833311 39.885670 39.937962 39.990184 40.042339 40.094426
## [386] 40.146445 40.198397 40.250282 40.302100 40.353852 40.405537 40.457156
## [393] 40.508710 40.560198 40.611620 40.662978 40.714271 40.765499 40.816663
## [400] 40.867763 40.918799 40.969772 41.020681 41.071527 41.122311 41.173031
## [407] 41.223690 41.274286 41.324820 41.375292 41.425703 41.476053 41.526341
## [414] 41.576569 41.626736 41.676843 41.726889 41.776876 41.826803 41.876670
## [421] 41.926478 41.976227 42.025917 42.075549 42.125122 42.174636 42.224093
## [428] 42.273492 42.322833 42.372116 42.421343 42.470512 42.519624 42.568680
## [435] 42.617679 42.666622 42.715509 42.764340 42.813116 42.861836 42.910500
## [442] 42.959110 43.007664 43.056164 43.104609 43.153000 43.201336 43.249619
## [449] 43.297848 43.346023 43.394144 43.442213 43.490228 43.538190 43.586099
## [456] 43.633956 43.681760 43.729512 43.777212 43.824861 43.872457 43.920002
## [463] 43.967495 44.014937 44.062328 44.109668 44.156958 44.204196 44.251385
## [470] 44.298523 44.345611 44.392649 44.439637 44.486576 44.533465 44.580305
## [477] 44.627095 44.673837 44.720530 44.767174 44.813769 44.860316 44.906815
## [484] 44.953266 44.999669 45.046024 45.092331 45.138591 45.184804 45.230969
## [491] 45.277087 45.323159 45.369183 45.415161 45.461093 45.506978 45.552816
## [498] 45.598609 45.644356 45.690057 45.735712 45.781322 45.826886 45.872405
summary(preds$se)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.053  23.013  32.473  30.633  39.742  45.872

Imprimimos el modelo

arima.opt
## 
## Call:
## arima(x = Yts, order = c(3, 1, 0))
## 
## Coefficients:
##          ar1     ar2      ar3
##       0.0083  0.0335  -0.0465
## s.e.  0.0177  0.0177   0.0177
## 
## sigma^2 estimated as 4.214:  log likelihood = -6807.94,  aic = 13623.88

Explicación del SE

Lo más importante que se observa es que el error estándar aumenta constantemente con el tiempo.

Al inicio, el error es muy bajo. Esto significa que el modelo tiene una confianza relativamente alta en sus predicciones para los próximos días.

Al final, el error es muy alto. Esto indica que el modelo tiene muy poca confianza en sus predicciones para fechas lejanas.

Esto nos habla de la volatilidad e imprevisibilidad a largo plazo. El resultado no significa que el modelo sea malo. Si no que, está reflejando una característica fundamental de los mercados financieros y de acciones como Apple (AAPL), son muy difíciles de predecir a largo plazo.

LS0tCnRpdGxlOiAiU2VyaWVzIGRlIFRpZW1wbyIKYXV0aG9yOiBFcXVpcG8gMwpkYXRlOiAKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUcnVlCiAgICBjb2RlX2Rvd25sb2FkOiBUcnVlCiAgICB0aGVtZTogY29zbW8KZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMjIEFjdGl2aWRhZCAtIFNlcmllcyBkZSBUaWVtcG8KCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkocXVhbnRtb2QpCmxpYnJhcnkoQUVSKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShzdGF0cykKbGlicmFyeShjYXIpCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHVyY2EpCmxpYnJhcnkoYVRTQSkKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShxdWFudG1vZCkKYGBgCgoKQXBsaWNhIGxhIG1ldG9kb2xvZ8OtYSBCb3gtSmVua2lucyBhIGxhIHNlcmllIGRlIHByZWNpb3MgYWp1c3RhZG9zIGRlIHVuYSBkZSBsYXMgc2lndWllbnRlcyBlbXByZXNhcyBkZWwgZMOtYSAwMS9FbmVyby8yMDEzIGFsIDMxL0Fnb3N0by8yMDI1OgotIEFtYXpvbiAoQU1aTikKLSBBcHBsZSAoQVBQTCkKLSBBbHBoYWJldCAoR09PRykKLSBNZXRhIChNRVRBKQotIFRlc2xhIChUU0xBKQotIEJpdENvaW4gKEJUQy1VU0QpCi0gU2Ftc3VuZyAoMDA1OTMwLktTKQoKCmBgYHtyfQpnZXRTeW1ib2xzKCJBQVBMIixmcm9tPSIyMDEzLzAxLzAxIiwgdG89IjIwMjUvMDgvMzEiKQo/Z2V0U3ltYm9scwpoZWFkKEFBUEwpCnN0YXJ0KEFBUEwpCmVuZChBQVBMKQpgYGAKCiMjIyBQYXNvIDE6IFZpc3VhbGl6YXIgCkdyYWZpY2EgbGEgU2VyaWUgZGUgVGllbXBvLCBhc8OtIGNvbW8gc3UgZGVzY29tcG9zaWNpw7NuIGVuIHRlbmRlbmNpYSwgZXN0YWNpb25hbGlkYWQgeSBlcnJvcmVzLgoKYGBge3J9ClkgPC0gQUFQTFssNF0KcGxvdChZLCBtYWluPSJBQVBMIGRlIDIwMTMgYSAyMDI1IiwgeWxhYj0iQ2llcnJlIiwgeGxhYj0iRmVjaGEiKQoKWXRzIDwtIHRzKGFzLm51bWVyaWMoWSksIGZyZXF1ZW5jeSA9IDI1MikKcGxvdChzdGwoWXRzLCBzLndpbmRvdz0icGVyaW9kaWMiKSkKClkuZGVjb21wID0gZGVjb21wb3NlKFl0cywgdHlwZSA9ICJhZGRpdGl2ZSIpCnBsb3QoWS5kZWNvbXApCmBgYAoKIyMjIFBhc28gMjogRXN0YWNpb25hcml6YSBsYSBzZXJpZQpFbmN1ZW50cmEgZWwgdmFsb3IgJGQkIHkgdmVyaWZpY2EgcXVlIGxhICRkJC3DqXNpbWEgZGlmZXJlbmNpYSBzZWEgdW4gcHJvY2VzbyBlc3RhY2lvbmFyaW8sIHRhbWJpw6luIHJldmlzYSBzaSBlc3RhIHRpZW5lIG8gbm8gdW5hIHRlbmRlbmNpYSBkZXRlcm1pbsOtc3RpY2EuCgpgYGB7cn0KbmRpZmZzKFl0cykKYWNmKFl0cykKcGFjZihZdHMpCgphZGYudGVzdChZdHMpCgpEMSA8LSBkaWZmKFl0cywgZGlmZmVyZW5jZXM9MSkKYWRmLnRlc3QoRDEpCm5kaWZmcyhEMSkgI0xhIGRpZmVyZW5jaWEgZXMgMQpgYGAKCiMjIyBQYXNvIDM6IElkZW50aWZpY2EgbG9zIHZhbG9yICRwJCB5ICRxJApFc3RpbWEgbGEgZnVuY2nDs24gZGUgYXV0b2NvcnJlbGFjacOzbiB5IGxhIGZ1bmNpw7NuIGRlIGF1dG9jb3JyZWxhY2nDs24gcGFyY2lhbC4gQSBwYXJ0aXIgZGUgc3VzIGNvcnJlbG9ncmFtYXMgZXN0aW1hIGxvcyB2YWxvcmVzIGRlICRwJCB5ICRxJC4KCmBgYHtyfQpwYWNmKEQxKSAjMywgMAojIDMgcG9ycXVlIGhheSAzIHBhbG9zIGhhY2lhIGF0csOhcyBkZWwgcHJpbWVybyBxdWUgc2FsZSBkZSBsYSBiYW5kYSBvIHBvcnF1ZSBoYXkgMyB6b25hcyBjb24gcGFsb3MgZnVlcmEgZGUgbGFzIGJhbmRhcwojIDAgcG9ycXVlIGxhcyBwcmltZXJhcyBsw61uZWFzIG5vIHNhbGVuLgphY2YoRDEpICMgMAojIDAgcG9ycXVlIHNvbG8gaGF5IDEgcGFsbyBxdWUgc2FsZSBwZXJvIGVzZSBubyBjdWVudGEuIGxvcyBzaWd1aWVudGVzIGVzdMOhbiBkZW50cm8gZGUgbGFzIGJhbmRhcy4KYGBgCgojIyMgUGFzbyA0OiBBanVzdGEgZWwgTW9kZWxvIEFSSU1BCkFqdXN0YSB1biBtb2RlbG8gJEFSSU1BKHAsZCxxKSQgY29uIGxvcyB2YWxvcmVzIGVuY29udHJhZG9zIGVuIGxvcyBwYXNvcyBwcmV2aW9zLiBSZXZpc2Egc3VzIHJlc2lkdWFsZXMsIGNvbXBhcmFsb3MgY29uIGVsIHByb2Nlc28gZXN0YWNpb25hcmlvIChydWlkbyBibGFuY28pIHF1ZSBlbmNvbnRyYXN0ZSBlbiBlbCBwYXNvIDIgeSBtdWVzdHJhIHN1IHZhbG9yIEFJQy4KCmBgYHtyfQphcmltYS5tb2QgPC0gYXJpbWEoWXRzLCBvcmRlcj1jKDMsMSwwKSkKYXJpbWEubW9kJGFpYwphcmltYS5tb2QyIDwtIGFyaW1hKFl0cywgb3JkZXI9YygwLDEsMCkpCmFyaW1hLm1vZDIkYWljCiMgRXN0ZSBtb2RlbG8gc2UgZWxpZ2UgZW4gYmFzZSBhIGxvIHZpc3RvIGVuIGNsYXNlLiBQb3IgbW90aXZvcyBkZSBpbnZlc3RpZ2FjacOzbiBkZWNpZGltb3MgcXVlZGFybm9zIGNvbiBlbCAzLDEsMCAKCiMgU2kgbGEgZGlmZXJlbmNpYSBkZSBBSUMgZXMgbWVub3IgYSAyLCBsb3MgbW9kZWxvcyBzb24gcHLDoWN0aWNhbWVudGUgaW5kaXN0aW5ndWlibGVzIGVuIHTDqXJtaW5vcyBkZSBjYWxpZGFkIGRlIGFqdXN0ZSwgeSBhaMOtIGVzIGRvbmRlIGRlYmVzIGVsZWdpciBlbCBtw6FzIHNpbXBsZSAocGFyc2ltb25pYSkuCiMgU2kgQUlDIGVzdMOhIGVudHJlIDQgeSA3LCBoYXkgdW4gc29wb3J0ZSBtZW5vciBwYXJhIGVsIG1vZGVsbyBjb24gZWwgQUlDIG3DoXMgYWx0by4KIyBTaSBBSUMgZXMgbWF5b3IgYSAxMCwgZXNlbmNpYWxtZW50ZSBubyBoYXkgc29wb3J0ZSBwYXJhIGVsIG1vZGVsbyBjb24gZWwgQUlDIG3DoXMgYWx0by4KCiMgQUlDPTEzNjI4LjQ14oiSMTM2MjMuODg9NC41NwoKIyBDdWFscXVpZXJhIGRlIGxvcyBwcmltZXJvcyAyIG1vZGVsb3MgZXMgdXRpbGl6YWJsZSBlbiBiYXNlIGEgbG8gdmlzdG8gZW4gY2xhc2UgeSBsbyBpbnZlc3RpZ2Fkby4gZGVwZW5kZSBkZSBxdWUgcmVnbGFzIG8gY3JpdGVyaW9zIHNlIGVzY29qYW4gcGFyYSByZWFsaXphcmxvIAoKIyBhdXRvLmFyaW1hKFkpICgwLDEsMCkKYXJpbWEub3B0IDwtIGFyaW1hKFl0cywgb3JkZXI9YygzLDEsMCkpCmFyaW1hLm9wdCRhaWMKCnBsb3QoYXJpbWEubW9kJHJlc2lkdWFscykKcGFjZihhcmltYS5tb2QkcmVzaWR1YWxzKQphY2YoYXJpbWEubW9kJHJlc2lkdWFscykKCmBgYAoKIyMjIFBhc28gNTogUHJveWVjY2lvbmVzClJlYWxpemEgcHJlZGljY2lvbmVzIHBhcmEgbG9zIHByw7N4aW1vcyAyIGHDsW9zIChsYSBmcmVjdWVuY2lhIGRlIGxhIHNlcmllIGVzIGRpYXJpYSkgeSBtdWVzdHJhIGVzdGFzIGdyw6FmaWNhbWVudGUuIFBhcmEgZXN0byBwdWVkZXMgdXRpbGl6YXIgZWwgY29tYW5kbyAncHJlZGljdCcgbyAnZm9yZWNhc3QnLgoKYGBge3J9CmVuZChZdHMpIApwcmVkcyA8LSBwcmVkaWN0KGFyaW1hLm1vZCwgbi5haGVhZD01MDQpCnN0YXJ0KHByZWRzJHByZWQpCmVuZChwcmVkcyRwcmVkKQoKdHMucGxvdChjYmluZChZdHMscHJlZHMkcHJlZCksbHR5PWMoMSwzKSkKdHMucGxvdChjYmluZCh0YWlsKFl0cywxNjkpLHByZWRzJHByZWQpLGx0eT1jKDEsMykpCgpwcm95cyA8LSBwcmVkcyRwcmVkICsgcm5vcm0oNTA0LCAwLCBzcXJ0KGFyaW1hLm1vZCRzaWdtYTIpKQp0cy5wbG90KGNiaW5kKHRhaWwoWXRzLDE2OSkscHJveXMpLGx0eT1jKDEsMykpCgpsb3diYW5kIDwtIHByZWRzJHByZWQgLSAxLjk2KnByZWRzJHNlICMxLjk2IHBvcnF1ZXMgc2UgZXN0YSBoYWNpZW5kbyBjb24gZWwgOTUlIGRlIGNvbmZpYW56YQp1cGJhbmQgPC0gcHJlZHMkcHJlZCArIDEuOTYqcHJlZHMkc2UgIzEuOTYgcG9ycXVlcyBzZSBlc3RhIGhhY2llbmRvIGNvbiBlbCA5NSUgZGUgY29uZmlhbnphCnRzLnBsb3QoY2JpbmQoWXRzLHByZWRzJHByZWQsIGxvd2JhbmQsIHVwYmFuZCksbHR5PWMoMSwzLDMsMyksIGNvbD1jKCJibGFjayIsImJsdWUiLCJyZWQiLCJyZWQiKSwgbWFpbj0iUHJlZGljY2lvbmVzIEFQUEwgMjAxMyAtIDIwMjQiKQp0cy5wbG90KGNiaW5kKHRhaWwoWXRzLDE2OSkscHJlZHMkcHJlZCwgbG93YmFuZCwgdXBiYW5kKSxsdHk9YygxLDMsMywzKSwgY29sPWMoImJsYWNrIiwiYmx1ZSIsInJlZCIsInJlZCIpLCBtYWluPSJQcmVkaWNjaW9uZXMgQVBQTCAyMDEzIC0gMjAyNCIpCgpwcm9ucyA8LSBmb3JlY2FzdDo6Zm9yZWNhc3QoYXJpbWEubW9kLCBsZXZlbD05NSwgaD01MDQpCnBsb3QocHJvbnMsIG1haW49IlByb27Ds3N0aWNvcyBBUFBMIikKYGBgCgojIyMgSW1wcmltaW1vcyBlbCBTRSBwYXJhIHZlciBsYSB2b2xhdGlsaWRhZCBkZSBsYSBhY2Npw7NuCmBgYHtyfQpwcmVkcyRzZQpzdW1tYXJ5KHByZWRzJHNlKQpgYGAKCiMjIyBJbXByaW1pbW9zIGVsIG1vZGVsbwpgYGB7cn0KYXJpbWEub3B0CmBgYAoKIyMjIEV4cGxpY2FjacOzbiBkZWwgU0UKTG8gbcOhcyBpbXBvcnRhbnRlIHF1ZSBzZSBvYnNlcnZhIGVzIHF1ZSBlbCBlcnJvciBlc3TDoW5kYXIgYXVtZW50YSBjb25zdGFudGVtZW50ZSBjb24gZWwgdGllbXBvLgoKQWwgaW5pY2lvLCBlbCBlcnJvciBlcyBtdXkgYmFqby4gRXN0byBzaWduaWZpY2EgcXVlIGVsIG1vZGVsbyB0aWVuZSB1bmEgY29uZmlhbnphIHJlbGF0aXZhbWVudGUgYWx0YSBlbiBzdXMgcHJlZGljY2lvbmVzIHBhcmEgbG9zIHByw7N4aW1vcyBkw61hcy4KCkFsIGZpbmFsLCBlbCBlcnJvciBlcyBtdXkgYWx0by4gRXN0byBpbmRpY2EgcXVlIGVsIG1vZGVsbyB0aWVuZSBtdXkgcG9jYSBjb25maWFuemEgZW4gc3VzIHByZWRpY2Npb25lcyBwYXJhIGZlY2hhcyBsZWphbmFzLgoKRXN0byBub3MgaGFibGEgZGUgbGEgdm9sYXRpbGlkYWQgZSBpbXByZXZpc2liaWxpZGFkIGEgbGFyZ28gcGxhem8uIEVsIHJlc3VsdGFkbyBubyBzaWduaWZpY2EgcXVlIGVsIG1vZGVsbyBzZWEgbWFsby4gU2kgbm8gcXVlLCBlc3TDoSByZWZsZWphbmRvIHVuYSBjYXJhY3RlcsOtc3RpY2EgZnVuZGFtZW50YWwgZGUgbG9zIG1lcmNhZG9zIGZpbmFuY2llcm9zIHkgZGUgYWNjaW9uZXMgY29tbyBBcHBsZSAoQUFQTCksIHNvbiBtdXkgZGlmw61jaWxlcyBkZSBwcmVkZWNpciBhIGxhcmdvIHBsYXpvLiAK