Contexto

En esta actividad usaremos 3 diferentes bases de datos.

Tema 1. Datos panel

1. Hogares: con variables como Año, Miembros, Ingresos, Gasto, Ahorro y Satisfacción.

Tema 2. Series de tiempo

2. Population: con variables como estado, año y población.

Tema 3. Modelos de ecuaciones estructurales

3. Ecosistema: con las siguientes variables,

Calidad del Suelo:

SPH: pH del Suelo

NC: Contenido de Nutrientes

OM: Materia Orgánica

Calidad del Agua:

CL: Niveles de Contaminantes

DO: Oxígeno Disuelto

WPH: pH del Agua

Salud del Ecosistema

SD: Diversidad de Especies

BM: Biomasa

EP: Productividad del Ecosistema

Instalar paquetes y llamar librerías

# Paquetes necesarios
# install.packages("WDI")
# install.packages("wbstats")
# install.packages("gplots")
# install.packages("plm")
#install.packages("DataExplorer")
library(WDI)
library(wbstats)
library(dplyr)
library(tidyverse)
library(plm)
library(gplots)
library(readxl)
library(lmtest)
library(forecast)
library(readxl)
library(lavaanPlot)
library(lavaan)
library(DataExplorer)

Tema 1. Datos de Panel

Importar la Base de Datos

df_hogares=read_excel('/Users/luisangeldiazcontreras/Library/CloudStorage/OneDrive-InstitutoTecnologicoydeEstudiosSuperioresdeMonterrey/9th season/M1/hogares.xlsx')
df_population=read_csv('/Users/luisangeldiazcontreras/Library/CloudStorage/OneDrive-InstitutoTecnologicoydeEstudiosSuperioresdeMonterrey/9th season/M1/population.csv')
df_ecosistemas=read_csv('/Users/luisangeldiazcontreras/Library/CloudStorage/OneDrive-InstitutoTecnologicoydeEstudiosSuperioresdeMonterrey/9th season/M1/ecosistema.csv')

Revisar Heterogeneidad

plotmeans (HogarID ~ Año, main= "Heterogeneidad entre hogares en el tiempo", data=df_hogares)

Creación de Datos de Panel

df1 <- pdata.frame(df_hogares,index=c("HogarID", "Año"))

Modelo 1. Regresión Agrupada (pooled)

