Actividad

Instalar paquete y Llamar librerías

#install.packages("WDI")
library(WDI)
#install.packages("wbstats")
library(wbstats)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("plm") #Realiza modelos lineales para datos de panel
library(plm)
#install.packages("gplots")
library(gplots)

Obtener Información

gdp <- wb_data(country=c("MX","US","CA"), indicator=c("NY.GDP.PCAP.CD","SM.POP.NETM"), start_date = 1950, end_date = 2025)
#View(gdp)

Generar conjunto de datos de panel

Panel_1 <- select(gdp, country, date, NY.GDP.PCAP.CD, SM.POP.NETM)
Panel_1 <- subset(Panel_1, date == 1960 | date == 1970 | date == 1980 | date == 1990 | date == 2000 | date == 2010 | date == 2020)

Panel_1 <- pdata.frame(Panel_1, index = c("country","date"))
Panel_1
##                          country date NY.GDP.PCAP.CD SM.POP.NETM
## Canada-1960               Canada 1960      2264.9485       49694
## Canada-1970               Canada 1970      4135.8215      304627
## Canada-1980               Canada 1980     11208.2027      122743
## Canada-1990               Canada 1990     21525.8611      181461
## Canada-2000               Canada 2000     24271.0021      201727
## Canada-2010               Canada 2010     47560.6666      225369
## Canada-2020               Canada 2020     43537.8393      256592
## Mexico-1960               Mexico 1960       355.0752      -85591
## Mexico-1970               Mexico 1970       699.0068     -164100
## Mexico-1980               Mexico 1980      3054.6216     -252177
## Mexico-1990               Mexico 1990      3154.4692     -321764
## Mexico-2000               Mexico 2000      7524.0271     -356433
## Mexico-2010               Mexico 2010      9728.8008      -40845
## Mexico-2020               Mexico 2020      8841.2708     -147456
## United States-1960 United States 1960      3002.0893      422708
## United States-1970 United States 1970      5234.2967      744902
## United States-1980 United States 1980     12574.7915      595916
## United States-1990 United States 1990     23888.6000     1084720
## United States-2000 United States 2000     36329.9703     1248392
## United States-2010 United States 2010     48642.6312     1594453
## United States-2020 United States 2020     64401.5074      329769

Obtener Información2

gdp2 <- wb_data(country=c("FR","DE","PL"), indicator=c("NY.GDP.PCAP.KD.ZG","AG.PRD.CROP.XD"), start_date = 1950, end_date = 2010)
#View(gdp2)

Generar conjunto de datos de panel

Panel_2 <- select(gdp2, country, date, NY.GDP.PCAP.KD.ZG, AG.PRD.CROP.XD)
Panel_2 <- subset(Panel_2, date == 1960 | date == 1970 | date == 1980 | date == 1990 | date == 2000 | date == 2010)

Panel_2 <- pdata.frame(Panel_2, index = c("country","date"))
Panel_2
##              country date NY.GDP.PCAP.KD.ZG AG.PRD.CROP.XD
## France-1960   France 1960                NA             NA
## France-1970   France 1970          5.238215          83.98
## France-1980   France 1980          1.134990          91.14
## France-1990   France 1990          2.268451          98.60
## France-2000   France 2000          3.428690         103.98
## France-2010   France 2010          1.498725          98.02
## Germany-1960 Germany 1960                NA             NA
## Germany-1970 Germany 1970          4.754088          88.75
## Germany-1980 Germany 1980          1.198694          81.32
## Germany-1990 Germany 1990          4.351639          89.56
## Germany-2000 Germany 2000          2.738012         101.29
## Germany-2010 Germany 2010          4.306441          91.64
## Poland-1960   Poland 1960                NA             NA
## Poland-1970   Poland 1970                NA         122.69
## Poland-1980   Poland 1980                NA          89.00
## Poland-1990   Poland 1990                NA         128.14
## Poland-2000   Poland 2000          5.755023         101.87
## Poland-2010   Poland 2010          3.464009          88.29

Paso 1 Generar conjunto de datos de panel

#Obtener información de varios países 
#gdp <- wb_data(country=c("MX","US","CA"), indicator=c("NY.GDP.PCAP.CD","SM.POP.NETM"), start_date = 1950, end_date = 2025)
#View(gdp)

