Lab: Introduction to R

Basic Commands:

x
[1] 1 3 5
y
[1] 1 6 2
length(x)
[1] 3
length(y)
[1] 3
x+y
[1] 2 9 7
ls()
[1] "x" "y"
ls()
character(0)
x
     [,1] [,2]
[1,]    1    3
[2,]    2    4
y
     [,1] [,2]
[1,]    1    2
[2,]    3    4
sqrt(y)
         [,1]     [,2]
[1,] 1.000000 1.414214
[2,] 1.732051 2.000000
x^2
     [,1] [,2]
[1,]    1    9
[2,]    4   16
cor(x,y)
[1] 0.6688024
round(rnorm(50), 4)
 [1] -1.1440  1.3421  2.1854  0.5364  0.0632  0.5022 -0.0004  0.5658 -0.5725 -1.1102
[11] -0.0487 -0.6957  0.8289  0.2067 -0.2357 -0.5563 -0.3648  0.8624 -0.6308  0.3136
[21] -0.9315  0.8239  0.5234  0.7069  0.4202 -0.2691 -1.5103 -0.6902 -0.1435 -1.0135
[31]  1.5733  0.0127  0.8726  0.4221 -0.0188  2.6157 -0.6931 -0.2663 -0.7206  1.3677
[41]  0.2640  0.6322 -1.3307  0.0269  1.0406  1.3120 -0.0300 -0.2500  0.0234  1.6599
mean(y)
[1] 0.01103557
var(y)
[1] 0.7328675
sqrt(var(y))
[1] 0.8560768
sd(y)
[1] 0.8560768

Graphics

x
 [1]  1  2  3  4  5  6  7  8  9 10
x
 [1]  1  2  3  4  5  6  7  8  9 10
round(x, 4)
 [1] -3.1416 -3.0134 -2.8851 -2.7569 -2.6287 -2.5005 -2.3722 -2.2440 -2.1158
[10] -1.9875 -1.8593 -1.7311 -1.6029 -1.4746 -1.3464 -1.2182 -1.0899 -0.9617
[19] -0.8335 -0.7053 -0.5770 -0.4488 -0.3206 -0.1923 -0.0641  0.0641  0.1923
[28]  0.3206  0.4488  0.5770  0.7053  0.8335  0.9617  1.0899  1.2182  1.3464
[37]  1.4746  1.6029  1.7311  1.8593  1.9875  2.1158  2.2440  2.3722  2.5005
[46]  2.6287  2.7569  2.8851  3.0134  3.1416

Indexing Data

A
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
A[2,3]
[1] 10
A[c(1,3), c(2,4)]
     [,1] [,2]
[1,]    5   13
[2,]    7   15
A[1:3, 2:4]
     [,1] [,2] [,3]
[1,]    5    9   13
[2,]    6   10   14
[3,]    7   11   15
A[1:2, ]
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
A[,1:2]
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
A[1,]
[1]  1  5  9 13
A[-c(1,3), ]
     [,1] [,2] [,3] [,4]
[1,]    2    6   10   14
[2,]    4    8   12   16
A[-c(1,3), -c(1,3,4)]
[1] 6 8

Loding Data

names(Auto)
[1] "mpg"          "cylinders"    "displacement" "horsepower"   "weight"      
[6] "acceleration" "year"         "origin"       "name"        

Additional Graphical and Numerical Summaries

plot(horsepower, mpg)
identify(horsepower, mpg, name)
integer(0)

summary(Auto)
      mpg          cylinders      displacement     horsepower        weight    
 Min.   : 9.00   Min.   :3.000   Min.   : 68.0   Min.   : 46.0   Min.   :1613  
 1st Qu.:17.00   1st Qu.:4.000   1st Qu.:105.0   1st Qu.: 75.0   1st Qu.:2225  
 Median :22.75   Median :4.000   Median :151.0   Median : 93.5   Median :2804  
 Mean   :23.45   Mean   :5.472   Mean   :194.4   Mean   :104.5   Mean   :2978  
 3rd Qu.:29.00   3rd Qu.:8.000   3rd Qu.:275.8   3rd Qu.:126.0   3rd Qu.:3615  
 Max.   :46.60   Max.   :8.000   Max.   :455.0   Max.   :230.0   Max.   :5140  
                                                                               
  acceleration        year           origin                      name    
 Min.   : 8.00   Min.   :70.00   Min.   :1.000   amc matador       :  5  
 1st Qu.:13.78   1st Qu.:73.00   1st Qu.:1.000   ford pinto        :  5  
 Median :15.50   Median :76.00   Median :1.000   toyota corolla    :  5  
 Mean   :15.54   Mean   :75.98   Mean   :1.577   amc gremlin       :  4  
 3rd Qu.:17.02   3rd Qu.:79.00   3rd Qu.:2.000   amc hornet        :  4  
 Max.   :24.80   Max.   :82.00   Max.   :3.000   chevrolet chevette:  4  
                                                 (Other)           :365  