pooled <- plm(Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, data = df1, model = "pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, 
##     data = df1, model = "pooling")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -3.522293 -0.642726  0.031837  0.700747  3.072450 
## 
## Coefficients: (1 dropped because of singularities)
##                Estimate  Std. Error  t-value Pr(>|t|)    
## (Intercept)  5.3662e+00  1.7113e-01  31.3567   <2e-16 ***
## Miembros    -2.9522e-02  2.8950e-02  -1.0198   0.3081    
## Ingreso      8.9451e-05  3.9046e-06  22.9089   <2e-16 ***
## Gasto       -9.9934e-05  4.8388e-06 -20.6524   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1888.5
## Residual Sum of Squares: 1015.8
## R-Squared:      0.46209
## Adj. R-Squared: 0.46047
## F-statistic: 285.209 on 3 and 996 DF, p-value: < 2.22e-16

Modelo 2. Efectos Fijos (within)

within <- plm(Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, data = df1, model = "within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, 
##     data = df1, model = "within")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -3.47988 -0.64311  0.06577  0.60962  2.98563 
## 
## Coefficients: (1 dropped because of singularities)
##            Estimate  Std. Error t-value  Pr(>|t|)    
## Ingreso  9.2085e-05  6.7477e-06 13.6469 < 2.2e-16 ***
## Gasto   -1.1352e-04  1.1653e-05 -9.7411 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1229.3
## Residual Sum of Squares: 940.52
## R-Squared:      0.23488
## Adj. R-Squared: 0.14882
## F-statistic: 137.836 on 2 and 898 DF, p-value: < 2.22e-16

Prueba: Modelo Pooled vs Modelo de Efectos Fijos

pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro
## F = 0.73356, df1 = 98, df2 = 898, p-value = 0.9735
## alternative hypothesis: significant effects

Modelo 3. Efectos Aleatorios - Metodo Walhus

walhus <- plm(Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, data = df1, model = "random", random.method = "walhus")
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, 
##     data = df1, model = "random", random.method = "walhus")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                 var std.dev share
## idiosyncratic 1.047   1.023     1
## individual    0.000   0.000     0
## theta: 0
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -3.522293 -0.642726  0.031837  0.700747  3.072450 
## 
## Coefficients: (1 dropped because of singularities)
##                Estimate  Std. Error  z-value Pr(>|z|)    
## (Intercept)  5.3662e+00  1.7113e-01  31.3567   <2e-16 ***
## Miembros    -2.9522e-02  2.8950e-02  -1.0198   0.3078    
## Ingreso      8.9451e-05  3.9046e-06  22.9089   <2e-16 ***
## Gasto       -9.9934e-05  4.8388e-06 -20.6524   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1888.5
## Residual Sum of Squares: 1015.8
## R-Squared:      0.46209
## Adj. R-Squared: 0.46047
## Chisq: 855.626 on 3 DF, p-value: < 2.22e-16

Modelo 3. Efectos Aleatorios - Metodo Amemiya

amemiya <- plm(Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, data = df1, model = "random", random.method = "amemiya")
summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro, 
##     data = df1, model = "random", random.method = "amemiya")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                 var std.dev share
## idiosyncratic 1.045   1.022     1
## individual    0.000   0.000     0
## theta: 0
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -3.522293 -0.642726  0.031837  0.700747  3.072450 
## 
## Coefficients: (1 dropped because of singularities)
##                Estimate  Std. Error  z-value Pr(>|z|)    
## (Intercept)  5.3662e+00  1.7113e-01  31.3567   <2e-16 ***
## Miembros    -2.9522e-02  2.8950e-02  -1.0198   0.3078    
## Ingreso      8.9451e-05  3.9046e-06  22.9089   <2e-16 ***
## Gasto       -9.9934e-05  4.8388e-06 -20.6524   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1888.5
## Residual Sum of Squares: 1015.8
## R-Squared:      0.46209
## Adj. R-Squared: 0.46047
## Chisq: 855.626 on 3 DF, p-value: < 2.22e-16

Modelo Efectos Fijos VS Modelo Efectos Aleatorios

phtest(walhus,within)
## 
##  Hausman Test
## 
## data:  Satisfacción ~ Miembros + Ingreso + Gasto + Ahorro
## chisq = 1.8826, df = 2, p-value = 0.3901
## alternative hypothesis: one model is inconsistent

Tema 2. Series de tiempo

Generar la serie de tiempo

df2 <- df_population %>% group_by(year) %>% summarise("population"=sum(population))
ts <- ts(data=df2$population, start=1900, frequency=1)

Generar modelo ARIMA

arima <- auto.arima(ts)
summary(arima)
## Series: ts 
## ARIMA(0,2,2) 
## 
## Coefficients:
##           ma1      ma2
##       -0.6804  -0.1615
## s.e.   0.0927   0.0987
## 
## sigma^2 = 1.102e+12:  log likelihood = -1802.93
## AIC=3611.86   AICc=3612.07   BIC=3620.17
## 
## Training set error measures:
##                    ME    RMSE      MAE        MPE      MAPE      MASE      ACF1
## Training set 36421.56 1031987 442586.8 0.02677207 0.2636174 0.2058893 -0.011439

Generar el pronóstico

pronostico <- forecast(arima, level=95, h=5)
pronostico
##      Point Forecast     Lo 95     Hi 95
## 2020      330368874 328311638 332426110
## 2021      332609084 329202860 336015307
## 2022      334849293 330283643 339414944
## 2023      337089503 331417432 342761574
## 2024      339329713 332562452 346096974
plot(pronostico, main="Población total anual")

Tema 3. Modelos de Ecuaciones Estructurales

Generar el Modelo

modelo <- '
          #Regresiones
          #Variables latentes
          CalidadSuelo =~ SPH + NC + OM
          CalidadAgua  =~ CL + DO + WPH
          SaludEcosistema =~ SD + BM + EP
          #Varianzas y covarianzas
          CalidadSuelo ~~ CalidadAgua
          CalidadSuelo ~~ SaludEcosistema
          CalidadAgua ~~ SaludEcosistema
          #Intercepto
          '

Generar el diagrama

df3 <- scale(df_ecosistemas)
df4 <- cfa(modelo, df3)
## Warning: lavaan->lav_object_post_check():  
##    covariance matrix of latent variables is not positive definite ; use 
##    lavInspect(fit, "cov.lv") to investigate.
summary(df4)
## lavaan 0.6-19 ended normally after 97 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        21
## 
##   Number of observations                           200
## 
## Model Test User Model:
##                                                       
##   Test statistic                                17.149
##   Degrees of freedom                                24
##   P-value (Chi-square)                           0.842
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)
##   CalidadSuelo =~                                       
##     SPH                 1.000                           
##     NC                  2.217    1.332    1.664    0.096
##     OM                  0.167    0.402    0.414    0.679
##   CalidadAgua =~                                        
##     CL                  1.000                           
##     DO                 -0.827    0.427   -1.936    0.053
##     WPH                 0.404    0.359    1.124    0.261
##   SaludEcosistema =~                                    
##     SD                  1.000                           
##     BM                 -1.899    3.995   -0.475    0.634
##     EP                 -4.224    8.093   -0.522    0.602
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   CalidadSuelo ~~                                     
##     CalidadAgua      -0.079    0.051   -1.558    0.119
##     SaludEcosistem   -0.010    0.020   -0.497    0.619
##   CalidadAgua ~~                                      
##     SaludEcosistem   -0.018    0.034   -0.513    0.608
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .SPH               0.926    0.103    9.016    0.000
##    .NC                0.657    0.226    2.906    0.004
##    .OM                0.993    0.100    9.978    0.000
##    .CL                0.953    0.118    8.086    0.000
##    .DO                0.966    0.108    8.977    0.000
##    .WPH               0.988    0.099    9.938    0.000
##    .SD                0.992    0.100    9.954    0.000
##    .BM                0.985    0.102    9.618    0.000
##    .EP                0.948    0.166    5.720    0.000
##     CalidadSuelo      0.069    0.057    1.197    0.231
##     CalidadAgua       0.042    0.075    0.558    0.577
##     SaludEcosistem    0.003    0.012    0.221    0.825
lavaanPlot(df4, coef=TRUE, cov=TRUE)
LS0tCnRpdGxlOiAnQWN0aXZpZGFkIEludGVncmFkb3JhIDInCmF1dGhvcjogIkx1aXMgQW5nZSBEw61heiBBMDE2NjIwMzQiCmRhdGU6ICIyMDI1LTA4LTI3IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogY2VydWxlYW4KLS0tCiFbXShodHRwczovL2Nkbi5kcmliYmJsZS5jb20vdXNlcnVwbG9hZC8yMTIxMDczNS9maWxlL29yaWdpbmFsLWY3ZWJkZjY1ODYwYmZiZmQ3M2U1MzU1ZDU5NmNjZjA2LmdpZikKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGUiPiBDb250ZXh0byA8L3NwYW4+CkVuIGVzdGEgYWN0aXZpZGFkIHVzYXJlbW9zIDMgZGlmZXJlbnRlcyBiYXNlcyBkZSBkYXRvcy4KClRlbWEgMS4gRGF0b3MgcGFuZWwKCioqMS4gSG9nYXJlczoqKiBjb24gdmFyaWFibGVzIGNvbW8gQcOxbywgTWllbWJyb3MsIEluZ3Jlc29zLCBHYXN0bywgQWhvcnJvIHkgU2F0aXNmYWNjacOzbi4KClRlbWEgMi4gU2VyaWVzIGRlIHRpZW1wbwoKKioyLiBQb3B1bGF0aW9uOioqIGNvbiB2YXJpYWJsZXMgY29tbyBlc3RhZG8sIGHDsW8geSBwb2JsYWNpw7NuLgoKVGVtYSAzLiBNb2RlbG9zIGRlIGVjdWFjaW9uZXMgZXN0cnVjdHVyYWxlcwoKKiozLiBFY29zaXN0ZW1hOioqIGNvbiBsYXMgc2lndWllbnRlcyB2YXJpYWJsZXMsCgpDYWxpZGFkIGRlbCBTdWVsbzoKIApTUEg6IHBIIGRlbCBTdWVsbwogCk5DOiBDb250ZW5pZG8gZGUgTnV0cmllbnRlcwogCk9NOiBNYXRlcmlhIE9yZ8OhbmljYQoKIApDYWxpZGFkIGRlbCBBZ3VhOgogCkNMOiBOaXZlbGVzIGRlIENvbnRhbWluYW50ZXMKCkRPOiBPeMOtZ2VubyBEaXN1ZWx0bwogCldQSDogcEggZGVsIEFndWEKIAoKU2FsdWQgZGVsIEVjb3Npc3RlbWEKClNEOiBEaXZlcnNpZGFkIGRlIEVzcGVjaWVzCiAKQk06IEJpb21hc2EKIApFUDogUHJvZHVjdGl2aWRhZCBkZWwgRWNvc2lzdGVtYQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IHB1cnBsZSI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFBhcXVldGVzIG5lY2VzYXJpb3MKIyBpbnN0YWxsLnBhY2thZ2VzKCJXREkiKQojIGluc3RhbGwucGFja2FnZXMoIndic3RhdHMiKQojIGluc3RhbGwucGFja2FnZXMoImdwbG90cyIpCiMgaW5zdGFsbC5wYWNrYWdlcygicGxtIikKI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpCmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHdic3RhdHMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBsbSkKbGlicmFyeShncGxvdHMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkobGF2YWFuUGxvdCkKbGlicmFyeShsYXZhYW4pCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnB1cnBsZSI+IFRlbWEgMS4gRGF0b3MgZGUgUGFuZWwgPC9zcGFuPgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBJbXBvcnRhciBsYSBCYXNlIGRlIERhdG9zIDwvc3Bhbj4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGZfaG9nYXJlcz1yZWFkX2V4Y2VsKCcvVXNlcnMvbHVpc2FuZ2VsZGlhemNvbnRyZXJhcy9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9PbmVEcml2ZS1JbnN0aXR1dG9UZWNub2xvZ2ljb3lkZUVzdHVkaW9zU3VwZXJpb3Jlc2RlTW9udGVycmV5Lzl0aCBzZWFzb24vTTEvaG9nYXJlcy54bHN4JykKZGZfcG9wdWxhdGlvbj1yZWFkX2NzdignL1VzZXJzL2x1aXNhbmdlbGRpYXpjb250cmVyYXMvTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtSW5zdGl0dXRvVGVjbm9sb2dpY295ZGVFc3R1ZGlvc1N1cGVyaW9yZXNkZU1vbnRlcnJleS85dGggc2Vhc29uL00xL3BvcHVsYXRpb24uY3N2JykKZGZfZWNvc2lzdGVtYXM9cmVhZF9jc3YoJy9Vc2Vycy9sdWlzYW5nZWxkaWF6Y29udHJlcmFzL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL09uZURyaXZlLUluc3RpdHV0b1RlY25vbG9naWNveWRlRXN0dWRpb3NTdXBlcmlvcmVzZGVNb250ZXJyZXkvOXRoIHNlYXNvbi9NMS9lY29zaXN0ZW1hLmNzdicpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBSZXZpc2FyIEhldGVyb2dlbmVpZGFkIDwvc3Bhbj4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdG1lYW5zIChIb2dhcklEIH4gQcOxbywgbWFpbj0gIkhldGVyb2dlbmVpZGFkIGVudHJlIGhvZ2FyZXMgZW4gZWwgdGllbXBvIiwgZGF0YT1kZl9ob2dhcmVzKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gQ3JlYWNpw7NuIGRlIERhdG9zIGRlIFBhbmVsIDwvc3Bhbj4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRmMSA8LSBwZGF0YS5mcmFtZShkZl9ob2dhcmVzLGluZGV4PWMoIkhvZ2FySUQiLCAiQcOxbyIpKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gTW9kZWxvIDEuIFJlZ3Jlc2nDs24gQWdydXBhZGEgKHBvb2xlZCkgPC9zcGFuPgpgYGB7cn0KcG9vbGVkIDwtIHBsbShTYXRpc2ZhY2Npw7NuIH4gTWllbWJyb3MgKyBJbmdyZXNvICsgR2FzdG8gKyBBaG9ycm8sIGRhdGEgPSBkZjEsIG1vZGVsID0gInBvb2xpbmciKQpzdW1tYXJ5KHBvb2xlZCkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IE1vZGVsbyAyLiBFZmVjdG9zIEZpam9zICh3aXRoaW4pIDwvc3Bhbj4KYGBge3J9CndpdGhpbiA8LSBwbG0oU2F0aXNmYWNjacOzbiB+IE1pZW1icm9zICsgSW5ncmVzbyArIEdhc3RvICsgQWhvcnJvLCBkYXRhID0gZGYxLCBtb2RlbCA9ICJ3aXRoaW4iKQpzdW1tYXJ5KHdpdGhpbikKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IFBydWViYTogTW9kZWxvIFBvb2xlZCB2cyBNb2RlbG8gZGUgRWZlY3RvcyBGaWpvcyA8L3NwYW4+CmBgYHtyfQpwRnRlc3Qod2l0aGluLCBwb29sZWQpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBNb2RlbG8gMy4gRWZlY3RvcyBBbGVhdG9yaW9zIC0gTWV0b2RvIFdhbGh1czwvc3Bhbj4KYGBge3J9CndhbGh1cyA8LSBwbG0oU2F0aXNmYWNjacOzbiB+IE1pZW1icm9zICsgSW5ncmVzbyArIEdhc3RvICsgQWhvcnJvLCBkYXRhID0gZGYxLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpCnN1bW1hcnkod2FsaHVzKQpgYGAKCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IE1vZGVsbyAzLiBFZmVjdG9zIEFsZWF0b3Jpb3MgLSBNZXRvZG8gQW1lbWl5YTwvc3Bhbj4KYGBge3J9CmFtZW1peWEgPC0gcGxtKFNhdGlzZmFjY2nDs24gfiBNaWVtYnJvcyArIEluZ3Jlc28gKyBHYXN0byArIEFob3JybywgZGF0YSA9IGRmMSwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJhbWVtaXlhIikKc3VtbWFyeShhbWVtaXlhKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBNb2RlbG8gRWZlY3RvcyBGaWpvcyBWUyBNb2RlbG8gRWZlY3RvcyBBbGVhdG9yaW9zPC9zcGFuPgpgYGB7cn0KcGh0ZXN0KHdhbGh1cyx3aXRoaW4pCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IHB1cnBsZSI+IFRlbWEgMi4gU2VyaWVzIGRlIHRpZW1wbzwvc3Bhbj4KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBHZW5lcmFyIGxhIHNlcmllIGRlIHRpZW1wbzwvc3Bhbj4KYGBge3J9CmRmMiA8LSBkZl9wb3B1bGF0aW9uICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKCJwb3B1bGF0aW9uIj1zdW0ocG9wdWxhdGlvbikpCnRzIDwtIHRzKGRhdGE9ZGYyJHBvcHVsYXRpb24sIHN0YXJ0PTE5MDAsIGZyZXF1ZW5jeT0xKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gR2VuZXJhciBtb2RlbG8gQVJJTUE8L3NwYW4+CmBgYHtyfQphcmltYSA8LSBhdXRvLmFyaW1hKHRzKQpzdW1tYXJ5KGFyaW1hKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBHZW5lcmFyIGVsIHByb27Ds3N0aWNvIDwvc3Bhbj4KYGBge3J9CnByb25vc3RpY28gPC0gZm9yZWNhc3QoYXJpbWEsIGxldmVsPTk1LCBoPTUpCnByb25vc3RpY28KcGxvdChwcm9ub3N0aWNvLCBtYWluPSJQb2JsYWNpw7NuIHRvdGFsIGFudWFsIikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogcHVycGxlIj4gVGVtYSAzLiBNb2RlbG9zIGRlIEVjdWFjaW9uZXMgRXN0cnVjdHVyYWxlcyA8L3NwYW4+CiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gR2VuZXJhciBlbCBNb2RlbG8gPC9zcGFuPgpgYGB7cn0KbW9kZWxvIDwtICcKICAgICAgICAgICNSZWdyZXNpb25lcwogICAgICAgICAgI1ZhcmlhYmxlcyBsYXRlbnRlcwogICAgICAgICAgQ2FsaWRhZFN1ZWxvID1+IFNQSCArIE5DICsgT00KICAgICAgICAgIENhbGlkYWRBZ3VhICA9fiBDTCArIERPICsgV1BICiAgICAgICAgICBTYWx1ZEVjb3Npc3RlbWEgPX4gU0QgKyBCTSArIEVQCiAgICAgICAgICAjVmFyaWFuemFzIHkgY292YXJpYW56YXMKICAgICAgICAgIENhbGlkYWRTdWVsbyB+fiBDYWxpZGFkQWd1YQogICAgICAgICAgQ2FsaWRhZFN1ZWxvIH5+IFNhbHVkRWNvc2lzdGVtYQogICAgICAgICAgQ2FsaWRhZEFndWEgfn4gU2FsdWRFY29zaXN0ZW1hCiAgICAgICAgICAjSW50ZXJjZXB0bwogICAgICAgICAgJwpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gR2VuZXJhciBlbCBkaWFncmFtYSA8L3NwYW4+CmBgYHtyfQpkZjMgPC0gc2NhbGUoZGZfZWNvc2lzdGVtYXMpCmRmNCA8LSBjZmEobW9kZWxvLCBkZjMpCnN1bW1hcnkoZGY0KQpsYXZhYW5QbG90KGRmNCwgY29lZj1UUlVFLCBjb3Y9VFJVRSkKYGBgCgoK