#Generar conjunto de datos panel
#Panel_1 <- select(gdp, country, date, NY.GDP.PCAP.CD, SM.POP.NETM)
#Panel_1 <- subset(Panel_1, date == 1960 | date == 1970 | date == 1980 | date == 1990 | date == 2000 | date == 2010 #| date == 2020)

#Panel_1 <- pdata.frame(Panel_1, index = c("country","date"))
#Panel_1

#NO CORRER

Paso 2: Prueba de Heterogeneidad

plotmeans(NY.GDP.PCAP.CD ~ country, main= "Prueba de heterogenidad entre paises para el PIB", data= Panel_1)

# Si la linea sale casi horizontal, hay poca o nula heterogenidad, por lo que no hay diferencias sistematicas que ajustar. 

#Si la linea sale quebrada, sube y baja, hay mucha Heterogenidad, por lo que hay que ajustar. (Buscamos esta linea quebarada para utilizar ya sea los modelos fijos o aleatorios)

#plotmeans(SM.POP.NETM ~ country, main= "Prueba de heterogenidad entre paises para la migracion neta", data= Panel_1)

Paso 3: Prueba de efectos fijos y aleatorios

#Modelo 1. Regresión agrupada (pooled)
#Asume que no hay heterogeneidad observada
pooled <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, Panel_1, model="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "pooling")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -21506.0 -10924.8  -3728.9   5274.5  45389.3 
## 
## Coefficients:
##               Estimate Std. Error t-value Pr(>|t|)   
## (Intercept) 1.2873e+04 4.2134e+03  3.0553 0.006511 **
## SM.POP.NETM 1.8616e-02 7.2324e-03  2.5740 0.018588 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7259500000
## Residual Sum of Squares: 5382600000
## R-Squared:      0.25855
## Adj. R-Squared: 0.21952
## F-statistic: 6.62533 on 1 and 19 DF, p-value: 0.018588
#Modelo 2. Efectos fijos (within)
#Cuando las diferencias no observadas son constantes en el tiempo
within <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "within" )
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "within")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -20886.56  -9903.27   -403.03   3407.39  44059.72 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)
## SM.POP.NETM 0.013921   0.014345  0.9705   0.3454
## 
## Total Sum of Squares:    5256100000
## Residual Sum of Squares: 4980200000
## R-Squared:      0.052492
## Adj. R-Squared: -0.11471
## F-statistic: 0.94181 on 1 and 17 DF, p-value: 0.34542
#Prueba F
pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  NY.GDP.PCAP.CD ~ SM.POP.NETM
## F = 0.68685, df1 = 2, df2 = 17, p-value = 0.5166
## alternative hypothesis: significant effects
# Si p-value < 0.05 se prefiere el modelo de efectos fijos.

#Modelo 3. Efectos Aleatorios
#Cuando las diferencias no observadas son aleatorias

#Método walhus
walhus <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "random", random.method = "walhus")
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "random", 
##     random.method = "walhus")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 278418900     16686     1
## individual            0         0     0
## theta: 0
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -21506.0 -10924.8  -3728.9   5274.5  45389.3 
## 
## Coefficients:
##               Estimate Std. Error z-value Pr(>|z|)   
## (Intercept) 1.2873e+04 4.2134e+03  3.0553 0.002248 **
## SM.POP.NETM 1.8616e-02 7.2324e-03  2.5740 0.010054 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7259500000
## Residual Sum of Squares: 5382600000
## R-Squared:      0.25855
## Adj. R-Squared: 0.21952
## Chisq: 6.62533 on 1 DF, p-value: 0.010054
#Método amemiya
amemiya <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "random", random.method = "amemiya")
summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "random", 
##     random.method = "amemiya")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 276675480     16634     1
## individual            0         0     0
## theta: 0
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -21506.0 -10924.8  -3728.9   5274.5  45389.3 
## 
## Coefficients:
##               Estimate Std. Error z-value Pr(>|z|)   
## (Intercept) 1.2873e+04 4.2134e+03  3.0553 0.002248 **
## SM.POP.NETM 1.8616e-02 7.2324e-03  2.5740 0.010054 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7259500000
## Residual Sum of Squares: 5382600000
## R-Squared:      0.25855
## Adj. R-Squared: 0.21952
## Chisq: 6.62533 on 1 DF, p-value: 0.010054
#Método nerlove
nerlove <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "random", random.method = "nerlove")
summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = Panel_1, model = "random", 
##     random.method = "nerlove")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 237150411     15400 0.864
## individual     37271843      6105 0.136
## theta: 0.31
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -20850.0  -9773.4  -2826.2   3450.7  45608.0 
## 
## Coefficients:
##               Estimate Std. Error z-value Pr(>|z|)  
## (Intercept) 1.3174e+04 5.8290e+03  2.2601  0.02382 *
## SM.POP.NETM 1.7563e-02 9.0595e-03  1.9386  0.05255 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    6.21e+09
## Residual Sum of Squares: 5184500000
## R-Squared:      0.16513
## Adj. R-Squared: 0.12119
## Chisq: 3.75814 on 1 DF, p-value: 0.052551
#Comparar la r2 ajustada de los 3 métodos y elegir el que tenga el mayor. 

