SERIES DE TIEMPO
Navarijo García Ricardo Daniel
Castillejos Arteaga Luis Felipe
Tasa de Desempleo en México
library(TSA) library(ggplot2) library(ggfortify) library(forecast) library(fpp2) library(forecast) library(fma) library(expsmooth) library(seasonal) library(urca) library(seasonal)
TABLA DE CONTENIDOS
1. Breve referencia a los datos, frecuencia, unidad de medida, fuente, etc
2. Graficar la serie de tiempo, analizar patrones y observaciones atípicas. Apoye su análisis con una descomposición clásica.
3. Si es necesario, utilizar transformación Box-Cox / logaritmos para estabilizar la varianza. Presentar grafica
4. Modelar la serie de tiempo elegida como función de una tendencia, tendencia cuadrática y/o medias estacionales. Presente el diagnóstico del modelo elegido.
5. En caso de estacionalidad de la serie de tiempo, aplicar diferencias estacionales. Presentar grafica
6. Usar prueba Dickey-Fuller para evaluar el orden de integración de la serie. Diferenciar hasta que la serie sea estacionaria.
7. Usar herramientas ACF,PACF,EACF y/o criterios de Akaike/Bayes para construir propuestas de modelos.
8. Como parte del diagnóstico del modelo, analizar los residuos y aplicar la prueba Ljung-Box.
9. Usar la función auto.arima() y compare sus resultados con el inciso anterior.
10. Presente la ecuación final y describa.
11. Realizar el pronóstico ARIMA para dos años.
12. Utilizando métodos de pronósticos simples y/o suavizamiento exponencial generar un pronóstico para dos años. Elegir el método que presente la raíz del error medio al cuadrado más pequeño.
1. Breve referencia a los datos, frecuencia, unidad de medida, fuente, etc.
La tasa de desempleo, también conocida como tasa de paro, mide el nivel de desocupación en relación a la población activa. En otras palabras, es la parte de la población que estando en edad, condiciones y disposición de trabajar -población activa- no tiene puesto de trabajo.
La tasa de desempleo es muy útil para conocer las personas que no están trabajando. Su fórmula de cálculo es la población de 16 años y más que no está trabajando y busca trabajo, dividido entre la población económicamente activa de 16 años y más, esto es, ocupados más desocupados. Se calcula de la siguiente manera: tasa de desempleo=(No. de desempleados/Poblacion activa)*100 datos sacdos de http://www.fao.org
2. Graficar la serie de tiempo, analizar patrones y observaciones atípicas. Apoye su análisis con una descomposición clásica.
base<-read.csv(file.choose()) tdd<-ts(base$tdd, start= c(1987,1),frequency= 12)
library(ggplot2)
library(ggfortify)
autoplot(tdd)



aquí podemos apreciar como tenemos una deserie donde aument eldesempleo en los 90’s por el efecto tequila, donde tuvimos una depresicación de la moneda mexicana, de igual manera podemos observar como baja poco a poco hasta el año 2000 donde tenemos un incremento hasta llegar a otra crisis en el años 2008-2009 pero no tan fuerte como en los 90’s
fit <- decompose(tdd, type=‘multiplicative’)

Para el caso clásico obtenemos los componentes separados de nuestra serie, en relacion a la estacionalidad, tendencia y residuos.
fit2 <- seas(tdd, x11=“”)

Se realizo una gráfica que compara el comportamiento de nuestros datos con el de un ajuste estacional y observamos un comportamiento más preciso en el componente tendencial, además de que la estacionalidad refleja cambios que van acortando los extremos verticales con una pequeña alza a mitad del periodo, que después regresa a su actividad inicial.
4. Modelar la serie de tiempo elegida como función de una tendencia, tendencia cuadrática y/o medias estacionales. Presente el diagnóstico del modelo elegido.
modelo1 <- lm(tdd~time(tdd))
summary(modelo1)
Call:
lm(formula = tdd ~ time(tdd))
Residuals:
Min 1Q Median 3Q Max
-1.6444 -0.6376 -0.1710 0.5324 4.0430
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -79.562984 10.827546 -7.348 1.28e-12 ***
time(tdd) 0.041652 0.005407 7.704 1.20e-13 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 0.9445 on 373 degrees of freedom
Multiple R-squared: 0.1373, Adjusted R-squared: 0.135
F-statistic: 59.35 on 1 and 373 DF, p-value: 1.205e-13

autoplot(modelo1, which = 1:6, ncol = 2, label.size = 3)
package <U+393C><U+3E31>bindrcpp<U+393C><U+3E32> was built under R version 3.4.4

shapiro.test(rstudent(modelo1))
Shapiro-Wilk normality test
data: rstudent(modelo1)
W = 0.93097, p-value = 3.725e-12

mes. <- season(tdd) modelo2 <- lm(tdd~mes.)
summary(modelo2)
Call:
lm(formula = tdd ~ mes.)
Residuals:
Min 1Q Median 3Q Max
-1.7621 -0.7700 -0.2213 0.7690 3.6787
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.827749 0.182065 21.024 <2e-16 ***
mes.February 0.034362 0.257479 0.133 0.894
mes.March -0.005961 0.257479 -0.023 0.982
mes.April 0.050283 0.259547 0.194 0.846
mes.May 0.050119 0.259547 0.193 0.847
mes.June 0.046411 0.259547 0.179 0.858
mes.July 0.062057 0.259547 0.239 0.811
mes.August 0.093549 0.259547 0.360 0.719
mes.September 0.002964 0.259547 0.011 0.991
mes.October -0.015663 0.259547 -0.060 0.952
mes.November 0.003626 0.259547 0.014 0.989
mes.December -0.071200 0.259547 -0.274 0.784
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 1.03 on 363 degrees of freedom
Multiple R-squared: 0.001701, Adjusted R-squared: -0.02855
F-statistic: 0.05622 on 11 and 363 DF, p-value: 1