summary(mpg)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   9.00   17.00   22.75   23.45   29.00   46.60 

Ejercicio #1 (Applied - 8)

Inciso a)

dim(College)
[1] 777  18

Inciso b)

Inics c)

summary(college)
 Private        Apps           Accept          Enroll       Top10perc    
 No :212   Min.   :   81   Min.   :   72   Min.   :  35   Min.   : 1.00  
 Yes:565   1st Qu.:  776   1st Qu.:  604   1st Qu.: 242   1st Qu.:15.00  
           Median : 1558   Median : 1110   Median : 434   Median :23.00  
           Mean   : 3002   Mean   : 2019   Mean   : 780   Mean   :27.56  
           3rd Qu.: 3624   3rd Qu.: 2424   3rd Qu.: 902   3rd Qu.:35.00  
           Max.   :48094   Max.   :26330   Max.   :6392   Max.   :96.00  
   Top25perc      F.Undergrad     P.Undergrad         Outstate       Room.Board  
 Min.   :  9.0   Min.   :  139   Min.   :    1.0   Min.   : 2340   Min.   :1780  
 1st Qu.: 41.0   1st Qu.:  992   1st Qu.:   95.0   1st Qu.: 7320   1st Qu.:3597  
 Median : 54.0   Median : 1707   Median :  353.0   Median : 9990   Median :4200  
 Mean   : 55.8   Mean   : 3700   Mean   :  855.3   Mean   :10441   Mean   :4358  
 3rd Qu.: 69.0   3rd Qu.: 4005   3rd Qu.:  967.0   3rd Qu.:12925   3rd Qu.:5050  
 Max.   :100.0   Max.   :31643   Max.   :21836.0   Max.   :21700   Max.   :8124  
     Books           Personal         PhD            Terminal       S.F.Ratio    
 Min.   :  96.0   Min.   : 250   Min.   :  8.00   Min.   : 24.0   Min.   : 2.50  
 1st Qu.: 470.0   1st Qu.: 850   1st Qu.: 62.00   1st Qu.: 71.0   1st Qu.:11.50  
 Median : 500.0   Median :1200   Median : 75.00   Median : 82.0   Median :13.60  
 Mean   : 549.4   Mean   :1341   Mean   : 72.66   Mean   : 79.7   Mean   :14.09  
 3rd Qu.: 600.0   3rd Qu.:1700   3rd Qu.: 85.00   3rd Qu.: 92.0   3rd Qu.:16.50  
 Max.   :2340.0   Max.   :6800   Max.   :103.00   Max.   :100.0   Max.   :39.80  
  perc.alumni        Expend        Grad.Rate       Elite    
 Min.   : 0.00   Min.   : 3186   Min.   : 10.00    Yes: 78  
 1st Qu.:13.00   1st Qu.: 6751   1st Qu.: 53.00   No  :699  
 Median :21.00   Median : 8377   Median : 65.00             
 Mean   :22.74   Mean   : 9660   Mean   : 65.46             
 3rd Qu.:31.00   3rd Qu.:10830   3rd Qu.: 78.00             
 Max.   :64.00   Max.   :56233   Max.   :118.00             

summary(Elite)
 Yes   No 
  78  699 

Inciso d)

  1. Con la data podemos darnos cuenta que más de 500 universidades en Estados Unidos aceptan menos de 1000 personas al año.

  2. Al rededor de 200 universidades tiene de 70 a 80 Ph. D. en su claustro.

  3. Definitivamente las universidades que son consideradas de elite son más costosas que las universidades que no son conideradas de elite, por la matriculación out-of-state.

Ejercicio 9 - (Applied)

names(Auto)
[1] "mpg"          "cylinders"    "displacement" "horsepower"   "weight"      
[6] "acceleration" "year"         "origin"       "name"        
typeof(mpg)
[1] "double"
typeof(cylinders)
[1] "integer"
typeof(displacement)
[1] "double"
typeof(horsepower)
[1] "double"
typeof(weight)
[1] "double"
typeof(acceleration)
[1] "double"
typeof(year)
[1] "double"
typeof(origin)
[1] "double"
typeof(name)
[1] "integer"
head(Auto)

Inciso a)

Por el contexto, las variables “cylinders”, “year”, “origin” y “name” son cualitativas.

Las variables “mpg”, “displacement”, “horsepower”, “weight”, “aceleration” cuantitativas

Inciso b)

ranges<-data.frame(range(mpg),
              range(displacement), 
              range(horsepower),
              range(weight),
              range(acceleration))
ranges

Inciso c)

means<-c(mean(mpg), mean(displacement),
         mean(horsepower), mean(weight), mean(acceleration))
sds<-c(sd(mpg), sd(displacement),
         sd(horsepower), sd(weight), sd(acceleration))
meanss<-data.frame(t(means))
sdss<-data.frame(t(sds))
colnames(meanss)<-c("mpg", "displacment", "horsepower", "weight", "acceleration")
colnames(sdss)<-c("mpg", "displacment", "horsepower", "weight", "acceleration")
statss
statss<-rbind(meanss, sdss)
rownames(statss)<-c("Means", "Std. Devs")
statss

