Actividad 1. Análisis y aplicación de datos panel

Los ejercicios de esta actividad realizados en equipo fueron elaborados por Astrid Paola González Diaz, José Santiago González Padilla, y Ana Estefanía López Alanís.

Panel de Indicadores del Banco Mundial

Obtener información de varíos país

gdp_data <- wb_data(country=c("MX","EC","CA"),indicator="NY.GDP.PCAP.CD", start_date=2013, end_date=2023)

gdp_data
## # A tibble: 30 × 9
##    iso2c iso3c country  date NY.GDP.PCAP.CD unit  obs_status footnote
##    <chr> <chr> <chr>   <dbl>          <dbl> <chr> <chr>      <chr>   
##  1 CA    CAN   Canada   2013         52635. <NA>  <NA>       <NA>    
##  2 CA    CAN   Canada   2014         50956. <NA>  <NA>       <NA>    
##  3 CA    CAN   Canada   2015         43596. <NA>  <NA>       <NA>    
##  4 CA    CAN   Canada   2016         42316. <NA>  <NA>       <NA>    
##  5 CA    CAN   Canada   2017         45129. <NA>  <NA>       <NA>    
##  6 CA    CAN   Canada   2018         46549. <NA>  <NA>       <NA>    
##  7 CA    CAN   Canada   2019         46374. <NA>  <NA>       <NA>    
##  8 CA    CAN   Canada   2020         43562. <NA>  <NA>       <NA>    
##  9 CA    CAN   Canada   2021         52515. <NA>  <NA>       <NA>    
## 10 CA    CAN   Canada   2022         55522. <NA>  <NA>       <NA>    
## # ℹ 20 more rows
## # ℹ 1 more variable: last_updated <date>

Generar un conjunto de datos de panel

panel <- select(gdp_data,country,date,NY.GDP.PCAP.CD)

Ejercicio 2. Conjunto de Datos de Panel con Indicadores del Banco Mundial

Variable endógena:

Parámetros:

Carga de archivo y transformación a panel

panel_salud <- wb_data(country = c("MX", "CA", "US","CH","CO","CN"),indicator=c("SP.DYN.LE00.IN", "EN.ATM.CO2E.PC", "IE.PPI.WATR.CD", "NY.GDP.PCAP.CD", "EN.POP.DNST", "SH.MED.BEDS.ZS", "SH.IMM.IDPT", "SH.MED.SAOP.P5", "VC.IHR.PSRC.P5", "EN.POP.SLUM.UR.ZS"), start_date = 1950, end_date=2023)

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

head(panel_salud)
##             iso2c iso3c country date EN.ATM.CO2E.PC EN.POP.DNST
## Canada-1960    CA   CAN  Canada 1960             NA          NA
## Canada-1961    CA   CAN  Canada 1961             NA    2.037903
## Canada-1962    CA   CAN  Canada 1962             NA    2.076160
## Canada-1963    CA   CAN  Canada 1963             NA    2.115198
## Canada-1964    CA   CAN  Canada 1964             NA    2.155463
## Canada-1965    CA   CAN  Canada 1965             NA    2.194836
##             EN.POP.SLUM.UR.ZS IE.PPI.WATR.CD NY.GDP.PCAP.CD SH.IMM.IDPT
## Canada-1960                NA             NA       2259.251          NA
## Canada-1961                NA             NA       2240.433          NA
## Canada-1962                NA             NA       2268.585          NA
## Canada-1963                NA             NA       2374.498          NA
## Canada-1964                NA             NA       2555.111          NA
## Canada-1965                NA             NA       2770.362          NA
##             SH.MED.BEDS.ZS SH.MED.SAOP.P5 SP.DYN.LE00.IN VC.IHR.PSRC.P5
## Canada-1960            6.2             NA       71.13317             NA
## Canada-1961             NA             NA       71.34610             NA
## Canada-1962             NA             NA       71.36707             NA
## Canada-1963             NA             NA       71.38073             NA
## Canada-1964             NA             NA       71.77634             NA
## Canada-1965             NA             NA       71.87220             NA

Visualizar valores faltantes y seleccionar variables

vis_miss(panel_salud)

panel_salud <- panel_salud %>% select(-c(iso2c, iso3c,EN.ATM.CO2E.PC, EN.POP.SLUM.UR.ZS,IE.PPI.WATR.CD, SH.MED.BEDS.ZS, SH.MED.SAOP.P5))

panel_salud <- subset(panel_salud, date==1990|date==2000|date==2010|date==2020)

Imputación de valores faltantes con MICE

panel_salud <- mice(panel_salud, m=5, maxit=10, method = "pmm")
## 
##  iter imp variable
##   1   1  VC.IHR.PSRC.P5
##   1   2  VC.IHR.PSRC.P5
##   1   3  VC.IHR.PSRC.P5
##   1   4  VC.IHR.PSRC.P5
##   1   5  VC.IHR.PSRC.P5
##   2   1  VC.IHR.PSRC.P5
##   2   2  VC.IHR.PSRC.P5
##   2   3  VC.IHR.PSRC.P5
##   2   4  VC.IHR.PSRC.P5
##   2   5  VC.IHR.PSRC.P5
##   3   1  VC.IHR.PSRC.P5
##   3   2  VC.IHR.PSRC.P5
##   3   3  VC.IHR.PSRC.P5
##   3   4  VC.IHR.PSRC.P5
##   3   5  VC.IHR.PSRC.P5
##   4   1  VC.IHR.PSRC.P5
##   4   2  VC.IHR.PSRC.P5
##   4   3  VC.IHR.PSRC.P5
##   4   4  VC.IHR.PSRC.P5
##   4   5  VC.IHR.PSRC.P5
##   5   1  VC.IHR.PSRC.P5
##   5   2  VC.IHR.PSRC.P5
##   5   3  VC.IHR.PSRC.P5
##   5   4  VC.IHR.PSRC.P5
##   5   5  VC.IHR.PSRC.P5
##   6   1  VC.IHR.PSRC.P5
##   6   2  VC.IHR.PSRC.P5
##   6   3  VC.IHR.PSRC.P5
##   6   4  VC.IHR.PSRC.P5
##   6   5  VC.IHR.PSRC.P5
##   7   1  VC.IHR.PSRC.P5
##   7   2  VC.IHR.PSRC.P5
##   7   3  VC.IHR.PSRC.P5
##   7   4  VC.IHR.PSRC.P5
##   7   5  VC.IHR.PSRC.P5
##   8   1  VC.IHR.PSRC.P5
##   8   2  VC.IHR.PSRC.P5
##   8   3  VC.IHR.PSRC.P5
##   8   4  VC.IHR.PSRC.P5
##   8   5  VC.IHR.PSRC.P5
##   9   1  VC.IHR.PSRC.P5
##   9   2  VC.IHR.PSRC.P5
##   9   3  VC.IHR.PSRC.P5
##   9   4  VC.IHR.PSRC.P5
##   9   5  VC.IHR.PSRC.P5
##   10   1  VC.IHR.PSRC.P5
##   10   2  VC.IHR.PSRC.P5
##   10   3  VC.IHR.PSRC.P5
##   10   4  VC.IHR.PSRC.P5
##   10   5  VC.IHR.PSRC.P5
panel_salud <- complete(panel_salud)

Tarea 2. Gráficas de Heterogeneidad de Datos de Panel con Indicadores del Banco Mundial

Heterogeneidad entre países

plotmeans(SP.DYN.LE00.IN ~ country, data = panel_salud, n.label=FALSE, main= "Heterogeneidad entre países")

  • ¿La línea que une los promedios es horizontal, o tiene muchos picos?
    • La gráfica tiene distintos picos entre los países, si tiene muchos picos.
  • ¿Los intervalos de confianza no miden lo mismo, están muy desfasados.
    • Variabilidad inconsistente entre los países de la gráfica. En esta gráfica se puede decir que cuenta con heterogeneidad, es decir, una diferencia significativa en las medias o dispersión entre los grupos.

