2. Explain whether each scenario is a classification or regression problem, and indicate whether we are most interested in inference or prediction. Finally, provide n and p.
a. We collect a set of data on the top 500 firms in the US. For each firm we record profit, number of employees, industry and the CEO salary. We are interested in understanding which factors affect CEO salary.
Regresion, inferencia, porque queremos entender que factores afectan. n = 500 firmas p = 3 factores
b. We are considering launching a new product and wish to know whether it will be a success or a failure. We collect data on 20 similar products that were previously launched. For each product we have recorded whether it was a success or failure, price charged for the product, marketing budget, competition price, and ten other variables.
Si exito o fracaso son dos categorias, se haria una clasificacion. n = 20 productos p = 13 variables
c. We are interesting in predicting the % change in the US dollar in relation to the weekly changes in the world stock markets. Hence we collect weekly data for all of 2012. For each week we record the % change in the dollar, the % change in the US market, the % change in the British market, and the % change in the German market.
Regresion, prediccion, queremos ver como cambiara pero no los factores. n = 52 semanas p = 3 mercados
3. We now revisit the bias-variance decomposition.
PENDIENTE
4. ou will now think of some real-life applications for statistical learning.
a. Describe three real-life applications in which classification might be useful. Describe the response, as well as the predictors. Is the goal of each application inference or prediction? Explain your answer.
Clasificar que alumnos estan en riesgo, quienes van bien, y quienes pueden optar a extras. Predictores: notas, asistencia, asistencia a refuerzo. Inferencia, pues se quiere saber en qué aspecto pueden mejorar.
A qué grupo de personas vender un producto. Predictores: sueldo de los compradores, tiendas/lugares que frecuenta. Prediccion, quienes comprarian el producto.
Que artista va a ver la gente en un concierto multiple. Predictores: donde compro su entrada, adquirio alguna promocion. Prediccion, a quien van a ver.
b. Describe three real-life applications in which regression might be useful. Describe the response, as well as the predictors. Is the goal of each application inference or prediction? Explain your answer.
Dinero que alguien gastara en sus vacaciones. Predictores: cuanto tiempo desde sus ultimas vacaciones, lugar al que ira, acompanantes. Prediccion, cantidad de dinero a gastar.
Prestamo que alguien va a pedir. Predictores: banco que usa, dinero ahorrado, que planea comprar/invertir. Prediccion: cantidad de dinero a pedir.
Ganancias de una empresa. Predictores: costo de produccion, cantidad de clientes, publicidad. Inferencia: Como afectan los factores, para poder aumentar la ganancia.
c. Describe three real-life applications in which cluster analysis might be useful.
Marca de vehiculo que alguien tiene
Lugar de vivienda de una persona
Centro comercial o supermercado donde alguien hace sus compras habituales
5. What are the advantages and disadvantages of a very flexible (versus a less flexible) approach for regression or classification? Under what circumstances might a more flexible approach be preferred to a less flexible approach? When might a less flexible approach be preferred?
Dependera de la forma que tomen los datos. Entre mas cercano sea a algo lineal, sera mejor un modelo no flexible. Si la forma no esta clara, un modelo flexible ayuda.
Hay casos, como clasificacion, donde no se quiere quedar tan cerca de las observaciones, sino hacer una distincion clara, se usaria un modelo no flexible.
6. Describe the differences between a parametric and a non-parametric statistical learning approach. What are the advantages of a parametric approach to regression or classification (as opposed to a nonparametric approach)? What are its disadvantages?
En el parametrico se busca ajustar los datos a una forma lo mas simple posible, para unicamente usar este ajuste para hacer predicciones. El no parametrico usara todos los datos para sacar predicciones.
Las ventajas que se tienen es la simplificacion que permite, la desventaja es que dependeremos del ajuste que le dimos, si lo ajustamos a un modelo que no era el apropiado se tendra problema con los resultados.
7. The table below provides a training data set containing six observations, three predictors, and one qualitative response variable.
PENDIENTE
8. This exercise relates to the College data set, which can be found in the file College.csv. It contains a number of variables for 777 different universities and colleges in the US.
a. Use the read.csv() function to read the data into R. Call the loaded data college. Make sure that you have the directory set to the correct location for the data
b. Look at the data using the fix() function. You should notice that the first column is just the name of each university. We don’t really want R to treat this as data. However, it may be handy to have these names for later
c. i. Use the summary() function to produce a numerical summary of the variables in the data set.
summary(college)
X Private
Abilene Christian University: 1 No :212
Adelphi University : 1 Yes:565
Adrian College : 1
Agnes Scott College : 1
Alaska Pacific University : 1
Albertson College : 1
(Other) :771
Apps Accept Enroll
Min. : 81 Min. : 72 Min. : 35
1st Qu.: 776 1st Qu.: 604 1st Qu.: 242
Median : 1558 Median : 1110 Median : 434
Mean : 3002 Mean : 2019 Mean : 780
3rd Qu.: 3624 3rd Qu.: 2424 3rd Qu.: 902
Max. :48094 Max. :26330 Max. :6392
Top10perc Top25perc F.Undergrad
Min. : 1.00 Min. : 9.0 Min. : 139
1st Qu.:15.00 1st Qu.: 41.0 1st Qu.: 992
Median :23.00 Median : 54.0 Median : 1707
Mean :27.56 Mean : 55.8 Mean : 3700
3rd Qu.:35.00 3rd Qu.: 69.0 3rd Qu.: 4005
Max. :96.00 Max. :100.0 Max. :31643
P.Undergrad Outstate Room.Board
Min. : 1.0 Min. : 2340 Min. :1780
1st Qu.: 95.0 1st Qu.: 7320 1st Qu.:3597
Median : 353.0 Median : 9990 Median :4200
Mean : 855.3 Mean :10441 Mean :4358
3rd Qu.: 967.0 3rd Qu.:12925 3rd Qu.:5050
Max. :21836.0 Max. :21700 Max. :8124
Books Personal PhD
Min. : 96.0 Min. : 250 Min. : 8.00
1st Qu.: 470.0 1st Qu.: 850 1st Qu.: 62.00
Median : 500.0 Median :1200 Median : 75.00
Mean : 549.4 Mean :1341 Mean : 72.66
3rd Qu.: 600.0 3rd Qu.:1700 3rd Qu.: 85.00
Max. :2340.0 Max. :6800 Max. :103.00
Terminal S.F.Ratio perc.alumni
Min. : 24.0 Min. : 2.50 Min. : 0.00
1st Qu.: 71.0 1st Qu.:11.50 1st Qu.:13.00
Median : 82.0 Median :13.60 Median :21.00
Mean : 79.7 Mean :14.09 Mean :22.74
3rd Qu.: 92.0 3rd Qu.:16.50 3rd Qu.:31.00
Max. :100.0 Max. :39.80 Max. :64.00
Expend Grad.Rate
Min. : 3186 Min. : 10.00
1st Qu.: 6751 1st Qu.: 53.00
Median : 8377 Median : 65.00
Mean : 9660 Mean : 65.46
3rd Qu.:10830 3rd Qu.: 78.00
Max. :56233 Max. :118.00
c. ii. Use the pairs() function to produce a scatterplot matrix of the first ten columns or variables of the data. Recall that you can reference the first ten columns of a matrix A using A[,1:10].
pairs(college[,1:10])
c. iii. Use the plot() function to produce side-by-side boxplots of Outstate versus Private.