Inciso d)

Auto<-Auto[-(10:84),] #Removemos desde la observacion 10 hasta la 85
attach(Auto)
meant<-c(mean(mpg), mean(displacement),
         mean(horsepower), mean(weight), mean(acceleration))
sdt<-c(sd(mpg), sd(displacement),
         sd(horsepower), sd(weight), sd(acceleration))
meants<-data.frame(t(meant))
sdts<-data.frame(t(sdt))
colnames(meants)<-c("mpg", "displacment", "horsepower", "weight", "acceleration")
colnames(sdts)<-c("mpg", "displacment", "horsepower", "weight", "acceleration")
statts<-rbind(meants, sdts)
rownames(statts)<-c("Means", "Std. Devs")
statts

Inciso e)

De la información anterior podemos notar que:

  • Existe una relación estrecha y negativa, entre: “mpg y displacement”, “mpg y horsepower”, “mpg y weight”.
  • Existe una realción estrecha y positiva entre: “displacemente y horsepower”, “displacement y weight”.
  • Existe una relación estrecha y positiva entre: “weight y displacemente”, “weight y horsepower”.
  • Existe una realción estrecha y negativa entre: “displacement y acceleration”, “horsepower y displacement”, “acceleration y weight”.

Inciso f)

Yo sugeriría utilizar las variables “displacement”, “horsepower”, “weight”, acceleration, y year ya que de las graficas anteriores, parecen tener una relación estrecha ya sea posistiva o negativa con la variable “mpg”.



Ejercicio 10 - (Applied)

dim(Boston)
[1] 506  14

Inciso a)

Inciso c)

names(Boston)
 [1] "crim"    "zn"      "indus"   "chas"    "nox"     "rm"      "age"    
 [8] "dis"     "rad"     "tax"     "ptratio" "black"   "lstat"   "medv"   

De las gráficas anteriores podemos deducir:

  • Existe una relación pisitiva entre la variable “crim” y las variables “nox”, “rm”, “age”, “black” y “Istat”

Inciso d)

highTax<-Boston %>%
  filter(tax > mean(tax))
  • Existe una proporción de 0.332 de suburbios con impuestos que se pueden considerar altos.
highCrim<-Boston %>%
  filter(crim > mean(crim))
  • Existe una proporción de 0.25296 de suburbios con impuestos que se pueden considerar altos.
highPtratio<-Boston %>%
  filter(crim > mean(ptratio))
  • Existe una proporción de 0.0415 de suburbios con impuestos que se pueden considerar altos.

Inciso e)

sum(subsBoundRiv)
[1] 35

Con el dataset nos damos cuenta que 35 suburbios están cercanos al Rio Charles.

Inicso f)

median(medPTR$ptratio)
[1] 19.05

La media de Pupil-Tutor Ratio es 19.05

Inciso g)

  • Los valores para las variables “black”, ptratio “varían” muy poco.
  • Los valores para la variable “tax” son muy variables.
  • Los valores para la variable “age” son relativamente grandes.

Inciso h)

nrow(rm7)
[1] 64

En promedio 64 viviendas tiene más de 7 cuartos.

En promedio 13 viviendas tiene más de 8 cuartos

