IMPORTAR PAQUETES Y LIBRERIAS

#install.packages("readxl")
library(readxl)
#df1 <- read_excel("C:/Users/52812/Downloads/PATENT 3.xls")
#df1 <- read.csv("ruta/de/tu/archivo.xlsx")
#summary(df1)

PARTE 1. Patentes

Instrucciones: Genera el mejor modelo y Genera predicciones…Incluye conclusiones.

# Instalar paquetes si es necesario
# install.packages("readxl")
# install.packages("plm")
# install.packages("lmtest")
# install.packages("sandwich")
# install.packages("dplyr")

library(readxl)
library(plm)
library(lmtest)
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(sandwich)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:plm':
## 
##     between, lag, lead
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
patentes <- read_excel("C:/Users/52812/Downloads/PATENT 3.xls", sheet = "Sheet1")

#LIMPIEZA DE DATOS
# Revisar valores NA
colSums(is.na(patentes))
##    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
patentes_modelo <- na.omit(patentes)

# Convertir a datos panel
panel_patentes <- pdata.frame(
  patentes_modelo,
  index = c("cusip", "year")
)

#Opcion 1 ~ Modelo de regresion Agrupada (Pooled)
pooled3_act <- plm(
  patents ~ merger + employ + return + patentsg +
    stckpr + rnd + rndeflt + rndstck + sales + sic,
  data = panel_patentes,
  model = "pooling"
)

summary(pooled3_act)
## Pooling Model
## 
## Call:
## plm(formula = patents ~ merger + employ + return + patentsg + 
##     stckpr + rnd + rndeflt + rndstck + sales + sic, data = panel_patentes, 
##     model = "pooling")
## 
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -525.42194   -2.59738   -0.31264    1.88763  277.92369 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  1.19864916  2.94181986  0.4075   0.68372    
## merger       1.92231907  4.04770404  0.4749   0.63490    
## employ       0.12548448  0.03060149  4.1006 4.280e-05 ***
## return       0.06432167  0.10374558  0.6200   0.53533    
## patentsg     0.78696226  0.01016726 77.4016 < 2.2e-16 ***
## stckpr       0.00355791  0.02557045  0.1391   0.88935    
## rnd         -0.18291882  0.04480367 -4.0827 4.621e-05 ***
## rndeflt      0.26805014  0.03877619  6.9128 6.306e-12 ***
## rndstck     -0.00122890  0.00628664 -0.1955   0.84504    
## sales       -0.00054529  0.00025769 -2.1161   0.03446 *  
## sic         -0.00049485  0.00081918 -0.6041   0.54586    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10910000
## Residual Sum of Squares: 1154800
## R-Squared:      0.89416
## Adj. R-Squared: 0.89365
## F-statistic: 1750.44 on 10 and 2072 DF, p-value: < 2.22e-16
#Opcion 2 ~ Modelo de regresion Agrupada/Efectos Fijos (Within)
within3_act <- plm(
  patents ~ merger + employ + return + patentsg +
    stckpr + rnd + rndeflt + rndstck + sales + sic,
  data = panel_patentes,
  model = "within"
)

summary(within3_act)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patents ~ merger + employ + return + patentsg + 
##     stckpr + rnd + rndeflt + rndstck + sales + sic, data = panel_patentes, 
##     model = "within")
## 
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -468.39577   -1.75634   -0.25666    1.85265  172.64513 
## 
## Coefficients:
##             Estimate  Std. Error  t-value  Pr(>|t|)    
## merger    6.02467998  4.30535335   1.3993    0.1619    
## employ   -0.09095534  0.08057733  -1.1288    0.2591    
## return   -0.01221444  0.12005904  -0.1017    0.9190    
## patentsg  0.03913907  0.02580379   1.5168    0.1295    
## stckpr   -0.03959771  0.03347713  -1.1828    0.2370    
## rnd      -2.04101003  0.15053766 -13.5581 < 2.2e-16 ***
## rndeflt   3.25369409  0.22523191  14.4460 < 2.2e-16 ***
## rndstck   0.19724166  0.01808942  10.9037 < 2.2e-16 ***
## sales    -0.00188938  0.00041715  -4.5293 6.294e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1090400
## Residual Sum of Squares: 714450
## R-Squared:      0.34479
## Adj. R-Squared: 0.2662
## F-statistic: 108.696 on 9 and 1859 DF, p-value: < 2.22e-16
#PruebaF
pFtest(within3_act,pooled3_act)
## 
##  F test for individual effects
## 
## data:  patents ~ merger + employ + return + patentsg + stckpr + rnd +  ...
## F = 5.3788, df1 = 213, df2 = 1859, p-value < 2.2e-16
## alternative hypothesis: significant effects
#Opcion 3 ~ Modelo de regresion efectos Aleatorios (Random)
random3_act <- plm(
  patents ~ merger + employ + return + patentsg +
    stckpr + rnd + rndeflt + rndstck + sales + sic,
  data = panel_patentes,
  model = "random"
)