c. iv. Create a new qualitative variable, called Elite, by binning the Top10perc variable. We are going to divide universities into two groups based on whether or not the proportion of students coming from the top 10% of their high school classes exceeds 50%.

c. v. Use the hist() function to produce some histograms with differing numbers of bins for a few of the quantitative variables.
par(mfrow = c(2,2))
hist(college$Accept)
hist(college$Enroll)
hist(college$Personal)
hist(college$PhD)

9. This exercise involves the Auto data set studied in the lab. Make sure that the missing values have been removed from the data.
a. Which of the predictors are quantitative, and which are qualitative?
Cuantitativos: mpg, cylinders, displacement, horsepower, weight, acceleration, year
Cualitativos: origin, name
b. What is the range of each quantitative predictor? You can answer this using the range() function. range()
c. What is the mean and standard deviation of each quantitative predictor?
summary(auto[,1:7])
mpg cylinders displacement horsepower weight acceleration
Min. : 9.00 Min. :3.000 Min. : 68.0 Min. : 46.0 Min. :1613 Min. : 8.00
1st Qu.:17.00 1st Qu.:4.000 1st Qu.:105.0 1st Qu.: 75.0 1st Qu.:2225 1st Qu.:13.78
Median :22.75 Median :4.000 Median :151.0 Median : 93.5 Median :2804 Median :15.50
Mean :23.45 Mean :5.472 Mean :194.4 Mean :104.5 Mean :2978 Mean :15.54
3rd Qu.:29.00 3rd Qu.:8.000 3rd Qu.:275.8 3rd Qu.:126.0 3rd Qu.:3615 3rd Qu.:17.02
Max. :46.60 Max. :8.000 Max. :455.0 Max. :230.0 Max. :5140 Max. :24.80
year
Min. :70.00
1st Qu.:73.00
Median :76.00
Mean :75.98
3rd Qu.:79.00
Max. :82.00
summary nos resume cada columna y nos muestra el minimo y maximo (para el rango) y la media de cada una.
sapply(auto[,1:8], range)
mpg cylinders displacement
[1,] 9.0 3 68
[2,] 46.6 8 455
horsepower weight acceleration year
[1,] 46 1613 8.0 70
[2,] 230 5140 24.8 82
origin
[1,] 1
[2,] 3
sapply(auto[,1:8], mean)
mpg cylinders displacement
23.445918 5.471939 194.411990
horsepower weight acceleration
104.469388 2977.584184 15.541327
year origin
75.979592 1.576531
sapply(auto[,1:8], sd)
mpg cylinders displacement
7.8050075 1.7057832 104.6440039
horsepower weight acceleration
38.4911599 849.4025600 2.7588641
year origin
3.6837365 0.8055182
apply nos permite aplicar sd (standard deviation) a las columnas cuantitativas
d. Now remove the 10th through 85th observations. What is the range, mean, and standard deviation of each predictor in the subset of the data that remains?
f. Suppose that we wish to predict gas mileage (mpg) on the basis of the other variables. Do your plots suggest that any of the other variables might be useful in predicting mpg? Justify your answer.

mpg vs displacement, mpg vs horsepower, mpg vs weight, y en menor medida mpg vs acceleration
par(mfrow = c(2,2))
plot(auto$displacement, auto$mpg)
plot(auto$horsepower, auto$mpg)
plot(auto$weight, auto$mpg)
plot(auto$acceleration, auto$mpg)

10. This exercise involves the Boston housing data set.
a. To begin, load in the Boston data set. The Boston data set is part of the MASS library in R.
library(MASS)
nrow(Boston)
[1] 506
ncol(Boston)
[1] 14
colnames(Boston)
[1] "crim" "zn" "indus"
[4] "chas" "nox" "rm"
[7] "age" "dis" "rad"
[10] "tax" "ptratio" "black"
[13] "lstat" "medv"
?Boston
b. Make some pairwise scatterplots of the predictors (columns) in this data set. Describe your findings.

Entre mas industria hay, mas produccion de oxidos de nitrogeno

Entre mas cerca de los centros de empleo, mas alta la concentracion de oxidos de nitrogeno

c. Are any of the predictors associated with per capita crime rate? If so, explain the relationship.
El crimen es mas alto en lugares donde las viviendas valen menos.