shapiro.test(rstudent(modelo2))
Shapiro-Wilk normality test
data: rstudent(modelo2)
W = 0.95154, p-value = 9.308e-10

modelo3 <- lm(tdd~mes. -1)
summary(modelo3)
Call:
lm(formula = tdd ~ mes. - 1)
Residuals:
Min 1Q Median 3Q Max
-1.7621 -0.7700 -0.2213 0.7690 3.6787
Coefficients:
Estimate Std. Error t value Pr(>|t|)
mes.January 3.8277 0.1821 21.02 <2e-16 ***
mes.February 3.8621 0.1821 21.21 <2e-16 ***
mes.March 3.8218 0.1821 20.99 <2e-16 ***
mes.April 3.8780 0.1850 20.96 <2e-16 ***
mes.May 3.8779 0.1850 20.96 <2e-16 ***
mes.June 3.8742 0.1850 20.94 <2e-16 ***
mes.July 3.8898 0.1850 21.03 <2e-16 ***
mes.August 3.9213 0.1850 21.20 <2e-16 ***
mes.September 3.8307 0.1850 20.71 <2e-16 ***
mes.October 3.8121 0.1850 20.61 <2e-16 ***
mes.November 3.8314 0.1850 20.71 <2e-16 ***
mes.December 3.7565 0.1850 20.31 <2e-16 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 1.03 on 363 degrees of freedom
Multiple R-squared: 0.9352, Adjusted R-squared: 0.933
F-statistic: 436.4 on 12 and 363 DF, p-value: < 2.2e-16


shapiro.test(rstudent(modelo3))
Shapiro-Wilk normality test
data: rstudent(modelo3)
W = 0.95154, p-value = 9.308e-10

5. En caso de estacionalidad de la serie de tiempo, aplicar diferencias estacionales. Presentar grafica
tdd.d<-autoplot(diff(tdd))

6. Usar prueba Dickey-Fuller para evaluar el orden de integración de la serie. Diferenciar hasta que la serie sea estacionaria.
Diferenciar hasta que la serie sea estacionaria. Ho: Existe raíz unitaria Ha: No existe raíz unitaria
adf.test(tdd)
Augmented Dickey-Fuller Test
data: tdd
Dickey-Fuller = -2.5049, Lag order = 7, p-value = 0.3639
alternative hypothesis: stationary
adf.test(tdd.d)
p-value smaller than printed p-value
Augmented Dickey-Fuller Test
data: tdd.d
Dickey-Fuller = -6.0305, Lag order = 7, p-value = 0.01
alternative hypothesis: stationary
7. Usar herramientas ACF,PACF,EACF y/o criterios de Akaike/Bayes para construir propuestas de modelos.


eacf(tdd.d)
AR/MA
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x o o x o x x o o o o o o o
1 o x o x o o o o o o o o o o
2 x o x o o o o o o o o o o o
3 x o x o o o o o o o o o o o
4 x x x o o o x o o o o o o o
5 x x x x x x o o o o o o o o
6 x x o o o x o o o o o o o o
7 o x o o o x o o o o o o o o

8. Como parte del diagnóstico del modelo, analizar los residuos y aplicar la prueba Ljung-Box.
fit1<-Arima(tdd.d, order=c(1,1,0), seasonal = c(1,1,0))
fit1
Series: tdd.d
ARIMA(1,1,0)(1,1,0)[12]
Coefficients:
ar1 sar1
-0.6851 -0.5895
s.e. 0.0388 0.0419
sigma^2 estimated as 0.1467: log likelihood=-167.61
AIC=341.23 AICc=341.29 BIC=352.89
checkresiduals(fit1)
Ljung-Box test
data: Residuals from ARIMA(1,1,0)(1,1,0)[12]
Q* = 197.66, df = 22, p-value < 2.2e-16
Model df: 2. Total lags used: 24

fit2<-Arima(tdd.d, order=c(2,1,0), seasonal = c(1,1,0))
fit2
Series: tdd.d
ARIMA(2,1,0)(1,1,0)[12]
Coefficients:
ar1 ar2 sar1
-0.9509 -0.3918 -0.5877
s.e. 0.0488 0.0485 0.0423
sigma^2 estimated as 0.1245: log likelihood=-137.73
AIC=283.46 AICc=283.57 BIC=299.01
checkresiduals(fit2)
Ljung-Box test
data: Residuals from ARIMA(2,1,0)(1,1,0)[12]
Q* = 153.02, df = 21, p-value < 2.2e-16
Model df: 3. Total lags used: 24

fit3<-auto.arima(tdd.d)
fit3
Series: tdd.d
ARIMA(3,0,5)(0,0,2)[12] with zero mean
Coefficients:
ar1 ar2 ar3 ma1 ma2 ma3 ma4 ma5 sma1 sma2
-1.4183 0.1019 0.5373 1.1735 -0.3911 -0.3383 0.3859 0.1442 -0.1353 0.1102
s.e. 0.2505 0.4935 0.2457 0.2563 0.4246 0.1610 0.0761 0.0689 0.0546 0.0555
sigma^2 estimated as 0.05748: log likelihood=7.77
AIC=6.46 AICc=7.19 BIC=49.63
checkresiduals(fit3)
Ljung-Box test
data: Residuals from ARIMA(3,0,5)(0,0,2)[12] with zero mean
Q* = 13.83, df = 14, p-value = 0.4625
Model df: 10. Total lags used: 24