summary(random3_act)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = patents ~ merger + employ + return + patentsg + 
##     stckpr + rnd + rndeflt + rndstck + sales + sic, data = panel_patentes, 
##     model = "random")
## 
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
## 
## Effects:
##                 var std.dev share
## idiosyncratic 384.3    19.6     1
## individual      0.0     0.0     0
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0       0       0       0 
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -525.42194   -2.59738   -0.31264    1.88763  277.92369 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  1.19864916  2.94181986  0.4075   0.68368    
## merger       1.92231907  4.04770404  0.4749   0.63485    
## employ       0.12548448  0.03060149  4.1006 4.121e-05 ***
## return       0.06432167  0.10374558  0.6200   0.53526    
## patentsg     0.78696226  0.01016726 77.4016 < 2.2e-16 ***
## stckpr       0.00355791  0.02557045  0.1391   0.88934    
## rnd         -0.18291882  0.04480367 -4.0827 4.452e-05 ***
## rndeflt      0.26805014  0.03877619  6.9128 4.753e-12 ***
## rndstck     -0.00122890  0.00628664 -0.1955   0.84502    
## sales       -0.00054529  0.00025769 -2.1161   0.03434 *  
## sic         -0.00049485  0.00081918 -0.6041   0.54579    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10910000
## Residual Sum of Squares: 1154800
## R-Squared:      0.89416
## Adj. R-Squared: 0.89365
## Chisq: 17504.4 on 10 DF, p-value: < 2.22e-16
# Prueba de Hausman 
#INTERPRETACION: Si p<0.05, usar efectos fijos; Si p>0.05 usar efectos aleatorios 
phtest(random3_act, within3_act) 
## 
##  Hausman Test
## 
## data:  patents ~ merger + employ + return + patentsg + stckpr + rnd +  ...
## chisq = 1104.9, df = 9, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
#El mejor modelo para este panel es el de EFECTOS FIJOS  

#ERRORES ESTANDAR ROBUSTOS
coeftest(
  within3_act,
  vcov = vcovHC(
    within3_act,
    type = "HC1",
    cluster = "group"
  )
)
## 
## t test of coefficients:
## 
##             Estimate  Std. Error t value Pr(>|t|)   
## merger    6.02467998  2.55971733  2.3537 0.018694 * 
## employ   -0.09095534  0.14487117 -0.6278 0.530188   
## return   -0.01221444  0.06872888 -0.1777 0.858963   
## patentsg  0.03913907  0.17892930  0.2187 0.826876   
## stckpr   -0.03959771  0.03723865 -1.0633 0.287761   
## rnd      -2.04101003  0.87516556 -2.3321 0.019800 * 
## rndeflt   3.25369409  1.15886687  2.8077 0.005043 **
## rndstck   0.19724166  0.09811965  2.0102 0.044553 * 
## sales    -0.00188938  0.00074645 -2.5312 0.011451 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#SITUACION PROBLEMA INVENTADA: Pronóstico de patentes para 2022 suponiendo que cada empresa mantiene en 2022 los valores de sus variables explicativas observados en 2021.

# Tomamos los datos observados en 2021
df_prediccion2022 <- subset(patentes_modelo, year == 2021)

# Cambiamos el año a 2022
df_prediccion2022$year <- 2022

coeficientes <- coef(within3_act)
# Efectos individuales de cada empresa
efectos_act3 <- fixef(within3_act)