Da la impresion que el crimen es cometido por gente de mayor edad. Hay criminales de 80 a 100 anios en Boston?
plot(Boston$age, Boston$crim)
e. How many of the suburbs in this data set bound the Charles river?
sum(Boston$chas == 1)
[1] 35
LS0tDQp0aXRsZTogIkxhYiAxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6ICJMdWlzIEppbWVuZXoiDQotLS0NCg0KIyMjIyAxLiBGb3IgZWFjaCBvZiBwYXJ0cyAoYSkgdGhyb3VnaCAoZCksIGluZGljYXRlIHdoZXRoZXIgd2Ugd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgYSBmbGV4aWJsZSBzdGF0aXN0aWNhbCBsZWFybmluZyBtZXRob2QgdG8gYmUgYmV0dGVyIG9yIHdvcnNlIHRoYW4gYW4gaW5mbGV4aWJsZSBtZXRob2QuIEp1c3RpZnkgeW91ciBhbnN3ZXINCg0KIyMjIyMgYS4gVGhlIHNhbXBsZSBzaXplIG4gaXMgZXh0cmVtZWx5IGxhcmdlLCBhbmQgdGhlIG51bWJlciBvZiBwcmVkaWN0b3JzIHAgaXMgc21hbGwuDQoNCkxvcyBt6XRvZG9zIGZsZXhpYmxlcyByZXF1aWVyZW4gbeFzIHByZWRpY3RvcmVzLCBlbnRvbmNlcyBzZSB1c2Fy7WEgdW5vIGluZmxleGlibGUNCg0KIyMjIyMgYi4gVGhlIG51bWJlciBvZiBwcmVkaWN0b3JzIHAgaXMgZXh0cmVtZWx5IGxhcmdlLCBhbmQgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgbiBpcyBzbWFsbC4NCg0KVW4gbel0b2RvIGZsZXhpYmxlLCBzZSBhZGFwdGEgbWVqb3IgYSB0ZW5lciBwb2NvcyBkYXRvcy4NCg0KIyMjIyMgYy4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcmVkaWN0b3JzIGFuZCByZXNwb25zZSBpcyBoaWdobHkgbm9uLWxpbmVhci4NCg0KVW4gbel0b2RvIGZsZXhpYmxlLCBwZXJtaXRpcuEgYWRhcHRhcnNlIG1lam9yIGEgbGEgZm9ybWEgZGUgbG9zIGRhdG9zLg0KDQojIyMjIy4gVGhlIHZhcmlhbmNlIG9mIHRoZSBlcnJvciB0ZXJtcywgaS5lLiBzaWdtYV4yID0gVmFyKGVyciksIGlzIGV4dHJlbWVseSBoaWdoLg0KDQpMb3MgZGF0b3MgZGlzcGVyc29zIHZhbiBhIHJlcXVlcmlyIHVuIG1vZGVsbyBmbGV4aWJsZSBwYXJhIHBvZGVyIGFkYXB0YXJzZSBtZWpvci4NCg0KDQoNCiMjIyMgMi4gRXhwbGFpbiB3aGV0aGVyIGVhY2ggc2NlbmFyaW8gaXMgYSBjbGFzc2lmaWNhdGlvbiBvciByZWdyZXNzaW9uIHByb2JsZW0sIGFuZCBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBtb3N0IGludGVyZXN0ZWQgaW4gaW5mZXJlbmNlIG9yIHByZWRpY3Rpb24uIEZpbmFsbHksIHByb3ZpZGUgbiBhbmQgcC4NCg0KIyMjIyMgYS4gV2UgY29sbGVjdCBhIHNldCBvZiBkYXRhIG9uIHRoZSB0b3AgNTAwIGZpcm1zIGluIHRoZSBVUy4gRm9yIGVhY2ggZmlybSB3ZSByZWNvcmQgcHJvZml0LCBudW1iZXIgb2YgZW1wbG95ZWVzLCBpbmR1c3RyeSBhbmQgdGhlIENFTyBzYWxhcnkuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHVuZGVyc3RhbmRpbmcgd2hpY2ggZmFjdG9ycyBhZmZlY3QgQ0VPIHNhbGFyeS4NClJlZ3Jlc2lvbiwgaW5mZXJlbmNpYSwgcG9ycXVlIHF1ZXJlbW9zIGVudGVuZGVyIHF1ZSBmYWN0b3JlcyBhZmVjdGFuLg0KbiA9IDUwMCBmaXJtYXMNCnAgPSAzIGZhY3RvcmVzDQoNCiMjIyMjIGIuIFdlIGFyZSBjb25zaWRlcmluZyBsYXVuY2hpbmcgYSBuZXcgcHJvZHVjdCBhbmQgd2lzaCB0byBrbm93IHdoZXRoZXIgaXQgd2lsbCBiZSBhIHN1Y2Nlc3Mgb3IgYSBmYWlsdXJlLiBXZSBjb2xsZWN0IGRhdGEgb24gMjAgc2ltaWxhciBwcm9kdWN0cyB0aGF0IHdlcmUgcHJldmlvdXNseSBsYXVuY2hlZC4gRm9yIGVhY2ggcHJvZHVjdCB3ZSBoYXZlIHJlY29yZGVkIHdoZXRoZXIgaXQgd2FzIGEgc3VjY2VzcyBvciBmYWlsdXJlLCBwcmljZSBjaGFyZ2VkIGZvciB0aGUgcHJvZHVjdCwgbWFya2V0aW5nIGJ1ZGdldCwgY29tcGV0aXRpb24gcHJpY2UsIGFuZCB0ZW4gb3RoZXIgdmFyaWFibGVzLg0KU2kgZXhpdG8gbyBmcmFjYXNvIHNvbiBkb3MgY2F0ZWdvcmlhcywgc2UgaGFyaWEgdW5hIGNsYXNpZmljYWNpb24uDQpuID0gMjAgcHJvZHVjdG9zDQpwID0gMTMgdmFyaWFibGVzDQoNCiMjIyMjIGMuIFdlIGFyZSBpbnRlcmVzdGluZyBpbiBwcmVkaWN0aW5nIHRoZSAlIGNoYW5nZSBpbiB0aGUgVVMgZG9sbGFyIGluIHJlbGF0aW9uIHRvIHRoZSB3ZWVrbHkgY2hhbmdlcyBpbiB0aGUgd29ybGQgc3RvY2sgbWFya2V0cy4gSGVuY2Ugd2UgY29sbGVjdCB3ZWVrbHkgZGF0YSBmb3IgYWxsIG9mIDIwMTIuIEZvciBlYWNoIHdlZWsgd2UgcmVjb3JkIHRoZSAlIGNoYW5nZSBpbiB0aGUgZG9sbGFyLCB0aGUgJSBjaGFuZ2UgaW4gdGhlIFVTIG1hcmtldCwgdGhlICUgY2hhbmdlIGluIHRoZSBCcml0aXNoIG1hcmtldCwgYW5kIHRoZSAlIGNoYW5nZSBpbiB0aGUgR2VybWFuIG1hcmtldC4NClJlZ3Jlc2lvbiwgcHJlZGljY2lvbiwgcXVlcmVtb3MgdmVyIGNvbW8gY2FtYmlhcmEgcGVybyBubyBsb3MgZmFjdG9yZXMuDQpuID0gNTIgc2VtYW5hcw0KcCA9IDMgbWVyY2Fkb3MNCg0KDQoNCiMjIyMgMy4gV2Ugbm93IHJldmlzaXQgdGhlIGJpYXMtdmFyaWFuY2UgZGVjb21wb3NpdGlvbi4NCg0KUEVORElFTlRFDQoNCg0KDQojIyMjIDQuIG91IHdpbGwgbm93IHRoaW5rIG9mIHNvbWUgcmVhbC1saWZlIGFwcGxpY2F0aW9ucyBmb3Igc3RhdGlzdGljYWwgbGVhcm5pbmcuDQoNCiMjIyMjIGEuIERlc2NyaWJlIHRocmVlIHJlYWwtbGlmZSBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggY2xhc3NpZmljYXRpb24gbWlnaHQgYmUgdXNlZnVsLiBEZXNjcmliZSB0aGUgcmVzcG9uc2UsIGFzIHdlbGwgYXMgdGhlIHByZWRpY3RvcnMuIElzIHRoZSBnb2FsIG9mIGVhY2ggYXBwbGljYXRpb24gaW5mZXJlbmNlIG9yIHByZWRpY3Rpb24/IEV4cGxhaW4geW91ciBhbnN3ZXIuDQotIENsYXNpZmljYXIgcXVlIGFsdW1ub3MgZXN0YW4gZW4gcmllc2dvLCBxdWllbmVzIHZhbiBiaWVuLCB5IHF1aWVuZXMgcHVlZGVuIG9wdGFyIGEgZXh0cmFzLiBQcmVkaWN0b3Jlczogbm90YXMsIGFzaXN0ZW5jaWEsIGFzaXN0ZW5jaWEgYSByZWZ1ZXJ6by4gSW5mZXJlbmNpYSwgcHVlcyBzZSBxdWllcmUgc2FiZXIgZW4gcXXpIGFzcGVjdG8gcHVlZGVuIG1lam9yYXIuDQoNCi0gQSBxdekgZ3J1cG8gZGUgcGVyc29uYXMgdmVuZGVyIHVuIHByb2R1Y3RvLiBQcmVkaWN0b3Jlczogc3VlbGRvIGRlIGxvcyBjb21wcmFkb3JlcywgdGllbmRhcy9sdWdhcmVzIHF1ZSBmcmVjdWVudGEuIFByZWRpY2Npb24sIHF1aWVuZXMgY29tcHJhcmlhbiBlbCBwcm9kdWN0by4NCg0KLSBRdWUgYXJ0aXN0YSB2YSBhIHZlciBsYSBnZW50ZSBlbiB1biBjb25jaWVydG8gbXVsdGlwbGUuIFByZWRpY3RvcmVzOiBkb25kZSBjb21wcm8gc3UgZW50cmFkYSwgYWRxdWlyaW8gYWxndW5hIHByb21vY2lvbi4gUHJlZGljY2lvbiwgYSBxdWllbiB2YW4gYSB2ZXIuDQoNCiMjIyMjIGIuIERlc2NyaWJlIHRocmVlIHJlYWwtbGlmZSBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggcmVncmVzc2lvbiBtaWdodCBiZSB1c2VmdWwuIERlc2NyaWJlIHRoZSByZXNwb25zZSwgYXMgd2VsbCBhcyB0aGUgcHJlZGljdG9ycy4gSXMgdGhlIGdvYWwgb2YgZWFjaCBhcHBsaWNhdGlvbiBpbmZlcmVuY2Ugb3IgcHJlZGljdGlvbj8gRXhwbGFpbiB5b3VyIGFuc3dlci4NCi0gRGluZXJvIHF1ZSBhbGd1aWVuIGdhc3RhcmEgZW4gc3VzIHZhY2FjaW9uZXMuIFByZWRpY3RvcmVzOiBjdWFudG8gdGllbXBvIGRlc2RlIHN1cyB1bHRpbWFzIHZhY2FjaW9uZXMsIGx1Z2FyIGFsIHF1ZSBpcmEsIGFjb21wYW5hbnRlcy4gUHJlZGljY2lvbiwgY2FudGlkYWQgZGUgZGluZXJvIGEgZ2FzdGFyLg0KDQotIFByZXN0YW1vIHF1ZSBhbGd1aWVuIHZhIGEgcGVkaXIuIFByZWRpY3RvcmVzOiBiYW5jbyBxdWUgdXNhLCBkaW5lcm8gYWhvcnJhZG8sIHF1ZSBwbGFuZWEgY29tcHJhci9pbnZlcnRpci4gUHJlZGljY2lvbjogY2FudGlkYWQgZGUgZGluZXJvIGEgcGVkaXIuDQoNCi0gR2FuYW5jaWFzIGRlIHVuYSBlbXByZXNhLiBQcmVkaWN0b3JlczogY29zdG8gZGUgcHJvZHVjY2lvbiwgY2FudGlkYWQgZGUgY2xpZW50ZXMsIHB1YmxpY2lkYWQuIEluZmVyZW5jaWE6IENvbW8gYWZlY3RhbiBsb3MgZmFjdG9yZXMsIHBhcmEgcG9kZXIgYXVtZW50YXIgbGEgZ2FuYW5jaWEuDQoNCiMjIyMjIGMuIERlc2NyaWJlIHRocmVlIHJlYWwtbGlmZSBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggY2x1c3RlciBhbmFseXNpcyBtaWdodCBiZSB1c2VmdWwuDQotIE1hcmNhIGRlIHZlaGljdWxvIHF1ZSBhbGd1aWVuIHRpZW5lDQoNCi0gTHVnYXIgZGUgdml2aWVuZGEgZGUgdW5hIHBlcnNvbmENCg0KLSBDZW50cm8gY29tZXJjaWFsIG8gc3VwZXJtZXJjYWRvIGRvbmRlIGFsZ3VpZW4gaGFjZSBzdXMgY29tcHJhcyBoYWJpdHVhbGVzDQoNCg0KDQojIyMjIDUuIFdoYXQgYXJlIHRoZSBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzIG9mIGEgdmVyeSBmbGV4aWJsZSAodmVyc3VzIGEgbGVzcyBmbGV4aWJsZSkgYXBwcm9hY2ggZm9yIHJlZ3Jlc3Npb24gb3IgY2xhc3NpZmljYXRpb24/IFVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBtaWdodCBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggYmUgcHJlZmVycmVkIHRvIGEgbGVzcyBmbGV4aWJsZSBhcHByb2FjaD8gV2hlbiBtaWdodCBhIGxlc3MgZmxleGlibGUgYXBwcm9hY2ggYmUgcHJlZmVycmVkPw0KRGVwZW5kZXJhIGRlIGxhIGZvcm1hIHF1ZSB0b21lbiBsb3MgZGF0b3MuIEVudHJlIG1hcyBjZXJjYW5vIHNlYSBhIGFsZ28gbGluZWFsLCBzZXJhIG1lam9yIHVuIG1vZGVsbyBubyBmbGV4aWJsZS4gU2kgbGEgZm9ybWEgbm8gZXN0YSBjbGFyYSwgdW4gbW9kZWxvIGZsZXhpYmxlIGF5dWRhLg0KDQpIYXkgY2Fzb3MsIGNvbW8gY2xhc2lmaWNhY2lvbiwgZG9uZGUgbm8gc2UgcXVpZXJlIHF1ZWRhciB0YW4gY2VyY2EgZGUgbGFzIG9ic2VydmFjaW9uZXMsIHNpbm8gaGFjZXIgdW5hIGRpc3RpbmNpb24gY2xhcmEsIHNlIHVzYXJpYSB1biBtb2RlbG8gbm8gZmxleGlibGUuDQoNCg0KDQojIyMjIDYuICBEZXNjcmliZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHBhcmFtZXRyaWMgYW5kIGEgbm9uLXBhcmFtZXRyaWMgc3RhdGlzdGljYWwgbGVhcm5pbmcgYXBwcm9hY2guIFdoYXQgYXJlIHRoZSBhZHZhbnRhZ2VzIG9mIGEgcGFyYW1ldHJpYyBhcHByb2FjaCB0byByZWdyZXNzaW9uIG9yIGNsYXNzaWZpY2F0aW9uIChhcyBvcHBvc2VkIHRvIGEgbm9ucGFyYW1ldHJpYyBhcHByb2FjaCk/IFdoYXQgYXJlIGl0cyBkaXNhZHZhbnRhZ2VzPw0KRW4gZWwgcGFyYW1ldHJpY28gc2UgYnVzY2EgYWp1c3RhciBsb3MgZGF0b3MgYSB1bmEgZm9ybWEgbG8gbWFzIHNpbXBsZSBwb3NpYmxlLCBwYXJhIHVuaWNhbWVudGUgdXNhciBlc3RlIGFqdXN0ZSBwYXJhIGhhY2VyIHByZWRpY2Npb25lcy4gRWwgbm8gcGFyYW1ldHJpY28gdXNhcmEgdG9kb3MgbG9zIGRhdG9zIHBhcmEgc2FjYXIgcHJlZGljY2lvbmVzLg0KDQpMYXMgdmVudGFqYXMgcXVlIHNlIHRpZW5lbiBlcyBsYSBzaW1wbGlmaWNhY2lvbiBxdWUgcGVybWl0ZSwgbGEgZGVzdmVudGFqYSBlcyBxdWUgZGVwZW5kZXJlbW9zIGRlbCBhanVzdGUgcXVlIGxlIGRpbW9zLCBzaSBsbyBhanVzdGFtb3MgYSB1biBtb2RlbG8gcXVlIG5vIGVyYSBlbCBhcHJvcGlhZG8gc2UgdGVuZHJhIHByb2JsZW1hIGNvbiBsb3MgcmVzdWx0YWRvcy4NCg0KDQoNCiMjIyMgNy4gVGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIGEgdHJhaW5pbmcgZGF0YSBzZXQgY29udGFpbmluZyBzaXggb2JzZXJ2YXRpb25zLCB0aHJlZSBwcmVkaWN0b3JzLCBhbmQgb25lIHF1YWxpdGF0aXZlIHJlc3BvbnNlIHZhcmlhYmxlLg0KDQpQRU5ESUVOVEUNCg0KDQoNCiMjIyMgOC4gVGhpcyBleGVyY2lzZSByZWxhdGVzIHRvIHRoZSBDb2xsZWdlIGRhdGEgc2V0LCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgQ29sbGVnZS5jc3YuIEl0IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyBmb3IgNzc3IGRpZmZlcmVudCB1bml2ZXJzaXRpZXMgYW5kIGNvbGxlZ2VzIGluIHRoZSBVUy4NCg0KIyMjIyMgYS4gVXNlIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uIHRvIHJlYWQgdGhlIGRhdGEgaW50byBSLiBDYWxsIHRoZSBsb2FkZWQgZGF0YSBjb2xsZWdlLiBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZGlyZWN0b3J5IHNldCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgdGhlIGRhdGENCmBgYHtyfQ0KY29sbGVnZSA8LSByZWFkLmNzdigiQ29sbGVnZS5jc3YiKQ0KYGBgDQoNCiMjIyMjIGIuIExvb2sgYXQgdGhlIGRhdGEgdXNpbmcgdGhlIGZpeCgpIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIG5vdGljZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaXMganVzdCB0aGUgbmFtZSBvZiBlYWNoIHVuaXZlcnNpdHkuIFdlIGRvbid0IHJlYWxseSB3YW50IFIgdG8gdHJlYXQgdGhpcyBhcyBkYXRhLiBIb3dldmVyLCBpdCBtYXkgYmUgaGFuZHkgdG8gaGF2ZSB0aGVzZSBuYW1lcyBmb3IgbGF0ZXINCmBgYHtyfQ0KZml4KGNvbGxlZ2UpDQpgYGANCg0KIyMjIyMgYy4gaS4gVXNlIHRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdG8gcHJvZHVjZSBhIG51bWVyaWNhbCBzdW1tYXJ5IG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGRhdGEgc2V0Lg0KYGBge3J9DQpzdW1tYXJ5KGNvbGxlZ2UpDQpgYGANCg0KIyMjIyMgYy4gaWkuIFVzZSB0aGUgcGFpcnMoKSBmdW5jdGlvbiB0byBwcm9kdWNlIGEgc2NhdHRlcnBsb3QgbWF0cml4IG9mIHRoZSBmaXJzdCB0ZW4gY29sdW1ucyBvciB2YXJpYWJsZXMgb2YgdGhlIGRhdGEuIFJlY2FsbCB0aGF0IHlvdSBjYW4gcmVmZXJlbmNlIHRoZSBmaXJzdCB0ZW4gY29sdW1ucyBvZiBhIG1hdHJpeCBBIHVzaW5nIEFbLDE6MTBdLg0KYGBge3J9DQpwYWlycyhjb2xsZWdlWywxOjEwXSkNCmBgYA0KDQojIyMjIyBjLiBpaWkuIFVzZSB0aGUgcGxvdCgpIGZ1bmN0aW9uIHRvIHByb2R1Y2Ugc2lkZS1ieS1zaWRlIGJveHBsb3RzIG9mIE91dHN0YXRlIHZlcnN1cyBQcml2YXRlLg0KYGBge3J9DQpib3hwbG90KGNvbGxlZ2UkT3V0c3RhdGUsIGNvbGxlZ2UkUHJpdmF0ZSkNCmBgYA0KDQojIyMjIyBjLiBpdi4gQ3JlYXRlIGEgbmV3IHF1YWxpdGF0aXZlIHZhcmlhYmxlLCBjYWxsZWQgRWxpdGUsIGJ5IGJpbm5pbmcgdGhlIFRvcDEwcGVyYyB2YXJpYWJsZS4gV2UgYXJlIGdvaW5nIHRvIGRpdmlkZSB1bml2ZXJzaXRpZXMgaW50byB0d28gZ3JvdXBzIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wb3J0aW9uIG9mIHN0dWRlbnRzIGNvbWluZyBmcm9tIHRoZSB0b3AgMTAlIG9mIHRoZWlyIGhpZ2ggc2Nob29sIGNsYXNzZXMgZXhjZWVkcyA1MCUuDQpgYGB7cn0NCkVsaXRlIDwtIHJlcCgiTm8iLG5yb3coY29sbGVnZSkpDQpFbGl0ZVtjb2xsZWdlJFRvcDEwcGVyYz41MF0gPSAiWWVzIg0KRWxpdGUgPSBhcy5mYWN0b3IoRWxpdGUpDQpjb2xsZWdlID0gZGF0YS5mcmFtZShjb2xsZWdlLCBFbGl0ZSkNCg0Kc3VtbWFyeShFbGl0ZSkNCg0KcGxvdChjb2xsZWdlJEVsaXRlLCBjb2xsZWdlJE91dHN0YXRlKQ0KYGBgDQoNCiMjIyMjIGMuIHYuIFVzZSB0aGUgaGlzdCgpIGZ1bmN0aW9uIHRvIHByb2R1Y2Ugc29tZSBoaXN0b2dyYW1zIHdpdGggZGlmZmVyaW5nIG51bWJlcnMgb2YgYmlucyBmb3IgYSBmZXcgb2YgdGhlIHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMuDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCg0KaGlzdChjb2xsZWdlJEFjY2VwdCkNCmhpc3QoY29sbGVnZSRFbnJvbGwpDQpoaXN0KGNvbGxlZ2UkUGVyc29uYWwpDQpoaXN0KGNvbGxlZ2UkUGhEKQ0KYGBgDQoNCg0KDQojIyMjIDkuIFRoaXMgZXhlcmNpc2UgaW52b2x2ZXMgdGhlIEF1dG8gZGF0YSBzZXQgc3R1ZGllZCBpbiB0aGUgbGFiLiBNYWtlIHN1cmUgdGhhdCB0aGUgbWlzc2luZyB2YWx1ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZGF0YS4NCg0KIyMjIyMgYS4gV2hpY2ggb2YgdGhlIHByZWRpY3RvcnMgYXJlIHF1YW50aXRhdGl2ZSwgYW5kIHdoaWNoIGFyZSBxdWFsaXRhdGl2ZT8NCmBgYHtyfQ0KYXV0byA8LSByZWFkLmNzdigiQXV0by5jc3YiLCBuYS5zdHJpbmdzID0gIj8iKQ0KYXV0byA8LSBuYS5vbWl0KGF1dG8pDQoNCmhlYWQoYXV0bykNCmBgYA0KDQpDdWFudGl0YXRpdm9zOg0KbXBnLCBjeWxpbmRlcnMsIGRpc3BsYWNlbWVudCwgaG9yc2Vwb3dlciwgd2VpZ2h0LCBhY2NlbGVyYXRpb24sIHllYXINCg0KQ3VhbGl0YXRpdm9zOg0Kb3JpZ2luLCBuYW1lDQoNCiMjIyMjIGIuIFdoYXQgaXMgdGhlIHJhbmdlIG9mIGVhY2ggcXVhbnRpdGF0aXZlIHByZWRpY3Rvcj8gWW91IGNhbiBhbnN3ZXIgdGhpcyB1c2luZyB0aGUgcmFuZ2UoKSBmdW5jdGlvbi4gcmFuZ2UoKQ0KDQojIyMjIyBjLiBXaGF0IGlzIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZWFjaCBxdWFudGl0YXRpdmUgcHJlZGljdG9yPw0KYGBge3J9DQpzdW1tYXJ5KGF1dG9bLDE6N10pDQpgYGANCg0Kc3VtbWFyeSBub3MgcmVzdW1lIGNhZGEgY29sdW1uYSB5IG5vcyBtdWVzdHJhIGVsIG1pbmltbyB5IG1heGltbyAocGFyYSBlbCByYW5nbykgeSBsYSBtZWRpYSBkZSBjYWRhIHVuYS4NCg0KYGBge3J9DQpzYXBwbHkoYXV0b1ssMTo3XSwgcmFuZ2UpDQpzYXBwbHkoYXV0b1ssMTo3XSwgbWVhbikNCnNhcHBseShhdXRvWywxOjddLCBzZCkNCmBgYA0KDQphcHBseSBub3MgcGVybWl0ZSBhcGxpY2FyIHNkIChzdGFuZGFyZCBkZXZpYXRpb24pIGEgbGFzIGNvbHVtbmFzIGN1YW50aXRhdGl2YXMNCg0KIyMjIyMgZC4gTm93IHJlbW92ZSB0aGUgMTB0aCB0aHJvdWdoIDg1dGggb2JzZXJ2YXRpb25zLiBXaGF0IGlzIHRoZSByYW5nZSwgbWVhbiwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlYWNoIHByZWRpY3RvciBpbiB0aGUgc3Vic2V0IG9mIHRoZSBkYXRhIHRoYXQgcmVtYWlucz8NCmBgYHtyfQ0KcmVtb3ZlIDwtIGF1dG9bLWMoMTA6ODUpLF0NCg0Kc2FwcGx5KHJlbW92ZVssMTo3XSwgcmFuZ2UpDQpzYXBwbHkocmVtb3ZlWywxOjddLCBtZWFuKQ0Kc2FwcGx5KHJlbW92ZVssMTo3XSwgc2QpDQpgYGANCg0KIyMjIyMgVXNpbmcgdGhlIGZ1bGwgZGF0YSBzZXQsIGludmVzdGlnYXRlIHRoZSBwcmVkaWN0b3JzIGdyYXBoaWNhbGx5LCB1c2luZyBzY2F0dGVycGxvdHMgb3Igb3RoZXIgdG9vbHMgb2YgeW91ciBjaG9pY2UuIENyZWF0ZSBzb21lIHBsb3RzIGhpZ2hsaWdodGluZyB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgcHJlZGljdG9ycy4gQ29tbWVudCBvbiB5b3VyIGZpbmRpbmdzLg0KYGBge3J9DQpwYWlycyhhdXRvWywxOjddKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChhdXRvJHdlaWdodCwgYXV0byRtcGcpDQojIEVudHJhIG1hcyBhbHRvIGVsIHBlc28sIG1lbm9yZXMgbGFzIG1pbGxhcyBwb3IgZ2Fsb24NCg0KcGxvdChhdXRvJHllYXIsIGF1dG8kaG9yc2Vwb3dlcikNCiMgRWwgY2FiYWxsYWplIHR1dm8gdGVuZGVuY2lhIGEgYmFqYXIgY29uIGxvcyBhbmlvcw0KIyBQYXNhcm9uIGRlIG1vZGEgbG9zICdtdXNjbGUgY2FyJw0KYGBgDQoNCiMjIyMjIGYuIFN1cHBvc2UgdGhhdCB3ZSB3aXNoIHRvIHByZWRpY3QgZ2FzIG1pbGVhZ2UgKG1wZykgb24gdGhlIGJhc2lzIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMuIERvIHlvdXIgcGxvdHMgc3VnZ2VzdCB0aGF0IGFueSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVkaWN0aW5nIG1wZz8gSnVzdGlmeSB5b3VyIGFuc3dlci4NCmBgYHtyfQ0KcGFpcnMoYXV0b1ssMTo3XSkNCmBgYA0KDQptcGcgdnMgZGlzcGxhY2VtZW50LCBtcGcgdnMgaG9yc2Vwb3dlciwgbXBnIHZzIHdlaWdodCwgeSBlbiBtZW5vciBtZWRpZGEgbXBnIHZzIGFjY2VsZXJhdGlvbg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QoYXV0byRkaXNwbGFjZW1lbnQsIGF1dG8kbXBnKQ0KcGxvdChhdXRvJGhvcnNlcG93ZXIsIGF1dG8kbXBnKQ0KcGxvdChhdXRvJHdlaWdodCwgYXV0byRtcGcpDQpwbG90KGF1dG8kYWNjZWxlcmF0aW9uLCBhdXRvJG1wZykNCmBgYA0KDQoNCg0KIyMjIyAxMC4gVGhpcyBleGVyY2lzZSBpbnZvbHZlcyB0aGUgQm9zdG9uIGhvdXNpbmcgZGF0YSBzZXQuDQoNCiMjIyMjIGEuIFRvIGJlZ2luLCBsb2FkIGluIHRoZSBCb3N0b24gZGF0YSBzZXQuIFRoZSBCb3N0b24gZGF0YSBzZXQgaXMgcGFydCBvZiB0aGUgTUFTUyBsaWJyYXJ5IGluIFIuDQpgYGB7cn0NCmxpYnJhcnkoTUFTUykNCm5yb3coQm9zdG9uKQ0KbmNvbChCb3N0b24pDQpjb2xuYW1lcyhCb3N0b24pDQojIExhIGF5dWRhIGRlIEJvc3RvbiAocGFydGUgZGUgTUFTUykgY29udGllbmUgbGFzIGRlc2NyaXBjaW9uZXMNCj9Cb3N0b24NCmBgYA0KDQojIyMjIyBiLiBNYWtlIHNvbWUgcGFpcndpc2Ugc2NhdHRlcnBsb3RzIG9mIHRoZSBwcmVkaWN0b3JzIChjb2x1bW5zKSBpbiB0aGlzIGRhdGEgc2V0LiBEZXNjcmliZSB5b3VyIGZpbmRpbmdzLg0KYGBge3J9DQpwYWlycyhCb3N0b25bLC1jKDQpXSkNCmBgYA0KDQpFbnRyZSBtYXMgaW5kdXN0cmlhIGhheSwgbWFzIHByb2R1Y2Npb24gZGUgb3hpZG9zIGRlIG5pdHJvZ2Vubw0KYGBge3J9DQpwbG90KEJvc3RvbiRpbmR1cywgQm9zdG9uJG5veCkNCmBgYA0KDQpFbnRyZSBtYXMgY2VyY2EgZGUgbG9zIGNlbnRyb3MgZGUgZW1wbGVvLCBtYXMgYWx0YSBsYSBjb25jZW50cmFjaW9uIGRlIG94aWRvcyBkZSBuaXRyb2dlbm8NCmBgYHtyfQ0KcGxvdChCb3N0b24kZGlzLCBCb3N0b24kbm94KQ0KYGBgDQoNCiMjIyMjIGMuIEFyZSBhbnkgb2YgdGhlIHByZWRpY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHBlciBjYXBpdGEgY3JpbWUgcmF0ZT8gSWYgc28sIGV4cGxhaW4gdGhlIHJlbGF0aW9uc2hpcC4NCkVsIGNyaW1lbiBlcyBtYXMgYWx0byBlbiBsdWdhcmVzIGRvbmRlIGxhcyB2aXZpZW5kYXMgdmFsZW4gbWVub3MuDQpgYGB7cn0NCnBsb3QoQm9zdG9uJG1lZHYsIEJvc3RvbiRjcmltKQ0KYGBgDQoNCkRhIGxhIGltcHJlc2lvbiBxdWUgZWwgY3JpbWVuIGVzIGNvbWV0aWRvIHBvciBnZW50ZSBkZSBtYXlvciBlZGFkLiBIYXkgY3JpbWluYWxlcyBkZSA4MCBhIDEwMCBhbmlvcyBlbiBCb3N0b24/DQpgYGB7cn0NCnBsb3QoQm9zdG9uJGFnZSwgQm9zdG9uJGNyaW0pDQpgYGANCg0KIyMjIyMgZC4gRG8gYW55IG9mIHRoZSBzdWJ1cmJzIG9mIEJvc3RvbiBhcHBlYXIgdG8gaGF2ZSBwYXJ0aWN1bGFybHkgaGlnaCBjcmltZSByYXRlcz8gVGF4IHJhdGVzPyBQdXBpbC10ZWFjaGVyIHJhdGlvcz8gQ29tbWVudCBvbiB0aGUgcmFuZ2Ugb2YgZWFjaCBwcmVkaWN0b3IuDQoNCkxvcyBpbXB1ZXN0b3Mgbm8gcGFyZWNlbiBpbmZsdWlyLiBIYXkgdW5hIHRhc2EgZGUgaW1wdWVzdG9zIHF1ZSBlcyBsYSBtYXMgY29tdW4sIHkgaGF5IHRvZGEgY2FudGlkYWQgZGUgY3JpbWVuIGVuIGVzdGUgbHVnYXIuDQpgYGB7cn0NCnBsb3QoQm9zdG9uJHRheCwgQm9zdG9uJGNyaW0pDQpgYGANCg0KTGEgY2FudGlkYWQgZGUgYWx1bW5vcyBwb3IgbWFlc3RybyB0YW1wb2NvIHBhcmVjZSBpbmZsdWlyLg0KYGBge3J9DQpwbG90KEJvc3RvbiRwdHJhdGlvLCBCb3N0b24kY3JpbSkNCmBgYA0KDQpFbiBlbCBpbmNpc28gYW50ZXJpb3Igc2UgdmlvIHF1ZSBsb3MgbHVnYXJlcyBjb24gbWVub3IgdmFsb3IgZGUgdml2aWVuZGEgdGllbmVuIG1hcyBjcmltZW4uDQoNCg0KDQojIyMjIyBlLiBIb3cgbWFueSBvZiB0aGUgc3VidXJicyBpbiB0aGlzIGRhdGEgc2V0IGJvdW5kIHRoZSBDaGFybGVzIHJpdmVyPw0KYGBge3J9DQpzdW0oQm9zdG9uJGNoYXMgPT0gMSkNCmBgYA0KDQojIyMjIyBmLiBXaGF0IGlzIHRoZSBtZWRpYW4gcHVwaWwtdGVhY2hlciByYXRpbyBhbW9uZyB0aGUgdG93bnMgaW4gdGhpcyBkYXRhIHNldD8NCmBgYHtyfQ0KbWVkaWFuKEJvc3RvbiRwdHJhdGlvKQ0KYGBgDQoNCiMjIyMjIGcuIFdoaWNoIHN1YnVyYiBvZiBCb3N0b24gaGFzIGxvd2VzdCBtZWRpYW4gdmFsdWUgb2Ygb3duZXJvY2N1cGllZCBob21lcz8gV2hhdCBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgb3RoZXIgcHJlZGljdG9ycyBmb3IgdGhhdCBzdWJ1cmIsIGFuZCBob3cgZG8gdGhvc2UgdmFsdWVzIGNvbXBhcmUgdG8gdGhlIG92ZXJhbGwgcmFuZ2VzIGZvciB0aG9zZSBwcmVkaWN0b3JzPyBDb21tZW50IG9uIHlvdXIgZmluZGluZ3MuDQoNCmBgYHtyfQ0KbWlubWVkaWFuID0gbWluKEJvc3RvbiRtZWR2KQ0KQm9zdG9uW0Jvc3RvbiRtZWR2ID09IG1pbm1lZGlhbixdDQpzYXBwbHkoQm9zdG9uLCBtZWFuKQ0KYGBgDQpIYXkgZG9zIHN1YnVyYmlvcyBjb24gbWVkdiBkZSA1LiBObyBwYXJlY2VuIGJ1ZW5vcyBsdWdhcmVzIHBhcmEgdml2aXIsIGVsIGNyaW1lbiB5IGxhIGNvbnRhbWluYWNpb24gc29uIG1hcyBhbHRvcyBxdWUgZWwgcHJvbWVkaW8uDQoNCiMjIyMjIGcuIEluIHRoaXMgZGF0YSBzZXQsIGhvdyBtYW55IG9mIHRoZSBzdWJ1cmJzIGF2ZXJhZ2UgbW9yZSB0aGFuIHNldmVuIHJvb21zIHBlciBkd2VsbGluZz8gTW9yZSB0aGFuIGVpZ2h0IHJvb21zIHBlciBkd2VsbGluZz8gQ29tbWVudCBvbiB0aGUgc3VidXJicyB0aGF0IGF2ZXJhZ2UgbW9yZSB0aGFuIGVpZ2h0IHJvb21zIHBlciBkd2VsbGluZy4NCg0KYGBge3J9DQpucm93KEJvc3RvbltCb3N0b24kcm0+NyxdKQ0KbnJvdyhCb3N0b25bQm9zdG9uJHJtPjgsXSkNCmBgYA0KNjQgc3VidXJiaW9zIGNvbiBtYXMgZGUgNyBoYWJpdGFjaW9uZXMgZW4gcHJvbWVkaW87IDEzIGNvbiBtYXMgZGUgOCBoYWJpdGFjaW9uZXMuDQo=