9. Usar la función auto.arima() y compare sus resultados con el inciso anterior.
fit4<-auto.arima(tdd.d, stepwise = FALSE, approximation = FALSE)
fit4
Series: tdd.d
ARIMA(1,0,2)(1,0,0)[12] with zero mean
Coefficients:
ar1 ma1 ma2 sar1
0.7332 -1.0379 0.3424 -0.1377
s.e. 0.1178 0.1166 0.0512 0.0521
sigma^2 estimated as 0.05974: log likelihood=-1.96
AIC=13.93 AICc=14.09 BIC=33.55
checkresiduals(fit4)
Ljung-Box test
data: Residuals from ARIMA(1,0,2)(1,0,0)[12] with zero mean
Q* = 23.12, df = 20, p-value = 0.2829
Model df: 4. Total lags used: 24

10. Presente la ecuación final y describa.
fit5<-Arima(tdd.d, order=c(3,0,5), seasonal = c(0,0,2))
fit5
Series: tdd.d
ARIMA(3,0,5)(0,0,2)[12] with non-zero mean
Coefficients:
ar1 ar2 ar3 ma1 ma2 ma3 ma4 ma5 sma1 sma2
-1.4143 0.1106 0.542 1.1685 -0.3997 -0.3421 0.3842 0.1426 -0.1356 0.1089
s.e. 0.2425 0.4779 0.238 0.2483 0.4105 0.1565 0.0762 0.0686 0.0545 0.0555
mean
-0.0050
s.e. 0.0131
sigma^2 estimated as 0.05762: log likelihood=7.84
AIC=8.32 AICc=9.18 BIC=55.41
checkresiduals(fit5)
Ljung-Box test
data: Residuals from ARIMA(3,0,5)(0,0,2)[12] with non-zero mean
Q* = 13.806, df = 13, p-value = 0.3876
Model df: 11. Total lags used: 24

Se ecoge este modelo porque es donde nuestro ACF no se salen y los residuos no se salen mucho a comparación de otros
11. Realizar el pronóstico ARIMA para dos años.
getrmse<-function(x,h,…) { train.end<-time(x)[length(x)-h] test.start<-time(x)[length(x)-h+1] train<-window(x,end=train.end) test<-window(x,start=test.start) fit<-Arima(train,…) fc<-forecast(fit,h=h) return(accuracy(fc,test)[2,“RMSE”]) }
getrmse(tdd,h=24,order=c(1,0,2),seasonal=c(1,0,0))
[1] 0.4559535
getrmse(tdd,h=24,order=c(2,1,1),seasonal=c(1,1,0))
[1] 0.617638
getrmse(tdd,h=24,order=c(2,1,0),seasonal=c(1,1,0))
[1] 0.4229213
getrmse(tdd,h=24,order=c(2,1,0),seasonal=c(1,1,2))
[1] 0.4072446
getrmse(tdd,h=24,order=c(2,1,1),seasonal=c(1,1,2))
[1] 0.2503558
getrmse(tdd,h=24,order=c(2,1,1),seasonal=c(1,1,1))
[1] 0.2523106
getrmse(tdd,h=24,order=c(2,1,1),seasonal=c(0,1,1))
[1] 0.2550056
getrmse(tdd,h=24,order=c(3,0,4),seasonal=c(1,1,0))
[1] 0.3094996
getrmse(tdd,h=24,order=c(3,0,4),seasonal=c(1,1,1))
[1] 0.3900453
getrmse(tdd,h=24,order=c(3,0,4),seasonal=c(0,1,2))
[1] 0.4088291
getrmse(tdd,h=24,order=c(3,1,4),seasonal=c(1,0,0))
[1] 0.3602454
getrmse(tdd,h=24,order=c(3,0,5),seasonal=c(0,0,2))
[1] 0.2359293
getrmse(tdd,h=24,order=c(3,1,1),seasonal=c(0,0,2))
[1] 0.3267824
fit6<-Arima(tdd, order=c(2,1,1),seasonal=c(1,1,2))
fit6
Series: tdd
ARIMA(2,1,1)(1,1,2)[12]
Coefficients:
ar1 ar2 ma1 sar1 sma1 sma2
0.5434 0.3153 -0.8153 -0.2883 -0.8138 -0.1276
s.e. 0.0999 0.0517 0.0927 0.3488 0.3562 0.3553
sigma^2 estimated as 0.06294: log likelihood=-25.08
AIC=64.16 AICc=64.48 BIC=91.4
autoplot(forecast(fit6,h=12,type='b',xlab='Time',ylab='Color Property'))
The non-existent type arguments will be ignored.The non-existent xlab arguments will be ignored.The non-existent ylab arguments will be ignored.

12. Utilizando métodos de pronósticos simples y/o suavizamiento exponencial generar un pronóstico para dos años. Elegir el método que presente la raíz del error medio al cuadrado más pequeño.
Para poder realizar el pronostico de nuestra serie, primeramente se realizo un recorte de los ultimos dos años para despues pronosticar nuestra serie mediante los metodos mean(media), naive y naive estacional.
tdd.c <- window(tdd,start=c(1987,4),end=c(2015,12))