En términos de países si es deseable que se pueda contar con heterogeneidad entre los países para poder contar con una forma de comparación entre los grupos.

Heterogeneidad entre años

plotmeans(SP.DYN.LE00.IN ~ date, data = panel_salud, n.label=FALSE, main= "Heterogeneidad entre años")

  • ¿La línea que une los promedios es horizontal, o tiene muchos picos?
    • La gráfica no tiene picos a lo largo de los años. Si cuenta con alguna disminución para 2020, pero puede ser explicado al ser un año atípico de manera general. Después se regulariza para 2021.
  • ¿Los intervalos de confianza miden lo mismo, puede decirse que tienen intervalos similares a lo largo del tiempo.
    • En esta gráfica no se cuenta con heterogeneidad puesto que se observa poca variación entre los años.

Ejercicio 3. Modelos con Indicadores del Banco Mundial

Modelo 1. Regresión Agrupada (pooled)

pooled1 <- plm(SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT + VC.IHR.PSRC.P5, data=panel_salud, model="pooling")

summary(pooled1)
## Pooling Model
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "pooling")
## 
## Balanced Panel: n = 6, T = 4, N = 24
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -3.62176 -1.20012 -0.28878  1.53907  2.59486 
## 
## Coefficients:
##                   Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)     6.7399e+01  3.6945e+00 18.2431 1.682e-13 ***
## NY.GDP.PCAP.CD  8.6687e-05  1.9317e-05  4.4876 0.0002522 ***
## EN.POP.DNST    -5.2865e-03  6.0208e-03 -0.8780 0.3908905    
## SH.IMM.IDPT     9.0818e-02  4.1998e-02  2.1624 0.0435476 *  
## VC.IHR.PSRC.P5 -8.6917e-02  2.0478e-02 -4.2444 0.0004386 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    427.34
## Residual Sum of Squares: 64.102
## R-Squared:      0.85
## Adj. R-Squared: 0.81842
## F-statistic: 26.9162 on 4 and 19 DF, p-value: 1.3514e-07

Modelo 2. Efectos Fijos (within)

within1 <- plm(SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT + VC.IHR.PSRC.P5, data=panel_salud, model="within")

summary(within1)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "within")
## 
## Balanced Panel: n = 6, T = 4, N = 24
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -1.413690 -0.790085  0.058293  0.624367  1.399891 
## 
## Coefficients:
##                   Estimate  Std. Error t-value  Pr(>|t|)    
## NY.GDP.PCAP.CD  6.8586e-05  2.8083e-05  2.4423   0.02846 *  
## EN.POP.DNST     3.2852e-02  3.7551e-02  0.8749   0.39641    
## SH.IMM.IDPT     8.0244e-02  2.8933e-02  2.7735   0.01494 *  
## VC.IHR.PSRC.P5 -1.0369e-01  1.7975e-02 -5.7687 4.862e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    138.73
## Residual Sum of Squares: 16.816
## R-Squared:      0.87879
## Adj. R-Squared: 0.80086
## F-statistic: 25.3747 on 4 and 14 DF, p-value: 2.7495e-06

Prueba pF

pFtest(within1,pooled1)
## 
##  F test for individual effects
## 
## data:  SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT +  ...
## F = 7.8738, df1 = 5, df2 = 14, p-value = 0.00103
## alternative hypothesis: significant effects

Los resultados de esta prueba nos indican que las varianzas de los grupos son distintas. En base a esto, se seleccionó el método de efectos fijos, pooled.

Modelo 3. Efectos Aleatorios - Método Walhus

walhus1 <- plm(SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT + VC.IHR.PSRC.P5, data=panel_salud, model="random", random.method = "walhus")

summary(walhus1)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "random", 
##     random.method = "walhus")
## 
## Balanced Panel: n = 6, T = 4, N = 24
## 
## Effects:
##                 var std.dev share
## idiosyncratic 1.189   1.090 0.445
## individual    1.482   1.217 0.555
## theta: 0.5913
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -2.387377 -0.666700 -0.077692  0.778973  2.229363 
## 
## Coefficients:
##                   Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)     6.8123e+01  2.7480e+00 24.7905 < 2.2e-16 ***
## NY.GDP.PCAP.CD  8.3176e-05  1.8344e-05  4.5342 5.783e-06 ***
## EN.POP.DNST    -3.4863e-03  9.1153e-03 -0.3825  0.702119    
## SH.IMM.IDPT     8.5581e-02  3.0202e-02  2.8336  0.004602 ** 
## VC.IHR.PSRC.P5 -1.0488e-01  1.5925e-02 -6.5859 4.522e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    186.94
## Residual Sum of Squares: 26.555
## R-Squared:      0.85795
## Adj. R-Squared: 0.82804
## Chisq: 114.752 on 4 DF, p-value: < 2.22e-16

Modelo 4. Efectos Aleatorios - Método Amemiya

amemiya1 <- plm(SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT + VC.IHR.PSRC.P5, data=panel_salud, model="random", random.method = "amemiya")

summary(amemiya1)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "random", 
##     random.method = "amemiya")
## 
## Balanced Panel: n = 6, T = 4, N = 24
## 
## Effects:
##                  var std.dev share
## idiosyncratic 0.9342  0.9665 0.105
## individual    7.9514  2.8198 0.895
## theta: 0.8311
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -1.873254 -0.620849 -0.034069  0.692410  1.876291 
## 
## Coefficients:
##                   Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)     6.7868e+01  2.7739e+00 24.4669 < 2.2e-16 ***
## NY.GDP.PCAP.CD  8.2684e-05  1.9611e-05  4.2161 2.485e-05 ***
## EN.POP.DNST     3.6024e-03  1.6792e-02  0.2145  0.830138    
## SH.IMM.IDPT     8.3333e-02  2.6346e-02  3.1630  0.001562 ** 
## VC.IHR.PSRC.P5 -1.0904e-01  1.4725e-02 -7.4054 1.308e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    146.96
## Residual Sum of Squares: 19.304
## R-Squared:      0.86865
## Adj. R-Squared: 0.841
## Chisq: 125.652 on 4 DF, p-value: < 2.22e-16

Modelo 5. Efectos Aleatorios - Método Nerlove

nerlove1 <- plm(SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT + VC.IHR.PSRC.P5, data=panel_salud, model="random", random.method = "nerlove")

summary(nerlove1)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "random", 
##     random.method = "nerlove")
## 
## Balanced Panel: n = 6, T = 4, N = 24
## 
## Effects:
##                  var std.dev share
## idiosyncratic 0.7007  0.8370 0.067
## individual    9.8219  3.1340 0.933
## theta: 0.8676
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -1.7686210 -0.6370092 -0.0028386  0.7036508  1.7982399 
## 
## Coefficients:
##                   Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)     6.7659e+01  2.9520e+00 22.9197 < 2.2e-16 ***
## NY.GDP.PCAP.CD  8.1183e-05  2.0284e-05  4.0023 6.273e-05 ***
## EN.POP.DNST     7.3756e-03  1.9619e-02  0.3759  0.706965    
## SH.IMM.IDPT     8.2828e-02  2.5922e-02  3.1953  0.001397 ** 
## VC.IHR.PSRC.P5 -1.0873e-01  1.4737e-02 -7.3779 1.608e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    143.78
## Residual Sum of Squares: 18.594
## R-Squared:      0.87068
## Adj. R-Squared: 0.84346
## Chisq: 127.926 on 4 DF, p-value: < 2.22e-16

Prueba Hausman