phtest(walhus, within)
## 
##  Hausman Test
## 
## data:  NY.GDP.PCAP.CD ~ SM.POP.NETM
## chisq = 0.14364, df = 1, p-value = 0.7047
## alternative hypothesis: one model is inconsistent
# si el valor de p-value es < 0.05 usamos Efectos fijos

Paso 2: Prueba de Heterogeneidad (Ejercicio personal)

plotmeans(NY.GDP.PCAP.KD.ZG ~ country, main= "Prueba de heterogenidad entre paises para el PIB", data= Panel_2)

# Si la linea sale casi horizontal, hay poca o nula heterogenidad, por lo que no hay diferencias sistematicas que ajustar. 

#Si la linea sale quebrada, sube y baja, hay mucha Heterogenidad, por lo que hay que ajustar. (Buscamos esta linea quebarada para utilizar ya sea los modelos fijos o aleatorios)

#plotmeans(AG.PRD.CROP.XD ~ country, main= "Prueba de heterogenidad entre paises para la producción agrearia", data= Panel_2)

# "NY.GDP.PCAP.KD.ZG","AG.PRD.CROP.XD"

Paso 3: Prueba de efectos fijos y aleatorios (Ejercicio personal)

#Modelo 1. Regresión agrupada (pooled)
#Asume que no hay heterogeneidad observada
pooled2 <- plm(NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, Panel_2, model="pooling")
summary(pooled2)
## Pooling Model
## 
## Call:
## plm(formula = NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, 
##     model = "pooling")
## 
## Unbalanced Panel: n = 3, T = 2-5, N = 12
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -2.200286 -1.292837  0.088143  1.125158  2.370490 
## 
## Coefficients:
##                 Estimate Std. Error t-value Pr(>|t|)
## (Intercept)    2.9168926  6.3610858  0.4586   0.6564
## AG.PRD.CROP.XD 0.0045906  0.0680542  0.0675   0.9475
## 
## Total Sum of Squares:    27.764
## Residual Sum of Squares: 27.751
## R-Squared:      0.0004548
## Adj. R-Squared: -0.0995
## F-statistic: 0.0045501 on 1 and 10 DF, p-value: 0.94755
#Modelo 2. Efectos fijos (within)
#Cuando las diferencias no observadas son constantes en el tiempo
within2 <- plm(NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, model = "within" )
summary(within2)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, 
##     model = "within")
## 
## Unbalanced Panel: n = 3, T = 2-5, N = 12
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -2.171680 -1.115609  0.068295  0.937140  2.645126 
## 
## Coefficients:
##                Estimate Std. Error t-value Pr(>|t|)
## AG.PRD.CROP.XD 0.010814   0.072255  0.1497   0.8847
## 
## Total Sum of Squares:    22.496
## Residual Sum of Squares: 22.433
## R-Squared:      0.002792
## Adj. R-Squared: -0.37116
## F-statistic: 0.0223984 on 1 and 8 DF, p-value: 0.88474
#Prueba F
pFtest(within2, pooled2)
## 
##  F test for individual effects
## 
## data:  NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD
## F = 0.94824, df1 = 2, df2 = 8, p-value = 0.427
## alternative hypothesis: significant effects
# Si p-value < 0.05 se prefiere el modelo de efectos fijos y elegimos de los siguiente método aleatorios.

#Modelo 3. Efectos Aleatorios
#Cuando las diferencias no observadas son aleatorias