# Intercepto + efecto individual + variables explicativas
df_prediccion2022$Patentes_Pronosticadas <-
  efectos_act3[as.character(df_prediccion2022$cusip)] +
  coeficientes["merger"] * df_prediccion2022$merger +
  coeficientes["employ"] * df_prediccion2022$employ +
  coeficientes["return"] * df_prediccion2022$return +
  coeficientes["patentsg"] * df_prediccion2022$patentsg +
  coeficientes["stckpr"] * df_prediccion2022$stckpr +
  coeficientes["rnd"] * df_prediccion2022$rnd +
  coeficientes["rndeflt"] * df_prediccion2022$rndeflt +
  coeficientes["rndstck"] * df_prediccion2022$rndstck +
  coeficientes["sales"] * df_prediccion2022$sales

#RESULTADOS DE PRONOSTICO
df_prediccion2022[, c(
  "cusip",
  "year",
  "Patentes_Pronosticadas"
)]
## # A tibble: 206 × 3
##    cusip  year Patentes_Pronosticadas
##    <dbl> <dbl>                  <dbl>
##  1   800  2022                 38.6  
##  2  4626  2022                  3.64 
##  3  4671  2022                  1.43 
##  4 20753  2022                  0.517
##  5 21367  2022                  0.593
##  6 23519  2022                 13.2  
##  7 29069  2022                  0.463
##  8 38213  2022                  1.48 
##  9 54303  2022                 -2.47 
## 10 67131  2022                  1.30 
## # ℹ 196 more rows

CONCLUSION: “El mejor modelo para la base de datos PATENT 3 es el modelo de efectos fijos, debido a que la prueba de Hausman rechaza la hipótesis de que los efectos individuales no estén correlacionados con las variables explicativas. El modelo utiliza las características específicas de cada empresa y explica aproximadamente el 34.5% de la variación de las patentes dentro de las empresas a través del tiempo. Bajo el escenario planteado de la actividad, el modelo estima aproximadamente 4.20 patentes. Para generar pronósticos futuros, es necesario establecer previamente los valores esperados de las variables explicativas; por ello, el pronóstico de 2022 presentado se interpreta como un escenario en el que dichas variables permanecen constantes respecto a 2021.”

PARTE 2. Cuidado de la piel

Instrucciones: Genera el mejor modelo y Genera predicciones…Incluye conclusiones. Si tuvieras que invertir en alguna sub-categoría, ¿en cuál lo harías? Justifica ampliamente tu respuesta…

PARTE 3. Banco Mundial

Instrucciones: Importar datos del Banco Mundial, Genera el mejor modelo y Genera predicciones…Incluye conclusiones y graficas.

Puntos Extras: +10 puntos sobre el examen si se entrega un PDF adicional con el código equivalente de este trabajo pero en Python o si se entrega una automatización con Claude relacionado con el tema “Datos de Panel” (de preferencia con la Industria del Cuidado de la Piel).