LS0tDQp0aXRsZTogJ0xhYm9yYXRvcmlvICMxIC0gUmVjb3JkYXRvcmlvIGRlIFInDQphdXRob3I6ICJQcmVuZyBCaWJhIC0gMDkwMDAxODUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQojTGFiOiBJbnRyb2R1Y3Rpb24gdG8gUg0KDQojIyBCYXNpYyBDb21tYW5kczoNCmBgYHtyfQ0KeDwtYygxLDMsNSkNCngNCmBgYA0KYGBge3J9DQp5PWMoMSw2LDIpDQp5DQpgYGANCmBgYHtyfQ0KbGVuZ3RoKHgpDQpsZW5ndGgoeSkNCmBgYA0KYGBge3J9DQp4K3kNCmBgYA0KYGBge3J9DQpscygpDQpgYGANCmBgYHtyfQ0Kcm0oeCx5KQ0KbHMoKQ0KYGBgDQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkNCmBgYA0KDQpgYGB7cn0NCiM/bWF0cml4DQpgYGANCg0KYGBge3J9DQp4PC1tYXRyaXgoZGF0YT1jKDEsMiwzLDQpLCBucm93PTIsIG5jb2w9MikNCngNCmBgYA0KYGBge3J9DQp5PC1tYXRyaXgoZGF0YT1jKDEsMiwzLDQpLCAyLCAyLCBieXJvdz1UUlVFKQ0KeQ0KYGBgDQpgYGB7cn0NCnNxcnQoeSkNCmBgYA0KYGBge3J9DQp4XjINCmBgYA0KYGBge3J9DQp4PC1ybm9ybSg1MCkNCnkgPC0geCArIHJub3JtKDUwLCBtZWFuPTUwLCBzZD0xKQ0KY29yKHgseSkNCmBgYA0KYGBge3J9DQpzZXQuc2VlZCgxMzAzKQ0Kcm91bmQocm5vcm0oNTApLCA0KQ0KYGBgDQpgYGB7cn0NCnNldC5zZWVkKDMpDQp5PC1ybm9ybSgxMDApDQptZWFuKHkpDQpgYGANCmBgYHtyfQ0KdmFyKHkpDQpgYGANCmBgYHtyfQ0Kc3FydCh2YXIoeSkpDQpgYGANCmBgYHtyfQ0Kc2QoeSkNCmBgYA0KIyMgR3JhcGhpY3MNCmBgYHtyfQ0KeDwtcm5vcm0oMTAwKQ0KeTwtcm5vcm0oMTAwKQ0KcGxvdCh4LHkpDQoNCmBgYA0KYGBge3J9DQpwbG90KHgsIHksIHhsYWI9IlRoaXMgaXMgdGhlIHgtYXhpcyIsIHlsYWI9IlRoaXMgaXMgdGhlIHktYXhpcyIsIG1haW49IlBsb3Qgb2YgWCB2cyBZIikNCmBgYA0KYGBge3J9DQpwZGYoIkZpZ3VyZS5wZGYiKQ0KcGxvdCh4LCB5LCBjb2w9InJlZCIpDQpkZXYub2ZmKCkNCmBgYA0KYGBge3J9DQp4PC1zZXEoMSwxMCkNCngNCmBgYA0KYGBge3J9DQp4PC0xOjEwDQp4DQpgYGANCmBgYHtyfQ0KeDwtc2VxKC1waSwgcGksIGxlbmd0aD01MCkNCnJvdW5kKHgsIDQpDQpgYGANCmBgYHtyfQ0KeTwteA0KZjwtb3V0ZXIoeCwgeSwgZnVuY3Rpb24oeCx5KWNvcyh5KS8oMSt4XjIpKQ0KY29udG91cih4LCB5LCBmKQ0KY29udG91cih4LCB5LCBmLCBubGV2ZWxzPTQ1LCBhZGQ9VCkNCmZhPC0oZi10KGYpKS8yDQpjb250b3VyKHgsIHksIGZhLCBubGV2ZWxzPTE1KQ0KYGBgDQpgYGB7cn0NCmltYWdlKHgsIHksIGZhKQ0KYGBgDQpgYGB7cn0NCnBlcnNwKHgsIHksIGZhKQ0KYGBgDQpgYGB7cn0NCnBlcnNwKHgseSxmYSAsdGhldGEgPTMwLCBwaGkgPTIwKQ0KYGBgDQoNCiMjSW5kZXhpbmcgRGF0YQ0KDQpgYGB7cn0NCkE8LW1hdHJpeCgxOjE2LCA0LCA0KQ0KQQ0KYGBgDQpgYGB7cn0NCkFbMiwzXQ0KYGBgDQpgYGB7cn0NCkFbYygxLDMpLCBjKDIsNCldDQpgYGANCmBgYHtyfQ0KQVsxOjMsIDI6NF0NCmBgYA0KYGBge3J9DQpBWzE6MiwgXQ0KYGBgDQpgYGB7cn0NCkFbLDE6Ml0NCmBgYA0KYGBge3J9DQpBWzEsXQ0KYGBgDQpgYGB7cn0NCkFbLWMoMSwzKSwgXQ0KYGBgDQpgYGB7cn0NCkFbLWMoMSwzKSwgLWMoMSwzLDQpXQ0KYGBgDQojIyBMb2RpbmcgRGF0YQ0KYGBge3J9DQpsaWJyYXJ5KElTTFIpDQpkYXRhKEF1dG8pDQojZml4KEF1dG8pDQpgYGANCg0KYGBge3J9DQpkaW0oQXV0bykNCkF1dG9bMTo0LCBdDQpgYGANCmBgYHtyfQ0KbmFtZXMoQXV0bykNCmBgYA0KDQojIyBBZGRpdGlvbmFsIEdyYXBoaWNhbCBhbmQgTnVtZXJpY2FsIFN1bW1hcmllcw0KDQpgYGB7cn0NCnBsb3QoQXV0byRjeWxpbmRlcnMsIEF1dG8kbXBnKQ0KYGBgDQpgYGB7cn0NCmF0dGFjaChBdXRvKQ0KcGxvdChjeWxpbmRlcnMsIG1wZykNCmBgYA0KYGBge3J9DQpjeWxpbmRlcnM8LWFzLmZhY3RvcihjeWxpbmRlcnMpDQpwbG90KGN5bGluZGVycyAsIG1wZyAsIGNvbCA9InJlZCIsIHZhcndpZHRoID1ULCB4bGFiPSIgY3lsaW5kZXJzICIsDQp5bGFiID0iTVBHICIpDQpgYGANCmBgYHtyfQ0KaGlzdChtcGcgLGNvbCA9MiwgYnJlYWtzID0xNSkNCmBgYA0KYGBge3J9DQpwYWlycyhBdXRvKQ0KYGBgDQpgYGB7cn0NCnBsb3QoaG9yc2Vwb3dlciwgbXBnKQ0KaWRlbnRpZnkoaG9yc2Vwb3dlciwgbXBnLCBuYW1lKQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoQXV0bykNCmBgYA0KYGBge3J9DQpzdW1tYXJ5KG1wZykNCmBgYA0KDQojRWplcmNpY2lvICMxIChBcHBsaWVkIC0gOCkNCg0KIyMgSW5jaXNvIGEpDQoNCmBgYHtyfQ0KY29sbGVnZTwtcmVhZC5jc3YoIkNvbGxlZ2UuY3N2IikNCmRpbShDb2xsZWdlKQ0KYGBgDQpgYGB7cn0NCmF0dGFjaChjb2xsZWdlKQ0KaGVhZChjb2xsZWdlLCBuID0gMTApDQpgYGANCg0KIyMgSW5jaXNvIGIpDQoNCmBgYHtyfQ0KY29sbGVnZTwtY29sbGVnZVssLTFdDQpoZWFkKGNvbGxlZ2UsIG49MTApDQpgYGANCg0KIyMgSW5pY3MgYykNCg0KYGBge3J9DQpzdW1tYXJ5KGNvbGxlZ2UpDQpgYGANCmBgYHtyLCBlY2hvPVRSVUV9DQpuYW1lcyhjb2xsZWdlKQ0KcGFpcnMoZGF0YT1jb2xsZWdlLCB+IFByaXZhdGUgKyBBcHBzICsgQWNjZXB0ICsgRW5yb2xsICsgVG9wMTBwZXJjICsgVG9wMjVwZXJjIA0KICAgICAgK0YuVW5kZXJncmFkICsgUC5VbmRlcmdyYWQgKyBPdXRzdGF0ZSArIFJvb20uQm9hcmQpDQpgYGANCmBgYHtyfQ0KcGxvdChQcml2YXRlLCBPdXRzdGF0ZSAsIGNvbCA9InJlZCIsIHZhcndpZHRoID1ULCB4bGFiPSJQcml2YXRlIiwNCnlsYWIgPSJPdXRzdGF0ZSIsIG1haW49IlByaXZhdGUgdnJzIE91dHN0YXRlIikNCmBgYA0KYGBge3J9DQpFbGl0ZTwtcmVwKCJObyIsbnJvdyhjb2xsZWdlKSkNCkVsaXRlW2NvbGxlZ2UkVG9wMTBwZXJjID4gNTBdID0gIiBZZXMiDQpFbGl0ZTwtYXMuZmFjdG9yKEVsaXRlKQ0KY29sbGVnZTwtZGF0YS5mcmFtZShjb2xsZWdlICxFbGl0ZSkNCmBgYA0KYGBge3J9DQpzdW1tYXJ5KEVsaXRlKQ0KYGBgDQpgYGB7cn0NCnBsb3QoRWxpdGUsIE91dHN0YXRlLCBjb2w9ImJsdWUiLCB2YXJ3aWR0aD1ULCB4bGFiPSJFbGl0ZSIsDQp5bGFiID0iT3V0c3RhdGUiLCBtYWluPSJFbGl0ZSB2cnMgT3V0c2F0ZSIpDQpgYGANCmBgYHtyfQ0KbmFtZXMoY29sbGVnZSkNCmhpc3QoQXBwcywgY29sID0gIlJlZCIpDQpwYXIobWZyb3c9YygyLDIpKQ0KYGBgDQpgYGB7cn0NCmhpc3QoUGhELCBjb2wgPSAiUmVkIikNCmBgYA0KYGBge3J9DQpoaXN0KEVucm9sbCwgY29sPSJCbHVlIikNCmBgYA0KYGBge3J9DQpoaXN0KEFjY2VwdCwgY29sPSJHcmVlbiIpDQpgYGANCiMjIEluY2lzbyBkKQ0KDQoxKSBDb24gbGEgZGF0YSBwb2RlbW9zIGRhcm5vcyBjdWVudGEgcXVlIG3hcyBkZSA1MDAgdW5pdmVyc2lkYWRlcyBlbiBFc3RhZG9zIFVuaWRvcyBhY2VwdGFuIG1lbm9zIGRlIDEwMDAgcGVyc29uYXMgYWwgYfFvLg0KDQoyKSBBbCByZWRlZG9yIGRlIDIwMCB1bml2ZXJzaWRhZGVzIHRpZW5lIGRlIDcwIGEgODAgUGguIEQuIGVuIHN1IGNsYXVzdHJvLg0KDQozKSBEZWZpbml0aXZhbWVudGUgbGFzIHVuaXZlcnNpZGFkZXMgcXVlIHNvbiBjb25zaWRlcmFkYXMgZGUgZWxpdGUgc29uIG3hcyBjb3N0b3NhcyBxdWUgbGFzIHVuaXZlcnNpZGFkZXMgcXVlIG5vIHNvbiBjb25pZGVyYWRhcyBkZSBlbGl0ZSwgcG9yIGxhIG1hdHJpY3VsYWNp824gb3V0LW9mLXN0YXRlLg0KDQo0KSANCg0KIyMgRWplcmNpY2lvIDkgLSAoQXBwbGllZCkNCmBgYHtyfQ0KZGF0YSgiQXV0byIpDQphdHRhY2goQXV0bykNCm5hbWVzKEF1dG8pDQpgYGANCmBgYHtyfQ0KdHlwZW9mKG1wZykNCnR5cGVvZihjeWxpbmRlcnMpDQp0eXBlb2YoZGlzcGxhY2VtZW50KQ0KdHlwZW9mKGhvcnNlcG93ZXIpDQp0eXBlb2Yod2VpZ2h0KQ0KdHlwZW9mKGFjY2VsZXJhdGlvbikNCnR5cGVvZih5ZWFyKQ0KdHlwZW9mKG9yaWdpbikNCnR5cGVvZihuYW1lKQ0KYGBgDQpgYGB7cn0NCmhlYWQoQXV0bykNCmBgYA0KIyMjIEluY2lzbyBhKQ0KDQojIyMjIFBvciBlbCBjb250ZXh0bywgbGFzIHZhcmlhYmxlcyAiY3lsaW5kZXJzIiwgInllYXIiLCAib3JpZ2luIiB5ICAibmFtZSIgc29uIGN1YWxpdGF0aXZhcy4NCg0KIyMjIyBMYXMgdmFyaWFibGVzICJtcGciLCAiZGlzcGxhY2VtZW50IiwgImhvcnNlcG93ZXIiLCAid2VpZ2h0IiwgImFjZWxlcmF0aW9uIiBjdWFudGl0YXRpdmFzIA0KDQojIyMgSW5jaXNvIGIpDQpgYGB7cn0NCnJhbmdlczwtZGF0YS5mcmFtZShyYW5nZShtcGcpLA0KICAgICAgICAgICAgICByYW5nZShkaXNwbGFjZW1lbnQpLCANCiAgICAgICAgICAgICAgcmFuZ2UoaG9yc2Vwb3dlciksDQogICAgICAgICAgICAgIHJhbmdlKHdlaWdodCksDQogICAgICAgICAgICAgIHJhbmdlKGFjY2VsZXJhdGlvbikpDQpyYW5nZXMNCmBgYA0KIyMjIEluY2lzbyBjKQ0KYGBge3J9DQptZWFuczwtYyhtZWFuKG1wZyksIG1lYW4oZGlzcGxhY2VtZW50KSwNCiAgICAgICAgIG1lYW4oaG9yc2Vwb3dlciksIG1lYW4od2VpZ2h0KSwgbWVhbihhY2NlbGVyYXRpb24pKQ0KDQpzZHM8LWMoc2QobXBnKSwgc2QoZGlzcGxhY2VtZW50KSwNCiAgICAgICAgIHNkKGhvcnNlcG93ZXIpLCBzZCh3ZWlnaHQpLCBzZChhY2NlbGVyYXRpb24pKQ0KDQptZWFuc3M8LWRhdGEuZnJhbWUodChtZWFucykpDQpzZHNzPC1kYXRhLmZyYW1lKHQoc2RzKSkNCg0KY29sbmFtZXMobWVhbnNzKTwtYygibXBnIiwgImRpc3BsYWNtZW50IiwgImhvcnNlcG93ZXIiLCAid2VpZ2h0IiwgImFjY2VsZXJhdGlvbiIpDQpjb2xuYW1lcyhzZHNzKTwtYygibXBnIiwgImRpc3BsYWNtZW50IiwgImhvcnNlcG93ZXIiLCAid2VpZ2h0IiwgImFjY2VsZXJhdGlvbiIpDQoNCnN0YXRzcw0KDQpzdGF0c3M8LXJiaW5kKG1lYW5zcywgc2RzcykNCnJvd25hbWVzKHN0YXRzcyk8LWMoIk1lYW5zIiwgIlN0ZC4gRGV2cyIpDQpzdGF0c3MNCmBgYA0KIyMjIEluY2lzbyBkKQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpBdXRvPC1BdXRvWy0oMTA6ODQpLF0gI1JlbW92ZW1vcyBkZXNkZSBsYSBvYnNlcnZhY2lvbiAxMCBoYXN0YSBsYSA4NQ0KYXR0YWNoKEF1dG8pDQpgYGANCg0KDQoNCmBgYHtyfQ0KbWVhbnQ8LWMobWVhbihtcGcpLCBtZWFuKGRpc3BsYWNlbWVudCksDQogICAgICAgICBtZWFuKGhvcnNlcG93ZXIpLCBtZWFuKHdlaWdodCksIG1lYW4oYWNjZWxlcmF0aW9uKSkNCg0KDQpzZHQ8LWMoc2QobXBnKSwgc2QoZGlzcGxhY2VtZW50KSwNCiAgICAgICAgIHNkKGhvcnNlcG93ZXIpLCBzZCh3ZWlnaHQpLCBzZChhY2NlbGVyYXRpb24pKQ0KDQptZWFudHM8LWRhdGEuZnJhbWUodChtZWFudCkpDQpzZHRzPC1kYXRhLmZyYW1lKHQoc2R0KSkNCg0KY29sbmFtZXMobWVhbnRzKTwtYygibXBnIiwgImRpc3BsYWNtZW50IiwgImhvcnNlcG93ZXIiLCAid2VpZ2h0IiwgImFjY2VsZXJhdGlvbiIpDQpjb2xuYW1lcyhzZHRzKTwtYygibXBnIiwgImRpc3BsYWNtZW50IiwgImhvcnNlcG93ZXIiLCAid2VpZ2h0IiwgImFjY2VsZXJhdGlvbiIpDQoNCnN0YXR0czwtcmJpbmQobWVhbnRzLCBzZHRzKQ0Kcm93bmFtZXMoc3RhdHRzKTwtYygiTWVhbnMiLCAiU3RkLiBEZXZzIikNCnN0YXR0cw0KYGBgDQoNCiMjIyBJbmNpc28gZSkNCmBgYHtyfQ0KcGFpcnMoQXV0bykNCmBgYA0KRGUgbGEgaW5mb3JtYWNp824gYW50ZXJpb3IgcG9kZW1vcyBub3RhciBxdWU6DQoNCiAgKiBFeGlzdGUgdW5hIHJlbGFjafNuIGVzdHJlY2hhIHkgbmVnYXRpdmEsIGVudHJlOiAibXBnIHkgZGlzcGxhY2VtZW50IiwgIm1wZyB5ICAgICBob3JzZXBvd2VyIiwgIm1wZyB5IHdlaWdodCIuDQogICogRXhpc3RlIHVuYSByZWFsY2nzbiBlc3RyZWNoYSB5IHBvc2l0aXZhIGVudHJlOiAiZGlzcGxhY2VtZW50ZSB5IGhvcnNlcG93ZXIiLCAiZGlzcGxhY2VtZW50IHkgd2VpZ2h0Ii4NCiAgKiBFeGlzdGUgdW5hIHJlbGFjafNuIGVzdHJlY2hhIHkgcG9zaXRpdmEgZW50cmU6ICJ3ZWlnaHQgeSBkaXNwbGFjZW1lbnRlIiwgIndlaWdodCB5IGhvcnNlcG93ZXIiLg0KICAqIEV4aXN0ZSB1bmEgcmVhbGNp824gZXN0cmVjaGEgeSBuZWdhdGl2YSBlbnRyZTogImRpc3BsYWNlbWVudCB5IGFjY2VsZXJhdGlvbiIsICJob3JzZXBvd2VyIHkgZGlzcGxhY2VtZW50IiwgImFjY2VsZXJhdGlvbiB5IHdlaWdodCIuDQoNCiMjIyBJbmNpc28gZikNCg0KWW8gc3VnZXJpcu1hIHV0aWxpemFyIGxhcyB2YXJpYWJsZXMgImRpc3BsYWNlbWVudCIsICJob3JzZXBvd2VyIiwgIndlaWdodCIsIGFjY2VsZXJhdGlvbiwgeSB5ZWFyIHlhIHF1ZSBkZSBsYXMgZ3JhZmljYXMgYW50ZXJpb3JlcywgcGFyZWNlbiB0ZW5lciB1bmEgcmVsYWNp824gZXN0cmVjaGEgeWEgc2VhIHBvc2lzdGl2YSBvIG5lZ2F0aXZhIGNvbiBsYSB2YXJpYWJsZSAibXBnIi4NCg0KDQoqKioqKioNCioqKioqKg0KDQojIyBFamVyY2ljaW8gMTAgLSAoQXBwbGllZCkNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShNQVNTKQ0KZGF0YShCb3N0b24pDQphdHRhY2goQm9zdG9uKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChCb3N0b24pDQpgYGANCmBgYHtyfQ0KZGltKEJvc3RvbikNCmBgYA0KIyMjIEluY2lzbyBhKQ0KYGBge3J9DQpwYWlycyhCb3N0b24pDQpgYGANCiMjIyBJbmNpc28gYykNCmBgYHtyfQ0KbmFtZXMoQm9zdG9uKQ0KYGBgDQoNCkRlIGxhcyBncuFmaWNhcyBhbnRlcmlvcmVzIHBvZGVtb3MgZGVkdWNpcjoNCg0KICogRXhpc3RlIHVuYSByZWxhY2nzbiBwaXNpdGl2YSBlbnRyZSBsYSB2YXJpYWJsZSAiY3JpbSIgeSBsYXMgdmFyaWFibGVzICJub3giLCAicm0iLCAiYWdlIiwgImJsYWNrIiB5ICJJc3RhdCINCg0KIyMjIEluY2lzbyBkKQ0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KDQpgYGB7cn0NCmhpZ2hUYXg8LUJvc3RvbiAlPiUNCiAgZmlsdGVyKHRheCA+IG1lYW4odGF4KSkNCmBgYA0KDQoqIEV4aXN0ZSB1bmEgcHJvcG9yY2nzbiBkZSBgciByb3VuZChucm93KGhpZ2hUYXgpL25yb3coQm9zdG9uKSwgNClgIGRlIHN1YnVyYmlvcyBjb24gaW1wdWVzdG9zIHF1ZSBzZSBwdWVkZW4gY29uc2lkZXJhciBhbHRvcy4NCg0KYGBge3J9DQpoaWdoQ3JpbTwtQm9zdG9uICU+JQ0KICBmaWx0ZXIoY3JpbSA+IG1lYW4oY3JpbSkpDQpgYGANCg0KKiBFeGlzdGUgdW5hIHByb3BvcmNp824gZGUgYHIgcm91bmQobnJvdyhoaWdoQ3JpbSkvbnJvdyhCb3N0b24pLCA1KWAgZGUgc3VidXJiaW9zIGNvbiBpbXB1ZXN0b3MgcXVlIHNlIHB1ZWRlbiBjb25zaWRlcmFyIGFsdG9zLg0KDQpgYGB7cn0NCmhpZ2hQdHJhdGlvPC1Cb3N0b24gJT4lDQogIGZpbHRlcihjcmltID4gbWVhbihwdHJhdGlvKSkNCmBgYA0KDQoqIEV4aXN0ZSB1bmEgcHJvcG9yY2nzbiBkZSBgciByb3VuZChucm93KGhpZ2hQdHJhdGlvKS9ucm93KEJvc3RvbiksIDUpYCBkZSBzdWJ1cmJpb3MgY29uIGltcHVlc3RvcyBxdWUgc2UgcHVlZGVuIGNvbnNpZGVyYXIgYWx0b3MuDQoNCiMjIyBJbmNpc28gZSkNCmBgYHtyfQ0Kc3Vic0JvdW5kUml2PC1Cb3N0b24gJT4lDQogIHNlbGVjdChjaGFzKSAlPiUNCiAgZmlsdGVyKGNoYXMgPT0gMSkNCg0Kc3VtKHN1YnNCb3VuZFJpdikNCmBgYA0KQ29uIGVsIGRhdGFzZXQgbm9zIGRhbW9zIGN1ZW50YSBxdWUgYHIgc3VtKHN1YnNCb3VuZFJpdilgIHN1YnVyYmlvcyBlc3ThbiBjZXJjYW5vcyBhbCBSaW8gQ2hhcmxlcy4NCg0KIyMjIyBJbmljc28gZikNCmBgYHtyfQ0KbWVkUFRSPC1Cb3N0b24gJT4lDQogIHNlbGVjdChwdHJhdGlvKQ0KDQpgYGANCg0KTGEgbWVkaWEgZGUgUHVwaWwtVHV0b3IgUmF0aW8gZXMgYHIgbWVkaWFuKG1lZFBUUiRwdHJhdGlvKWANCg0KIyMjIEluY2lzbyBnKQ0KYGBge3J9DQpPT008LUJvc3RvbiAlPiUNCiAgZmlsdGVyKG1lZHYgPCBtZWFuKG1lZHYpKQ0KDQpPT00NCmBgYA0KDQoqIExvcyB2YWxvcmVzIHBhcmEgbGFzIHZhcmlhYmxlcyAiYmxhY2siLCBwdHJhdGlvICJ2YXLtYW4iIG11eSBwb2NvLg0KKiBMb3MgdmFsb3JlcyBwYXJhIGxhIHZhcmlhYmxlICJ0YXgiIHNvbiBtdXkgdmFyaWFibGVzLg0KKiBMb3MgdmFsb3JlcyBwYXJhIGxhIHZhcmlhYmxlICJhZ2UiIHNvbiByZWxhdGl2YW1lbnRlIGdyYW5kZXMuDQoNCiMjIyBJbmNpc28gaCkNCmBgYHtyfQ0Kcm03PC0gQm9zdG9uICU+JQ0KICBmaWx0ZXIocm0gPj0gNykNCm5yb3cocm03KQ0KYGBgDQpFbiBwcm9tZWRpbyBgciBucm93KHJtNylgIHZpdmllbmRhcyB0aWVuZSBt4XMgZGUgNyBjdWFydG9zLg0KDQpgYGB7cn0NCnJtODwtQm9zdG9uICU+JQ0KICBmaWx0ZXIocm0gPj0gOCkNCmBgYA0KRW4gcHJvbWVkaW8gYHIgbnJvdyhybTgpYCB2aXZpZW5kYXMgdGllbmUgbeFzIGRlIDggY3VhcnRvcw0KDQoNCiAgDQo=