#Método walhus
walhus2 <- plm(NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, model = "random", random.method = "walhus")
summary(walhus2)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, 
##     model = "random", random.method = "walhus")
## 
## Unbalanced Panel: n = 3, T = 2-5, N = 12
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 2.770499 1.664482 0.998
## individual    0.006575 0.081085 0.002
## theta:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.002365 0.005881 0.005881 0.005295 0.005881 0.005881 
## 
## Residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -2.197746 -1.291179  0.086712 -0.000738  1.123339  2.364997 
## 
## Coefficients:
##                 Estimate Std. Error z-value Pr(>|z|)
## (Intercept)    2.9071350  6.3604207  0.4571   0.6476
## AG.PRD.CROP.XD 0.0047111  0.0680437  0.0692   0.9448
## 
## Total Sum of Squares:    27.784
## Residual Sum of Squares: 27.711
## R-Squared:      0.0048655
## Adj. R-Squared: -0.094648
## Chisq: 0.00479378 on 1 DF, p-value: 0.9448
#Método amemiya
amemiya2 <- plm(NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, model = "random", random.method = "amemiya")
summary(amemiya2)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, 
##     model = "random", random.method = "amemiya")
## 
## Unbalanced Panel: n = 3, T = 2-5, N = 12
## 
## Effects:
##                 var std.dev share
## idiosyncratic 2.804   1.675     1
## individual    0.000   0.000     0
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0       0       0       0 
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -2.200286 -1.292837  0.088143  1.125158  2.370490 
## 
## Coefficients:
##                 Estimate Std. Error z-value Pr(>|z|)
## (Intercept)    2.9168926  6.3610858  0.4586   0.6466
## AG.PRD.CROP.XD 0.0045906  0.0680542  0.0675   0.9462
## 
## Total Sum of Squares:    27.764
## Residual Sum of Squares: 27.751
## R-Squared:      0.0004548
## Adj. R-Squared: -0.0995
## Chisq: 0.0045501 on 1 DF, p-value: 0.94622
#Método nerlove
nerlove2 <- plm(NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, model = "random", random.method = "nerlove")
summary(nerlove2)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD, data = Panel_2, 
##     model = "random", random.method = "nerlove")
## 
## Unbalanced Panel: n = 3, T = 2-5, N = 12
## 
## Effects:
##                  var std.dev share
## idiosyncratic 1.8694  1.3673 0.737
## individual    0.6677  0.8171 0.263
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.2362  0.4009  0.4009  0.3734  0.4009  0.4009 
## 
## Residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -2.1573 -1.1315 -0.0249 -0.0395  1.0150  2.1772 
## 
## Coefficients:
##                Estimate Std. Error z-value Pr(>|z|)
## (Intercept)    2.519123   6.274084  0.4015   0.6880
## AG.PRD.CROP.XD 0.010119   0.066739  0.1516   0.8795
## 
## Total Sum of Squares:    27.647
## Residual Sum of Squares: 24.98
## R-Squared:      0.15769
## Adj. R-Squared: 0.073459
## Chisq: 0.0229902 on 1 DF, p-value: 0.87948
#Comparar la r2 ajustada de los 3 métodos y elegir el que tenga el mayor. 