phtest(walhus1,pooled1)
## 
##  Hausman Test
## 
## data:  SP.DYN.LE00.IN ~ NY.GDP.PCAP.CD + EN.POP.DNST + SH.IMM.IDPT +  ...
## chisq = 0.20979, df = 4, p-value = 0.9949
## alternative hypothesis: one model is inconsistent

Después de haber analizado el p-value de la prueba Hausman, se puede concluir que el Modelo de Efectos Aleatorios Walhus es consistente y eficiente, por lo cual será el seleccionado para llevar a cabo el análisis.

Los resultados del modelo indican que las variables que resultaron ser significativas al momento de predecir la expectativa de vida al nacer son el PIB, los homicidios intencionales y la inmunización de los niños de entre 12 y 23 meses.

Tarea 3. Patentes

Carga de archivo y transformación a panel

patent <- read.csv("PATENT 3 - CSV.csv")
patent <- pdata.frame(patent, index = c("cusip", "year"))

str(patent)
## Classes 'pdata.frame' and 'data.frame':  2260 obs. of  13 variables:
##  $ cusip   : Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ merger  : 'pseries' Named int  0 0 0 0 0 0 0 0 0 0 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ employ  : 'pseries' Named int  10 12 12 12 13 13 14 14 13 12 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ return  : 'pseries' Named int  6 6 4 5 5 5 5 5 4 5 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ patents : 'pseries' Named int  22 34 31 32 40 60 57 77 38 5 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ patentsg: 'pseries' Named int  24 32 30 34 28 33 53 47 64 70 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ stckpr  : 'pseries' Named int  48 58 33 38 35 34 31 34 46 41 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rnd     : 'pseries' Named int  3 3 3 3 4 4 5 5 7 8 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rndeflt : 'pseries' Named int  3 3 3 3 3 3 3 3 4 4 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rndstck : 'pseries' Named int  16 17 20 22 23 25 27 30 34 38 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ sales   : 'pseries' Named int  344 436 535 567 631 706 819 992 1045 939 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ sic     : 'pseries' Named int  3740 3740 3740 3740 3740 3740 3740 3740 3740 3740 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ year    : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  - attr(*, "index")=Classes 'pindex' and 'data.frame':   2260 obs. of  2 variables:
##   ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...

Transformación de variables e imputación

patent$year <- as.factor(patent$year)
patent$sic <- as.factor(patent$sic)
patent$merger <- as.factor(patent$merger)
patent$cusip <- as.factor(patent$cusip)
vis_miss(patent)

colSums(is.na(patent))
##    cusip   merger   employ   return  patents patentsg   stckpr      rnd 
##        0        0       21        8        0        0        2        0 
##  rndeflt  rndstck    sales      sic     year 
##        0      157        3        0        0
## 
##  iter imp variable
##   1   1  employ  return  stckpr  rndstck  sales
##   1   2  employ  return  stckpr  rndstck  sales
##   1   3  employ  return  stckpr  rndstck  sales
##   1   4  employ  return  stckpr  rndstck  sales
##   1   5  employ  return  stckpr  rndstck  sales
##   2   1  employ  return  stckpr  rndstck  sales
##   2   2  employ  return  stckpr  rndstck  sales
##   2   3  employ  return  stckpr  rndstck  sales
##   2   4  employ  return  stckpr  rndstck  sales
##   2   5  employ  return  stckpr  rndstck  sales
##   3   1  employ  return  stckpr  rndstck  sales
##   3   2  employ  return  stckpr  rndstck  sales
##   3   3  employ  return  stckpr  rndstck  sales
##   3   4  employ  return  stckpr  rndstck  sales
##   3   5  employ  return  stckpr  rndstck  sales
##   4   1  employ  return  stckpr  rndstck  sales
##   4   2  employ  return  stckpr  rndstck  sales
##   4   3  employ  return  stckpr  rndstck  sales
##   4   4  employ  return  stckpr  rndstck  sales
##   4   5  employ  return  stckpr  rndstck  sales
##   5   1  employ  return  stckpr  rndstck  sales
##   5   2  employ  return  stckpr  rndstck  sales
##   5   3  employ  return  stckpr  rndstck  sales
##   5   4  employ  return  stckpr  rndstck  sales
##   5   5  employ  return  stckpr  rndstck  sales
##    cusip   merger   employ   return  patents patentsg   stckpr      rnd 
##        0        0        0        0        0        0        0        0 
##  rndeflt  rndstck    sales      sic     year 
##        0        0        0        0        0
patent <- patent %>% mutate(employees= employ*1)

Análisis de correlación

patent_num <- Filter(is.numeric, patent) %>% select(-employ)
patent_cor <- cor(patent_num)

corrplot(patent_cor,method = 'number')

Selección de variables

patent_1 <- patent %>% select(c(patentsg,rnd, rndeflt, rndstck, sales, employees, patents, year, cusip))

patent_2 <- patent %>% select(c(patentsg, rnd, rndeflt, rndstck, sales, stckpr, employees, patents, year, cusip))

patent_3 <- patent %>% select(c(patentsg, rndeflt, rndstck, sales, patents, employees, year, cusip))

Gráficas de Heterogeneidad

Heterogeneidad entre empresas

plotmeans(patentsg ~ cusip, data = patent_2, n.label=FALSE, main= "Heterogeneidad entre empresas")

Heterogeneidad entre años

plotmeans(patentsg ~ year, data = patent_2, n.label=FALSE, main= "Heterogeneidad entre años")

Al analizar las gráficas de heterogeneidad, se puede puede observar a través de las barras de error que existe una gran variabilidad dentro de los grupos graficados entre años, a diferencia de la variabilidad entre los grupos de empresas que refleja ser poca. Sin embargo, al prestar atención al gráfico entre empresas, se pueden percibir distintos picos, lo cual es una señal de variabilidad en las medias que refleja heterogeneidad. En cuanto al gráfico entre años, se puede concluir que durante los primeros cinco años se seguía una tendencia de homogeneidad, sin embargo a partir del 2018 esta cambió a un comportamiento de heterogeneidad dado los cambios en las medias.

Modelado

Modelo 1. Regresión Agrupada (pooled)

pooled2 <- plm(patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees, data = patent, model = "pooling")

summary(pooled2)
## Pooling Model
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + 
##     employees, data = patent, model = "pooling")
## 
## Unbalanced Panel: n = 226, T = 10-10, N = 2260
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -351.2417  -10.6066    1.3246    7.8431  541.1633 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept) -1.0577e+01  1.4787e+00 -7.1529 1.144e-12 ***
## rnd         -5.9513e-01  9.1821e-02 -6.4814 1.113e-10 ***
## rndeflt      5.3283e-02  8.0030e-02  0.6658    0.5056    
## rndstck      8.6966e-02  1.2883e-02  6.7507 1.865e-11 ***
## sales       -2.5027e-03  5.2903e-04 -4.7308 2.375e-06 ***
## stckpr       7.5250e-01  4.7190e-02 15.9463 < 2.2e-16 ***
## employees    1.4344e+00  5.4527e-02 26.3064 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14168000
## Residual Sum of Squares: 5441400
## R-Squared:      0.61594
## Adj. R-Squared: 0.61491
## F-statistic: 602.204 on 6 and 2253 DF, p-value: < 2.22e-16

Modelo 2. Efectos Fijos (within)

within2 <- plm(patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees, data = patent, model ="within")