http://rpubs.com/Richie1995/ http://rpubs.com/Richie1995/397935
LS0tDQp0aXRsZTogIlRSQUJBSk8gRklOQUwgREUgU0VSSUVTIERFIFRJRU1QTyINCmF1dGhvcjogImF1dGhvciINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQojU0VSSUVTIERFIFRJRU1QTw0KIyNOYXZhcmlqbyBHYXJj7WEgUmljYXJkbyBEYW5pZWwgDQojI0Nhc3RpbGxlam9zIEFydGVhZ2EgTHVpcyBGZWxpcGUNCiMjVGFzYSBkZSBEZXNlbXBsZW8gZW4gTel4aWNvDQoNCmxpYnJhcnkoVFNBKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ2ZvcnRpZnkpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShmcHAyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkoZm1hKQ0KbGlicmFyeShleHBzbW9vdGgpDQpsaWJyYXJ5KHNlYXNvbmFsKQ0KbGlicmFyeSh1cmNhKQ0KbGlicmFyeShzZWFzb25hbCkNCg0KIyNUQUJMQSBERSBDT05URU5JRE9TDQojIzEuIEJyZXZlIHJlZmVyZW5jaWEgYSBsb3MgZGF0b3MsIGZyZWN1ZW5jaWEsIHVuaWRhZCBkZSBtZWRpZGEsIGZ1ZW50ZSwgZXRjDQojIzIuIEdyYWZpY2FyIGxhIHNlcmllIGRlIHRpZW1wbywgYW5hbGl6YXIgcGF0cm9uZXMgeSBvYnNlcnZhY2lvbmVzIGF07XBpY2FzLiBBcG95ZSBzdSBhbuFsaXNpcyBjb24gdW5hIGRlc2NvbXBvc2ljafNuIGNs4XNpY2EuDQojIzMuIFNpIGVzIG5lY2VzYXJpbywgdXRpbGl6YXIgdHJhbnNmb3JtYWNp824gQm94LUNveCAvIGxvZ2FyaXRtb3MgcGFyYSBlc3RhYmlsaXphciBsYSB2YXJpYW56YS4gUHJlc2VudGFyIGdyYWZpY2ENCiMjNC4gTW9kZWxhciBsYSBzZXJpZSBkZSB0aWVtcG8gZWxlZ2lkYSBjb21vIGZ1bmNp824gZGUgdW5hIHRlbmRlbmNpYSwgdGVuZGVuY2lhIGN1YWRy4XRpY2EgeS9vIG1lZGlhcyBlc3RhY2lvbmFsZXMuIFByZXNlbnRlIGVsIGRpYWdu83N0aWNvIGRlbCBtb2RlbG8gZWxlZ2lkby4NCiMjNS4gRW4gY2FzbyBkZSBlc3RhY2lvbmFsaWRhZCBkZSBsYSBzZXJpZSBkZSB0aWVtcG8sIGFwbGljYXIgZGlmZXJlbmNpYXMgZXN0YWNpb25hbGVzLiBQcmVzZW50YXIgZ3JhZmljYQ0KIyM2LiBVc2FyIHBydWViYSBEaWNrZXktRnVsbGVyIHBhcmEgZXZhbHVhciBlbCBvcmRlbiBkZSBpbnRlZ3JhY2nzbiBkZSBsYSBzZXJpZS4gRGlmZXJlbmNpYXIgaGFzdGEgcXVlIGxhIHNlcmllIHNlYSBlc3RhY2lvbmFyaWEuDQojIzcuIFVzYXIgaGVycmFtaWVudGFzIEFDRixQQUNGLEVBQ0YgeS9vIGNyaXRlcmlvcyBkZSBBa2Fpa2UvQmF5ZXMgcGFyYSBjb25zdHJ1aXIgcHJvcHVlc3RhcyBkZSBtb2RlbG9zLg0KIyM4LiBDb21vIHBhcnRlIGRlbCBkaWFnbvNzdGljbyBkZWwgbW9kZWxvLCBhbmFsaXphciBsb3MgcmVzaWR1b3MgeSBhcGxpY2FyIGxhIHBydWViYSBManVuZy1Cb3guDQojIzkuIFVzYXIgbGEgZnVuY2nzbiBhdXRvLmFyaW1hKCkgeSBjb21wYXJlIHN1cyByZXN1bHRhZG9zIGNvbiBlbCBpbmNpc28gYW50ZXJpb3IuDQojIzEwLiBQcmVzZW50ZSBsYSBlY3VhY2nzbiBmaW5hbCB5IGRlc2NyaWJhLg0KIyMxMS4gUmVhbGl6YXIgZWwgcHJvbvNzdGljbyBBUklNQSBwYXJhIGRvcyBh8W9zLg0KIyMxMi4gVXRpbGl6YW5kbyBt6XRvZG9zIGRlIHByb27zc3RpY29zIHNpbXBsZXMgeS9vIHN1YXZpemFtaWVudG8gZXhwb25lbmNpYWwgZ2VuZXJhciB1biBwcm9u83N0aWNvIHBhcmEgZG9zIGHxb3MuIEVsZWdpciBlbCBt6XRvZG8gcXVlIHByZXNlbnRlIGxhIHJh7XogZGVsIGVycm9yIG1lZGlvIGFsIGN1YWRyYWRvIG3hcyBwZXF1ZfFvLg0KDQojMS4gQnJldmUgcmVmZXJlbmNpYSBhIGxvcyBkYXRvcywgZnJlY3VlbmNpYSwgdW5pZGFkIGRlIG1lZGlkYSwgZnVlbnRlLCBldGMuDQpMYSB0YXNhIGRlIGRlc2VtcGxlbywgdGFtYmnpbiBjb25vY2lkYSBjb21vIHRhc2EgZGUgcGFybywgbWlkZSBlbCBuaXZlbCBkZSBkZXNvY3VwYWNp824gZW4gcmVsYWNp824gYSBsYSBwb2JsYWNp824gYWN0aXZhLiBFbiBvdHJhcyBwYWxhYnJhcywgZXMgbGEgcGFydGUgZGUgbGEgcG9ibGFjafNuIHF1ZSBlc3RhbmRvIGVuIGVkYWQsIGNvbmRpY2lvbmVzIHkgZGlzcG9zaWNp824gZGUgdHJhYmFqYXIgLXBvYmxhY2nzbiBhY3RpdmEtIG5vIHRpZW5lIHB1ZXN0byBkZSB0cmFiYWpvLg0KDQpMYSB0YXNhIGRlIGRlc2VtcGxlbyBlcyBtdXkg+nRpbCBwYXJhIGNvbm9jZXIgbGFzIHBlcnNvbmFzIHF1ZSBubyBlc3ThbiB0cmFiYWphbmRvLiBTdSBm83JtdWxhIGRlIGPhbGN1bG8gZXMgbGEgcG9ibGFjafNuIGRlIDE2IGHxb3MgeSBt4XMgcXVlIG5vIGVzdOEgdHJhYmFqYW5kbyB5IGJ1c2NhIHRyYWJham8sIGRpdmlkaWRvIGVudHJlIGxhIHBvYmxhY2nzbiBlY29u821pY2FtZW50ZSBhY3RpdmEgZGUgMTYgYfFvcyB5IG3hcywgZXN0byBlcywgb2N1cGFkb3MgbeFzIGRlc29jdXBhZG9zLiBTZSBjYWxjdWxhIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQp0YXNhIGRlIGRlc2VtcGxlbz0oTm8uIGRlIGRlc2VtcGxlYWRvcy9Qb2JsYWNpb24gYWN0aXZhKSoxMDANCmRhdG9zIHNhY2RvcyBkZSBodHRwOi8vd3d3LmZhby5vcmcgDQoNCiMyLiBHcmFmaWNhciBsYSBzZXJpZSBkZSB0aWVtcG8sIGFuYWxpemFyIHBhdHJvbmVzIHkgb2JzZXJ2YWNpb25lcyBhdO1waWNhcy4gQXBveWUgc3UgYW7hbGlzaXMgY29uIHVuYSBkZXNjb21wb3NpY2nzbiBjbOFzaWNhLg0KDQpiYXNlPC1yZWFkLmNzdihmaWxlLmNob29zZSgpKQ0KdGRkPC10cyhiYXNlJHRkZCwgc3RhcnQ9IGMoMTk4NywxKSxmcmVxdWVuY3k9IDEyKQ0KYGBge3J9DQphdXRvcGxvdCh0ZGQpDQpgYGANCg0KYGBge3J9DQpnZ3NlYXNvbnBsb3QodGRkKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dzZWFzb25wbG90KHRkZCwgcG9sYXI9VFJVRSkNCmBgYA0KDQphcXXtIHBvZGVtb3MgYXByZWNpYXIgY29tbyB0ZW5lbW9zIHVuYSBkZXNlcmllIGRvbmRlIGF1bWVudCBlbGRlc2VtcGxlbyBlbiBsb3MgOTAncyBwb3IgZWwgZWZlY3RvIHRlcXVpbGEsIGRvbmRlIHR1dmltb3MgdW5hIGRlcHJlc2ljYWNp824gZGUgbGEgbW9uZWRhIG1leGljYW5hLCBkZSBpZ3VhbCBtYW5lcmEgcG9kZW1vcyBvYnNlcnZhciBjb21vIGJhamEgcG9jbyBhIHBvY28gaGFzdGEgZWwgYfFvIDIwMDAgZG9uZGUgdGVuZW1vcyB1biBpbmNyZW1lbnRvIGhhc3RhIGxsZWdhciBhIG90cmEgY3Jpc2lzIGVuIGVsIGHxb3MgMjAwOC0yMDA5IHBlcm8gbm8gdGFuIGZ1ZXJ0ZSBjb21vIGVuIGxvcyA5MCdzDQoNCmZpdCA8LSBkZWNvbXBvc2UodGRkLCB0eXBlPSdtdWx0aXBsaWNhdGl2ZScpDQpgYGB7cn0NCmF1dG9wbG90KGZpdCkNCmBgYA0KUGFyYSBlbCBjYXNvIGNs4XNpY28gb2J0ZW5lbW9zIGxvcyBjb21wb25lbnRlcyBzZXBhcmFkb3MgZGUgbnVlc3RyYSBzZXJpZSwgZW4gcmVsYWNpb24gYSBsYSBlc3RhY2lvbmFsaWRhZCwgdGVuZGVuY2lhIHkgcmVzaWR1b3MuDQoNCmZpdDIgPC0gc2Vhcyh0ZGQsIHgxMT0iIikNCmBgYHtyfQ0KYXV0b3Bsb3QoZml0MikgKyBnZ3RpdGxlKCJYMTEgZGVjb21wb3NpY2lvbiBkZSBsYSB0YXNhIGRlIGRlc2VtcGxlbyIpDQpgYGANClNlIHJlYWxpem8gdW5hIGdy4WZpY2EgcXVlIGNvbXBhcmEgZWwgY29tcG9ydGFtaWVudG8gZGUgbnVlc3Ryb3MgZGF0b3MgY29uIGVsIGRlIHVuIGFqdXN0ZSBlc3RhY2lvbmFsIHkgb2JzZXJ2YW1vcyB1biBjb21wb3J0YW1pZW50byBt4XMgcHJlY2lzbyBlbiBlbCBjb21wb25lbnRlIHRlbmRlbmNpYWwsIGFkZW3hcyBkZSBxdWUgbGEgZXN0YWNpb25hbGlkYWQgcmVmbGVqYSBjYW1iaW9zIHF1ZSB2YW4gYWNvcnRhbmRvIGxvcyBleHRyZW1vcyB2ZXJ0aWNhbGVzIGNvbiB1bmEgcGVxdWXxYSBhbHphIGEgbWl0YWQgZGVsIHBlcmlvZG8sIHF1ZSBkZXNwdelzIHJlZ3Jlc2EgYSBzdSBhY3RpdmlkYWQgaW5pY2lhbC4NCg0KIzMuIFNpIGVzIG5lY2VzYXJpbywgdXRpbGl6YXIgdHJhbnNmb3JtYWNp824gQm94LUNveCAvIGxvZ2FyaXRtb3MgcGFyYSBlc3RhYmlsaXphciBsYSB2YXJpYW56YS4gUHJlc2VudGFyIGdyYWZpY2ENCkVuIG51ZXN0cm9zIGNhc28gc2UgZXN0YW4gdHJhYmFqYW5kbyBjb24g7W5kaWNlcywgcG9yIGxvIGN1YWwgbm8gZXMgY29ycmVjdG8gZWwgaGFjZXIgdXNvIGRlIGxvZ2FyaXRtb3MsIHBvciBsbyBxdWUgc29sbyBjb25zaWRlcmFtb3MgbGEgYXBsaWNhY2nzbiBkZSBsYSBkaWZlcmVuY2lhY2nzbi4gUG9yIGxvIGFudGVyaW9yIGRpY2hvLCBubyBoYWNlbW9zIGNvbnNpZGVyYWNp824gZGUgbGEgdHJhbnNmb3JtYWNp824gQm94IENveC4NCg0KIzQuIE1vZGVsYXIgbGEgc2VyaWUgZGUgdGllbXBvIGVsZWdpZGEgY29tbyBmdW5jafNuIGRlIHVuYSB0ZW5kZW5jaWEsIHRlbmRlbmNpYSBjdWFkcuF0aWNhIHkvbyBtZWRpYXMgZXN0YWNpb25hbGVzLiBQcmVzZW50ZSBlbCBkaWFnbvNzdGljbyBkZWwgbW9kZWxvIGVsZWdpZG8uDQptb2RlbG8xIDwtIGxtKHRkZH50aW1lKHRkZCkpDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbG8xKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGJhc2UsIGFlcyh5PXRkZCwgeD10aW1lKHRkZCkpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChtb2RlbG8xLCB3aGljaCA9IDE6NiwgbmNvbCA9IDIsIGxhYmVsLnNpemUgPSAzKQ0KYGBgDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHJzdHVkZW50KG1vZGVsbzEpKQ0KYGBgDQoNCmBgYHtyfQ0KYXV0b3Bsb3QoYWNmKHJzdHVkZW50KG1vZGVsbzEpLHBsb3Q9RikpDQpgYGANCg0KbWVzLiA8LSBzZWFzb24odGRkKQ0KbW9kZWxvMiA8LSBsbSh0ZGR+bWVzLikNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbG8yKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGJhc2UsIGFlcyh5PXRkZCwgeD10aW1lKHRkZCkpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChtb2RlbG8yLCB3aGljaCA9IDE6NiwgbmNvbCA9IDIsIGxhYmVsLnNpemUgPSAzKQ0KYGBgDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHJzdHVkZW50KG1vZGVsbzIpKQ0KYGBgDQoNCmBgYHtyfQ0KYXV0b3Bsb3QoYWNmKHJzdHVkZW50KG1vZGVsbzIpLHBsb3Q9RikpDQpgYGANCg0KbW9kZWxvMyA8LSBsbSh0ZGR+bWVzLiAtMSkNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbG8zKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGJhc2UsIGFlcyh5PXRkZCwgeD10aW1lKHRkZCkpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChtb2RlbG8zLCB3aGljaCA9IDE6NiwgbmNvbCA9IDIsIGxhYmVsLnNpemUgPSAzKQ0KYGBgDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHJzdHVkZW50KG1vZGVsbzMpKQ0KYGBgDQoNCmBgYHtyfQ0KYXV0b3Bsb3QoYWNmKHJzdHVkZW50KG1vZGVsbzMpLHBsb3Q9RikpDQpgYGANCg0KIzUuIEVuIGNhc28gZGUgZXN0YWNpb25hbGlkYWQgZGUgbGEgc2VyaWUgZGUgdGllbXBvLCBhcGxpY2FyIGRpZmVyZW5jaWFzIGVzdGFjaW9uYWxlcy4gUHJlc2VudGFyIGdyYWZpY2ENCmBgYHtyfQ0KdGRkLmQ8LWF1dG9wbG90KGRpZmYodGRkKSkNCmBgYA0KDQpgYGB7cn0NCmF1dG9wbG90KHRkZC5kKSsgZ2d0aXRsZSgidGFzYSBkZSBkZXNlbXBsZW8iKQ0KYGBgDQoNCiM2LiBVc2FyIHBydWViYSBEaWNrZXktRnVsbGVyIHBhcmEgZXZhbHVhciBlbCBvcmRlbiBkZSBpbnRlZ3JhY2nzbiBkZSBsYSBzZXJpZS4gRGlmZXJlbmNpYXIgaGFzdGEgcXVlIGxhIHNlcmllIHNlYSBlc3RhY2lvbmFyaWEuDQoNCkRpZmVyZW5jaWFyIGhhc3RhIHF1ZSBsYSBzZXJpZSBzZWEgZXN0YWNpb25hcmlhLg0KSG86IEV4aXN0ZSByYe16IHVuaXRhcmlhDQpIYTogTm8gZXhpc3RlIHJh7XogdW5pdGFyaWEgDQoNCmBgYHtyfQ0KYWRmLnRlc3QodGRkKQ0KYGBgDQoNCmBgYHtyfQ0KdGRkLmQ8LShkaWZmKHRkZCkpDQphZGYudGVzdCh0ZGQuZCkNCmBgYA0KDQojNy4gVXNhciBoZXJyYW1pZW50YXMgQUNGLFBBQ0YsRUFDRiB5L28gY3JpdGVyaW9zIGRlIEFrYWlrZS9CYXllcyBwYXJhIGNvbnN0cnVpciBwcm9wdWVzdGFzIGRlIG1vZGVsb3MuDQoNCmBgYHtyfQ0KZ2dBY2YodGRkLmQpDQpgYGANCg0KYGBge3J9DQpnZ1BhY2YodGRkLmQpDQpgYGANCg0KYGBge3J9DQplYWNmKHRkZC5kKQ0KYGBgDQoNCmBgYHtyfQ0KZ2d0c2Rpc3BsYXkodGRkLmQpDQpgYGANCg0KIzguIENvbW8gcGFydGUgZGVsIGRpYWdu83N0aWNvIGRlbCBtb2RlbG8sIGFuYWxpemFyIGxvcyByZXNpZHVvcyB5IGFwbGljYXIgbGEgcHJ1ZWJhIExqdW5nLUJveC4NCg0KZml0MTwtQXJpbWEodGRkLmQsIG9yZGVyPWMoMSwxLDApLCBzZWFzb25hbCA9IGMoMSwxLDApKQ0KYGBge3J9DQpmaXQxDQpgYGANCg0KYGBge3J9DQpjaGVja3Jlc2lkdWFscyhmaXQxKQ0KYGBgDQoNCmZpdDI8LUFyaW1hKHRkZC5kLCBvcmRlcj1jKDIsMSwwKSwgc2Vhc29uYWwgPSBjKDEsMSwwKSkNCmBgYHtyfQ0KZml0Mg0KYGBgDQoNCmBgYHtyfQ0KY2hlY2tyZXNpZHVhbHMoZml0MikNCmBgYA0KDQpmaXQzPC1hdXRvLmFyaW1hKHRkZC5kKQ0KYGBge3J9DQpmaXQzDQpgYGANCg0KYGBge3J9DQpjaGVja3Jlc2lkdWFscyhmaXQzKQ0KYGBgDQoNCiM5LiBVc2FyIGxhIGZ1bmNp824gYXV0by5hcmltYSgpIHkgY29tcGFyZSBzdXMgcmVzdWx0YWRvcyBjb24gZWwgaW5jaXNvIGFudGVyaW9yLg0KZml0NDwtYXV0by5hcmltYSh0ZGQuZCwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQ0KYGBge3J9DQpmaXQ0DQpgYGANCg0KYGBge3J9DQpjaGVja3Jlc2lkdWFscyhmaXQ0KQ0KYGBgDQoNCiMxMC4gUHJlc2VudGUgbGEgZWN1YWNp824gZmluYWwgeSBkZXNjcmliYS4NCg0KZml0NTwtQXJpbWEodGRkLmQsIG9yZGVyPWMoMywwLDUpLCBzZWFzb25hbCA9IGMoMCwwLDIpKQ0KYGBge3J9DQpmaXQ1DQpgYGANCg0KYGBge3J9DQpjaGVja3Jlc2lkdWFscyhmaXQ1KQ0KYGBgDQpTZSBlY29nZSBlc3RlIG1vZGVsbyBwb3JxdWUgZXMgZG9uZGUgbnVlc3RybyBBQ0Ygbm8gc2Ugc2FsZW4geSBsb3MgcmVzaWR1b3Mgbm8gc2Ugc2FsZW4gbXVjaG8gYSBjb21wYXJhY2nzbiBkZSBvdHJvcyANCg0KIzExLiBSZWFsaXphciBlbCBwcm9u83N0aWNvIEFSSU1BIHBhcmEgZG9zIGHxb3MuDQoNCmdldHJtc2U8LWZ1bmN0aW9uKHgsaCwuLi4pDQp7DQp0cmFpbi5lbmQ8LXRpbWUoeClbbGVuZ3RoKHgpLWhdDQp0ZXN0LnN0YXJ0PC10aW1lKHgpW2xlbmd0aCh4KS1oKzFdDQp0cmFpbjwtd2luZG93KHgsZW5kPXRyYWluLmVuZCkNCnRlc3Q8LXdpbmRvdyh4LHN0YXJ0PXRlc3Quc3RhcnQpDQpmaXQ8LUFyaW1hKHRyYWluLC4uLikNCmZjPC1mb3JlY2FzdChmaXQsaD1oKQ0KcmV0dXJuKGFjY3VyYWN5KGZjLHRlc3QpWzIsIlJNU0UiXSkNCn0NCmBgYHtyfQ0KZ2V0cm1zZSh0ZGQsaD0yNCxvcmRlcj1jKDEsMCwyKSxzZWFzb25hbD1jKDEsMCwwKSkNCmBgYA0KYGBge3J9DQpnZXRybXNlKHRkZCxoPTI0LG9yZGVyPWMoMiwxLDEpLHNlYXNvbmFsPWMoMSwxLDApKQ0KYGBgDQpgYGB7cn0NCmdldHJtc2UodGRkLGg9MjQsb3JkZXI9YygyLDEsMCksc2Vhc29uYWw9YygxLDEsMCkpDQpgYGANCmBgYHtyfQ0KZ2V0cm1zZSh0ZGQsaD0yNCxvcmRlcj1jKDIsMSwwKSxzZWFzb25hbD1jKDEsMSwyKSkNCmBgYA0KYGBge3J9DQpnZXRybXNlKHRkZCxoPTI0LG9yZGVyPWMoMiwxLDEpLHNlYXNvbmFsPWMoMSwxLDIpKQ0KYGBgDQpgYGB7cn0NCmdldHJtc2UodGRkLGg9MjQsb3JkZXI9YygyLDEsMSksc2Vhc29uYWw9YygxLDEsMSkpDQpgYGANCmBgYHtyfQ0KZ2V0cm1zZSh0ZGQsaD0yNCxvcmRlcj1jKDIsMSwxKSxzZWFzb25hbD1jKDAsMSwxKSkNCmBgYA0KYGBge3J9DQpnZXRybXNlKHRkZCxoPTI0LG9yZGVyPWMoMywwLDQpLHNlYXNvbmFsPWMoMSwxLDApKQ0KYGBgDQpgYGB7cn0NCmdldHJtc2UodGRkLGg9MjQsb3JkZXI9YygzLDAsNCksc2Vhc29uYWw9YygxLDEsMSkpDQpgYGANCmBgYHtyfQ0KZ2V0cm1zZSh0ZGQsaD0yNCxvcmRlcj1jKDMsMCw0KSxzZWFzb25hbD1jKDAsMSwyKSkNCmBgYA0KYGBge3J9DQpnZXRybXNlKHRkZCxoPTI0LG9yZGVyPWMoMywxLDQpLHNlYXNvbmFsPWMoMSwwLDApKQ0KYGBgDQpgYGB7cn0NCmdldHJtc2UodGRkLGg9MjQsb3JkZXI9YygzLDAsNSksc2Vhc29uYWw9YygwLDAsMikpDQpgYGANCmBgYHtyfQ0KZ2V0cm1zZSh0ZGQsaD0yNCxvcmRlcj1jKDMsMSwxKSxzZWFzb25hbD1jKDAsMCwyKSkNCmBgYA0KDQpmaXQ2PC1BcmltYSh0ZGQsIG9yZGVyPWMoMiwxLDEpLHNlYXNvbmFsPWMoMSwxLDIpKQ0KDQpgYGB7cn0NCmZpdDYNCmBgYA0KDQpgYGB7cn0NCmF1dG9wbG90KGZvcmVjYXN0KGZpdDYsaD0xMix0eXBlPSdiJyx4bGFiPSdUaW1lJyx5bGFiPSdDb2xvciAgUHJvcGVydHknKSkNCmBgYA0KDQojMTIuIFV0aWxpemFuZG8gbel0b2RvcyBkZSBwcm9u83N0aWNvcyBzaW1wbGVzIHkvbyBzdWF2aXphbWllbnRvIGV4cG9uZW5jaWFsIGdlbmVyYXIgdW4gcHJvbvNzdGljbyBwYXJhIGRvcyBh8W9zLiBFbGVnaXIgZWwgbel0b2RvIHF1ZSBwcmVzZW50ZSBsYSByYe16IGRlbCBlcnJvciBtZWRpbyBhbCBjdWFkcmFkbyBt4XMgcGVxdWXxby4NCg0KUGFyYSBwb2RlciByZWFsaXphciBlbCBwcm9ub3N0aWNvIGRlIG51ZXN0cmEgc2VyaWUsIHByaW1lcmFtZW50ZSBzZSByZWFsaXpvIHVuIHJlY29ydGUgZGUgbG9zIHVsdGltb3MgZG9zIGHxb3MgcGFyYSBkZXNwdWVzIHByb25vc3RpY2FyIG51ZXN0cmEgc2VyaWUgbWVkaWFudGUgbG9zIG1ldG9kb3MgbWVhbihtZWRpYSksIG5haXZlIHkgbmFpdmUgZXN0YWNpb25hbC4NCg0KdGRkLmMgPC0gd2luZG93KHRkZCxzdGFydD1jKDE5ODcsNCksZW5kPWMoMjAxNSwxMikpDQpgYGB7cn0NCmF1dG9wbG90KHRkZC5jKQ0KYGBgDQoNCmBgYHtyfQ0KYXV0b3Bsb3QodGRkLmMpK2ZvcmVjYXN0OjphdXRvbGF5ZXIobWVhbmYodGRkLmMsaD00MiksUEk9RkFMU0Usc2VyaWVzPSJNZWFuIikrZm9yZWNhc3Q6OmF1dG9sYXllcihyd2YodGRkLmMsaD00MiksUEk9RkFMU0Usc2VyaWVzPSJOYe92ZSIpK2ZvcmVjYXN0OjphdXRvbGF5ZXIocndmKHRkZC5jLGRyaWZ0PVRSVUUsaD00MiksUEk9RkFMU0Usc2VyaWVzPSJEcmlmdCIpK2dndGl0bGUoIlRhc2EgZGUgRGVzZW1wbGVvIikreGxhYigiRGF5IikreWxhYigiYfFvIikrZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IkZvcmVjYXN0IikpDQoNCmBgYA0KDQpodHRwOi8vcnB1YnMuY29tL1JpY2hpZTE5OTUvDQpodHRwOi8vcnB1YnMuY29tL1JpY2hpZTE5OTUvMzk3OTM1IA0K