phtest(walhus2, within2)
## 
##  Hausman Test
## 
## data:  NY.GDP.PCAP.KD.ZG ~ AG.PRD.CROP.XD
## chisq = 0.063028, df = 1, p-value = 0.8018
## alternative hypothesis: one model is inconsistent
# si el valor de p-value es < 0.05 usamos Efectos fijos
LS0tDQp0aXRsZTogIkRhdG9zX3BhbmVsX0FDVDEiDQphdXRob3I6ICJTYW1hbnRoYSAtIEEwMTQyMjc0OSINCmRhdGU6ICIyMDI1LTA4LTExIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGNvc21vIA0KLS0tDQoNCiFbXShodHRwczovL21lZGlhMy5naXBoeS5jb20vbWVkaWEvdjEuWTJsa1BUWmpNRGxpT1RVeWJtSnpkV00zT0RkaU9XVjBjV3huTmpOMWJHZDNhSGN5YjJKeGREVXpOamN6YVhreWIzZzNaQ1psY0QxMk1WOW5hV1p6WDNObFlYSmphQ1pqZEQxbi9HMkZUQnA0d3E5RnFpSk9vUlEvc291cmNlLmdpZikNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IEJsdWU7Ij5BY3RpdmlkYWQ8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5JbnN0YWxhciBwYXF1ZXRlIHkgTGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoIldESSIpDQpsaWJyYXJ5KFdESSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJ3YnN0YXRzIikNCmxpYnJhcnkod2JzdGF0cykNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojaW5zdGFsbC5wYWNrYWdlcygicGxtIikgI1JlYWxpemEgbW9kZWxvcyBsaW5lYWxlcyBwYXJhIGRhdG9zIGRlIHBhbmVsDQpsaWJyYXJ5KHBsbSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJncGxvdHMiKQ0KbGlicmFyeShncGxvdHMpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPk9idGVuZXIgSW5mb3JtYWNpw7NuPC9zcGFuPg0KYGBge3J9DQpnZHAgPC0gd2JfZGF0YShjb3VudHJ5PWMoIk1YIiwiVVMiLCJDQSIpLCBpbmRpY2F0b3I9YygiTlkuR0RQLlBDQVAuQ0QiLCJTTS5QT1AuTkVUTSIpLCBzdGFydF9kYXRlID0gMTk1MCwgZW5kX2RhdGUgPSAyMDI1KQ0KI1ZpZXcoZ2RwKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5HZW5lcmFyIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHBhbmVsPC9zcGFuPg0KYGBge3J9DQpQYW5lbF8xIDwtIHNlbGVjdChnZHAsIGNvdW50cnksIGRhdGUsIE5ZLkdEUC5QQ0FQLkNELCBTTS5QT1AuTkVUTSkNClBhbmVsXzEgPC0gc3Vic2V0KFBhbmVsXzEsIGRhdGUgPT0gMTk2MCB8IGRhdGUgPT0gMTk3MCB8IGRhdGUgPT0gMTk4MCB8IGRhdGUgPT0gMTk5MCB8IGRhdGUgPT0gMjAwMCB8IGRhdGUgPT0gMjAxMCB8IGRhdGUgPT0gMjAyMCkNCg0KUGFuZWxfMSA8LSBwZGF0YS5mcmFtZShQYW5lbF8xLCBpbmRleCA9IGMoImNvdW50cnkiLCJkYXRlIikpDQpQYW5lbF8xDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPk9idGVuZXIgSW5mb3JtYWNpw7NuMjwvc3Bhbj4NCmBgYHtyfQ0KZ2RwMiA8LSB3Yl9kYXRhKGNvdW50cnk9YygiRlIiLCJERSIsIlBMIiksIGluZGljYXRvcj1jKCJOWS5HRFAuUENBUC5LRC5aRyIsIkFHLlBSRC5DUk9QLlhEIiksIHN0YXJ0X2RhdGUgPSAxOTUwLCBlbmRfZGF0ZSA9IDIwMTApDQojVmlldyhnZHAyKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5HZW5lcmFyIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHBhbmVsPC9zcGFuPg0KYGBge3J9DQpQYW5lbF8yIDwtIHNlbGVjdChnZHAyLCBjb3VudHJ5LCBkYXRlLCBOWS5HRFAuUENBUC5LRC5aRywgQUcuUFJELkNST1AuWEQpDQpQYW5lbF8yIDwtIHN1YnNldChQYW5lbF8yLCBkYXRlID09IDE5NjAgfCBkYXRlID09IDE5NzAgfCBkYXRlID09IDE5ODAgfCBkYXRlID09IDE5OTAgfCBkYXRlID09IDIwMDAgfCBkYXRlID09IDIwMTApDQoNClBhbmVsXzIgPC0gcGRhdGEuZnJhbWUoUGFuZWxfMiwgaW5kZXggPSBjKCJjb3VudHJ5IiwiZGF0ZSIpKQ0KUGFuZWxfMg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij4gUGFzbyAxIEdlbmVyYXIgY29uanVudG8gZGUgZGF0b3MgZGUgcGFuZWw8L3NwYW4+DQpgYGB7cn0NCiNPYnRlbmVyIGluZm9ybWFjacOzbiBkZSB2YXJpb3MgcGHDrXNlcyANCiNnZHAgPC0gd2JfZGF0YShjb3VudHJ5PWMoIk1YIiwiVVMiLCJDQSIpLCBpbmRpY2F0b3I9YygiTlkuR0RQLlBDQVAuQ0QiLCJTTS5QT1AuTkVUTSIpLCBzdGFydF9kYXRlID0gMTk1MCwgZW5kX2RhdGUgPSAyMDI1KQ0KI1ZpZXcoZ2RwKQ0KDQojR2VuZXJhciBjb25qdW50byBkZSBkYXRvcyBwYW5lbA0KI1BhbmVsXzEgPC0gc2VsZWN0KGdkcCwgY291bnRyeSwgZGF0ZSwgTlkuR0RQLlBDQVAuQ0QsIFNNLlBPUC5ORVRNKQ0KI1BhbmVsXzEgPC0gc3Vic2V0KFBhbmVsXzEsIGRhdGUgPT0gMTk2MCB8IGRhdGUgPT0gMTk3MCB8IGRhdGUgPT0gMTk4MCB8IGRhdGUgPT0gMTk5MCB8IGRhdGUgPT0gMjAwMCB8IGRhdGUgPT0gMjAxMCAjfCBkYXRlID09IDIwMjApDQoNCiNQYW5lbF8xIDwtIHBkYXRhLmZyYW1lKFBhbmVsXzEsIGluZGV4ID0gYygiY291bnRyeSIsImRhdGUiKSkNCiNQYW5lbF8xDQoNCiNOTyBDT1JSRVINCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyAyOiBQcnVlYmEgZGUgSGV0ZXJvZ2VuZWlkYWQgPC9zcGFuPg0KYGBge3J9DQpwbG90bWVhbnMoTlkuR0RQLlBDQVAuQ0QgfiBjb3VudHJ5LCBtYWluPSAiUHJ1ZWJhIGRlIGhldGVyb2dlbmlkYWQgZW50cmUgcGFpc2VzIHBhcmEgZWwgUElCIiwgZGF0YT0gUGFuZWxfMSkNCg0KIyBTaSBsYSBsaW5lYSBzYWxlIGNhc2kgaG9yaXpvbnRhbCwgaGF5IHBvY2EgbyBudWxhIGhldGVyb2dlbmlkYWQsIHBvciBsbyBxdWUgbm8gaGF5IGRpZmVyZW5jaWFzIHNpc3RlbWF0aWNhcyBxdWUgYWp1c3Rhci4gDQoNCiNTaSBsYSBsaW5lYSBzYWxlIHF1ZWJyYWRhLCBzdWJlIHkgYmFqYSwgaGF5IG11Y2hhIEhldGVyb2dlbmlkYWQsIHBvciBsbyBxdWUgaGF5IHF1ZSBhanVzdGFyLiAoQnVzY2Ftb3MgZXN0YSBsaW5lYSBxdWViYXJhZGEgcGFyYSB1dGlsaXphciB5YSBzZWEgbG9zIG1vZGVsb3MgZmlqb3MgbyBhbGVhdG9yaW9zKQ0KDQojcGxvdG1lYW5zKFNNLlBPUC5ORVRNIH4gY291bnRyeSwgbWFpbj0gIlBydWViYSBkZSBoZXRlcm9nZW5pZGFkIGVudHJlIHBhaXNlcyBwYXJhIGxhIG1pZ3JhY2lvbiBuZXRhIiwgZGF0YT3CoFBhbmVsXzEpDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyAzOiBQcnVlYmEgZGUgZWZlY3RvcyBmaWpvcyB5IGFsZWF0b3Jpb3M8L3NwYW4+DQoNCmBgYHtyfQ0KI01vZGVsbyAxLiBSZWdyZXNpw7NuIGFncnVwYWRhIChwb29sZWQpDQojQXN1bWUgcXVlIG5vIGhheSBoZXRlcm9nZW5laWRhZCBvYnNlcnZhZGENCnBvb2xlZCA8LSBwbG0oTlkuR0RQLlBDQVAuQ0QgfiBTTS5QT1AuTkVUTSwgUGFuZWxfMSwgbW9kZWw9InBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWQpDQoNCiNNb2RlbG8gMi4gRWZlY3RvcyBmaWpvcyAod2l0aGluKQ0KI0N1YW5kbyBsYXMgZGlmZXJlbmNpYXMgbm8gb2JzZXJ2YWRhcyBzb24gY29uc3RhbnRlcyBlbiBlbCB0aWVtcG8NCndpdGhpbiA8LSBwbG0oTlkuR0RQLlBDQVAuQ0QgfiBTTS5QT1AuTkVUTSwgZGF0YSA9IFBhbmVsXzEsIG1vZGVsID0gIndpdGhpbiIgKQ0Kc3VtbWFyeSh3aXRoaW4pDQoNCiNQcnVlYmEgRg0KcEZ0ZXN0KHdpdGhpbiwgcG9vbGVkKQ0KIyBTaSBwLXZhbHVlIDwgMC4wNSBzZSBwcmVmaWVyZSBlbCBtb2RlbG8gZGUgZWZlY3RvcyBmaWpvcy4NCg0KI01vZGVsbyAzLiBFZmVjdG9zIEFsZWF0b3Jpb3MNCiNDdWFuZG8gbGFzIGRpZmVyZW5jaWFzIG5vIG9ic2VydmFkYXMgc29uIGFsZWF0b3JpYXMNCg0KI03DqXRvZG8gd2FsaHVzDQp3YWxodXMgPC0gcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gU00uUE9QLk5FVE0sIGRhdGEgPSBQYW5lbF8xLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1cykNCg0KI03DqXRvZG8gYW1lbWl5YQ0KYW1lbWl5YSA8LSBwbG0oTlkuR0RQLlBDQVAuQ0QgfiBTTS5QT1AuTkVUTSwgZGF0YSA9IFBhbmVsXzEsIG1vZGVsID0gInJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAiYW1lbWl5YSIpDQpzdW1tYXJ5KGFtZW1peWEpDQoNCiNNw6l0b2RvIG5lcmxvdmUNCm5lcmxvdmUgPC0gcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gU00uUE9QLk5FVE0sIGRhdGEgPSBQYW5lbF8xLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIm5lcmxvdmUiKQ0Kc3VtbWFyeShuZXJsb3ZlKQ0KDQoNCiNDb21wYXJhciBsYSByMiBhanVzdGFkYSBkZSBsb3MgMyBtw6l0b2RvcyB5IGVsZWdpciBlbCBxdWUgdGVuZ2EgZWwgbWF5b3IuIA0KDQpwaHRlc3Qod2FsaHVzLCB3aXRoaW4pDQojIHNpIGVsIHZhbG9yIGRlIHAtdmFsdWUgZXMgPCAwLjA1IHVzYW1vcyBFZmVjdG9zIGZpam9zDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyAyOiBQcnVlYmEgZGUgSGV0ZXJvZ2VuZWlkYWQgKEVqZXJjaWNpbyBwZXJzb25hbCkgPC9zcGFuPg0KYGBge3J9DQpwbG90bWVhbnMoTlkuR0RQLlBDQVAuS0QuWkcgfiBjb3VudHJ5LCBtYWluPSAiUHJ1ZWJhIGRlIGhldGVyb2dlbmlkYWQgZW50cmUgcGFpc2VzIHBhcmEgZWwgUElCIiwgZGF0YT0gUGFuZWxfMikNCg0KIyBTaSBsYSBsaW5lYSBzYWxlIGNhc2kgaG9yaXpvbnRhbCwgaGF5IHBvY2EgbyBudWxhIGhldGVyb2dlbmlkYWQsIHBvciBsbyBxdWUgbm8gaGF5IGRpZmVyZW5jaWFzIHNpc3RlbWF0aWNhcyBxdWUgYWp1c3Rhci4gDQoNCiNTaSBsYSBsaW5lYSBzYWxlIHF1ZWJyYWRhLCBzdWJlIHkgYmFqYSwgaGF5IG11Y2hhIEhldGVyb2dlbmlkYWQsIHBvciBsbyBxdWUgaGF5IHF1ZSBhanVzdGFyLiAoQnVzY2Ftb3MgZXN0YSBsaW5lYSBxdWViYXJhZGEgcGFyYSB1dGlsaXphciB5YSBzZWEgbG9zIG1vZGVsb3MgZmlqb3MgbyBhbGVhdG9yaW9zKQ0KDQojcGxvdG1lYW5zKEFHLlBSRC5DUk9QLlhEIH4gY291bnRyeSwgbWFpbj0gIlBydWViYSBkZSBoZXRlcm9nZW5pZGFkIGVudHJlIHBhaXNlcyBwYXJhIGxhIHByb2R1Y2Npw7NuIGFncmVhcmlhIiwgZGF0YT3CoFBhbmVsXzIpDQoNCiMgIk5ZLkdEUC5QQ0FQLktELlpHIiwiQUcuUFJELkNST1AuWEQiDQpgYGANCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyAzOiBQcnVlYmEgZGUgZWZlY3RvcyBmaWpvcyB5IGFsZWF0b3Jpb3MgKEVqZXJjaWNpbyBwZXJzb25hbCk8L3NwYW4+DQoNCmBgYHtyfQ0KI01vZGVsbyAxLiBSZWdyZXNpw7NuIGFncnVwYWRhIChwb29sZWQpDQojQXN1bWUgcXVlIG5vIGhheSBoZXRlcm9nZW5laWRhZCBvYnNlcnZhZGENCnBvb2xlZDIgPC0gcGxtKE5ZLkdEUC5QQ0FQLktELlpHIH4gQUcuUFJELkNST1AuWEQsIFBhbmVsXzIsIG1vZGVsPSJwb29saW5nIikNCnN1bW1hcnkocG9vbGVkMikNCg0KI01vZGVsbyAyLiBFZmVjdG9zIGZpam9zICh3aXRoaW4pDQojQ3VhbmRvIGxhcyBkaWZlcmVuY2lhcyBubyBvYnNlcnZhZGFzIHNvbiBjb25zdGFudGVzIGVuIGVsIHRpZW1wbw0Kd2l0aGluMiA8LSBwbG0oTlkuR0RQLlBDQVAuS0QuWkcgfiBBRy5QUkQuQ1JPUC5YRCwgZGF0YSA9IFBhbmVsXzIsIG1vZGVsID0gIndpdGhpbiIgKQ0Kc3VtbWFyeSh3aXRoaW4yKQ0KDQojUHJ1ZWJhIEYNCnBGdGVzdCh3aXRoaW4yLCBwb29sZWQyKQ0KIyBTaSBwLXZhbHVlIDwgMC4wNSBzZSBwcmVmaWVyZSBlbCBtb2RlbG8gZGUgZWZlY3RvcyBmaWpvcyB5IGVsZWdpbW9zIGRlIGxvcyBzaWd1aWVudGUgbcOpdG9kbyBhbGVhdG9yaW9zLg0KDQojTW9kZWxvIDMuIEVmZWN0b3MgQWxlYXRvcmlvcw0KI0N1YW5kbyBsYXMgZGlmZXJlbmNpYXMgbm8gb2JzZXJ2YWRhcyBzb24gYWxlYXRvcmlhcw0KDQojTcOpdG9kbyB3YWxodXMNCndhbGh1czIgPC0gcGxtKE5ZLkdEUC5QQ0FQLktELlpHIH4gQUcuUFJELkNST1AuWEQsIGRhdGEgPSBQYW5lbF8yLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1czIpDQoNCiNNw6l0b2RvIGFtZW1peWENCmFtZW1peWEyIDwtIHBsbShOWS5HRFAuUENBUC5LRC5aRyB+IEFHLlBSRC5DUk9QLlhELCBkYXRhID0gUGFuZWxfMiwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJhbWVtaXlhIikNCnN1bW1hcnkoYW1lbWl5YTIpDQoNCiNNw6l0b2RvIG5lcmxvdmUNCm5lcmxvdmUyIDwtIHBsbShOWS5HRFAuUENBUC5LRC5aRyB+IEFHLlBSRC5DUk9QLlhELCBkYXRhID0gUGFuZWxfMiwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZTIpDQoNCg0KI0NvbXBhcmFyIGxhIHIyIGFqdXN0YWRhIGRlIGxvcyAzIG3DqXRvZG9zIHkgZWxlZ2lyIGVsIHF1ZSB0ZW5nYSBlbCBtYXlvci4gDQoNCnBodGVzdCh3YWxodXMyLCB3aXRoaW4yKQ0KIyBzaSBlbCB2YWxvciBkZSBwLXZhbHVlIGVzIDwgMC4wNSB1c2Ftb3MgRWZlY3RvcyBmaWpvcw0KYGBgDQoNCg0KDQoNCg==