summary(within2)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + 
##     employees, data = patent, model = "within")
## 
## Unbalanced Panel: n = 226, T = 10-10, N = 2260
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -215.44842   -1.99734   -0.31352    1.60894  270.53860 
## 
## Coefficients:
##              Estimate  Std. Error t-value  Pr(>|t|)    
## rnd       -0.68238259  0.12553753 -5.4357 6.116e-08 ***
## rndeflt    0.98023786  0.18783907  5.2185 1.988e-07 ***
## rndstck    0.05684339  0.01514703  3.7528 0.0001798 ***
## sales     -0.00125183  0.00035707 -3.5059 0.0004650 ***
## stckpr     0.03653503  0.02743834  1.3315 0.1831636    
## employees -0.12894432  0.06871313 -1.8766 0.0607219 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    715640
## Residual Sum of Squares: 579320
## R-Squared:      0.19048
## Adj. R-Squared: 0.098274
## F-statistic: 79.5325 on 6 and 2028 DF, p-value: < 2.22e-16

Prueba pF

pFtest(within2,pooled2)
## 
##  F test for individual effects
## 
## data:  patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees
## F = 75.646, df1 = 225, df2 = 2028, p-value < 2.2e-16
## alternative hypothesis: significant effects

Al observar los resultados de la prueba F, se puede inferir que existe suficiente evidencia que indica que uno de los modelos refleja una varianza distinta. Dado que la R Ajustada fue mayor en el modelo especificado con el método pooled, este será el seleccionado para ser comparado con los modelos de efectos aleatorios.

Modelo 3. Efectos Aleatorios - Método Walhus

walhus2 <- plm(patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees, data = patent, model = "random", random.method = "walhus")

summary(walhus2)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + 
##     employees, data = patent, model = "random", random.method = "walhus")
## 
## Unbalanced Panel: n = 226, T = 10-10, N = 2260
## 
## Effects:
##                   var std.dev share
## idiosyncratic  428.37   20.70 0.175
## individual    2021.74   44.96 0.825
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.856   0.856   0.856   0.856   0.856   0.856 
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -144.80625   -3.39788   -1.69754    0.57448  293.35880 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 10.39911476  2.81410543   3.6954 0.0002196 ***
## rnd         -0.94436220  0.05249658 -17.9890 < 2.2e-16 ***
## rndeflt      1.21657502  0.07252309  16.7750 < 2.2e-16 ***
## rndstck      0.09322105  0.00672427  13.8634 < 2.2e-16 ***
## sales       -0.00109613  0.00036427  -3.0091 0.0026198 ** 
## stckpr       0.10336942  0.02807935   3.6813 0.0002320 ***
## employees    0.27634791  0.06142046   4.4993 6.818e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    994750
## Residual Sum of Squares: 724390
## R-Squared:      0.27179
## Adj. R-Squared: 0.26985
## Chisq: 840.9 on 6 DF, p-value: < 2.22e-16

Modelo 4. Efectos Aleatorios - Método Amemiya

amemiya2 <- plm(patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees, data = patent, model = "random", random.method = "amemiya")

summary(amemiya2)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + 
##     employees, data = patent, model = "random", random.method = "amemiya")
## 
## Unbalanced Panel: n = 226, T = 10-10, N = 2260
## 
## Effects:
##                  var std.dev share
## idiosyncratic  285.7    16.9 0.064
## individual    4147.6    64.4 0.936
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9173  0.9173  0.9173  0.9173  0.9173  0.9173 
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -161.41146   -2.85443   -1.28379    0.88962  285.14854 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 13.43106582  4.45508214   3.0148  0.002572 ** 
## rnd         -0.96274424  0.06167614 -15.6097 < 2.2e-16 ***
## rndeflt      1.34138061  0.08956767  14.9762 < 2.2e-16 ***
## rndstck      0.09222972  0.00768642  11.9990 < 2.2e-16 ***
## sales       -0.00110351  0.00034676  -3.1824  0.001461 ** 
## stckpr       0.06851836  0.02658462   2.5774  0.009956 ** 
## employees    0.06203179  0.06219800   0.9973  0.318605    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    807650
## Residual Sum of Squares: 630870
## R-Squared:      0.21889
## Adj. R-Squared: 0.21681
## Chisq: 631.354 on 6 DF, p-value: < 2.22e-16

Modelo 5. Efectos Aleatorios - Método Nerlove

nerlove2 <- plm(patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees, data = patent, model = "random", random.method = "nerlove")

summary(nerlove2)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + 
##     employees, data = patent, model = "random", random.method = "nerlove")
## 
## Unbalanced Panel: n = 226, T = 10-10, N = 2260
## 
## Effects:
##                   var std.dev share
## idiosyncratic  256.34   16.01 0.057
## individual    4278.95   65.41 0.943
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9228  0.9228  0.9228  0.9228  0.9228  0.9228 
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -164.46257   -2.79495   -1.23851    0.91357  284.40339 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 13.75953443  4.73993208   2.9029  0.003697 ** 
## rnd         -0.95973769  0.06348396 -15.1178 < 2.2e-16 ***
## rndeflt      1.34416190  0.09252565  14.5275 < 2.2e-16 ***
## rndstck      0.09163857  0.00788895  11.6161 < 2.2e-16 ***
## sales       -0.00110690  0.00034553  -3.2035  0.001358 ** 
## stckpr       0.06592701  0.02648316   2.4894  0.012796 *  
## employees    0.04500187  0.06228622   0.7225  0.469986    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    795740
## Residual Sum of Squares: 624600
## R-Squared:      0.21508
## Adj. R-Squared: 0.21299
## Chisq: 617.355 on 6 DF, p-value: < 2.22e-16

Prueba Hausman

phtest(walhus2,pooled2)
## 
##  Hausman Test
## 
## data:  patentsg ~ rnd + rndeflt + rndstck + sales + stckpr + employees
## chisq = 644.09, df = 6, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent

Dado que el método Walhus reflejó mejores resultados, fue seleccionado al igual que el modelo Pooled para realizar la prueba Hausman. Los resultados de la prueba indican que el modelo Walhus de efectos aleatorios es inconsistente a comparación del modelo Pooled de efectos fijos.