LS0tDQp0aXRsZTogIkFDVElWSURBRCAxXzh2b1NlbWVzdHJlIg0KYXV0aG9yOiAiTHVjZXJvX1NhbGF6YXJfQTAwODM0ODkzIg0KZGF0ZTogIjIwMjYtMDgtMTMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KIyBJTVBPUlRBUiBQQVFVRVRFUyBZIExJQlJFUklBUw0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQ0KbGlicmFyeShyZWFkeGwpDQojZGYxIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzLzUyODEyL0Rvd25sb2Fkcy9QQVRFTlQgMy54bHMiKQ0KI2RmMSA8LSByZWFkLmNzdigicnV0YS9kZS90dS9hcmNoaXZvLnhsc3giKQ0KI3N1bW1hcnkoZGYxKQ0KYGBgDQoNCiMgUEFSVEUgMS4gUGF0ZW50ZXMNCkluc3RydWNjaW9uZXM6IEdlbmVyYSBlbCBtZWpvciBtb2RlbG8geSBHZW5lcmEgcHJlZGljY2lvbmVzLi4uSW5jbHV5ZSBjb25jbHVzaW9uZXMuDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KIyBJbnN0YWxhciBwYXF1ZXRlcyBzaSBlcyBuZWNlc2FyaW8NCiMgaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikNCiMgaW5zdGFsbC5wYWNrYWdlcygicGxtIikNCiMgaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IikNCiMgaW5zdGFsbC5wYWNrYWdlcygic2FuZHdpY2giKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQoNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KGRwbHlyKQ0KDQpwYXRlbnRlcyA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy81MjgxMi9Eb3dubG9hZHMvUEFURU5UIDMueGxzIiwgc2hlZXQgPSAiU2hlZXQxIikNCg0KI0xJTVBJRVpBIERFIERBVE9TDQojIFJldmlzYXIgdmFsb3JlcyBOQQ0KY29sU3Vtcyhpcy5uYShwYXRlbnRlcykpDQoNCnBhdGVudGVzX21vZGVsbyA8LSBuYS5vbWl0KHBhdGVudGVzKQ0KDQojIENvbnZlcnRpciBhIGRhdG9zIHBhbmVsDQpwYW5lbF9wYXRlbnRlcyA8LSBwZGF0YS5mcmFtZSgNCiAgcGF0ZW50ZXNfbW9kZWxvLA0KICBpbmRleCA9IGMoImN1c2lwIiwgInllYXIiKQ0KKQ0KDQojT3BjaW9uIDEgfiBNb2RlbG8gZGUgcmVncmVzaW9uIEFncnVwYWRhIChQb29sZWQpDQpwb29sZWQzX2FjdCA8LSBwbG0oDQogIHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBwYXRlbnRzZyArDQogICAgc3Rja3ByICsgcm5kICsgcm5kZWZsdCArIHJuZHN0Y2sgKyBzYWxlcyArIHNpYywNCiAgZGF0YSA9IHBhbmVsX3BhdGVudGVzLA0KICBtb2RlbCA9ICJwb29saW5nIg0KKQ0KDQpzdW1tYXJ5KHBvb2xlZDNfYWN0KQ0KDQojT3BjaW9uIDIgfiBNb2RlbG8gZGUgcmVncmVzaW9uIEFncnVwYWRhL0VmZWN0b3MgRmlqb3MgKFdpdGhpbikNCndpdGhpbjNfYWN0IDwtIHBsbSgNCiAgcGF0ZW50cyB+IG1lcmdlciArIGVtcGxveSArIHJldHVybiArIHBhdGVudHNnICsNCiAgICBzdGNrcHIgKyBybmQgKyBybmRlZmx0ICsgcm5kc3RjayArIHNhbGVzICsgc2ljLA0KICBkYXRhID0gcGFuZWxfcGF0ZW50ZXMsDQogIG1vZGVsID0gIndpdGhpbiINCikNCg0Kc3VtbWFyeSh3aXRoaW4zX2FjdCkNCg0KI1BydWViYUYNCnBGdGVzdCh3aXRoaW4zX2FjdCxwb29sZWQzX2FjdCkNCg0KI09wY2lvbiAzIH4gTW9kZWxvIGRlIHJlZ3Jlc2lvbiBlZmVjdG9zIEFsZWF0b3Jpb3MgKFJhbmRvbSkNCnJhbmRvbTNfYWN0IDwtIHBsbSgNCiAgcGF0ZW50cyB+IG1lcmdlciArIGVtcGxveSArIHJldHVybiArIHBhdGVudHNnICsNCiAgICBzdGNrcHIgKyBybmQgKyBybmRlZmx0ICsgcm5kc3RjayArIHNhbGVzICsgc2ljLA0KICBkYXRhID0gcGFuZWxfcGF0ZW50ZXMsDQogIG1vZGVsID0gInJhbmRvbSINCikNCg0Kc3VtbWFyeShyYW5kb20zX2FjdCkNCg0KIyBQcnVlYmEgZGUgSGF1c21hbiANCiNJTlRFUlBSRVRBQ0lPTjogU2kgcDwwLjA1LCB1c2FyIGVmZWN0b3MgZmlqb3M7IFNpIHA+MC4wNSB1c2FyIGVmZWN0b3MgYWxlYXRvcmlvcyANCnBodGVzdChyYW5kb20zX2FjdCwgd2l0aGluM19hY3QpIA0KI0VsIG1lam9yIG1vZGVsbyBwYXJhIGVzdGUgcGFuZWwgZXMgZWwgZGUgRUZFQ1RPUyBGSUpPUyAgDQoNCiNFUlJPUkVTIEVTVEFOREFSIFJPQlVTVE9TDQpjb2VmdGVzdCgNCiAgd2l0aGluM19hY3QsDQogIHZjb3YgPSB2Y292SEMoDQogICAgd2l0aGluM19hY3QsDQogICAgdHlwZSA9ICJIQzEiLA0KICAgIGNsdXN0ZXIgPSAiZ3JvdXAiDQogICkNCikNCg0KI1NJVFVBQ0lPTiBQUk9CTEVNQSBJTlZFTlRBREE6IFByb27Ds3N0aWNvIGRlIHBhdGVudGVzIHBhcmEgMjAyMiBzdXBvbmllbmRvIHF1ZSBjYWRhIGVtcHJlc2EgbWFudGllbmUgZW4gMjAyMiBsb3MgdmFsb3JlcyBkZSBzdXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcyBvYnNlcnZhZG9zIGVuIDIwMjEuDQoNCiMgVG9tYW1vcyBsb3MgZGF0b3Mgb2JzZXJ2YWRvcyBlbiAyMDIxDQpkZl9wcmVkaWNjaW9uMjAyMiA8LSBzdWJzZXQocGF0ZW50ZXNfbW9kZWxvLCB5ZWFyID09IDIwMjEpDQoNCiMgQ2FtYmlhbW9zIGVsIGHDsW8gYSAyMDIyDQpkZl9wcmVkaWNjaW9uMjAyMiR5ZWFyIDwtIDIwMjINCg0KY29lZmljaWVudGVzIDwtIGNvZWYod2l0aGluM19hY3QpDQojIEVmZWN0b3MgaW5kaXZpZHVhbGVzIGRlIGNhZGEgZW1wcmVzYQ0KZWZlY3Rvc19hY3QzIDwtIGZpeGVmKHdpdGhpbjNfYWN0KQ0KDQojIEludGVyY2VwdG8gKyBlZmVjdG8gaW5kaXZpZHVhbCArIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMNCmRmX3ByZWRpY2Npb24yMDIyJFBhdGVudGVzX1Byb25vc3RpY2FkYXMgPC0NCiAgZWZlY3Rvc19hY3QzW2FzLmNoYXJhY3RlcihkZl9wcmVkaWNjaW9uMjAyMiRjdXNpcCldICsNCiAgY29lZmljaWVudGVzWyJtZXJnZXIiXSAqIGRmX3ByZWRpY2Npb24yMDIyJG1lcmdlciArDQogIGNvZWZpY2llbnRlc1siZW1wbG95Il0gKiBkZl9wcmVkaWNjaW9uMjAyMiRlbXBsb3kgKw0KICBjb2VmaWNpZW50ZXNbInJldHVybiJdICogZGZfcHJlZGljY2lvbjIwMjIkcmV0dXJuICsNCiAgY29lZmljaWVudGVzWyJwYXRlbnRzZyJdICogZGZfcHJlZGljY2lvbjIwMjIkcGF0ZW50c2cgKw0KICBjb2VmaWNpZW50ZXNbInN0Y2twciJdICogZGZfcHJlZGljY2lvbjIwMjIkc3Rja3ByICsNCiAgY29lZmljaWVudGVzWyJybmQiXSAqIGRmX3ByZWRpY2Npb24yMDIyJHJuZCArDQogIGNvZWZpY2llbnRlc1sicm5kZWZsdCJdICogZGZfcHJlZGljY2lvbjIwMjIkcm5kZWZsdCArDQogIGNvZWZpY2llbnRlc1sicm5kc3RjayJdICogZGZfcHJlZGljY2lvbjIwMjIkcm5kc3RjayArDQogIGNvZWZpY2llbnRlc1sic2FsZXMiXSAqIGRmX3ByZWRpY2Npb24yMDIyJHNhbGVzDQoNCiNSRVNVTFRBRE9TIERFIFBST05PU1RJQ08NCmRmX3ByZWRpY2Npb24yMDIyWywgYygNCiAgImN1c2lwIiwNCiAgInllYXIiLA0KICAiUGF0ZW50ZXNfUHJvbm9zdGljYWRhcyINCildDQpgYGANCkNPTkNMVVNJT046ICJFbCBtZWpvciBtb2RlbG8gcGFyYSBsYSBiYXNlIGRlIGRhdG9zIFBBVEVOVCAzIGVzIGVsIG1vZGVsbyBkZSBlZmVjdG9zIGZpam9zLCBkZWJpZG8gYSBxdWUgbGEgcHJ1ZWJhIGRlIEhhdXNtYW4gcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIGRlIHF1ZSBsb3MgZWZlY3RvcyBpbmRpdmlkdWFsZXMgbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcyBjb24gbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMuIEVsIG1vZGVsbyB1dGlsaXphIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGVzcGVjw61maWNhcyBkZSBjYWRhIGVtcHJlc2EgeSBleHBsaWNhIGFwcm94aW1hZGFtZW50ZSBlbCAzNC41JSBkZSBsYSB2YXJpYWNpw7NuIGRlIGxhcyBwYXRlbnRlcyBkZW50cm8gZGUgbGFzIGVtcHJlc2FzIGEgdHJhdsOpcyBkZWwgdGllbXBvLiBCYWpvIGVsIGVzY2VuYXJpbyBwbGFudGVhZG8gZGUgbGEgYWN0aXZpZGFkLCBlbCBtb2RlbG8gZXN0aW1hIGFwcm94aW1hZGFtZW50ZSA0LjIwIHBhdGVudGVzLg0KUGFyYSBnZW5lcmFyIHByb27Ds3N0aWNvcyBmdXR1cm9zLCBlcyBuZWNlc2FyaW8gZXN0YWJsZWNlciBwcmV2aWFtZW50ZSBsb3MgdmFsb3JlcyBlc3BlcmFkb3MgZGUgbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXM7IHBvciBlbGxvLCBlbCBwcm9uw7NzdGljbyBkZSAyMDIyIHByZXNlbnRhZG8gc2UgaW50ZXJwcmV0YSBjb21vIHVuIGVzY2VuYXJpbyBlbiBlbCBxdWUgZGljaGFzIHZhcmlhYmxlcyBwZXJtYW5lY2VuIGNvbnN0YW50ZXMgcmVzcGVjdG8gYSAyMDIxLiINCg0KDQojIFBBUlRFIDIuIEN1aWRhZG8gZGUgbGEgcGllbA0KSW5zdHJ1Y2Npb25lczogR2VuZXJhIGVsIG1lam9yIG1vZGVsbyB5IEdlbmVyYSBwcmVkaWNjaW9uZXMuLi5JbmNsdXllIGNvbmNsdXNpb25lcy4NClNpIHR1dmllcmFzIHF1ZSBpbnZlcnRpciBlbiBhbGd1bmEgc3ViLWNhdGVnb3LDrWEsIMK/ZW4gY3XDoWwgbG8gaGFyw61hcz8gSnVzdGlmaWNhIGFtcGxpYW1lbnRlIHR1IHJlc3B1ZXN0YS4uLg0KYGBge3J9DQoNCmBgYA0KDQoNCiMgUEFSVEUgMy4gQmFuY28gTXVuZGlhbA0KSW5zdHJ1Y2Npb25lczogSW1wb3J0YXIgZGF0b3MgZGVsIEJhbmNvIE11bmRpYWwsIEdlbmVyYSBlbCBtZWpvciBtb2RlbG8geSBHZW5lcmEgcHJlZGljY2lvbmVzLi4uSW5jbHV5ZSBjb25jbHVzaW9uZXMgeSBncmFmaWNhcy4NCmBgYHtyfQ0KDQpgYGANCg0KDQpQdW50b3MgRXh0cmFzOiArMTAgcHVudG9zIHNvYnJlIGVsIGV4YW1lbiBzaSBzZSBlbnRyZWdhIHVuIFBERiBhZGljaW9uYWwgY29uIGVsIGPDs2RpZ28gZXF1aXZhbGVudGUgZGUgZXN0ZSB0cmFiYWpvIHBlcm8gZW4gUHl0aG9uIG8gc2kgc2UgZW50cmVnYSB1bmEgYXV0b21hdGl6YWNpw7NuIGNvbiBDbGF1ZGUgcmVsYWNpb25hZG8gY29uIGVsIHRlbWEgIkRhdG9zIGRlIFBhbmVsIiAoZGUgcHJlZmVyZW5jaWEgY29uIGxhIEluZHVzdHJpYSBkZWwgQ3VpZGFkbyBkZSBsYSBQaWVsKS4NCmBgYHtyfQ0KDQpgYGANCg0K