Al seleccionar el Modelo de Efectos Fijo Pooled, los resultados muestran que todas las variables seleccionadas para el modelo son significativas al momento de predecir el número de patentes otorgadas a las empresas, a excepción de la variable rndeflt (R&D expend, 1972 mill $).

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAxLiBBbsOhbGlzaXMgeSBhcGxpY2FjacOzbiBkZSBkYXRvcyBwYW5lbCINCmF1dGhvcjogIkFuYSBFc3RlZmFuw61hIEzDs3BleiBBbGFuw61zIg0KZGF0ZTogIjIwMjQtMDItMTYiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICB0b2NfZGVwdGg6IDINCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSkNCmBgYA0KDQoqTG9zIGVqZXJjaWNpb3MgZGUgZXN0YSBhY3RpdmlkYWQgcmVhbGl6YWRvcyBlbiBlcXVpcG8gZnVlcm9uIGVsYWJvcmFkb3MgcG9yIEFzdHJpZCBQYW9sYSBHb256w6FsZXogRGlheiwgSm9zw6kgU2FudGlhZ28gR29uesOhbGV6IFBhZGlsbGEsIHkgQW5hIEVzdGVmYW7DrWEgTMOzcGV6IEFsYW7DrXMuKg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoV0RJKQ0KbGlicmFyeSh3YnN0YXRzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdwbG90cykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh2aXNkYXQpDQpsaWJyYXJ5KG1pY2UpICMjIGltcHV0YWNpw7NuIGRlIGRhdG9zDQpsaWJyYXJ5KHBsbSkgIyMgcGFyYSBoYWNlciBlbCBtb2RlbGFkbw0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KHRzaWJibGUpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KYGBgDQoNCiMjIFBhbmVsIGRlIEluZGljYWRvcmVzIGRlbCBCYW5jbyBNdW5kaWFsDQoNCiFbXShTdHVhcnQtSG9sbWVzLVdPUkxEQkFOSy5naWYpe3dpZHRoPSIyOTgifQ0KDQojIyMgT2J0ZW5lciBpbmZvcm1hY2nDs24gZGUgdmFyw61vcyBwYcOtcw0KDQpgYGB7cn0NCmdkcF9kYXRhIDwtIHdiX2RhdGEoY291bnRyeT1jKCJNWCIsIkVDIiwiQ0EiKSxpbmRpY2F0b3I9Ik5ZLkdEUC5QQ0FQLkNEIiwgc3RhcnRfZGF0ZT0yMDEzLCBlbmRfZGF0ZT0yMDIzKQ0KDQpnZHBfZGF0YQ0KYGBgDQoNCiMjIyBHZW5lcmFyIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHBhbmVsDQoNCmBgYHtyfQ0KcGFuZWwgPC0gc2VsZWN0KGdkcF9kYXRhLGNvdW50cnksZGF0ZSxOWS5HRFAuUENBUC5DRCkNCmBgYA0KDQojIyBFamVyY2ljaW8gMi4gQ29uanVudG8gZGUgRGF0b3MgZGUgUGFuZWwgY29uIEluZGljYWRvcmVzIGRlbCBCYW5jbyBNdW5kaWFsDQoNCiFbXShnaXBoeS5naWYpe3dpZHRoPSIyOTIifQ0KDQoqKlZhcmlhYmxlIGVuZMOzZ2VuYToqKg0KDQotICAgTGlmZSBFeHBlY3RhbmN5IFRvdGFsICh5ZWFycykuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU1AuRFlOLkxFMDAuSU4/dmlldz1jaGFydD4NCg0KKipQYXLDoW1ldHJvczoqKg0KDQotICAgRW1pc2lvbmVzIGRlIENPMi4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5BVE0uQ08yRS5QQz92aWV3PWNoYXJ0Pg0KDQotICAgSW52ZXJzacOzbiBlbiBhZ3VhIHkgc2FuaXRpemFjacOzbi4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9JRS5QUEkuV0FUUi5DRD92aWV3PWNoYXJ0Pg0KDQotICAgUElCLiA8aHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLkNEP3ZpZXc9Y2hhcnQ+DQoNCi0gICBEZW5zaWRhZCBkZSBwb2JsYWNpw7NuLiA8aHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLlBPUC5ETlNUP3ZpZXc9Y2hhcnQ+DQoNCi0gICBDYW50aWRhZCBkZSBjYW1hcyBkaXNwb25pYmxlcy4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5NRUQuQkVEUy5aUz92aWV3PWNoYXJ0Pg0KDQotICAgSW5tdW5pemFjacOzbi4gTmnDsW9zIGRlIDEyIGEgMjMgbWVzZXMuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guSU1NLklEUFQ/dmlldz1jaGFydD4NCg0KLSAgIEVzcGVjaWFsaXN0YXMgY2lydWphbm9zIHBvciBjYWRhIDEwMDAgaGFiaXRhbnRlcy4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5NRUQuU0FPUC5QNT92aWV3PWNoYXJ0Pg0KDQotICAgSG9taWNpZGlvcyBpbnRlbmNpb25hbGVzIHBvciAxMDAsMDAwLiA8aHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1ZDLklIUi5QU1JDLlA1P3ZpZXc9Y2hhcnQ+DQoNCi0gICBQb2JsYWNpw7NuIHZpdmllbmRvIGVuIGJhcnJpb3MgbWFyZ2luYWRvcy4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5QT1AuU0xVTS5VUi5aUz92aWV3PWNoYXJ0Pg0KDQojIyMgQ2FyZ2EgZGUgYXJjaGl2byB5IHRyYW5zZm9ybWFjacOzbiBhIHBhbmVsDQoNCmBgYHtyfQ0KcGFuZWxfc2FsdWQgPC0gd2JfZGF0YShjb3VudHJ5ID0gYygiTVgiLCAiQ0EiLCAiVVMiLCJDSCIsIkNPIiwiQ04iKSxpbmRpY2F0b3I9YygiU1AuRFlOLkxFMDAuSU4iLCAiRU4uQVRNLkNPMkUuUEMiLCAiSUUuUFBJLldBVFIuQ0QiLCAiTlkuR0RQLlBDQVAuQ0QiLCAiRU4uUE9QLkROU1QiLCAiU0guTUVELkJFRFMuWlMiLCAiU0guSU1NLklEUFQiLCAiU0guTUVELlNBT1AuUDUiLCAiVkMuSUhSLlBTUkMuUDUiLCAiRU4uUE9QLlNMVU0uVVIuWlMiKSwgc3RhcnRfZGF0ZSA9IDE5NTAsIGVuZF9kYXRlPTIwMjMpDQoNCnBhbmVsX3NhbHVkIDwtIHBkYXRhLmZyYW1lKHBhbmVsX3NhbHVkLCBpbmRleCA9IGMoImNvdW50cnkiLCAiZGF0ZSIpKQ0KDQpoZWFkKHBhbmVsX3NhbHVkKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemFyIHZhbG9yZXMgZmFsdGFudGVzIHkgc2VsZWNjaW9uYXIgdmFyaWFibGVzDQoNCmBgYHtyfQ0KdmlzX21pc3MocGFuZWxfc2FsdWQpDQoNCnBhbmVsX3NhbHVkIDwtIHBhbmVsX3NhbHVkICU+JSBzZWxlY3QoLWMoaXNvMmMsIGlzbzNjLEVOLkFUTS5DTzJFLlBDLCBFTi5QT1AuU0xVTS5VUi5aUyxJRS5QUEkuV0FUUi5DRCwgU0guTUVELkJFRFMuWlMsIFNILk1FRC5TQU9QLlA1KSkNCg0KcGFuZWxfc2FsdWQgPC0gc3Vic2V0KHBhbmVsX3NhbHVkLCBkYXRlPT0xOTkwfGRhdGU9PTIwMDB8ZGF0ZT09MjAxMHxkYXRlPT0yMDIwKQ0KYGBgDQoNCiMjIyBJbXB1dGFjacOzbiBkZSB2YWxvcmVzIGZhbHRhbnRlcyBjb24gTUlDRQ0KDQpgYGB7cn0NCnBhbmVsX3NhbHVkIDwtIG1pY2UocGFuZWxfc2FsdWQsIG09NSwgbWF4aXQ9MTAsIG1ldGhvZCA9ICJwbW0iKQ0KcGFuZWxfc2FsdWQgPC0gY29tcGxldGUocGFuZWxfc2FsdWQpDQpgYGANCg0KIyMgVGFyZWEgMi4gR3LDoWZpY2FzIGRlIEhldGVyb2dlbmVpZGFkIGRlIERhdG9zIGRlIFBhbmVsIGNvbiBJbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbA0KDQojIyMgSGV0ZXJvZ2VuZWlkYWQgZW50cmUgcGHDrXNlcw0KDQpgYGB7cn0NCnBsb3RtZWFucyhTUC5EWU4uTEUwMC5JTiB+IGNvdW50cnksIGRhdGEgPSBwYW5lbF9zYWx1ZCwgbi5sYWJlbD1GQUxTRSwgbWFpbj0gIkhldGVyb2dlbmVpZGFkIGVudHJlIHBhw61zZXMiKQ0KYGBgDQoNCi0gICDCv0xhIGzDrW5lYSBxdWUgdW5lIGxvcyBwcm9tZWRpb3MgZXMgaG9yaXpvbnRhbCwgbyB0aWVuZSBtdWNob3MgcGljb3M/DQogICAgLSAgIExhIGdyw6FmaWNhIHRpZW5lIGRpc3RpbnRvcyBwaWNvcyBlbnRyZSBsb3MgcGHDrXNlcywgc2kgdGllbmUgbXVjaG9zIHBpY29zLg0KLSAgIMK/TG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIG5vIG1pZGVuIGxvIG1pc21vLCBlc3TDoW4gbXV5IGRlc2Zhc2Fkb3MuDQogICAgLSAgIFZhcmlhYmlsaWRhZCBpbmNvbnNpc3RlbnRlIGVudHJlIGxvcyBwYcOtc2VzIGRlIGxhIGdyw6FmaWNhLiBFbiBlc3RhIGdyw6FmaWNhIHNlIHB1ZWRlIGRlY2lyIHF1ZSBjdWVudGEgY29uIGhldGVyb2dlbmVpZGFkLCBlcyBkZWNpciwgdW5hIGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBlbiBsYXMgbWVkaWFzIG8gZGlzcGVyc2nDs24gZW50cmUgbG9zIGdydXBvcy4NCg0KRW4gdMOpcm1pbm9zIGRlIHBhw61zZXMgc2kgZXMgZGVzZWFibGUgcXVlIHNlIHB1ZWRhIGNvbnRhciBjb24gaGV0ZXJvZ2VuZWlkYWQgZW50cmUgbG9zIHBhw61zZXMgcGFyYSBwb2RlciBjb250YXIgY29uIHVuYSBmb3JtYSBkZSBjb21wYXJhY2nDs24gZW50cmUgbG9zIGdydXBvcy4NCg0KIyMjIEhldGVyb2dlbmVpZGFkIGVudHJlIGHDsW9zDQoNCmBgYHtyfQ0KcGxvdG1lYW5zKFNQLkRZTi5MRTAwLklOIH4gZGF0ZSwgZGF0YSA9IHBhbmVsX3NhbHVkLCBuLmxhYmVsPUZBTFNFLCBtYWluPSAiSGV0ZXJvZ2VuZWlkYWQgZW50cmUgYcOxb3MiKQ0KYGBgDQoNCi0gICDCv0xhIGzDrW5lYSBxdWUgdW5lIGxvcyBwcm9tZWRpb3MgZXMgaG9yaXpvbnRhbCwgbyB0aWVuZSBtdWNob3MgcGljb3M/DQogICAgLSAgIExhIGdyw6FmaWNhIG5vIHRpZW5lIHBpY29zIGEgbG8gbGFyZ28gZGUgbG9zIGHDsW9zLiBTaSBjdWVudGEgY29uIGFsZ3VuYSBkaXNtaW51Y2nDs24gcGFyYSAyMDIwLCBwZXJvIHB1ZWRlIHNlciBleHBsaWNhZG8gYWwgc2VyIHVuIGHDsW8gYXTDrXBpY28gZGUgbWFuZXJhIGdlbmVyYWwuIERlc3B1w6lzIHNlIHJlZ3VsYXJpemEgcGFyYSAyMDIxLg0KLSAgIMK/TG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIG1pZGVuIGxvIG1pc21vLCBwdWVkZSBkZWNpcnNlIHF1ZSB0aWVuZW4gaW50ZXJ2YWxvcyBzaW1pbGFyZXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KICAgIC0gICBFbiBlc3RhIGdyw6FmaWNhIG5vIHNlIGN1ZW50YSBjb24gaGV0ZXJvZ2VuZWlkYWQgcHVlc3RvIHF1ZSBzZSBvYnNlcnZhIHBvY2EgdmFyaWFjacOzbiBlbnRyZSBsb3MgYcOxb3MuDQoNCiMjIEVqZXJjaWNpbyAzLiBNb2RlbG9zIGNvbiBJbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbA0KDQojIyMgTW9kZWxvIDEuIFJlZ3Jlc2nDs24gQWdydXBhZGEgKHBvb2xlZCkNCg0KYGBge3J9DQpwb29sZWQxIDwtIHBsbShTUC5EWU4uTEUwMC5JTiB+IE5ZLkdEUC5QQ0FQLkNEICsgRU4uUE9QLkROU1QgKyBTSC5JTU0uSURQVCArIFZDLklIUi5QU1JDLlA1LCBkYXRhPXBhbmVsX3NhbHVkLCBtb2RlbD0icG9vbGluZyIpDQoNCnN1bW1hcnkocG9vbGVkMSkNCmBgYA0KDQojIyMgTW9kZWxvIDIuIEVmZWN0b3MgRmlqb3MgKHdpdGhpbikNCg0KYGBge3J9DQp3aXRoaW4xIDwtIHBsbShTUC5EWU4uTEUwMC5JTiB+IE5ZLkdEUC5QQ0FQLkNEICsgRU4uUE9QLkROU1QgKyBTSC5JTU0uSURQVCArIFZDLklIUi5QU1JDLlA1LCBkYXRhPXBhbmVsX3NhbHVkLCBtb2RlbD0id2l0aGluIikNCg0Kc3VtbWFyeSh3aXRoaW4xKQ0KYGBgDQoNCiMjIyBQcnVlYmEgcEYNCg0KYGBge3J9DQpwRnRlc3Qod2l0aGluMSxwb29sZWQxKQ0KYGBgDQoNCkxvcyByZXN1bHRhZG9zIGRlIGVzdGEgcHJ1ZWJhIG5vcyBpbmRpY2FuIHF1ZSBsYXMgdmFyaWFuemFzIGRlIGxvcyBncnVwb3Mgc29uIGRpc3RpbnRhcy4gRW4gYmFzZSBhIGVzdG8sIHNlIHNlbGVjY2lvbsOzIGVsIG3DqXRvZG8gZGUgZWZlY3RvcyBmaWpvcywgKnBvb2xlZCouDQoNCiMjIyBNb2RlbG8gMy4gRWZlY3RvcyBBbGVhdG9yaW9zIC0gTcOpdG9kbyBXYWxodXMNCg0KYGBge3J9DQp3YWxodXMxIDwtIHBsbShTUC5EWU4uTEUwMC5JTiB+IE5ZLkdEUC5QQ0FQLkNEICsgRU4uUE9QLkROU1QgKyBTSC5JTU0uSURQVCArIFZDLklIUi5QU1JDLlA1LCBkYXRhPXBhbmVsX3NhbHVkLCBtb2RlbD0icmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJ3YWxodXMiKQ0KDQpzdW1tYXJ5KHdhbGh1czEpDQpgYGANCg0KIyMjIE1vZGVsbyA0LiBFZmVjdG9zIEFsZWF0b3Jpb3MgLSBNw6l0b2RvIEFtZW1peWENCg0KYGBge3J9DQphbWVtaXlhMSA8LSBwbG0oU1AuRFlOLkxFMDAuSU4gfiBOWS5HRFAuUENBUC5DRCArIEVOLlBPUC5ETlNUICsgU0guSU1NLklEUFQgKyBWQy5JSFIuUFNSQy5QNSwgZGF0YT1wYW5lbF9zYWx1ZCwgbW9kZWw9InJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAiYW1lbWl5YSIpDQoNCnN1bW1hcnkoYW1lbWl5YTEpDQpgYGANCg0KIyMjIE1vZGVsbyA1LiBFZmVjdG9zIEFsZWF0b3Jpb3MgLSBNw6l0b2RvIE5lcmxvdmUNCg0KYGBge3J9DQpuZXJsb3ZlMSA8LSBwbG0oU1AuRFlOLkxFMDAuSU4gfiBOWS5HRFAuUENBUC5DRCArIEVOLlBPUC5ETlNUICsgU0guSU1NLklEUFQgKyBWQy5JSFIuUFNSQy5QNSwgZGF0YT1wYW5lbF9zYWx1ZCwgbW9kZWw9InJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAibmVybG92ZSIpDQoNCnN1bW1hcnkobmVybG92ZTEpDQpgYGANCg0KIyMjIFBydWViYSBIYXVzbWFuDQoNCmBgYHtyfQ0KcGh0ZXN0KHdhbGh1czEscG9vbGVkMSkNCmBgYA0KDQpEZXNwdcOpcyBkZSBoYWJlciBhbmFsaXphZG8gZWwgKnAtdmFsdWUqIGRlIGxhIHBydWViYSBIYXVzbWFuLCBzZSBwdWVkZSBjb25jbHVpciBxdWUgZWwgTW9kZWxvIGRlIEVmZWN0b3MgQWxlYXRvcmlvcyBXYWxodXMgZXMgY29uc2lzdGVudGUgeSBlZmljaWVudGUsIHBvciBsbyBjdWFsIHNlcsOhIGVsIHNlbGVjY2lvbmFkbyBwYXJhIGxsZXZhciBhIGNhYm8gZWwgYW7DoWxpc2lzLg0KDQpMb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxvIGluZGljYW4gcXVlIGxhcyB2YXJpYWJsZXMgcXVlIHJlc3VsdGFyb24gc2VyIHNpZ25pZmljYXRpdmFzIGFsIG1vbWVudG8gZGUgcHJlZGVjaXIgbGEgZXhwZWN0YXRpdmEgZGUgdmlkYSBhbCBuYWNlciBzb24gZWwgUElCLCBsb3MgaG9taWNpZGlvcyBpbnRlbmNpb25hbGVzIHkgbGEgaW5tdW5pemFjacOzbiBkZSBsb3MgbmnDsW9zIGRlIGVudHJlIDEyIHkgMjMgbWVzZXMuDQoNCiMjIFRhcmVhIDMuIFBhdGVudGVzDQoNCiFbXShnaXBoeSAoMSkuZ2lmKXt3aWR0aD0iMjcxIn0NCg0KIyMjIENhcmdhIGRlIGFyY2hpdm8geSB0cmFuc2Zvcm1hY2nDs24gYSBwYW5lbA0KDQpgYGB7cn0NCnBhdGVudCA8LSByZWFkLmNzdigiUEFURU5UIDMgLSBDU1YuY3N2IikNCnBhdGVudCA8LSBwZGF0YS5mcmFtZShwYXRlbnQsIGluZGV4ID0gYygiY3VzaXAiLCAieWVhciIpKQ0KDQpzdHIocGF0ZW50KQ0KYGBgDQoNCiMjIyBUcmFuc2Zvcm1hY2nDs24gZGUgdmFyaWFibGVzIGUgaW1wdXRhY2nDs24NCg0KYGBge3J9DQpwYXRlbnQkeWVhciA8LSBhcy5mYWN0b3IocGF0ZW50JHllYXIpDQpwYXRlbnQkc2ljIDwtIGFzLmZhY3RvcihwYXRlbnQkc2ljKQ0KcGF0ZW50JG1lcmdlciA8LSBhcy5mYWN0b3IocGF0ZW50JG1lcmdlcikNCnBhdGVudCRjdXNpcCA8LSBhcy5mYWN0b3IocGF0ZW50JGN1c2lwKQ0KYGBgDQoNCmBgYHtyfQ0KdmlzX21pc3MocGF0ZW50KQ0KY29sU3Vtcyhpcy5uYShwYXRlbnQpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcGF0ZW50X21pY2VkIDwtIG1pY2UocGF0ZW50LCBtPTUsIG1heGl0PTUsIG1ldGhvZCA9ICJjYXJ0IikNCnBhdGVudCA8LSBjb21wbGV0ZShwYXRlbnRfbWljZWQpDQoNCmNvbFN1bXMoaXMubmEocGF0ZW50KSkNCmBgYA0KDQpgYGB7cn0NCnBhdGVudCA8LSBwYXRlbnQgJT4lIG11dGF0ZShlbXBsb3llZXM9IGVtcGxveSoxKQ0KYGBgDQoNCiMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuDQoNCmBgYHtyfQ0KcGF0ZW50X251bSA8LSBGaWx0ZXIoaXMubnVtZXJpYywgcGF0ZW50KSAlPiUgc2VsZWN0KC1lbXBsb3kpDQpwYXRlbnRfY29yIDwtIGNvcihwYXRlbnRfbnVtKQ0KDQpjb3JycGxvdChwYXRlbnRfY29yLG1ldGhvZCA9ICdudW1iZXInKQ0KYGBgDQoNCiMjIyBTZWxlY2Npw7NuIGRlIHZhcmlhYmxlcw0KDQpgYGB7cn0NCnBhdGVudF8xIDwtIHBhdGVudCAlPiUgc2VsZWN0KGMocGF0ZW50c2cscm5kLCBybmRlZmx0LCBybmRzdGNrLCBzYWxlcywgZW1wbG95ZWVzLCBwYXRlbnRzLCB5ZWFyLCBjdXNpcCkpDQoNCnBhdGVudF8yIDwtIHBhdGVudCAlPiUgc2VsZWN0KGMocGF0ZW50c2csIHJuZCwgcm5kZWZsdCwgcm5kc3Rjaywgc2FsZXMsIHN0Y2twciwgZW1wbG95ZWVzLCBwYXRlbnRzLCB5ZWFyLCBjdXNpcCkpDQoNCnBhdGVudF8zIDwtIHBhdGVudCAlPiUgc2VsZWN0KGMocGF0ZW50c2csIHJuZGVmbHQsIHJuZHN0Y2ssIHNhbGVzLCBwYXRlbnRzLCBlbXBsb3llZXMsIHllYXIsIGN1c2lwKSkNCmBgYA0KDQojIyMgR3LDoWZpY2FzIGRlIEhldGVyb2dlbmVpZGFkDQoNCiMjIyMgSGV0ZXJvZ2VuZWlkYWQgZW50cmUgZW1wcmVzYXMNCg0KYGBge3J9DQpwbG90bWVhbnMocGF0ZW50c2cgfiBjdXNpcCwgZGF0YSA9IHBhdGVudF8yLCBuLmxhYmVsPUZBTFNFLCBtYWluPSAiSGV0ZXJvZ2VuZWlkYWQgZW50cmUgZW1wcmVzYXMiKQ0KYGBgDQoNCiMjIyMgSGV0ZXJvZ2VuZWlkYWQgZW50cmUgYcOxb3MNCg0KYGBge3J9DQpwbG90bWVhbnMocGF0ZW50c2cgfiB5ZWFyLCBkYXRhID0gcGF0ZW50XzIsIG4ubGFiZWw9RkFMU0UsIG1haW49ICJIZXRlcm9nZW5laWRhZCBlbnRyZSBhw7FvcyIpDQpgYGANCg0KQWwgYW5hbGl6YXIgbGFzIGdyw6FmaWNhcyBkZSBoZXRlcm9nZW5laWRhZCwgc2UgcHVlZGUgcHVlZGUgb2JzZXJ2YXIgYSB0cmF2w6lzIGRlIGxhcyBiYXJyYXMgZGUgZXJyb3IgcXVlIGV4aXN0ZSB1bmEgZ3JhbiB2YXJpYWJpbGlkYWQgZGVudHJvIGRlIGxvcyBncnVwb3MgZ3JhZmljYWRvcyBlbnRyZSBhw7FvcywgYSBkaWZlcmVuY2lhIGRlIGxhIHZhcmlhYmlsaWRhZCBlbnRyZSBsb3MgZ3J1cG9zIGRlIGVtcHJlc2FzIHF1ZSByZWZsZWphIHNlciBwb2NhLiBTaW4gZW1iYXJnbywgYWwgcHJlc3RhciBhdGVuY2nDs24gYWwgZ3LDoWZpY28gZW50cmUgZW1wcmVzYXMsIHNlIHB1ZWRlbiBwZXJjaWJpciBkaXN0aW50b3MgcGljb3MsIGxvIGN1YWwgZXMgdW5hIHNlw7FhbCBkZSB2YXJpYWJpbGlkYWQgZW4gbGFzIG1lZGlhcyBxdWUgcmVmbGVqYSBoZXRlcm9nZW5laWRhZC4gRW4gY3VhbnRvIGFsIGdyw6FmaWNvIGVudHJlIGHDsW9zLCBzZSBwdWVkZSBjb25jbHVpciBxdWUgZHVyYW50ZSBsb3MgcHJpbWVyb3MgY2luY28gYcOxb3Mgc2Ugc2VndcOtYSB1bmEgdGVuZGVuY2lhIGRlIGhvbW9nZW5laWRhZCwgc2luIGVtYmFyZ28gYSBwYXJ0aXIgZGVsIDIwMTggZXN0YSBjYW1iacOzIGEgdW4gY29tcG9ydGFtaWVudG8gZGUgaGV0ZXJvZ2VuZWlkYWQgZGFkbyBsb3MgY2FtYmlvcyBlbiBsYXMgbWVkaWFzLg0KDQojIyMgTW9kZWxhZG8NCg0KIyMjIyBNb2RlbG8gMS4gUmVncmVzacOzbiBBZ3J1cGFkYSAocG9vbGVkKQ0KDQpgYGB7cn0NCnBvb2xlZDIgPC0gcGxtKHBhdGVudHNnIH4gcm5kICsgcm5kZWZsdCArIHJuZHN0Y2sgKyBzYWxlcyArIHN0Y2twciArIGVtcGxveWVlcywgZGF0YSA9IHBhdGVudCwgbW9kZWwgPSAicG9vbGluZyIpDQoNCnN1bW1hcnkocG9vbGVkMikNCmBgYA0KDQojIyMjIE1vZGVsbyAyLiBFZmVjdG9zIEZpam9zICh3aXRoaW4pDQoNCmBgYHtyfQ0Kd2l0aGluMiA8LSBwbG0ocGF0ZW50c2cgfiBybmQgKyBybmRlZmx0ICsgcm5kc3RjayArIHNhbGVzICsgc3Rja3ByICsgZW1wbG95ZWVzLCBkYXRhID0gcGF0ZW50LCBtb2RlbCA9IndpdGhpbiIpDQoNCnN1bW1hcnkod2l0aGluMikNCmBgYA0KDQojIyMjIFBydWViYSBwRg0KDQpgYGB7cn0NCnBGdGVzdCh3aXRoaW4yLHBvb2xlZDIpDQpgYGANCg0KQWwgb2JzZXJ2YXIgbG9zIHJlc3VsdGFkb3MgZGUgbGEgcHJ1ZWJhIEYsIHNlIHB1ZWRlIGluZmVyaXIgcXVlIGV4aXN0ZSBzdWZpY2llbnRlIGV2aWRlbmNpYSBxdWUgaW5kaWNhIHF1ZSB1bm8gZGUgbG9zIG1vZGVsb3MgcmVmbGVqYSB1bmEgdmFyaWFuemEgZGlzdGludGEuIERhZG8gcXVlIGxhIFIgQWp1c3RhZGEgZnVlIG1heW9yIGVuIGVsIG1vZGVsbyBlc3BlY2lmaWNhZG8gY29uIGVsIG3DqXRvZG8gKnBvb2xlZCosIGVzdGUgc2Vyw6EgZWwgc2VsZWNjaW9uYWRvIHBhcmEgc2VyIGNvbXBhcmFkbyBjb24gbG9zIG1vZGVsb3MgZGUgZWZlY3RvcyBhbGVhdG9yaW9zLg0KDQojIyMjIE1vZGVsbyAzLiBFZmVjdG9zIEFsZWF0b3Jpb3MgLSBNw6l0b2RvIFdhbGh1cw0KDQpgYGB7cn0NCndhbGh1czIgPC0gcGxtKHBhdGVudHNnIH4gcm5kICsgcm5kZWZsdCArIHJuZHN0Y2sgKyBzYWxlcyArIHN0Y2twciArIGVtcGxveWVlcywgZGF0YSA9IHBhdGVudCwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJ3YWxodXMiKQ0KDQpzdW1tYXJ5KHdhbGh1czIpDQpgYGANCg0KIyMjIyBNb2RlbG8gNC4gRWZlY3RvcyBBbGVhdG9yaW9zIC0gTcOpdG9kbyBBbWVtaXlhDQoNCmBgYHtyfQ0KYW1lbWl5YTIgPC0gcGxtKHBhdGVudHNnIH4gcm5kICsgcm5kZWZsdCArIHJuZHN0Y2sgKyBzYWxlcyArIHN0Y2twciArIGVtcGxveWVlcywgZGF0YSA9IHBhdGVudCwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJhbWVtaXlhIikNCg0Kc3VtbWFyeShhbWVtaXlhMikNCmBgYA0KDQojIyMjIE1vZGVsbyA1LiBFZmVjdG9zIEFsZWF0b3Jpb3MgLSBNw6l0b2RvIE5lcmxvdmUNCg0KYGBge3J9DQpuZXJsb3ZlMiA8LSBwbG0ocGF0ZW50c2cgfiBybmQgKyBybmRlZmx0ICsgcm5kc3RjayArIHNhbGVzICsgc3Rja3ByICsgZW1wbG95ZWVzLCBkYXRhID0gcGF0ZW50LCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIm5lcmxvdmUiKQ0KDQpzdW1tYXJ5KG5lcmxvdmUyKQ0KYGBgDQoNCiMjIyMgUHJ1ZWJhIEhhdXNtYW4NCg0KYGBge3J9DQpwaHRlc3Qod2FsaHVzMixwb29sZWQyKQ0KYGBgDQoNCkRhZG8gcXVlIGVsIG3DqXRvZG8gKldhbGh1cyogcmVmbGVqw7MgbWVqb3JlcyByZXN1bHRhZG9zLCBmdWUgc2VsZWNjaW9uYWRvIGFsIGlndWFsIHF1ZSBlbCBtb2RlbG8gKlBvb2xlZCogcGFyYSByZWFsaXphciBsYSBwcnVlYmEgSGF1c21hbi4gTG9zIHJlc3VsdGFkb3MgZGUgbGEgcHJ1ZWJhIGluZGljYW4gcXVlIGVsIG1vZGVsbyAqV2FsaHVzKiBkZSBlZmVjdG9zIGFsZWF0b3Jpb3MgZXMgaW5jb25zaXN0ZW50ZSBhIGNvbXBhcmFjacOzbiBkZWwgbW9kZWxvICpQb29sZWQqIGRlIGVmZWN0b3MgZmlqb3MuDQoNCkFsIHNlbGVjY2lvbmFyIGVsIE1vZGVsbyBkZSBFZmVjdG9zIEZpam8gKlBvb2xlZCosIGxvcyByZXN1bHRhZG9zIG11ZXN0cmFuIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIHNlbGVjY2lvbmFkYXMgcGFyYSBlbCBtb2RlbG8gc29uIHNpZ25pZmljYXRpdmFzIGFsIG1vbWVudG8gZGUgcHJlZGVjaXIgZWwgbsO6bWVybyBkZSBwYXRlbnRlcyBvdG9yZ2FkYXMgYSBsYXMgZW1wcmVzYXMsIGEgZXhjZXBjacOzbiBkZSBsYSB2YXJpYWJsZSBybmRlZmx0ICgqUiZEIGV4cGVuZCwgMTk3MiBtaWxsIFwkKikuDQo=