Descripción General

Para mi proyecto trabajare sobre la base de datos del precio de las casas en california, la cual esta compuesta de las siguientes variables

old_warn <- getOption("warn")
options(warn = -1)    
setwd("C:/Users/USER/Desktop/MEB")
library(flextable)
library(formattable)
library(ggplot2)
library(knitr)

Desc <- flextable(read.csv("DescripciónVariables.csv"))
Desc <- theme_vanilla(Desc)

print(Desc)

Variable

Tipo._de_Dato

Razon

longitude

Continua

A measure of how far west a house is; a higher value is farther west

latitude

Continua

A measure of how far north a house is; a higher value is farther north

housingMedianAge

Discreta

Median age of a house within a block; a lower number is a newer building

totalRooms

Discreta

Total number of rooms within a block

totalBedrooms

Discreta

Total number of bedrooms within a block

population

Discreta

Total number of people residing within a block

households

Discreta

Total number of households, a group of people residing within a home unit, for a block

medianIncome

Continua

Median income for households within a block of houses (measured in tens of thousands of US Dollars)

medianHouseValue

Continua

Median house value for households within a block (measured in US Dollars)

oceanProximity

Discreta

Median house value for households within a block (measured in US Dollars)

NA
NA

La variable a sera Median House Value para poder estimar el costo de una vivienda segun las caracteristicas del vecindario en el que se encuentra

Base

housing <- data.frame(read.csv("housing.csv"))
housing_head <- flextable(head(housing))
housing_head <-theme_vanilla(housing_head)
print(housing_head)

longitude

latitude

housing_median_age

total_rooms

total_bedrooms

population

households

median_income

median_house_value

ocean_proximity

-122.23

37.88

41

880

129

322

126

8.3252

452,600

NEAR BAY

-122.22

37.86

21

7,099

1,106

2,401

1,138

8.3014

358,500

NEAR BAY

-122.24

37.85

52

1,467

190

496

177

7.2574

352,100

NEAR BAY

-122.25

37.85

52

1,274

235

558

219

5.6431

341,300

NEAR BAY

-122.25

37.85

52

1,627

280

565

259

3.8462

342,200

NEAR BAY

-122.25

37.85

52

919

213

413

193

4.0368

269,700

NEAR BAY

NA
NA

Problematica

La principal problematica a resolver es encontrar las zonas del estado de california con mayor precio y cuales son sus caracteristicas

El dataset del cual haremos el analisis proviene de Kaggle

Analisis Exploratorio de Datos

Estadisticos Descriptivos

housing$ocean_proximity <- as.vector(housing$ocean_proximity)
summary(housing)
   longitude         latitude     housing_median_age  total_rooms    total_bedrooms  
 Min.   :-124.3   Min.   :32.54   Min.   : 1.00      Min.   :    2   Min.   :   2.0  
 1st Qu.:-121.8   1st Qu.:33.93   1st Qu.:18.00      1st Qu.: 1438   1st Qu.: 297.0  
 Median :-118.5   Median :34.27   Median :28.00      Median : 2111   Median : 436.0  
 Mean   :-119.6   Mean   :35.65   Mean   :28.37      Mean   : 2620   Mean   : 539.6  
 3rd Qu.:-118.0   3rd Qu.:37.73   3rd Qu.:37.00      3rd Qu.: 3121   3rd Qu.: 648.0  
 Max.   :-114.3   Max.   :41.95   Max.   :52.00      Max.   :39320   Max.   :6445.0  
                                                                     NA's   :200     
   population      households     median_income     median_house_value ocean_proximity   
 Min.   :    3   Min.   :   2.0   Min.   : 0.4999   Min.   : 14999     Length:19648      
 1st Qu.:  796   1st Qu.: 282.0   1st Qu.: 2.5263   1st Qu.:116475     Class :character  
 Median : 1179   Median : 411.0   Median : 3.4491   Median :173600     Mode  :character  
 Mean   : 1441   Mean   : 501.2   Mean   : 3.6764   Mean   :192055                       
 3rd Qu.: 1746   3rd Qu.: 606.0   3rd Qu.: 4.5825   3rd Qu.:247900                       
 Max.   :35682   Max.   :6082.0   Max.   :15.0001   Max.   :499100                       
                                                                                         

Longitud

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$longitude, n = 143)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$longitude, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$longitude,breaks = 143, main= "Histograma de Longitud",
     xlab = "Longitud", ylab='Frecuencia')

BoxPlot


boxplot(housing$longitude,main="BoxPlot de Longitud",ylab='valores')

Latitud

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$latitude, n = 50)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$latitude, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$latitude,breaks =50, main= "Histograma de Latitud",
     xlab = "Latitud", ylab='Frecuencia', xlim=c(32,43))

BoxPlot


boxplot(housing$latitude,main="BoxPlot de Latitude",ylab='valores')

Housing Media Age

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$housing_median_age, n = 10)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$housing_median_age, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$housing_median_age,breaks = 20, main= "Histograma de Edad de las casas",
     xlab = "Edad", ylab='Frecuencia')

BoxPlot


boxplot(housing$housing_median_age,main="BoxPlot de Edad de las Casas",ylab='valores')

Total Rooms

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$total_rooms, n = 50)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$total_rooms, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$total_rooms,breaks = 100, main= "Histograma del total de habitaciones del vecindario",
     xlab = "habitaciones", ylab='Frecuencia')

BoxPlot


boxplot(housing$total_rooms,main="BoxPlot del total de habitaciones",ylab='valores')

Total Bedrooms

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$total_bedrooms, n = 50)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$total_bedrooms, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$total_bedrooms,breaks = 100, main= "Histograma del total de dormitorios del vecindario",
     xlab = "Total de Dormitorios", ylab='Frecuencia')

BoxPlot


boxplot(housing$total_bedrooms,main="BoxPlot de Edad del total de dormitorios del vecindario",ylab='valores')

Population

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$population, n = 100)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$population, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$population,breaks = 100, main= "Histograma de población",
     xlab = "Población", ylab='Frecuencia')

BoxPlot


boxplot(housing$population,main="BoxPlot de la población",ylab='valores')

HouseHolds

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$households, n = 50)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$households, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$households,breaks = 100, main= "Histograma de Hogares",
     xlab = "Hogares", ylab='Frecuencia')

BoxPlot


boxplot(housing$households,main="BoxPlot de Hogares",ylab='valores')

Median Income

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$median_income, n = 10)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$median_income, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$median_income,breaks = 20, main= "Histograma del ingreso",
     xlab = "Ingreso", ylab='Frecuencia')

BoxPlot


boxplot(housing$median_income,main="BoxPlot del ingreso",ylab='valores')

Ocean proxymity

Tabla de Frecuencias


tabla_frecuencia <- table(housing$ocean_proximity)

tabla_completa <- data.frame(
  Categoria = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Categoria <- as.character(tabla_completa$Categoria)
print(tabla_completa)
NA
NA

Grafico de Barras

# Gráfico de barras
barplot(tabla_frecuencia,
        col = "skyblue",
        main = "Gráfico de Barras Proximidad al Oceano",
        xlab = "Proximidad",
        ylab = "Frecuencia",
        ylim = c(0,10000),
        cex.names = 0.7)

Variable a Predecir: Median House Value

Tabla de Frecuencias

# Definir los cortes
breaks <- pretty(housing$median_house_value, n = 100)
# Crear etiquetas num?ricas limpias
intervalos <- cut(housing$median_house_value, breaks = breaks, include.lowest = TRUE, right = FALSE)
# Crear tabla de frecuencias
tabla_frecuencia <- table(intervalos)

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia)
)

# Mostrar la tabla
tabla_completa$Intervalo <- as.character(tabla_completa$Intervalo)
print(tabla_completa)
NA
NA

Histograma

hist(housing$median_house_value,breaks = 100, main= "Histograma del precio",
     xlab = "Precio Promedio", ylab='Frecuencia')

BoxPlot


boxplot(housing$median_house_value,main="BoxPlot del precio de las casas",ylab='valores')

Analisis de Regresión Multiple

Matriz de Dispersión

base <- na.omit(read.csv('housing.csv'))
base$ocean_proximity<-as.factor(base$ocean_proximity) 
base_numeric <- na.omit(read.csv('housing.csv'))
base_numeric$ocean_proximity<-as.factor(base$ocean_proximity) 
base_numeric$ocean_proximity <- as.numeric(base$ocean_proximity)

plot(base_numeric[, sapply(base_numeric, is.numeric)],main = "Matriz de Dispersión")

  • Se pueden observar variables donde podríamos tener problemas, principalmente en Longitud y Latitud y Total_rooms, total_bedrooms y Populations.

Correlación

cor_matrix <- cor(base_numeric[, sapply(base_numeric, is.numeric)])
library(corrplot)

# Ajustar márgenes antes de graficar
par(mar = c(1, 1, 4, 1))
corrplot(cor_matrix, method = "color", type = "upper"
         , tl.cex = 0.8
         ,title = "Matriz de Correlación"
         ,mar = c(0,0,2,0))

  • Justo como se comentó en la matriz de dispersión, las variables longitud y latitud y total_rooms, total_bedrooms, populatios y households tienen correlación entre sí.

Analisis de Multicolinealidad

El primer resultado de nuetro análisis de multicolinealidad fue el siguiente:

TodasVar=lm(median_house_value~.,data=base)

library("car")

print(vif(TodasVar))
                        GVIF Df GVIF^(1/(2*Df))
longitude          17.703989  1        4.207611
latitude           19.662840  1        4.434280
housing_median_age  1.367696  1        1.169485
total_rooms        14.039723  1        3.746962
total_bedrooms     37.009555  1        6.083548
population          6.536153  1        2.556590
households         34.474343  1        5.871486
median_income       1.875301  1        1.369416
ocean_proximity     4.032026  4        1.190393

La primer varible a descartar sería Total Bedrooms

print(vif(lm(median_house_value~longitude+ latitude  + housing_median_age + total_rooms  + population+households   +median_income +ocean_proximity,data=base)))
                        GVIF Df GVIF^(1/(2*Df))
longitude          17.536228  1        4.187628
latitude           19.567987  1        4.423572
housing_median_age  1.358056  1        1.165357
total_rooms        10.105478  1        3.178912
population          6.111420  1        2.472129
households         12.302297  1        3.507463
median_income       1.596687  1        1.263601
ocean_proximity     3.988666  4        1.188785

La segunda varible a descartar sería Latitude

print(vif(lm(median_house_value~longitude  + housing_median_age + total_rooms  + population+households   +median_income +ocean_proximity,data=base)))
                        GVIF Df GVIF^(1/(2*Df))
longitude           1.347920  1        1.160999
housing_median_age  1.339613  1        1.157417
total_rooms         9.878153  1        3.142953
population          6.065901  1        2.462905
households         12.196284  1        3.492318
median_income       1.538663  1        1.240428
ocean_proximity     1.810099  4        1.076993

La ultima variable que se descartó fue households

print(vif(lm(median_house_value~longitude  + housing_median_age + total_rooms  + population  +median_income +ocean_proximity,data=base)))
                       GVIF Df GVIF^(1/(2*Df))
longitude          1.346076  1        1.160205
housing_median_age 1.337128  1        1.156343
total_rooms        4.842184  1        2.200496
population         4.507587  1        2.123108
median_income      1.319313  1        1.148614
ocean_proximity    1.684002  4        1.067315

Quedando el modelo final de la siguiente manera

\[ \text{Median House Value} = \beta_0 + \beta_1 \cdot \text{longitude} + \beta_2 \cdot \text{housing_median_age} \\ + \beta_3 \cdot \text{total_rooms} + \beta_4 \cdot \text{population} \\ + \beta_5 \cdot \text{median_income} + \beta_6 \cdot \text{NEAR_BAY} \\ + \beta_7 \cdot \text{NEAR_OCEAN} + \beta_8 \cdot \text{INLAND} + \beta_9 \cdot \text{ISLAND} \] ### Analisis de Significancia y Ajuste

ModFin=lm(median_house_value~longitude  + housing_median_age + total_rooms  + population   +median_income +ocean_proximity,data=base)

print(summary(ModFin))

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    total_rooms + population + median_income + ocean_proximity, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-488971  -40257   -9937   28465  365127 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -2.240e+05  3.108e+04  -7.207 5.93e-13 ***
longitude                 -2.380e+03  2.609e+02  -9.122  < 2e-16 ***
housing_median_age         9.221e+02  4.170e+01  22.113  < 2e-16 ***
total_rooms                1.088e+01  4.542e-01  23.964  < 2e-16 ***
population                -1.620e+01  8.367e-01 -19.362  < 2e-16 ***
median_income              3.369e+04  3.302e+02 102.052  < 2e-16 ***
ocean_proximityINLAND     -7.462e+04  1.152e+03 -64.794  < 2e-16 ***
ocean_proximityISLAND      1.848e+05  2.815e+04   6.565 5.33e-11 ***
ocean_proximityNEAR BAY   -3.446e+03  1.813e+03  -1.901   0.0573 .  
ocean_proximityNEAR OCEAN  1.084e+04  1.468e+03   7.385 1.58e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 62920 on 19438 degrees of freedom
Multiple R-squared:  0.5803,    Adjusted R-squared:  0.5801 
F-statistic:  2987 on 9 and 19438 DF,  p-value: < 2.2e-16

\[ H_0 = \beta_{longitud} = \beta_{\text{housing_median_age}} = \beta_{\text{total_rooms}} = \beta_{population} = \beta_{\text{median_income}} = \beta_{\text{ocean_proximityINLAND}} \\ = \beta_{\text{ocean_proximityISLAND}} = \beta_{\text{ocean_proximityNEAR BAY}} = \beta_{\text{ocean_proximityNEAR OCEAN}} = 0 \] \[ H_1 \neq \beta_{j} \text{ Para al menos una varible} \]

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5803, podríamos considerar un ajuste moderado.

Ecuación Final del Modelo

summary(ModFin)$coefficients
                               Estimate   Std. Error    t value      Pr(>|t|)
(Intercept)               -223998.93273 3.108064e+04  -7.207025  5.928128e-13
longitude                   -2380.31769 2.609499e+02  -9.121741  8.096318e-20
housing_median_age            922.12510 4.170130e+01  22.112623 4.979887e-107
total_rooms                    10.88334 4.541557e-01  23.963889 4.303260e-125
population                    -16.19977 8.366812e-01 -19.361943  9.723523e-83
median_income               33692.66429 3.301533e+02 102.051589  0.000000e+00
ocean_proximityINLAND      -74617.50351 1.151613e+03 -64.793932  0.000000e+00
ocean_proximityISLAND      184838.43458 2.815459e+04   6.565125  5.330284e-11
ocean_proximityNEAR BAY     -3446.41645 1.812787e+03  -1.901171  5.729444e-02
ocean_proximityNEAR OCEAN   10844.13694 1.468337e+03   7.385320  1.582278e-13

\[ \text{Median House Value} = -223998.93 -2380.31 \cdot \text{longitude} + 922.12 \cdot \text{housing_median_age} \\ + 10.88 \cdot \text{total_rooms} -16.2 \cdot \text{population} + 33692.66 \cdot \text{median_income} -3446.4 \cdot \text{NEAR_BAY} \\ + 10844.13 \cdot \text{NEAR_OCEAN} -74617.50 \cdot \text{INLAND} + 184838.43 \cdot \text{ISLAND} \]

Aporte de cada variable

Variable Aportacion Comentarios
-2380.31 Longitude Negativa La Longitud tiene una relación inversa al valor de la casa
922.12 Housing Median Age Postiva La edad tiene una relación directa con el valor de la casa
+ 10.88 Total Rooms Positiva La cantidad de habitaciones afecta positivamente a la edad de al valor de la casa
-16.2Population Negativa La población afecta inversamente al valor de la casa
33692.66 Median Income Positiva El ingreso afecta de manera directa al valor de la casa
-3446.4 Ocean Proximity INLAND Negativa Cuando la proximidad al océano se encuentra en la categoría INLAND afecta de manera inversa al valor de la casa
-74617.50 Ocean Proximity ISLAND Positiva Cuando se encuentra en la categoría ISLAND afecta de manera directa
184838.43 Ocean Proximity Near bay Positiva Cuando se encuentra cerca de la bahía afecta de manera directa al valor de la casa
10844.1Ocean Proximity Near Ocean Positiva Cuando se encuentra cerca del oceano afecta de manera directa al valor de la casa

Regresiones Posibles

library(olsrr)
todos<-ols_step_all_possible(lm(median_house_value~longitude  + housing_median_age + total_rooms  + population   +median_income +ocean_proximity,data=base))
Modelos <- todos$result
head(Modelos[order(-Modelos$adjr),],10)

El modelo con mejor ajuste fue: \[ \text{Median House Value} = -223998.93 -2380.31 \cdot \text{longitude} + 922.12 \cdot \text{housing_median_age} \\ + 10.88 \cdot \text{total_rooms} -16.2 \cdot \text{population} + 33692.66 \cdot \text{median_income} -3446.4 \cdot \text{NEAR_BAY} \\ + 10844.13 \cdot \text{NEAR_OCEAN} -74617.50 \cdot \text{INLAND} + 184838.43 \cdot \text{ISLAND} \]

mm <- lm(median_house_value~longitude  + housing_median_age+ total_rooms  + population   +median_income +ocean_proximity,data=base)
summary(mm)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    total_rooms + population + median_income + ocean_proximity, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-488971  -40257   -9937   28465  365127 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -2.240e+05  3.108e+04  -7.207 5.93e-13 ***
longitude                 -2.380e+03  2.609e+02  -9.122  < 2e-16 ***
housing_median_age         9.221e+02  4.170e+01  22.113  < 2e-16 ***
total_rooms                1.088e+01  4.542e-01  23.964  < 2e-16 ***
population                -1.620e+01  8.367e-01 -19.362  < 2e-16 ***
median_income              3.369e+04  3.302e+02 102.052  < 2e-16 ***
ocean_proximityINLAND     -7.462e+04  1.152e+03 -64.794  < 2e-16 ***
ocean_proximityISLAND      1.848e+05  2.815e+04   6.565 5.33e-11 ***
ocean_proximityNEAR BAY   -3.446e+03  1.813e+03  -1.901   0.0573 .  
ocean_proximityNEAR OCEAN  1.084e+04  1.468e+03   7.385 1.58e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 62920 on 19438 degrees of freedom
Multiple R-squared:  0.5803,    Adjusted R-squared:  0.5801 
F-statistic:  2987 on 9 and 19438 DF,  p-value: < 2.2e-16
confint(mm)
                                  2.5 %        97.5 %
(Intercept)               -2.849197e+05 -163078.21115
longitude                 -2.891802e+03   -1868.83336
housing_median_age         8.403870e+02    1003.86323
total_rooms                9.993153e+00      11.77352
population                -1.783974e+01     -14.55981
median_income              3.304554e+04   34339.79307
ocean_proximityINLAND     -7.687476e+04  -72360.24390
ocean_proximityISLAND      1.296530e+05  240023.86187
ocean_proximityNEAR BAY   -6.999634e+03     106.80109
ocean_proximityNEAR OCEAN  7.966070e+03   13722.20343

\[ H_0 = \beta_{longitud} = \beta_{\text{housing_median_age}} = \beta_{\text{total_rooms}} = \beta_{population} = \beta_{\text{median_income}} = \beta_{\text{ocean_proximityINLAND}} \\ = \beta_{\text{ocean_proximityISLAND}} = \beta_{\text{ocean_proximityNEAR BAY}} = \beta_{\text{ocean_proximityNEAR OCEAN}} = 0 \] \[ H_1 \neq \beta_{j} \text{ Para al menos una varible} \]

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.6121, podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm)
ks.test(r,pnorm,mean=0,sd=62920)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.089334, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos a transformar nuestra variable

 mm <- lm(sqrt(median_house_value)~longitude  + housing_median_age + total_rooms  + population   +median_income +ocean_proximity,data=base)
summary(mm)

Call:
lm(formula = sqrt(median_house_value) ~ longitude + housing_median_age + 
    total_rooms + population + median_income + ocean_proximity, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-536.99  -45.52   -8.42   36.42  376.20 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -3.806e+00  3.366e+01  -0.113  0.90996    
longitude                 -2.431e+00  2.826e-01  -8.603  < 2e-16 ***
housing_median_age         8.604e-01  4.516e-02  19.052  < 2e-16 ***
total_rooms                1.176e-02  4.918e-04  23.901  < 2e-16 ***
population                -1.672e-02  9.061e-04 -18.452  < 2e-16 ***
median_income              3.741e+01  3.575e-01 104.627  < 2e-16 ***
ocean_proximityINLAND     -9.541e+01  1.247e+00 -76.502  < 2e-16 ***
ocean_proximityISLAND      1.835e+02  3.049e+01   6.018  1.8e-09 ***
ocean_proximityNEAR BAY   -5.431e+00  1.963e+00  -2.766  0.00567 ** 
ocean_proximityNEAR OCEAN  8.593e+00  1.590e+00   5.404  6.6e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 68.13 on 19438 degrees of freedom
Multiple R-squared:  0.6118,    Adjusted R-squared:  0.6116 
F-statistic:  3404 on 9 and 19438 DF,  p-value: < 2.2e-16
confint(mm)
                                 2.5 %       97.5 %
(Intercept)               -69.78071483  62.16794551
longitude                  -2.98516396  -1.87733611
housing_median_age          0.77186485   0.94890211
total_rooms                 0.01079115   0.01271921
population                 -0.01849524  -0.01494322
median_income              36.70761742  38.10923864
ocean_proximityINLAND     -97.85394393 -92.96492793
ocean_proximityISLAND     123.71412375 243.24066599
ocean_proximityNEAR BAY    -9.27891971  -1.58297846
ocean_proximityNEAR OCEAN   5.47621573  11.70984212

\[ H_0 = \beta_{\text{housing_median_age}} = \beta_{\text{total_rooms}} = \beta_{population} = \beta_{\text{median_income}} = \beta_{\text{ocean_proximityINLAND}} \\ = \beta_{\text{ocean_proximityISLAND}} = \beta_{\text{ocean_proximityNEAR BAY}} = \beta_{\text{ocean_proximityNEAR OCEAN}} = 0 \] \[ H_1 \neq \beta_{j} \text{ Para al menos una varible} \] Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.6336, podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm)
ks.test(r,pnorm,mean=0,sd=74.25)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.068168, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el tercer mejor modelo

#   longitude housing_median_age total_rooms median_income ocean_proximity
mm <- lm(median_house_value~longitude + housing_median_age + total_rooms     +median_income +ocean_proximity,data=base)
summary(mm)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    total_rooms + median_income + ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-508169  -40806  -10492   28416  369534 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -2.714e+05  3.128e+04  -8.676  < 2e-16 ***
longitude                 -2.659e+03  2.630e+02 -10.109  < 2e-16 ***
housing_median_age         9.350e+02  4.209e+01  22.213  < 2e-16 ***
total_rooms                3.257e+00  2.283e-01  14.270  < 2e-16 ***
median_income              3.588e+04  3.132e+02 114.568  < 2e-16 ***
ocean_proximityINLAND     -6.972e+04  1.134e+03 -61.467  < 2e-16 ***
ocean_proximityISLAND      1.939e+05  2.842e+04   6.822 9.24e-12 ***
ocean_proximityNEAR BAY   -4.440e+02  1.823e+03  -0.244    0.808    
ocean_proximityNEAR OCEAN  1.373e+04  1.475e+03   9.307  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 63520 on 19439 degrees of freedom
Multiple R-squared:  0.5722,    Adjusted R-squared:  0.5721 
F-statistic:  3250 on 8 and 19439 DF,  p-value: < 2.2e-16
confint(mm)
                                  2.5 %        97.5 %
(Intercept)               -3.327091e+05 -2.100836e+05
longitude                 -3.174640e+03 -2.143453e+03
housing_median_age         8.525314e+02  1.017551e+03
total_rooms                2.809685e+00  3.704484e+00
median_income              3.526677e+04  3.649449e+04
ocean_proximityINLAND     -7.193929e+04 -6.749304e+04
ocean_proximityISLAND      1.381757e+05  2.495876e+05
ocean_proximityNEAR BAY   -4.018110e+03  3.130045e+03
ocean_proximityNEAR OCEAN  1.083439e+04  1.661570e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.6016, podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm)
ks.test(r,pnorm,mean=0,sd=72860)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10111, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el cuarto mejor modelo

#   longitude total_rooms population median_income ocean_proximity
mm <- lm(sqrt(median_house_value)~longitude  + total_rooms +population    +median_income +ocean_proximity,data=base)
summary(mm)

Call:
lm(formula = sqrt(median_house_value) ~ longitude + total_rooms + 
    population + median_income + ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-507.31  -45.20   -9.36   36.22  382.73 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                1.915e+01  3.395e+01   0.564    0.573    
longitude                 -2.527e+00  2.852e-01  -8.861  < 2e-16 ***
total_rooms                1.032e-02  4.905e-04  21.032  < 2e-16 ***
population                -1.700e-02  9.144e-04 -18.587  < 2e-16 ***
median_income              3.613e+01  3.544e-01 101.935  < 2e-16 ***
ocean_proximityINLAND     -1.006e+02  1.229e+00 -81.834  < 2e-16 ***
ocean_proximityISLAND      1.917e+02  3.077e+01   6.229 4.80e-10 ***
ocean_proximityNEAR BAY    8.975e-01  1.953e+00   0.460    0.646    
ocean_proximityNEAR OCEAN  8.075e+00  1.605e+00   5.032 4.89e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 68.77 on 19439 degrees of freedom
Multiple R-squared:  0.6046,    Adjusted R-squared:  0.6044 
F-statistic:  3715 on 8 and 19439 DF,  p-value: < 2.2e-16
confint(mm)
                                  2.5 %       97.5 %
(Intercept)               -4.739418e+01  85.69193745
longitude                 -3.085723e+00  -1.96780481
total_rooms                9.354858e-03   0.01127770
population                -1.878762e-02  -0.01520314
median_income              3.543520e+01  36.82467098
ocean_proximityINLAND     -1.029664e+02 -98.14935305
ocean_proximityISLAND      1.313457e+02 251.96793932
ocean_proximityNEAR BAY   -2.930150e+00   4.72511785
ocean_proximityNEAR OCEAN  4.929908e+00  11.22038389

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.6006, podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm)
ks.test(r,pnorm,mean=0,sd=74.96)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.071639, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el quinto mejor modelo

#   housing_median_age total_rooms median_income ocean_proximity
mm <- lm(median_house_value~housing_median_age+ total_rooms+ median_income+ ocean_proximity,data=base)
summary(mm)

Call:
lm(formula = median_house_value ~ housing_median_age + total_rooms + 
    median_income + ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-503075  -41211  -10447   28809  372503 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                4.404e+04  2.184e+03  20.166  < 2e-16 ***
housing_median_age         9.430e+02  4.220e+01  22.347  < 2e-16 ***
total_rooms                3.151e+00  2.286e-01  13.784  < 2e-16 ***
median_income              3.604e+04  3.136e+02 114.925  < 2e-16 ***
ocean_proximityINLAND     -6.718e+04  1.109e+03 -60.579  < 2e-16 ***
ocean_proximityISLAND      1.925e+05  2.849e+04   6.757 1.44e-11 ***
ocean_proximityNEAR BAY    8.544e+03  1.596e+03   5.353 8.74e-08 ***
ocean_proximityNEAR OCEAN  1.496e+04  1.474e+03  10.153  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 63680 on 19440 degrees of freedom
Multiple R-squared:   0.57, Adjusted R-squared:  0.5698 
F-statistic:  3681 on 7 and 19440 DF,  p-value: < 2.2e-16
confint(mm)
                                  2.5 %        97.5 %
(Intercept)                39760.778081  48322.099641
housing_median_age           860.269041   1025.688949
total_rooms                    2.703127      3.599306
median_income              35425.434281  36654.785442
ocean_proximityINLAND     -69351.639106 -65004.435692
ocean_proximityISLAND     136695.021973 248395.273597
ocean_proximityNEAR BAY     5415.624469  11672.561251
ocean_proximityNEAR OCEAN  12072.469425  17848.863546

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.6005 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm)
ks.test(r,pnorm,mean=0,sd=72960)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10104, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el sexto mejor modelo

#   total_rooms population median_income ocean_proximity
mm1 <- lm(sqrt(median_house_value)~total_rooms+ population+ median_income+ ocean_proximity,data=base)
summary(mm1)

Call:
lm(formula = sqrt(median_house_value) ~ total_rooms + population + 
    median_income + ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-501.71  -45.51   -9.34   36.80  385.48 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                3.196e+02  1.710e+00 186.934  < 2e-16 ***
total_rooms                1.041e-02  4.914e-04  21.195  < 2e-16 ***
population                -1.744e-02  9.148e-04 -19.070  < 2e-16 ***
median_income              3.621e+01  3.550e-01 101.991  < 2e-16 ***
ocean_proximityINLAND     -9.833e+01  1.205e+00 -81.588  < 2e-16 ***
ocean_proximityISLAND      1.902e+02  3.083e+01   6.170 6.99e-10 ***
ocean_proximityNEAR BAY    9.385e+00  1.705e+00   5.504 3.76e-08 ***
ocean_proximityNEAR OCEAN  9.162e+00  1.603e+00   5.715 1.11e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 68.9 on 19440 degrees of freedom
Multiple R-squared:  0.603, Adjusted R-squared:  0.6028 
F-statistic:  4218 on 7 and 19440 DF,  p-value: < 2.2e-16
confint(mm1)
                                  2.5 %       97.5 %
(Intercept)                3.162244e+02 322.92621128
total_rooms                9.451344e-03   0.01137753
population                -1.923780e-02  -0.01565171
median_income              3.551414e+01  36.90592784
ocean_proximityINLAND     -1.006931e+02 -95.96845038
ocean_proximityISLAND      1.297784e+02 250.63918627
ocean_proximityNEAR BAY    6.042867e+00  12.72713866
ocean_proximityNEAR OCEAN  6.020001e+00  12.30455321

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de0.5997 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm1)
ks.test(r,pnorm,mean=0,sd=75.05)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.071009, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el septimo mejor modelo

#   longitude housing_median_age median_income ocean_proximity
mm1 <- lm(median_house_value~longitude +housing_median_age+ median_income+ ocean_proximity,data=base)
summary(mm1)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    median_income + ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-518466  -40667  -10259   28482  364984 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -239360.42   31362.14  -7.632 2.42e-14 ***
longitude                   -2486.82     264.14  -9.415  < 2e-16 ***
housing_median_age            732.99      39.85  18.395  < 2e-16 ***
median_income               36575.64     310.98 117.615  < 2e-16 ***
ocean_proximityINLAND      -69579.13    1140.05 -61.031  < 2e-16 ***
ocean_proximityISLAND      194017.34   28567.88   6.791 1.14e-11 ***
ocean_proximityNEAR BAY      1470.92    1827.94   0.805    0.421    
ocean_proximityNEAR OCEAN   13882.18    1482.38   9.365  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 63850 on 19440 degrees of freedom
Multiple R-squared:  0.5678,    Adjusted R-squared:  0.5676 
F-statistic:  3648 on 7 and 19440 DF,  p-value: < 2.2e-16
confint(mm1)
                                 2.5 %       97.5 %
(Intercept)               -300832.9061 -177887.9303
longitude                   -3004.5504   -1969.0953
housing_median_age            654.8831     811.0946
median_income               35966.0958   37185.1846
ocean_proximityINLAND      -71813.7316  -67344.5286
ocean_proximityISLAND      138021.8507  250012.8373
ocean_proximityNEAR BAY     -2111.9906    5053.8333
ocean_proximityNEAR OCEAN   10976.5762   16787.7767

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5979 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

library(nortest)
r<-residuals(mm1)
lillie.test(r)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  r
D = 0.08864, p-value < 2.2e-16

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el octavos mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm1 <- lm(median_house_value~ longitude+ housing_median_age+ population+ median_income+ ocean_proximity,data=base)
summary(mm1)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    population + median_income + ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-518105  -40697  -10363   28546  366090 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -2.483e+05  3.152e+04  -7.879 3.46e-15 ***
longitude                 -2.537e+03  2.647e+02  -9.584  < 2e-16 ***
housing_median_age         7.687e+02  4.181e+01  18.385  < 2e-16 ***
population                 1.189e+00  4.226e-01   2.814   0.0049 ** 
median_income              3.662e+04  3.113e+02 117.638  < 2e-16 ***
ocean_proximityINLAND     -6.924e+04  1.146e+03 -60.416  < 2e-16 ***
ocean_proximityISLAND      1.947e+05  2.856e+04   6.815 9.71e-12 ***
ocean_proximityNEAR BAY    1.362e+03  1.828e+03   0.745   0.4562    
ocean_proximityNEAR OCEAN  1.407e+04  1.484e+03   9.482  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 63840 on 19439 degrees of freedom
Multiple R-squared:  0.5679,    Adjusted R-squared:  0.5677 
F-statistic:  3194 on 8 and 19439 DF,  p-value: < 2.2e-16
confint(mm1)
                                  2.5 %        97.5 %
(Intercept)               -3.101259e+05 -1.865669e+05
longitude                 -3.055696e+03 -2.018078e+03
housing_median_age         6.867160e+02  8.506179e+02
population                 3.608608e-01  2.017603e+00
median_income              3.600669e+04  3.722691e+04
ocean_proximityINLAND     -7.148932e+04 -6.699643e+04
ocean_proximityISLAND      1.386706e+05  2.506452e+05
ocean_proximityNEAR BAY   -2.220901e+03  4.945250e+03
ocean_proximityNEAR OCEAN  1.115873e+04  1.697458e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5978 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

library(nortest)
r<-residuals(mm1)
ks.test(r,pnorm,mean=0,sd=73200)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10079, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el octavos mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~ median_income +ocean_proximity,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ median_income + ocean_proximity, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-479385  -40789  -10925   27979  376737 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                83149.6     1400.0  59.393  < 2e-16 ***
median_income              35168.8      303.1 116.048  < 2e-16 ***
ocean_proximityINLAND     -72061.3     1093.3 -65.911  < 2e-16 ***
ocean_proximityISLAND     200772.6    28884.4   6.951 3.74e-12 ***
ocean_proximityNEAR BAY    15788.2     1583.1   9.973  < 2e-16 ***
ocean_proximityNEAR OCEAN  14585.1     1493.7   9.765  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 64560 on 19442 degrees of freedom
Multiple R-squared:  0.558, Adjusted R-squared:  0.5579 
F-statistic:  4908 on 5 and 19442 DF,  p-value: < 2.2e-16
confint(mm2)
                              2.5 %    97.5 %
(Intercept)                80405.44  85893.68
median_income              34574.76  35762.78
ocean_proximityINLAND     -74204.31 -69918.31
ocean_proximityISLAND     144156.59 257388.51
ocean_proximityNEAR BAY    12685.15  18891.33
ocean_proximityNEAR OCEAN  11657.40  17512.85

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.588 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm1)
ks.test(r,pnorm,mean=0,sd=74090)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10205, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el octavos mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+housing_median_age+total_rooms+
            population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    total_rooms + population + median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-561262  -48560  -12205   35840  378276 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.074e+05  3.083e+04  -3.483 0.000497 ***
longitude          -7.627e+02  2.579e+02  -2.957 0.003105 ** 
housing_median_age  1.744e+03  4.450e+01  39.186  < 2e-16 ***
total_rooms         5.926e+00  5.030e-01  11.783  < 2e-16 ***
population         -5.306e+00  9.226e-01  -5.751 9.02e-09 ***
median_income       4.103e+04  3.521e+02 116.554  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71160 on 19442 degrees of freedom
Multiple R-squared:  0.463, Adjusted R-squared:  0.4629 
F-statistic:  3353 on 5 and 19442 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -1.678147e+05 -46956.487549
longitude          -1.268242e+03   -257.231922
housing_median_age  1.656384e+03   1830.815621
total_rooms         4.940565e+00      6.912251
population         -7.113806e+00     -3.497153
median_income       4.034481e+04  41724.978856

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5172, podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80210)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.082297, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el decimo mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~housing_median_age+median_income+ocean_proximity,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ housing_median_age + median_income + 
    ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-513378  -41124  -10261   28882  367906 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                55293.25    2035.46  27.165  < 2e-16 ***
housing_median_age           746.58      39.91  18.706  < 2e-16 ***
median_income              36703.93     311.38 117.875  < 2e-16 ***
ocean_proximityINLAND     -67204.56    1114.31 -60.311  < 2e-16 ***
ocean_proximityISLAND     192760.62   28631.88   6.732 1.72e-11 ***
ocean_proximityNEAR BAY     9836.29    1601.06   6.144 8.22e-10 ***
ocean_proximityNEAR OCEAN  15035.42    1480.64  10.155  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 63990 on 19441 degrees of freedom
Multiple R-squared:  0.5658,    Adjusted R-squared:  0.5656 
F-statistic:  4222 on 6 and 19441 DF,  p-value: < 2.2e-16
confint(mm2)
                               2.5 %      97.5 %
(Intercept)                51303.585  59282.9194
housing_median_age           668.353    824.8134
median_income              36093.601  37314.2614
ocean_proximityINLAND     -69388.698 -65020.4202
ocean_proximityISLAND     136639.664 248881.5727
ocean_proximityNEAR BAY     6698.082  12974.5069
ocean_proximityNEAR OCEAN  12133.240  17937.6061

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5172, podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80210)
Warning :ties should not be present for the one-sample Kolmogorov-Smirnov test

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10982, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 11 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+population+median_income+ocean_proximity,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + population + median_income + 
    ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-487424  -40319  -10871   27575  371948 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -2.244e+05  3.176e+04  -7.065 1.67e-12 ***
longitude                 -2.605e+03  2.669e+02  -9.760  < 2e-16 ***
population                -1.167e+00  4.062e-01  -2.873  0.00407 ** 
median_income              3.509e+04  3.026e+02 115.964  < 2e-16 ***
ocean_proximityINLAND     -7.460e+04  1.118e+03 -66.733  < 2e-16 ***
ocean_proximityISLAND      2.010e+05  2.881e+04   6.976 3.14e-12 ***
ocean_proximityNEAR BAY    6.571e+03  1.822e+03   3.607  0.00031 ***
ocean_proximityNEAR OCEAN  1.320e+04  1.496e+03   8.828  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 64390 on 19440 degrees of freedom
Multiple R-squared:  0.5604,    Adjusted R-squared:  0.5603 
F-statistic:  3541 on 7 and 19440 DF,  p-value: < 2.2e-16
confint(mm2)
                                  2.5 %        97.5 %
(Intercept)               -2.866570e+05 -1.621382e+05
longitude                 -3.128575e+03 -2.082105e+03
population                -1.963162e+00 -3.708108e-01
median_income              3.450011e+04  3.568644e+04
ocean_proximityINLAND     -7.679504e+04 -7.241250e+04
ocean_proximityISLAND      1.444875e+05  2.574204e+05
ocean_proximityNEAR BAY    3.000516e+03  1.014118e+04
ocean_proximityNEAR OCEAN  1.027143e+04  1.613453e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5898 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=79930)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.11626, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 12 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+total_rooms+median_income+ocean_proximity,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + total_rooms + median_income + 
    ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-476261  -40301  -10992   27390  376714 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -2.473e+05  3.166e+04  -7.813 5.87e-15 ***
longitude                 -2.768e+03  2.663e+02 -10.394  < 2e-16 ***
total_rooms                1.552e+00  2.177e-01   7.129 1.05e-12 ***
median_income              3.453e+04  3.111e+02 110.998  < 2e-16 ***
ocean_proximityINLAND     -7.522e+04  1.121e+03 -67.120  < 2e-16 ***
ocean_proximityISLAND      2.029e+05  2.877e+04   7.053 1.81e-12 ***
ocean_proximityNEAR BAY    6.491e+03  1.819e+03   3.568  0.00036 ***
ocean_proximityNEAR OCEAN  1.322e+04  1.493e+03   8.851  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 64320 on 19440 degrees of freedom
Multiple R-squared:  0.5614,    Adjusted R-squared:  0.5612 
F-statistic:  3554 on 7 and 19440 DF,  p-value: < 2.2e-16
confint(mm2)
                                  2.5 %        97.5 %
(Intercept)               -3.093682e+05 -1.852740e+05
longitude                 -3.290032e+03 -2.246049e+03
total_rooms                1.124981e+00  1.978243e+00
median_income              3.392161e+04  3.514117e+04
ocean_proximityINLAND     -7.741868e+04 -7.302530e+04
ocean_proximityISLAND      1.465395e+05  2.593419e+05
ocean_proximityNEAR BAY    2.925316e+03  1.005655e+04
ocean_proximityNEAR OCEAN  1.028878e+04  1.614214e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5897 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=73940)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10915, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 13 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+median_income+ocean_proximity,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + median_income + 
    ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-485496  -40243  -10997   27537  373436 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -232907.2    31631.1  -7.363 1.87e-13 ***
longitude                   -2662.9      266.2 -10.002  < 2e-16 ***
median_income               35061.3      302.5 115.915  < 2e-16 ***
ocean_proximityINLAND      -74509.3     1117.7 -66.665  < 2e-16 ***
ocean_proximityISLAND      201962.0    28811.4   7.010 2.46e-12 ***
ocean_proximityNEAR BAY      6714.6     1821.2   3.687 0.000228 ***
ocean_proximityNEAR OCEAN   13359.0     1494.9   8.936  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 64400 on 19441 degrees of freedom
Multiple R-squared:  0.5602,    Adjusted R-squared:  0.5601 
F-statistic:  4128 on 6 and 19441 DF,  p-value: < 2.2e-16
confint(mm2)
                                2.5 %     97.5 %
(Intercept)               -294906.890 -170907.53
longitude                   -3184.734   -2141.02
median_income               34468.456   35654.21
ocean_proximityINLAND      -76700.025  -72318.56
ocean_proximityISLAND      145489.240  258434.83
ocean_proximityNEAR BAY      3144.945   10284.24
ocean_proximityNEAR OCEAN   10428.853   16289.18

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5891 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=73990)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10704, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 14 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~total_rooms median_income ocean_proximity,data=base)
G1;H1;Errorh: unexpected input en "mm2 <- lm(median_house_value ~total_rooms "
Error durante el wrapup: no hay tantas estructuras en la pila
Error: no more error handlers available (recursive errors?); invoking 'abort' restart
g
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + median_income + 
    ocean_proximity, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-485496  -40243  -10997   27537  373436 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)               -232907.2    31631.1  -7.363 1.87e-13 ***
longitude                   -2662.9      266.2 -10.002  < 2e-16 ***
median_income               35061.3      302.5 115.915  < 2e-16 ***
ocean_proximityINLAND      -74509.3     1117.7 -66.665  < 2e-16 ***
ocean_proximityISLAND      201962.0    28811.4   7.010 2.46e-12 ***
ocean_proximityNEAR BAY      6714.6     1821.2   3.687 0.000228 ***
ocean_proximityNEAR OCEAN   13359.0     1494.9   8.936  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 64400 on 19441 degrees of freedom
Multiple R-squared:  0.5602,    Adjusted R-squared:  0.5601 
F-statistic:  4128 on 6 and 19441 DF,  p-value: < 2.2e-16
confint(mm2)
                                2.5 %     97.5 %
(Intercept)               -294906.890 -170907.53
longitude                   -3184.734   -2141.02
median_income               34468.456   35654.21
ocean_proximityINLAND      -76700.025  -72318.56
ocean_proximityISLAND      145489.240  258434.83
ocean_proximityNEAR BAY      3144.945   10284.24
ocean_proximityNEAR OCEAN   10428.853   16289.18

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5891 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=73990)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.10704, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 16 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~ longitude+housing_median_age+total_rooms+population+median_income ,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    total_rooms + population + median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-561262  -48560  -12205   35840  378276 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.074e+05  3.083e+04  -3.483 0.000497 ***
longitude          -7.627e+02  2.579e+02  -2.957 0.003105 ** 
housing_median_age  1.744e+03  4.450e+01  39.186  < 2e-16 ***
total_rooms         5.926e+00  5.030e-01  11.783  < 2e-16 ***
population         -5.306e+00  9.226e-01  -5.751 9.02e-09 ***
median_income       4.103e+04  3.521e+02 116.554  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71160 on 19442 degrees of freedom
Multiple R-squared:  0.463, Adjusted R-squared:  0.4629 
F-statistic:  3353 on 5 and 19442 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -1.678147e+05 -46956.487549
longitude          -1.268242e+03   -257.231922
housing_median_age  1.656384e+03   1830.815621
total_rooms         4.940565e+00      6.912251
population         -7.113806e+00     -3.497153
median_income       4.034481e+04  41724.978856

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5172 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80210)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.082297, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 17 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~housing_median_age+total_rooms+population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ housing_median_age + total_rooms + 
    population + median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-560053  -48814  -12185   35853  377680 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.644e+04  2.192e+03  -7.499 6.72e-14 ***
housing_median_age  1.757e+03  4.429e+01  39.665  < 2e-16 ***
total_rooms         6.077e+00  5.005e-01  12.142  < 2e-16 ***
population         -5.646e+00  9.156e-01  -6.166 7.12e-10 ***
median_income       4.103e+04  3.521e+02 116.513  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71170 on 19443 degrees of freedom
Multiple R-squared:  0.4628,    Adjusted R-squared:  0.4627 
F-statistic:  4187 on 4 and 19443 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -20733.599175 -12140.635810
housing_median_age   1669.819417   1843.428840
total_rooms             5.095888      7.057852
population             -7.440278     -3.851137
median_income       40337.465381  41717.872700

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5171 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80210)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.082664, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 18 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+housing_median_age+total_rooms+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    total_rooms + median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-566878  -48555  -12328   35519  381575 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.326e+05  3.054e+04  -4.342 1.42e-05 ***
longitude          -9.477e+02  2.561e+02  -3.700 0.000216 ***
housing_median_age  1.736e+03  4.451e+01  39.005  < 2e-16 ***
total_rooms         3.433e+00  2.552e-01  13.453  < 2e-16 ***
median_income       4.163e+04  3.366e+02 123.689  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71220 on 19443 degrees of freedom
Multiple R-squared:  0.4621,    Adjusted R-squared:  0.462 
F-statistic:  4176 on 4 and 19443 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -1.924647e+05 -72736.474208
longitude          -1.449644e+03   -445.698122
housing_median_age  1.649037e+03   1823.540912
total_rooms         2.933091e+00      3.933542
median_income       4.097386e+04  42293.382211

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5142 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80460)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.084848, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 19 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~housing_median_age+total_rooms+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ housing_median_age + total_rooms + 
    median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-565806  -48721  -12313   35479  381089 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.986e+04  2.123e+03  -9.354   <2e-16 ***
housing_median_age  1.752e+03  4.432e+01  39.532   <2e-16 ***
total_rooms         3.421e+00  2.553e-01  13.403   <2e-16 ***
median_income       4.167e+04  3.365e+02 123.827   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71240 on 19444 degrees of freedom
Multiple R-squared:  0.4617,    Adjusted R-squared:  0.4616 
F-statistic:  5560 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -24017.346554 -15696.005020
housing_median_age   1665.259296   1839.010449
total_rooms             2.921086      3.921784
median_income       41013.307402  42332.604761

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.514 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80470)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.085049, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 20 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+housing_median_age+population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    population + median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-576455  -48718  -12271   35157  379752 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.443e+05  3.078e+04  -4.688 2.78e-06 ***
longitude          -1.070e+03  2.575e+02  -4.156 3.25e-05 ***
housing_median_age  1.640e+03  4.378e+01  37.469  < 2e-16 ***
population          4.065e+00  4.694e-01   8.659  < 2e-16 ***
median_income       4.243e+04  3.328e+02 127.478  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71410 on 19443 degrees of freedom
Multiple R-squared:  0.4592,    Adjusted R-squared:  0.4591 
F-statistic:  4127 on 4 and 19443 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -2.046234e+05 -83965.202782
longitude          -1.574811e+03   -565.427632
housing_median_age  1.554522e+03   1726.141574
population          3.144555e+00      4.984654
median_income       4.177487e+04  43079.581206

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5106 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80760)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.087031, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 21 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~housing_median_age+population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ housing_median_age + population + 
    median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-575287  -48795  -12269   35439  378959 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.670e+04  2.200e+03  -7.592  3.3e-14 ***
housing_median_age  1.655e+03  4.365e+01  37.915  < 2e-16 ***
population          3.920e+00  4.683e-01   8.370  < 2e-16 ***
median_income       4.247e+04  3.328e+02 127.598  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71440 on 19444 degrees of freedom
Multiple R-squared:  0.4587,    Adjusted R-squared:  0.4586 
F-statistic:  5492 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                           2.5 %        97.5 %
(Intercept)        -21015.305664 -12390.476698
housing_median_age   1569.513990   1740.640406
population              3.001656      4.837428
median_income       41814.733117  43119.446170

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5104 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80770)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.087405, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 22 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+housing_median_age+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + housing_median_age + 
    median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-578768  -48775  -12189   35931  374044 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -115417.60   30655.77  -3.765 0.000167 ***
longitude             -904.32     257.26  -3.515 0.000440 ***
housing_median_age    1532.64      42.05  36.444  < 2e-16 ***
median_income        42388.46     333.42 127.132  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71550 on 19444 degrees of freedom
Multiple R-squared:  0.4571,    Adjusted R-squared:  0.457 
F-statistic:  5457 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                         2.5 %      97.5 %
(Intercept)        -175505.549 -55329.6598
longitude            -1408.575   -400.0728
housing_median_age    1450.211   1615.0723
median_income        41734.929  43042.0002

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5097 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=80830)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.08512, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 23 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~housing_median_age+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ housing_median_age + median_income, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-577705  -48783  -12190   35958  373932 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -7870.41    1933.95   -4.07 4.73e-05 ***
housing_median_age  1548.44      41.83   37.02  < 2e-16 ***
median_income      42423.51     333.37  127.26  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 71570 on 19445 degrees of freedom
Multiple R-squared:  0.4568,    Adjusted R-squared:  0.4567 
F-statistic:  8175 on 2 and 19445 DF,  p-value: < 2.2e-16
confint(mm2)
                        2.5 %   97.5 %
(Intercept)        -11661.112 -4079.70
housing_median_age   1466.455  1630.42
median_income       41770.081 43076.95

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.5096 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=79930)
Warning :ties should not be present for the one-sample Kolmogorov-Smirnov test

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.084496, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 24 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+total_rooms+population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + total_rooms + population + 
    median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-512493  -51204  -12821   36620  369680 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -1.632e+05  3.199e+04  -5.100 3.42e-07 ***
longitude     -1.763e+03  2.666e+02  -6.613 3.85e-11 ***
total_rooms    2.045e+00  5.122e-01   3.992 6.59e-05 ***
population    -4.273e+00  9.579e-01  -4.460 8.23e-06 ***
median_income  3.949e+04  3.634e+02 108.672  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 73910 on 19443 degrees of freedom
Multiple R-squared:  0.4206,    Adjusted R-squared:  0.4205 
F-statistic:  3529 on 4 and 19443 DF,  p-value: < 2.2e-16
confint(mm2)
                      2.5 %        97.5 %
(Intercept)   -2.258564e+05 -1.004534e+05
longitude     -2.285424e+03 -1.240431e+03
total_rooms    1.040524e+00  3.048419e+00
population    -6.150133e+00 -2.395004e+00
median_income  3.877933e+04  4.020393e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.4774 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=79930)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.083947, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 25 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~total_rooms+population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ total_rooms + population + 
    median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-508819  -51339  -13491   36799  371062 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   48163.0027  1525.2594  31.577  < 2e-16 ***
total_rooms       2.3280     0.5110   4.556 5.24e-06 ***
population       -5.0487     0.9517  -5.305 1.14e-07 ***
median_income 39447.8542   363.7407 108.450  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 74000 on 19444 degrees of freedom
Multiple R-squared:  0.4193,    Adjusted R-squared:  0.4192 
F-statistic:  4680 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                     2.5 %       97.5 %
(Intercept)   45173.363136 51152.642315
total_rooms       1.326470     3.329517
population       -6.914181    -3.183248
median_income 38734.891251 40160.817167

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.4757 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=83510)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.089804, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 26 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + population + median_income, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-518982  -50966  -13096   36458  371005 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -1.752e+05  3.186e+04  -5.500 3.85e-08 ***
longitude     -1.852e+03  2.657e+02  -6.969 3.29e-12 ***
population    -9.316e-01  4.660e-01  -1.999   0.0456 *  
median_income  4.002e+04  3.382e+02 118.359  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 73940 on 19444 degrees of freedom
Multiple R-squared:  0.4201,    Adjusted R-squared:   0.42 
F-statistic:  4696 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                      2.5 %        97.5 %
(Intercept)   -2.376611e+05 -1.127708e+05
longitude     -2.372849e+03 -1.331124e+03
population    -1.845016e+00 -1.818640e-02
median_income  3.936132e+04  4.068696e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.4757 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=83590)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.089461, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 27 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + median_income, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-517465  -50956  -12980   36380  372197 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -182921.6    31626.8  -5.784 7.42e-09 ***
longitude       -1906.1      264.4  -7.210 5.80e-13 ***
median_income   39994.5      337.9 118.377  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 73950 on 19445 degrees of freedom
Multiple R-squared:   0.42, Adjusted R-squared:   0.42 
F-statistic:  7041 on 2 and 19445 DF,  p-value: < 2.2e-16
confint(mm2)
                    2.5 %      97.5 %
(Intercept)   -244912.791 -120930.391
longitude       -2424.312   -1387.929
median_income   39332.242   40656.704

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.475 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
lillie.test(r)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  r
D = 0.079995, p-value < 2.2e-16

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 28 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~longitude+total_rooms+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ longitude + total_rooms + median_income, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-517183  -50990  -12946   36331  372267 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -1.833e+05  3.168e+04  -5.785 7.37e-09 ***
longitude     -1.909e+03  2.647e+02  -7.211 5.77e-13 ***
total_rooms    4.823e-02  2.492e-01   0.194    0.847    
median_income  3.998e+04  3.467e+02 115.306  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 73950 on 19444 degrees of freedom
Multiple R-squared:   0.42, Adjusted R-squared:  0.4199 
F-statistic:  4694 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                      2.5 %        97.5 %
(Intercept)   -2.453933e+05 -1.211847e+05
longitude     -2.427411e+03 -1.389787e+03
total_rooms   -4.402271e-01  5.366917e-01
median_income  3.929979e+04  4.065901e+04

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.475 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
ks.test(r,pnorm,mean=0,sd=83640)

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  r
D = 0.090309, p-value < 2.2e-16
alternative hypothesis: two-sided

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 29 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~population+median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ population + median_income, 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-516048  -51101  -13595   36590  370113 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   46573.9001  1485.5997   31.35  < 2e-16 ***
population       -1.2626     0.4641   -2.72  0.00653 ** 
median_income 40055.9556   338.5404  118.32  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 74030 on 19445 degrees of freedom
Multiple R-squared:  0.4187,    Adjusted R-squared:  0.4186 
F-statistic:  7002 on 2 and 19445 DF,  p-value: < 2.2e-16
confint(mm2)
                     2.5 %        97.5 %
(Intercept)   43661.996995 49485.8031885
population       -2.172323    -0.3527815
median_income 39392.387178 40719.5239358

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.4746 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
lillie.test(r)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  r
D = 0.081752, p-value < 2.2e-16

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedemos con el 30 mejor modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~median_income,data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ median_income, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-513852  -51108  -13674   36398  369870 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    44899.4     1352.3    33.2   <2e-16 ***
median_income  40016.6      338.3   118.3   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 74050 on 19446 degrees of freedom
Multiple R-squared:  0.4185,    Adjusted R-squared:  0.4184 
F-statistic: 1.399e+04 on 1 and 19446 DF,  p-value: < 2.2e-16
confint(mm2)
                 2.5 %   97.5 %
(Intercept)   42248.85 47550.05
median_income 39353.53 40679.67

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.4738 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
lillie.test(r)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  r
D = 0.08271, p-value < 2.2e-16

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para concluir que los residuales no tienen distribución normal con media cero. Por lo que procedeeremos con transformaciones al modelo

#   longitude housing_median_age population median_income ocean_proximity
mm2 <- lm(median_house_value ~ poly(median_income, 3, raw = TRUE),data=base)
summary(mm2)

Call:
lm(formula = median_house_value ~ poly(median_income, 3, raw = TRUE), 
    data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-306048  -51292  -13724   36143  358183 

Coefficients:
                                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)                          73987.6     4122.4  17.948  < 2e-16 ***
poly(median_income, 3, raw = TRUE)1  15432.8     2784.3   5.543 3.02e-08 ***
poly(median_income, 3, raw = TRUE)2   5820.5      559.4  10.405  < 2e-16 ***
poly(median_income, 3, raw = TRUE)3   -394.6       33.7 -11.706  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 73760 on 19444 degrees of freedom
Multiple R-squared:  0.423, Adjusted R-squared:  0.4229 
F-statistic:  4752 on 3 and 19444 DF,  p-value: < 2.2e-16
confint(mm2)
                                         2.5 %     97.5 %
(Intercept)                         65907.2364 82067.8713
poly(median_income, 3, raw = TRUE)1  9975.2418 20890.3539
poly(median_income, 3, raw = TRUE)2  4724.0525  6916.8634
poly(median_income, 3, raw = TRUE)3  -460.6161  -328.4872

Rechazo \(H_0\) si p- valor < α, dado que nuestro p-valor es igual a \(2.2 \times 10^{-16}\) concluimos que se rechaza \(H_0\), por lo que hay evidencia estadística para que alguna variable sea significativa

El modelo cuenta con un \(R^2\) Ajustado de 0.434 , podríamos considerar un ajuste moderado. No se aprecia Regresión al origen

Supuestos de los Residuales

Normalidad y Media cero

\(H_0\): residuales provienen de distribución normal con media cero

\(H_1\): residuales no provienen de distribución normal con media cero

r<-residuals(mm2)
lillie.test(r)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  r
D = 0.083566, p-value < 2.2e-16

Pruebas de Bondad de Ajuste

latitud

Pera la latidud usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$latitude
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 10)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 3.57205485, sdlog = 0.05963411 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 3.57205485, sdlog = 0.05963411 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas)
Warning :Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla_completa$Frecuencia and esperadas
X-squared = 90, df = 81, p-value = 0.2313

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma lognormal

longitud

Pera la longitud usaremos como distribución sospechada la normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$longitude
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "norm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 50)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(pnorm(breaks,mean = -119.563485 , sd = 2.005838 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = -119.563485, sdlog = 2.005838 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 2295, df = NA, p-value = 0.0004998

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que rechazamos H0, por lo que hay evidencia estadística para concluir que no se distribuye de forma normal

Housing Median Age

Pera la variable housing median age usaremos como distribución sospechada la normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$housing_median_age
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "norm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma normal

\(H_1\): La variable no se distribuye de forma normal

breaks <- pretty(hh, n = 20)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(pnorm(breaks,mean = 28.36472, sd = 12.50994 ))
cola_infinito <-1 -  pnorm(max(breaks),mean= 28.36472, sd = 12.50994 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas)
Warning :Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla_completa$Frecuencia and esperadas
X-squared = 650, df = 625, p-value = 0.2368

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma normal

Total Rooms

Pera la varibale total rooms usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$total_rooms
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 50)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 7.622727, sdlog = 0.750080 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 7.622727, sdlog = 0.750080 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 920, df = NA, p-value = 0.4838

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma lognormal

Total Bedrooms

Pera la variable total bedrooms usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$total_bedrooms
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 10)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 6.055793, sdlog = 0.728844 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 6.055793, sdlog = 0.728844 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 156, df = NA, p-value = 1

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma lognormal

Population

Pera la variable Population usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$population
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 50)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 7.0359476, sdlog = 0.73646241 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 7.0359476, sdlog = 0.7364624 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 540, df = NA, p-value = 1

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma lognormal

HouseHolds

Pera la variable House Holds usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$households
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 50)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 5.9852195, sdlog = 0.7298244 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 5.9852195, sdlog = 0.7298244 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 2013, df = NA, p-value = 1

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma lognormal

Median Income

Pera la variable Median Income usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$median_income
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 100)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 1.2094913, sdlog = 0.4413968 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 1.2094913, sdlog = 0.4413968 )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 3626, df = NA, p-value = 0.0004998

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que rechazamos H0, por lo que hay evidencia estadística para concluir que no se distribuye de forma lognormal

Median House Value

Pera la a predecir usaremos como distribución sospechada la log-normal. Empezamos definiendo los parametros estimados mediante estimación por maxima verosimilitud

hh<-base$median_house_value
#Estimación de Parametros
#install.packages("fitdistrplus")  # Si no lo tienes
library(fitdistrplus)
# Estimación de parámetros de la lognorm
ajuste <- fitdist(hh, "lnorm")
Warning :Se han producido NaNs
Warning :Se han producido NaNs
Warning :Se han producido NaNs
print(ajuste)
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

\(H_0\): La variable se distribuye de forma log normal

\(H_1\): La variable no se distribuye de forma log normal

breaks <- pretty(hh, n = 143)
intervalos=cut(hh,breaks=breaks)
tabla_frecuencia <- table(intervalos)
#Generamos nuestra probabilidad por intervalo
Probs<-diff(plnorm(breaks,meanlog = 12.0323150, sdlog = 0.5320982 ))
cola_infinito <-1 -  plnorm(max(breaks),meanlog = 12.0323150, sdlog = 0.5320982  )
# Sumar la cola al último intervalo 
Probs[length(Probs)] <- Probs[length(Probs)] + cola_infinito 
n  <- length(hh)
esperadas <- Probs * n 

tabla_completa <- data.frame(
  Intervalo = names(tabla_frecuencia),
  Frecuencia = as.vector(tabla_frecuencia))
#Prueba de Bondad 
chisq.test(tabla_completa$Frecuencia,esperadas,simulate.p.value = TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tabla_completa$Frecuencia and esperadas
X-squared = 8428, df = NA, p-value = 1

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que se distribuye de forma lognormal

Prueba de Hipotesis

La primer variable que usaremos para nuestras pruebas de hipotesis será Housing Median Age

T Tes de dos muestras

¿Hay diferencia en la edad mediana de viviendas entre zonas cercanas al océano y zonas tierra adentro?

t.test(housing_median_age ~ ocean_proximity, data = base, subset = ocean_proximity %in% c("INLAND", "NEAR OCEAN"))

    Welch Two Sample t-test

data:  housing_median_age by ocean_proximity
t = -17.354, df = 4355.8, p-value < 2.2e-16
alternative hypothesis: true difference in means between group INLAND and group NEAR OCEAN is not equal to 0
95 percent confidence interval:
 -5.500291 -4.383698
sample estimates:
    mean in group INLAND mean in group NEAR OCEAN 
                24.24722                 29.18921 

Hipotesis

\(H_0\): No hay diferencia en la edad mediana de las viviendas entre los grupos INLAND y NEAR OCEAN.

\(H_1\): Si hay diferencia en la edad mediana de las viviendas entre los grupos INLAND y NEAR OCEAN.

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que rechazamos H0, por lo que hay evidencia estadística para concluir que si hay diferencia entre las viviendas que se encuentran cerca del oceano y las que se encuentran tierra dentro

Ahora bien, queremos probar que son más nuevas la casas cercas al oceano

Hipotesis

\(H_0\): Los grupos de casa NEAR OCEAN son más antiguas que los grupos INLAND.

\(H_1\): Los grupos de casa NEAR OCEAN son más recientes que los grupos INLAND.

t.test(
  housing_median_age ~ ocean_proximity,
  data = base,
  subset = ocean_proximity %in% c("INLAND", "NEAR OCEAN"),
  alternative = "greater",
  var.equal = FALSE
)

    Welch Two Sample t-test

data:  housing_median_age by ocean_proximity
t = -17.354, df = 4355.8, p-value = 1
alternative hypothesis: true difference in means between group INLAND and group NEAR OCEAN is greater than 0
95 percent confidence interval:
 -5.410501       Inf
sample estimates:
    mean in group INLAND mean in group NEAR OCEAN 
                24.24722                 29.18921 

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que no rechazamos H0, por lo que hay evidencia estadística para concluir que las casas cercanas al oceanos son más antiguas que las nuevas

Continuaremos transformando nuestra variable Ocean Proximity a una distribución binomial, donde distinguiremos entre las propiedades cerca al oceano y aquellas que no lo estan

base$near_ocean_bin <- ifelse(base$ocean_proximity == "NEAR OCEAN", 1, 0)
print(table(base$near_ocean_bin))

    0     1 
17038  2410 

Queremos comprobar si al menos un cuarto de las casas estan cercanas al oceano

Hipotesis

\(H_0\): Los grupos de casa NEAR OCEAN representan por lo menos el 25%.

\(H_1\):Los grupos de casa NEAR OCEAN representan menos del 25%.

prop.test(sum(base$near_ocean_bin), length(base$near_ocean_bin), p = 0.25, alternative = "less")

    1-sample proportions test with continuity correction

data:  sum(base$near_ocean_bin) out of length(base$near_ocean_bin), null probability 0.25
X-squared = 1648.1, df = 1, p-value < 2.2e-16
alternative hypothesis: true p is less than 0.25
95 percent confidence interval:
 0.0000000 0.1278849
sample estimates:
        p 
0.1239202 

Rechazamos H0 si P-Valor ≤ α, tomamos un α =0.05, por lo tanto podemos concluir que rechazamos H0, por lo que hay evidencia estadística para concluir que las casas cercanas al oceanos son menos del 25%

Conclusiones

Para mi trabajo con la base de casas en california se busco responder a la pregunta de cual es el costo de una casa según las características de su ubicación. Se probaron todos los modelos posibles de regresión, tanto múltiple como univariada. Como mejor modelo nos dio el siguiente:

\[ \text{Median House Value} = -223998.93 -2380.31 \cdot \text{longitude} + 922.12 \cdot \text{housing_median_age} \\ + 10.88 \cdot \text{total_rooms} -16.2 \cdot \text{population} + 33692.66 \cdot \text{median_income} -3446.4 \cdot \text{NEAR_BAY} \\ + 10844.13 \cdot \text{NEAR_OCEAN} -74617.50 \cdot \text{INLAND} + 184838.43 \cdot \text{ISLAND} \]

Con un ajuste de 0.5801 y nuestras variables aportan de la siguiente manera:

Variable Aportacion Comentarios
-2380.31 Longitude Negativa La Longitud tiene una relación inversa al valor de la casa
922.12 Housing Median Age Postiva La edad tiene una relación directa con el valor de la casa
+ 10.88 Total Rooms Positiva La cantidad de habitaciones afecta positivamente a la edad de al valor de la casa
-16.2Population Negativa La población afecta inversamente al valor de la casa
33692.66 Median Income Positiva El ingreso afecta de manera directa al valor de la casa
-3446.4 Ocean Proximity INLAND Negativa Cuando la proximidad al océano se encuentra en la categoría INLAND afecta de manera inversa al valor de la casa
-74617.50 Ocean Proximity ISLAND Positiva Cuando se encuentra en la categoría ISLAND afecta de manera directa
184838.43 Ocean Proximity Near bay Positiva Cuando se encuentra cerca de la bahía afecta de manera directa al valor de la casa
10844.1Ocean Proximity Near Ocean Positiva Cuando se encuentra cerca del oceano afecta de manera directa al valor de la casa

Asi mismo podemos responder las siguientes preguntas:

plnorm(100,,meanlog = 5.9852195, sdlog = 0.7298244 )
[1] 0.02931662

Existe una probabilidad de 0.0293 de encontrar una casa con menos de 100 vecinos

pnorm(15,mean = 28.36472, sd = 12.50994 )
[1] 0.1426863

Existe una probabilidad de 0.1427 de encontrar una casa menor a 15 años

plnorm(36,meanlog = 3.57205485, sdlog = 0.05963411 ) - plnorm(35,meanlog = 3.57205485, sdlog = 0.05963411 )
[1] 0.1865437

Existe una probabilidad de 0.1865 de encontrar una casa entre esas coordenadas

plnorm(1000,meanlog = 7.0359476, sdlog = 0.73646241 ) - plnorm(800,meanlog = 7.0359476, sdlog = 0.73646241 )
[1] 0.1142471

Existe una probabilidad de 0.1142 de encontrar una casa con entre 1000 y 800 vecinos

1-plnorm(350,meanlog = 6.055793, sdlog = 0.728844 )
[1] 0.6069855

Existe una probablidad de 0.607 de encontrar una casas que el total de dormitorios de la casa sea mayor a 350

LS0tDQp0aXRsZTogIlByb3llY3RvIEZpbmFsIE1ldG9kb3MgRXN0YWRpc3RpY29zIELDoXNpY29zIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KIyMgRGVzY3JpcGNpw7NuIEdlbmVyYWwNCg0KUGFyYSBtaSBwcm95ZWN0byB0cmFiYWphcmUgc29icmUgbGEgYmFzZSBkZSBkYXRvcyBkZWwgcHJlY2lvIGRlIGxhcyBjYXNhcyBlbiBjYWxpZm9ybmlhLCBsYSBjdWFsIGVzdGEgY29tcHVlc3RhIGRlIGxhcyBzaWd1aWVudGVzIHZhcmlhYmxlcw0KDQpgYGB7cn0NCm9sZF93YXJuIDwtIGdldE9wdGlvbigid2FybiIpDQpvcHRpb25zKHdhcm4gPSAtMSkgICAgDQpzZXR3ZCgiQzovVXNlcnMvVVNFUi9EZXNrdG9wL01FQiIpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KDQpEZXNjIDwtIGZsZXh0YWJsZShyZWFkLmNzdigiRGVzY3JpcGNpw7NuVmFyaWFibGVzLmNzdiIpKQ0KRGVzYyA8LSB0aGVtZV92YW5pbGxhKERlc2MpDQoNCnByaW50KERlc2MpDQoNCg0KYGBgDQoNCkxhIHZhcmlhYmxlIGEgc2VyYSAqKk1lZGlhbiBIb3VzZSBWYWx1ZSoqIHBhcmEgcG9kZXIgZXN0aW1hciBlbCBjb3N0byBkZSB1bmEgdml2aWVuZGEgc2VndW4gbGFzIGNhcmFjdGVyaXN0aWNhcyBkZWwgdmVjaW5kYXJpbyBlbiBlbCBxdWUgc2UgZW5jdWVudHJhDQoNCiMjIEJhc2UNCg0KYGBge3J9DQpob3VzaW5nIDwtIGRhdGEuZnJhbWUocmVhZC5jc3YoImhvdXNpbmcuY3N2IikpDQpob3VzaW5nX2hlYWQgPC0gZmxleHRhYmxlKGhlYWQoaG91c2luZykpDQpob3VzaW5nX2hlYWQgPC10aGVtZV92YW5pbGxhKGhvdXNpbmdfaGVhZCkNCnByaW50KGhvdXNpbmdfaGVhZCkNCg0KDQpgYGANCg0KIyMgUHJvYmxlbWF0aWNhDQoNCkxhIHByaW5jaXBhbCBwcm9ibGVtYXRpY2EgYSByZXNvbHZlciBlcyBlbmNvbnRyYXIgbGFzIHpvbmFzIGRlbCBlc3RhZG8gZGUgY2FsaWZvcm5pYSBjb24gbWF5b3IgcHJlY2lvIHkgY3VhbGVzIHNvbiBzdXMgY2FyYWN0ZXJpc3RpY2FzDQoNCkVsIGRhdGFzZXQgZGVsIGN1YWwgaGFyZW1vcyBlbCBhbmFsaXNpcyBwcm92aWVuZSBkZSBLYWdnbGUNCg0KLSAgIFtIb3VzaW5nIENhbGlmb3JuaWFdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvY2FtbnVnZW50L2NhbGlmb3JuaWEtaG91c2luZy1wcmljZXMpDQoNCiMjIEFuYWxpc2lzIEV4cGxvcmF0b3JpbyBkZSBEYXRvcw0KDQojIyMgRXN0YWRpc3RpY29zIERlc2NyaXB0aXZvcw0KDQpgYGB7cn0NCmhvdXNpbmckb2NlYW5fcHJveGltaXR5IDwtIGFzLnZlY3Rvcihob3VzaW5nJG9jZWFuX3Byb3hpbWl0eSkNCnN1bW1hcnkoaG91c2luZykNCg0KDQpgYGANCg0KIyMjIExvbmdpdHVkDQoNCiMjIyMgVGFibGEgZGUgRnJlY3VlbmNpYXMNCg0KYGBge3J9DQojIERlZmluaXIgbG9zIGNvcnRlcw0KYnJlYWtzIDwtIHByZXR0eShob3VzaW5nJGxvbmdpdHVkZSwgbiA9IDE0MykNCiMgQ3JlYXIgZXRpcXVldGFzIG51bT9yaWNhcyBsaW1waWFzDQppbnRlcnZhbG9zIDwtIGN1dChob3VzaW5nJGxvbmdpdHVkZSwgYnJlYWtzID0gYnJlYWtzLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIHJpZ2h0ID0gRkFMU0UpDQojIENyZWFyIHRhYmxhIGRlIGZyZWN1ZW5jaWFzDQp0YWJsYV9mcmVjdWVuY2lhIDwtIHRhYmxlKGludGVydmFsb3MpDQoNCnRhYmxhX2NvbXBsZXRhIDwtIGRhdGEuZnJhbWUoDQogIEludGVydmFsbyA9IG5hbWVzKHRhYmxhX2ZyZWN1ZW5jaWEpLA0KICBGcmVjdWVuY2lhID0gYXMudmVjdG9yKHRhYmxhX2ZyZWN1ZW5jaWEpDQopDQoNCiMgTW9zdHJhciBsYSB0YWJsYQ0KdGFibGFfY29tcGxldGEkSW50ZXJ2YWxvIDwtIGFzLmNoYXJhY3Rlcih0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8pDQpwcmludCh0YWJsYV9jb21wbGV0YSkNCg0KDQpgYGANCg0KIyMjIyBIaXN0b2dyYW1hDQoNCmBgYHtyfQ0KaGlzdChob3VzaW5nJGxvbmdpdHVkZSxicmVha3MgPSAxNDMsIG1haW49ICJIaXN0b2dyYW1hIGRlIExvbmdpdHVkIiwNCiAgICAgeGxhYiA9ICJMb25naXR1ZCIsIHlsYWI9J0ZyZWN1ZW5jaWEnKQ0KDQpgYGANCg0KIyMjIyBCb3hQbG90DQoNCmBgYHtyfQ0KDQpib3hwbG90KGhvdXNpbmckbG9uZ2l0dWRlLG1haW49IkJveFBsb3QgZGUgTG9uZ2l0dWQiLHlsYWI9J3ZhbG9yZXMnKQ0KDQpgYGANCg0KIyMjIExhdGl0dWQNCg0KIyMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhcw0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgY29ydGVzDQpicmVha3MgPC0gcHJldHR5KGhvdXNpbmckbGF0aXR1ZGUsIG4gPSA1MCkNCiMgQ3JlYXIgZXRpcXVldGFzIG51bT9yaWNhcyBsaW1waWFzDQppbnRlcnZhbG9zIDwtIGN1dChob3VzaW5nJGxhdGl0dWRlLCBicmVha3MgPSBicmVha3MsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgcmlnaHQgPSBGQUxTRSkNCiMgQ3JlYXIgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkNCikNCg0KIyBNb3N0cmFyIGxhIHRhYmxhDQp0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8gPC0gYXMuY2hhcmFjdGVyKHRhYmxhX2NvbXBsZXRhJEludGVydmFsbykNCnByaW50KHRhYmxhX2NvbXBsZXRhKQ0KDQoNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWENCg0KYGBge3J9DQpoaXN0KGhvdXNpbmckbGF0aXR1ZGUsYnJlYWtzID01MCwgbWFpbj0gIkhpc3RvZ3JhbWEgZGUgTGF0aXR1ZCIsDQogICAgIHhsYWIgPSAiTGF0aXR1ZCIsIHlsYWI9J0ZyZWN1ZW5jaWEnLCB4bGltPWMoMzIsNDMpKQ0KDQpgYGANCg0KIyMjIyBCb3hQbG90DQoNCmBgYHtyfQ0KDQpib3hwbG90KGhvdXNpbmckbGF0aXR1ZGUsbWFpbj0iQm94UGxvdCBkZSBMYXRpdHVkZSIseWxhYj0ndmFsb3JlcycpDQoNCmBgYA0KDQojIyMgSG91c2luZyBNZWRpYSBBZ2UNCg0KIyMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhcw0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgY29ydGVzDQpicmVha3MgPC0gcHJldHR5KGhvdXNpbmckaG91c2luZ19tZWRpYW5fYWdlLCBuID0gMTApDQojIENyZWFyIGV0aXF1ZXRhcyBudW0/cmljYXMgbGltcGlhcw0KaW50ZXJ2YWxvcyA8LSBjdXQoaG91c2luZyRob3VzaW5nX21lZGlhbl9hZ2UsIGJyZWFrcyA9IGJyZWFrcywgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLCByaWdodCA9IEZBTFNFKQ0KIyBDcmVhciB0YWJsYSBkZSBmcmVjdWVuY2lhcw0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShpbnRlcnZhbG9zKQ0KDQp0YWJsYV9jb21wbGV0YSA8LSBkYXRhLmZyYW1lKA0KICBJbnRlcnZhbG8gPSBuYW1lcyh0YWJsYV9mcmVjdWVuY2lhKSwNCiAgRnJlY3VlbmNpYSA9IGFzLnZlY3Rvcih0YWJsYV9mcmVjdWVuY2lhKQ0KKQ0KDQojIE1vc3RyYXIgbGEgdGFibGENCnRhYmxhX2NvbXBsZXRhJEludGVydmFsbyA8LSBhcy5jaGFyYWN0ZXIodGFibGFfY29tcGxldGEkSW50ZXJ2YWxvKQ0KcHJpbnQodGFibGFfY29tcGxldGEpDQoNCg0KYGBgDQoNCiMjIyMgSGlzdG9ncmFtYQ0KDQpgYGB7cn0NCmhpc3QoaG91c2luZyRob3VzaW5nX21lZGlhbl9hZ2UsYnJlYWtzID0gMjAsIG1haW49ICJIaXN0b2dyYW1hIGRlIEVkYWQgZGUgbGFzIGNhc2FzIiwNCiAgICAgeGxhYiA9ICJFZGFkIiwgeWxhYj0nRnJlY3VlbmNpYScpDQoNCmBgYA0KDQojIyMjIEJveFBsb3QNCg0KYGBge3J9DQoNCmJveHBsb3QoaG91c2luZyRob3VzaW5nX21lZGlhbl9hZ2UsbWFpbj0iQm94UGxvdCBkZSBFZGFkIGRlIGxhcyBDYXNhcyIseWxhYj0ndmFsb3JlcycpDQoNCmBgYA0KDQojIyMgVG90YWwgUm9vbXMNCg0KIyMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhcw0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgY29ydGVzDQpicmVha3MgPC0gcHJldHR5KGhvdXNpbmckdG90YWxfcm9vbXMsIG4gPSA1MCkNCiMgQ3JlYXIgZXRpcXVldGFzIG51bT9yaWNhcyBsaW1waWFzDQppbnRlcnZhbG9zIDwtIGN1dChob3VzaW5nJHRvdGFsX3Jvb21zLCBicmVha3MgPSBicmVha3MsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgcmlnaHQgPSBGQUxTRSkNCiMgQ3JlYXIgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkNCikNCg0KIyBNb3N0cmFyIGxhIHRhYmxhDQp0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8gPC0gYXMuY2hhcmFjdGVyKHRhYmxhX2NvbXBsZXRhJEludGVydmFsbykNCnByaW50KHRhYmxhX2NvbXBsZXRhKQ0KDQoNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWENCg0KYGBge3J9DQpoaXN0KGhvdXNpbmckdG90YWxfcm9vbXMsYnJlYWtzID0gMTAwLCBtYWluPSAiSGlzdG9ncmFtYSBkZWwgdG90YWwgZGUgaGFiaXRhY2lvbmVzIGRlbCB2ZWNpbmRhcmlvIiwNCiAgICAgeGxhYiA9ICJoYWJpdGFjaW9uZXMiLCB5bGFiPSdGcmVjdWVuY2lhJykNCg0KYGBgDQoNCiMjIyMgQm94UGxvdA0KDQpgYGB7cn0NCg0KYm94cGxvdChob3VzaW5nJHRvdGFsX3Jvb21zLG1haW49IkJveFBsb3QgZGVsIHRvdGFsIGRlIGhhYml0YWNpb25lcyIseWxhYj0ndmFsb3JlcycpDQoNCmBgYA0KDQojIyMgVG90YWwgQmVkcm9vbXMNCg0KIyMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhcw0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgY29ydGVzDQpicmVha3MgPC0gcHJldHR5KGhvdXNpbmckdG90YWxfYmVkcm9vbXMsIG4gPSA1MCkNCiMgQ3JlYXIgZXRpcXVldGFzIG51bT9yaWNhcyBsaW1waWFzDQppbnRlcnZhbG9zIDwtIGN1dChob3VzaW5nJHRvdGFsX2JlZHJvb21zLCBicmVha3MgPSBicmVha3MsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgcmlnaHQgPSBGQUxTRSkNCiMgQ3JlYXIgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkNCikNCg0KIyBNb3N0cmFyIGxhIHRhYmxhDQp0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8gPC0gYXMuY2hhcmFjdGVyKHRhYmxhX2NvbXBsZXRhJEludGVydmFsbykNCnByaW50KHRhYmxhX2NvbXBsZXRhKQ0KDQoNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWENCg0KYGBge3J9DQpoaXN0KGhvdXNpbmckdG90YWxfYmVkcm9vbXMsYnJlYWtzID0gMTAwLCBtYWluPSAiSGlzdG9ncmFtYSBkZWwgdG90YWwgZGUgZG9ybWl0b3Jpb3MgZGVsIHZlY2luZGFyaW8iLA0KICAgICB4bGFiID0gIlRvdGFsIGRlIERvcm1pdG9yaW9zIiwgeWxhYj0nRnJlY3VlbmNpYScpDQoNCmBgYA0KDQojIyMjIEJveFBsb3QNCg0KYGBge3J9DQoNCmJveHBsb3QoaG91c2luZyR0b3RhbF9iZWRyb29tcyxtYWluPSJCb3hQbG90IGRlIEVkYWQgZGVsIHRvdGFsIGRlIGRvcm1pdG9yaW9zIGRlbCB2ZWNpbmRhcmlvIix5bGFiPSd2YWxvcmVzJykNCg0KYGBgDQoNCiMjIyBQb3B1bGF0aW9uDQoNCiMjIyMgVGFibGEgZGUgRnJlY3VlbmNpYXMNCg0KYGBge3J9DQojIERlZmluaXIgbG9zIGNvcnRlcw0KYnJlYWtzIDwtIHByZXR0eShob3VzaW5nJHBvcHVsYXRpb24sIG4gPSAxMDApDQojIENyZWFyIGV0aXF1ZXRhcyBudW0/cmljYXMgbGltcGlhcw0KaW50ZXJ2YWxvcyA8LSBjdXQoaG91c2luZyRwb3B1bGF0aW9uLCBicmVha3MgPSBicmVha3MsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgcmlnaHQgPSBGQUxTRSkNCiMgQ3JlYXIgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkNCikNCg0KIyBNb3N0cmFyIGxhIHRhYmxhDQp0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8gPC0gYXMuY2hhcmFjdGVyKHRhYmxhX2NvbXBsZXRhJEludGVydmFsbykNCnByaW50KHRhYmxhX2NvbXBsZXRhKQ0KDQoNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWENCg0KYGBge3J9DQpoaXN0KGhvdXNpbmckcG9wdWxhdGlvbixicmVha3MgPSAxMDAsIG1haW49ICJIaXN0b2dyYW1hIGRlIHBvYmxhY2nDs24iLA0KICAgICB4bGFiID0gIlBvYmxhY2nDs24iLCB5bGFiPSdGcmVjdWVuY2lhJykNCg0KYGBgDQoNCiMjIyMgQm94UGxvdA0KDQpgYGB7cn0NCg0KYm94cGxvdChob3VzaW5nJHBvcHVsYXRpb24sbWFpbj0iQm94UGxvdCBkZSBsYSBwb2JsYWNpw7NuIix5bGFiPSd2YWxvcmVzJykNCg0KYGBgDQoNCiMjIyBIb3VzZUhvbGRzDQoNCiMjIyMgVGFibGEgZGUgRnJlY3VlbmNpYXMNCg0KYGBge3J9DQojIERlZmluaXIgbG9zIGNvcnRlcw0KYnJlYWtzIDwtIHByZXR0eShob3VzaW5nJGhvdXNlaG9sZHMsIG4gPSA1MCkNCiMgQ3JlYXIgZXRpcXVldGFzIG51bT9yaWNhcyBsaW1waWFzDQppbnRlcnZhbG9zIDwtIGN1dChob3VzaW5nJGhvdXNlaG9sZHMsIGJyZWFrcyA9IGJyZWFrcywgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLCByaWdodCA9IEZBTFNFKQ0KIyBDcmVhciB0YWJsYSBkZSBmcmVjdWVuY2lhcw0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShpbnRlcnZhbG9zKQ0KDQp0YWJsYV9jb21wbGV0YSA8LSBkYXRhLmZyYW1lKA0KICBJbnRlcnZhbG8gPSBuYW1lcyh0YWJsYV9mcmVjdWVuY2lhKSwNCiAgRnJlY3VlbmNpYSA9IGFzLnZlY3Rvcih0YWJsYV9mcmVjdWVuY2lhKQ0KKQ0KDQojIE1vc3RyYXIgbGEgdGFibGENCnRhYmxhX2NvbXBsZXRhJEludGVydmFsbyA8LSBhcy5jaGFyYWN0ZXIodGFibGFfY29tcGxldGEkSW50ZXJ2YWxvKQ0KcHJpbnQodGFibGFfY29tcGxldGEpDQoNCg0KYGBgDQoNCiMjIyMgSGlzdG9ncmFtYQ0KDQpgYGB7cn0NCmhpc3QoaG91c2luZyRob3VzZWhvbGRzLGJyZWFrcyA9IDEwMCwgbWFpbj0gIkhpc3RvZ3JhbWEgZGUgSG9nYXJlcyIsDQogICAgIHhsYWIgPSAiSG9nYXJlcyIsIHlsYWI9J0ZyZWN1ZW5jaWEnKQ0KDQpgYGANCg0KIyMjIyBCb3hQbG90DQoNCmBgYHtyfQ0KDQpib3hwbG90KGhvdXNpbmckaG91c2Vob2xkcyxtYWluPSJCb3hQbG90IGRlIEhvZ2FyZXMiLHlsYWI9J3ZhbG9yZXMnKQ0KDQpgYGANCg0KIyMjIE1lZGlhbiBJbmNvbWUNCg0KIyMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhcw0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgY29ydGVzDQpicmVha3MgPC0gcHJldHR5KGhvdXNpbmckbWVkaWFuX2luY29tZSwgbiA9IDEwKQ0KIyBDcmVhciBldGlxdWV0YXMgbnVtP3JpY2FzIGxpbXBpYXMNCmludGVydmFsb3MgPC0gY3V0KGhvdXNpbmckbWVkaWFuX2luY29tZSwgYnJlYWtzID0gYnJlYWtzLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIHJpZ2h0ID0gRkFMU0UpDQojIENyZWFyIHRhYmxhIGRlIGZyZWN1ZW5jaWFzDQp0YWJsYV9mcmVjdWVuY2lhIDwtIHRhYmxlKGludGVydmFsb3MpDQoNCnRhYmxhX2NvbXBsZXRhIDwtIGRhdGEuZnJhbWUoDQogIEludGVydmFsbyA9IG5hbWVzKHRhYmxhX2ZyZWN1ZW5jaWEpLA0KICBGcmVjdWVuY2lhID0gYXMudmVjdG9yKHRhYmxhX2ZyZWN1ZW5jaWEpDQopDQoNCiMgTW9zdHJhciBsYSB0YWJsYQ0KdGFibGFfY29tcGxldGEkSW50ZXJ2YWxvIDwtIGFzLmNoYXJhY3Rlcih0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8pDQpwcmludCh0YWJsYV9jb21wbGV0YSkNCg0KDQpgYGANCg0KIyMjIyBIaXN0b2dyYW1hDQoNCmBgYHtyfQ0KaGlzdChob3VzaW5nJG1lZGlhbl9pbmNvbWUsYnJlYWtzID0gMjAsIG1haW49ICJIaXN0b2dyYW1hIGRlbCBpbmdyZXNvIiwNCiAgICAgeGxhYiA9ICJJbmdyZXNvIiwgeWxhYj0nRnJlY3VlbmNpYScpDQoNCmBgYA0KDQojIyMjIEJveFBsb3QNCg0KYGBge3J9DQoNCmJveHBsb3QoaG91c2luZyRtZWRpYW5faW5jb21lLG1haW49IkJveFBsb3QgZGVsIGluZ3Jlc28iLHlsYWI9J3ZhbG9yZXMnKQ0KDQpgYGANCg0KIyMjIE9jZWFuIHByb3h5bWl0eQ0KDQojIyMjIFRhYmxhIGRlIEZyZWN1ZW5jaWFzDQoNCmBgYHtyfQ0KDQp0YWJsYV9mcmVjdWVuY2lhIDwtIHRhYmxlKGhvdXNpbmckb2NlYW5fcHJveGltaXR5KQ0KDQp0YWJsYV9jb21wbGV0YSA8LSBkYXRhLmZyYW1lKA0KICBDYXRlZ29yaWEgPSBuYW1lcyh0YWJsYV9mcmVjdWVuY2lhKSwNCiAgRnJlY3VlbmNpYSA9IGFzLnZlY3Rvcih0YWJsYV9mcmVjdWVuY2lhKQ0KKQ0KDQojIE1vc3RyYXIgbGEgdGFibGENCnRhYmxhX2NvbXBsZXRhJENhdGVnb3JpYSA8LSBhcy5jaGFyYWN0ZXIodGFibGFfY29tcGxldGEkQ2F0ZWdvcmlhKQ0KcHJpbnQodGFibGFfY29tcGxldGEpDQoNCg0KYGBgDQoNCiMjIyMgR3JhZmljbyBkZSBCYXJyYXMNCg0KYGBge3J9DQojIEdyw6FmaWNvIGRlIGJhcnJhcw0KYmFycGxvdCh0YWJsYV9mcmVjdWVuY2lhLA0KICAgICAgICBjb2wgPSAic2t5Ymx1ZSIsDQogICAgICAgIG1haW4gPSAiR3LDoWZpY28gZGUgQmFycmFzIFByb3hpbWlkYWQgYWwgT2NlYW5vIiwNCiAgICAgICAgeGxhYiA9ICJQcm94aW1pZGFkIiwNCiAgICAgICAgeWxhYiA9ICJGcmVjdWVuY2lhIiwNCiAgICAgICAgeWxpbSA9IGMoMCwxMDAwMCksDQogICAgICAgIGNleC5uYW1lcyA9IDAuNykNCg0KYGBgDQoNCiMjIyBWYXJpYWJsZSBhIFByZWRlY2lyOiBNZWRpYW4gSG91c2UgVmFsdWUNCg0KIyMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhcw0KDQpgYGB7cn0NCiMgRGVmaW5pciBsb3MgY29ydGVzDQpicmVha3MgPC0gcHJldHR5KGhvdXNpbmckbWVkaWFuX2hvdXNlX3ZhbHVlLCBuID0gMTAwKQ0KIyBDcmVhciBldGlxdWV0YXMgbnVtP3JpY2FzIGxpbXBpYXMNCmludGVydmFsb3MgPC0gY3V0KGhvdXNpbmckbWVkaWFuX2hvdXNlX3ZhbHVlLCBicmVha3MgPSBicmVha3MsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgcmlnaHQgPSBGQUxTRSkNCiMgQ3JlYXIgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkNCikNCg0KIyBNb3N0cmFyIGxhIHRhYmxhDQp0YWJsYV9jb21wbGV0YSRJbnRlcnZhbG8gPC0gYXMuY2hhcmFjdGVyKHRhYmxhX2NvbXBsZXRhJEludGVydmFsbykNCnByaW50KHRhYmxhX2NvbXBsZXRhKQ0KDQoNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWENCg0KYGBge3J9DQpoaXN0KGhvdXNpbmckbWVkaWFuX2hvdXNlX3ZhbHVlLGJyZWFrcyA9IDEwMCwgbWFpbj0gIkhpc3RvZ3JhbWEgZGVsIHByZWNpbyIsDQogICAgIHhsYWIgPSAiUHJlY2lvIFByb21lZGlvIiwgeWxhYj0nRnJlY3VlbmNpYScpDQoNCmBgYA0KDQojIyMjIEJveFBsb3QNCg0KYGBge3J9DQoNCmJveHBsb3QoaG91c2luZyRtZWRpYW5faG91c2VfdmFsdWUsbWFpbj0iQm94UGxvdCBkZWwgcHJlY2lvIGRlIGxhcyBjYXNhcyIseWxhYj0ndmFsb3JlcycpDQoNCmBgYA0KDQojIyBBbmFsaXNpcyBkZSBSZWdyZXNpw7NuIE11bHRpcGxlDQoNCiMjIyBNYXRyaXogZGUgRGlzcGVyc2nDs24NCg0KYGBge3J9DQpiYXNlIDwtIG5hLm9taXQocmVhZC5jc3YoJ2hvdXNpbmcuY3N2JykpDQpiYXNlJG9jZWFuX3Byb3hpbWl0eTwtYXMuZmFjdG9yKGJhc2Ukb2NlYW5fcHJveGltaXR5KSANCmJhc2VfbnVtZXJpYyA8LSBuYS5vbWl0KHJlYWQuY3N2KCdob3VzaW5nLmNzdicpKQ0KYmFzZV9udW1lcmljJG9jZWFuX3Byb3hpbWl0eTwtYXMuZmFjdG9yKGJhc2Ukb2NlYW5fcHJveGltaXR5KSANCmJhc2VfbnVtZXJpYyRvY2Vhbl9wcm94aW1pdHkgPC0gYXMubnVtZXJpYyhiYXNlJG9jZWFuX3Byb3hpbWl0eSkNCg0KcGxvdChiYXNlX251bWVyaWNbLCBzYXBwbHkoYmFzZV9udW1lcmljLCBpcy5udW1lcmljKV0sbWFpbiA9ICJNYXRyaXogZGUgRGlzcGVyc2nDs24iKQ0KDQpgYGANCg0KLSAgIFNlIHB1ZWRlbiBvYnNlcnZhciB2YXJpYWJsZXMgZG9uZGUgcG9kcsOtYW1vcyB0ZW5lciBwcm9ibGVtYXMsIHByaW5jaXBhbG1lbnRlIGVuIExvbmdpdHVkIHkgTGF0aXR1ZCB5IFRvdGFsX3Jvb21zLCB0b3RhbF9iZWRyb29tcyB5IFBvcHVsYXRpb25zLg0KDQojIyMgQ29ycmVsYWNpw7NuDQoNCmBgYHtyfQ0KY29yX21hdHJpeCA8LSBjb3IoYmFzZV9udW1lcmljWywgc2FwcGx5KGJhc2VfbnVtZXJpYywgaXMubnVtZXJpYyldKQ0KbGlicmFyeShjb3JycGxvdCkNCg0KIyBBanVzdGFyIG3DoXJnZW5lcyBhbnRlcyBkZSBncmFmaWNhcg0KcGFyKG1hciA9IGMoMSwgMSwgNCwgMSkpDQpjb3JycGxvdChjb3JfbWF0cml4LCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIg0KICAgICAgICAgLCB0bC5jZXggPSAwLjgNCiAgICAgICAgICx0aXRsZSA9ICJNYXRyaXogZGUgQ29ycmVsYWNpw7NuIg0KICAgICAgICAgLG1hciA9IGMoMCwwLDIsMCkpDQoNCmBgYA0KDQotICAgSnVzdG8gY29tbyBzZSBjb21lbnTDsyBlbiBsYSBtYXRyaXogZGUgZGlzcGVyc2nDs24sIGxhcyB2YXJpYWJsZXMgbG9uZ2l0dWQgeSBsYXRpdHVkIHkgdG90YWxfcm9vbXMsIHRvdGFsX2JlZHJvb21zLCBwb3B1bGF0aW9zIHkgaG91c2Vob2xkcyB0aWVuZW4gY29ycmVsYWNpw7NuIGVudHJlIHPDrS4NCg0KIyMjIEFuYWxpc2lzIGRlIE11bHRpY29saW5lYWxpZGFkDQoNCkVsIHByaW1lciByZXN1bHRhZG8gZGUgbnVldHJvIGFuw6FsaXNpcyBkZSBtdWx0aWNvbGluZWFsaWRhZCBmdWUgZWwgc2lndWllbnRlOg0KDQpgYGB7cn0NClRvZGFzVmFyPWxtKG1lZGlhbl9ob3VzZV92YWx1ZX4uLGRhdGE9YmFzZSkNCg0KbGlicmFyeSgiY2FyIikNCg0KcHJpbnQodmlmKFRvZGFzVmFyKSkNCg0KYGBgDQoNCkxhIHByaW1lciB2YXJpYmxlIGEgZGVzY2FydGFyIHNlcsOtYSAqKlRvdGFsIEJlZHJvb21zKioNCg0KYGBge3J9DQpwcmludCh2aWYobG0obWVkaWFuX2hvdXNlX3ZhbHVlfmxvbmdpdHVkZSsgbGF0aXR1ZGUgICsgaG91c2luZ19tZWRpYW5fYWdlICsgdG90YWxfcm9vbXMgICsgcG9wdWxhdGlvbitob3VzZWhvbGRzICAgK21lZGlhbl9pbmNvbWUgK29jZWFuX3Byb3hpbWl0eSxkYXRhPWJhc2UpKSkNCg0KYGBgDQoNCkxhIHNlZ3VuZGEgdmFyaWJsZSBhIGRlc2NhcnRhciBzZXLDrWEgKipMYXRpdHVkZSoqDQoNCmBgYHtyfQ0KcHJpbnQodmlmKGxtKG1lZGlhbl9ob3VzZV92YWx1ZX5sb25naXR1ZGUgICsgaG91c2luZ19tZWRpYW5fYWdlICsgdG90YWxfcm9vbXMgICsgcG9wdWxhdGlvbitob3VzZWhvbGRzICAgK21lZGlhbl9pbmNvbWUgK29jZWFuX3Byb3hpbWl0eSxkYXRhPWJhc2UpKSkNCg0KYGBgDQoNCkxhIHVsdGltYSB2YXJpYWJsZSBxdWUgc2UgZGVzY2FydMOzIGZ1ZSAqKmhvdXNlaG9sZHMqKg0KDQpgYGB7cn0NCnByaW50KHZpZihsbShtZWRpYW5faG91c2VfdmFsdWV+bG9uZ2l0dWRlICArIGhvdXNpbmdfbWVkaWFuX2FnZSArIHRvdGFsX3Jvb21zICArIHBvcHVsYXRpb24gICttZWRpYW5faW5jb21lICtvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKSkpDQoNCmBgYA0KDQpRdWVkYW5kbyBlbCBtb2RlbG8gZmluYWwgZGUgbGEgc2lndWllbnRlIG1hbmVyYQ0KDQokJA0KXHRleHR7TWVkaWFuIEhvdXNlIFZhbHVlfSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IFx0ZXh0e2xvbmdpdHVkZX0gKyBcYmV0YV8yIFxjZG90ICBcdGV4dHtob3VzaW5nX21lZGlhbl9hZ2V9IFxcICsgXGJldGFfMyBcY2RvdCBcdGV4dHt0b3RhbF9yb29tc30gKyBcYmV0YV80IFxjZG90IFx0ZXh0e3BvcHVsYXRpb259IFxcICsgXGJldGFfNSBcY2RvdCBcdGV4dHttZWRpYW5faW5jb21lfSArIFxiZXRhXzYgXGNkb3QgXHRleHR7TkVBUl9CQVl9IFxcICsgXGJldGFfNyBcY2RvdCBcdGV4dHtORUFSX09DRUFOfSArIFxiZXRhXzggXGNkb3QgXHRleHR7SU5MQU5EfSArIFxiZXRhXzkgXGNkb3QgXHRleHR7SVNMQU5EfSANCiQkIFwjIyMgQW5hbGlzaXMgZGUgU2lnbmlmaWNhbmNpYSB5IEFqdXN0ZQ0KDQpgYGB7cn0NCk1vZEZpbj1sbShtZWRpYW5faG91c2VfdmFsdWV+bG9uZ2l0dWRlICArIGhvdXNpbmdfbWVkaWFuX2FnZSArIHRvdGFsX3Jvb21zICArIHBvcHVsYXRpb24gICArbWVkaWFuX2luY29tZSArb2NlYW5fcHJveGltaXR5LGRhdGE9YmFzZSkNCg0KcHJpbnQoc3VtbWFyeShNb2RGaW4pKQ0KDQoNCmBgYA0KDQokJA0KSF8wID0gXGJldGFfe2xvbmdpdHVkfSA9IFxiZXRhX3tcdGV4dHtob3VzaW5nX21lZGlhbl9hZ2V9fSA9IFxiZXRhX3tcdGV4dHt0b3RhbF9yb29tc319ICAgPSBcYmV0YV97cG9wdWxhdGlvbn0gID0gXGJldGFfe1x0ZXh0e21lZGlhbl9pbmNvbWV9fSAgPSAgXGJldGFfe1x0ZXh0e29jZWFuX3Byb3hpbWl0eUlOTEFORH19IFxcICA9IFxiZXRhX3tcdGV4dHtvY2Vhbl9wcm94aW1pdHlJU0xBTkR9fSAgPSAgXGJldGFfe1x0ZXh0e29jZWFuX3Byb3hpbWl0eU5FQVIgQkFZfX0gID0gIFxiZXRhX3tcdGV4dHtvY2Vhbl9wcm94aW1pdHlORUFSIE9DRUFOfX0gPSAwDQokJCAkJA0KSF8xIFxuZXEgXGJldGFfe2p9ICAgXHRleHR7IFBhcmEgYWwgbWVub3MgdW5hIHZhcmlibGV9DQokJA0KDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgMC41ODAzLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLg0KDQojIyMgRWN1YWNpw7NuIEZpbmFsIGRlbCBNb2RlbG8NCg0KYGBge3J9DQpzdW1tYXJ5KE1vZEZpbikkY29lZmZpY2llbnRzDQoNCmBgYA0KDQokJA0KXHRleHR7TWVkaWFuIEhvdXNlIFZhbHVlfSA9IC0yMjM5OTguOTMgIC0yMzgwLjMxIFxjZG90IFx0ZXh0e2xvbmdpdHVkZX0gKyA5MjIuMTIgXGNkb3QgIFx0ZXh0e2hvdXNpbmdfbWVkaWFuX2FnZX0gXFwgKyAxMC44OCBcY2RvdCBcdGV4dHt0b3RhbF9yb29tc30gIC0xNi4yIFxjZG90IFx0ZXh0e3BvcHVsYXRpb259ICArICAzMzY5Mi42NiBcY2RvdCBcdGV4dHttZWRpYW5faW5jb21lfSAtMzQ0Ni40IFxjZG90IFx0ZXh0e05FQVJfQkFZfSBcXCArICAxMDg0NC4xMyBcY2RvdCBcdGV4dHtORUFSX09DRUFOfSAgLTc0NjE3LjUwIFxjZG90IFx0ZXh0e0lOTEFORH0gKyAgMTg0ODM4LjQzIFxjZG90IFx0ZXh0e0lTTEFORH0gDQokJA0KDQojIyMgQXBvcnRlIGRlIGNhZGEgdmFyaWFibGUNCg0KfCBWYXJpYWJsZSB8IEFwb3J0YWNpb24gfCBDb21lbnRhcmlvcyB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IC0yMzgwLjMxIExvbmdpdHVkZSB8IE5lZ2F0aXZhIHwgTGEgTG9uZ2l0dWQgdGllbmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGFsIHZhbG9yIGRlIGxhIGNhc2EgfA0KfCA5MjIuMTIgSG91c2luZyBNZWRpYW4gQWdlIHwgUG9zdGl2YSB8IExhIGVkYWQgdGllbmUgdW5hIHJlbGFjacOzbiBkaXJlY3RhIGNvbiBlbCB2YWxvciBkZSBsYSBjYXNhIHwNCnwgKyAxMC44OCBUb3RhbCBSb29tcyB8IFBvc2l0aXZhIHwgTGEgY2FudGlkYWQgZGUgaGFiaXRhY2lvbmVzIGFmZWN0YSBwb3NpdGl2YW1lbnRlIGEgbGEgZWRhZCBkZSBhbCB2YWxvciBkZSBsYSBjYXNhIHwNCnwgLTE2LjJQb3B1bGF0aW9uIHwgTmVnYXRpdmEgfCBMYSBwb2JsYWNpw7NuIGFmZWN0YSBpbnZlcnNhbWVudGUgYWwgdmFsb3IgZGUgbGEgY2FzYSB8DQp8IDMzNjkyLjY2IE1lZGlhbiBJbmNvbWUgfCBQb3NpdGl2YSB8IEVsIGluZ3Jlc28gYWZlY3RhIGRlIG1hbmVyYSBkaXJlY3RhIGFsIHZhbG9yIGRlIGxhIGNhc2EgfA0KfCAtMzQ0Ni40IE9jZWFuIFByb3hpbWl0eSBJTkxBTkQgfCBOZWdhdGl2YSB8IEN1YW5kbyBsYSBwcm94aW1pZGFkIGFsIG9jw6lhbm8gc2UgZW5jdWVudHJhIGVuIGxhIGNhdGVnb3LDrWEgSU5MQU5EIGFmZWN0YSBkZSBtYW5lcmEgaW52ZXJzYSBhbCB2YWxvciBkZSBsYSBjYXNhIHwNCnwgLTc0NjE3LjUwIE9jZWFuIFByb3hpbWl0eSBJU0xBTkQgfCBQb3NpdGl2YSB8IEN1YW5kbyBzZSBlbmN1ZW50cmEgZW4gbGEgY2F0ZWdvcsOtYSBJU0xBTkQgYWZlY3RhIGRlIG1hbmVyYSBkaXJlY3RhIHwNCnwgIDE4NDgzOC40MyBPY2VhbiBQcm94aW1pdHkgTmVhciBiYXkgfCBQb3NpdGl2YSB8IEN1YW5kbyBzZSBlbmN1ZW50cmEgY2VyY2EgZGUgbGEgYmFow61hIGFmZWN0YSBkZSBtYW5lcmEgZGlyZWN0YSBhbCB2YWxvciBkZSBsYSBjYXNhIHwNCnwxMDg0NC4xT2NlYW4gUHJveGltaXR5IE5lYXIgT2NlYW4gfCBQb3NpdGl2YSB8IEN1YW5kbyBzZSBlbmN1ZW50cmEgY2VyY2EgZGVsIG9jZWFubyBhZmVjdGEgZGUgbWFuZXJhIGRpcmVjdGEgYWwgdmFsb3IgZGUgbGEgY2FzYSB8DQoNCiMjIyBSZWdyZXNpb25lcyBQb3NpYmxlcw0KDQpgYGB7cn0NCmxpYnJhcnkob2xzcnIpDQp0b2Rvczwtb2xzX3N0ZXBfYWxsX3Bvc3NpYmxlKGxtKG1lZGlhbl9ob3VzZV92YWx1ZX5sb25naXR1ZGUgICsgaG91c2luZ19tZWRpYW5fYWdlICsgdG90YWxfcm9vbXMgICsgcG9wdWxhdGlvbiAgICttZWRpYW5faW5jb21lICtvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKSkNCk1vZGVsb3MgPC0gdG9kb3MkcmVzdWx0DQpoZWFkKE1vZGVsb3Nbb3JkZXIoLU1vZGVsb3MkYWRqciksXSwxMCkNCmBgYA0KDQpFbCBtb2RlbG8gY29uIG1lam9yIGFqdXN0ZSBmdWU6ICQkDQpcdGV4dHtNZWRpYW4gSG91c2UgVmFsdWV9ID0gLTIyMzk5OC45MyAgLTIzODAuMzEgXGNkb3QgXHRleHR7bG9uZ2l0dWRlfSArIDkyMi4xMiBcY2RvdCAgXHRleHR7aG91c2luZ19tZWRpYW5fYWdlfSBcXCArIDEwLjg4IFxjZG90IFx0ZXh0e3RvdGFsX3Jvb21zfSAgLTE2LjIgXGNkb3QgXHRleHR7cG9wdWxhdGlvbn0gICsgIDMzNjkyLjY2IFxjZG90IFx0ZXh0e21lZGlhbl9pbmNvbWV9IC0zNDQ2LjQgXGNkb3QgXHRleHR7TkVBUl9CQVl9IFxcICsgIDEwODQ0LjEzIFxjZG90IFx0ZXh0e05FQVJfT0NFQU59ICAtNzQ2MTcuNTAgXGNkb3QgXHRleHR7SU5MQU5EfSArICAxODQ4MzguNDMgXGNkb3QgXHRleHR7SVNMQU5EfSANCiQkDQoNCmBgYHtyfQ0KbW0gPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlfmxvbmdpdHVkZSAgKyBob3VzaW5nX21lZGlhbl9hZ2UrIHRvdGFsX3Jvb21zICArIHBvcHVsYXRpb24gICArbWVkaWFuX2luY29tZSArb2NlYW5fcHJveGltaXR5LGRhdGE9YmFzZSkNCnN1bW1hcnkobW0pDQpjb25maW50KG1tKQ0KDQpgYGANCg0KJCQNCkhfMCA9IFxiZXRhX3tsb25naXR1ZH0gPSBcYmV0YV97XHRleHR7aG91c2luZ19tZWRpYW5fYWdlfX0gPSBcYmV0YV97XHRleHR7dG90YWxfcm9vbXN9fSAgID0gXGJldGFfe3BvcHVsYXRpb259ICA9IFxiZXRhX3tcdGV4dHttZWRpYW5faW5jb21lfX0gID0gIFxiZXRhX3tcdGV4dHtvY2Vhbl9wcm94aW1pdHlJTkxBTkR9fSBcXCAgPSBcYmV0YV97XHRleHR7b2NlYW5fcHJveGltaXR5SVNMQU5EfX0gID0gIFxiZXRhX3tcdGV4dHtvY2Vhbl9wcm94aW1pdHlORUFSIEJBWX19ICA9ICBcYmV0YV97XHRleHR7b2NlYW5fcHJveGltaXR5TkVBUiBPQ0VBTn19ID0gMA0KJCQgJCQNCkhfMSBcbmVxIFxiZXRhX3tqfSAgIFx0ZXh0eyBQYXJhIGFsIG1lbm9zIHVuYSB2YXJpYmxlfQ0KJCQNCg0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlIDAuNjEyMSwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbSkNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9NjI5MjApDQpgYGANCg0KDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBhIHRyYW5zZm9ybWFyIG51ZXN0cmEgdmFyaWFibGUNCg0KYGBge3J9DQogbW0gPC0gbG0oc3FydChtZWRpYW5faG91c2VfdmFsdWUpfmxvbmdpdHVkZSAgKyBob3VzaW5nX21lZGlhbl9hZ2UgKyB0b3RhbF9yb29tcyAgKyBwb3B1bGF0aW9uICAgK21lZGlhbl9pbmNvbWUgK29jZWFuX3Byb3hpbWl0eSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tKQ0KY29uZmludChtbSkNCg0KDQpgYGANCiQkDQpIXzAgPSAgXGJldGFfe1x0ZXh0e2hvdXNpbmdfbWVkaWFuX2FnZX19ID0gXGJldGFfe1x0ZXh0e3RvdGFsX3Jvb21zfX0gICA9IFxiZXRhX3twb3B1bGF0aW9ufSAgPSBcYmV0YV97XHRleHR7bWVkaWFuX2luY29tZX19ICA9ICBcYmV0YV97XHRleHR7b2NlYW5fcHJveGltaXR5SU5MQU5EfX0gXFwgID0gXGJldGFfe1x0ZXh0e29jZWFuX3Byb3hpbWl0eUlTTEFORH19ICA9ICBcYmV0YV97XHRleHR7b2NlYW5fcHJveGltaXR5TkVBUiBCQVl9fSAgPSAgXGJldGFfe1x0ZXh0e29jZWFuX3Byb3hpbWl0eU5FQVIgT0NFQU59fSA9IDANCiQkICQkDQpIXzEgXG5lcSBcYmV0YV97an0gICBcdGV4dHsgUGFyYSBhbCBtZW5vcyB1bmEgdmFyaWJsZX0NCiQkDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgMC42MzM2LCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD03NC4yNSkNCmBgYA0KDQoNClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCB0ZXJjZXIgbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlsb25naXR1ZGUgaG91c2luZ19tZWRpYW5fYWdlIHRvdGFsX3Jvb21zIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbSA8LSBsbShtZWRpYW5faG91c2VfdmFsdWV+bG9uZ2l0dWRlICsgaG91c2luZ19tZWRpYW5fYWdlICsgdG90YWxfcm9vbXMgICAgICttZWRpYW5faW5jb21lICtvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbSkNCmNvbmZpbnQobW0pDQoNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlIDAuNjAxNiwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbSkNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9NzI4NjApDQpgYGANCg0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIGN1YXJ0byBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSB0b3RhbF9yb29tcyBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbSA8LSBsbShzcXJ0KG1lZGlhbl9ob3VzZV92YWx1ZSl+bG9uZ2l0dWRlICArIHRvdGFsX3Jvb21zICtwb3B1bGF0aW9uICAgICttZWRpYW5faW5jb21lICtvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbSkNCmNvbmZpbnQobW0pDQoNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlIDAuNjAwNiwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbSkNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9NzQuOTYpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCBxdWludG8gbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlob3VzaW5nX21lZGlhbl9hZ2UgdG90YWxfcm9vbXMgbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZX5ob3VzaW5nX21lZGlhbl9hZ2UrIHRvdGFsX3Jvb21zKyBtZWRpYW5faW5jb21lKyBvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbSkNCmNvbmZpbnQobW0pDQoNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlIDAuNjAwNSAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0pDQprcy50ZXN0KHIscG5vcm0sbWVhbj0wLHNkPTcyOTYwKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBjb24gZWwgc2V4dG8gbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwl0b3RhbF9yb29tcyBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTEgPC0gbG0oc3FydChtZWRpYW5faG91c2VfdmFsdWUpfnRvdGFsX3Jvb21zKyBwb3B1bGF0aW9uKyBtZWRpYW5faW5jb21lKyBvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTEpDQpjb25maW50KG1tMSkNCg0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUwLjU5OTcgICwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbTEpDQprcy50ZXN0KHIscG5vcm0sbWVhbj0wLHNkPTc1LjA1KQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBjb24gZWwgc2VwdGltbyBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tMSA8LSBsbShtZWRpYW5faG91c2VfdmFsdWV+bG9uZ2l0dWRlICtob3VzaW5nX21lZGlhbl9hZ2UrIG1lZGlhbl9pbmNvbWUrIG9jZWFuX3Byb3hpbWl0eSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMSkNCmNvbmZpbnQobW0xKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgMC41OTc5ICAgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KbGlicmFyeShub3J0ZXN0KQ0KcjwtcmVzaWR1YWxzKG1tMSkNCmxpbGxpZS50ZXN0KHIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCBvY3Rhdm9zIG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTEgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlfiBsb25naXR1ZGUrIGhvdXNpbmdfbWVkaWFuX2FnZSsgcG9wdWxhdGlvbisgbWVkaWFuX2luY29tZSsgb2NlYW5fcHJveGltaXR5LGRhdGE9YmFzZSkNCnN1bW1hcnkobW0xKQ0KY29uZmludChtbTEpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAwLjU5NzggICAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpsaWJyYXJ5KG5vcnRlc3QpDQpyPC1yZXNpZHVhbHMobW0xKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD03MzIwMCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIG9jdGF2b3MgbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlsb25naXR1ZGUgaG91c2luZ19tZWRpYW5fYWdlIHBvcHVsYXRpb24gbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tMiA8LSBsbShtZWRpYW5faG91c2VfdmFsdWUgfiBtZWRpYW5faW5jb21lICtvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlIDAuNTg4ICAgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMSkNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9NzQwOTApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCBvY3Rhdm9zIG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH5sb25naXR1ZGUraG91c2luZ19tZWRpYW5fYWdlK3RvdGFsX3Jvb21zKw0KICAgICAgICAgICAgcG9wdWxhdGlvbittZWRpYW5faW5jb21lLGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAwLjUxNzIsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD04MDIxMCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIGRlY2ltbyBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+aG91c2luZ19tZWRpYW5fYWdlK21lZGlhbl9pbmNvbWUrb2NlYW5fcHJveGltaXR5LGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAwLjUxNzIsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD04MDIxMCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDExIG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH5sb25naXR1ZGUrcG9wdWxhdGlvbittZWRpYW5faW5jb21lK29jZWFuX3Byb3hpbWl0eSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNTg5OCAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD03OTkzMCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDEyIG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH5sb25naXR1ZGUrdG90YWxfcm9vbXMrbWVkaWFuX2luY29tZStvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjU4OTcgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9NzM5NDApDQpgYGANCg0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDEzIG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH5sb25naXR1ZGUrbWVkaWFuX2luY29tZStvY2Vhbl9wcm94aW1pdHksZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjU4OTEgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9NzM5OTApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAxNCBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+dG90YWxfcm9vbXPCoG1lZGlhbl9pbmNvbWXCoG9jZWFuX3Byb3hpbWl0eSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNTg5MSAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD03Mzk5MCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDE2IG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH4gbG9uZ2l0dWRlK2hvdXNpbmdfbWVkaWFuX2FnZSt0b3RhbF9yb29tcytwb3B1bGF0aW9uK21lZGlhbl9pbmNvbWUgLGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAgMC41MTcyICwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbTIpDQprcy50ZXN0KHIscG5vcm0sbWVhbj0wLHNkPTgwMjEwKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBjb24gZWwgMTcgbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlsb25naXR1ZGUgaG91c2luZ19tZWRpYW5fYWdlIHBvcHVsYXRpb24gbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tMiA8LSBsbShtZWRpYW5faG91c2VfdmFsdWUgfmhvdXNpbmdfbWVkaWFuX2FnZSt0b3RhbF9yb29tcytwb3B1bGF0aW9uK21lZGlhbl9pbmNvbWUsZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjUxNzEgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9ODAyMTApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAxOCBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+bG9uZ2l0dWRlK2hvdXNpbmdfbWVkaWFuX2FnZSt0b3RhbF9yb29tcyttZWRpYW5faW5jb21lLGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAgMC41MTQyICwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbTIpDQprcy50ZXN0KHIscG5vcm0sbWVhbj0wLHNkPTgwNDYwKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBjb24gZWwgMTkgbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlsb25naXR1ZGUgaG91c2luZ19tZWRpYW5fYWdlIHBvcHVsYXRpb24gbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tMiA8LSBsbShtZWRpYW5faG91c2VfdmFsdWUgfmhvdXNpbmdfbWVkaWFuX2FnZSt0b3RhbF9yb29tcyttZWRpYW5faW5jb21lLGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAgMC41MTQgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9ODA0NzApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAyMCBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+bG9uZ2l0dWRlK2hvdXNpbmdfbWVkaWFuX2FnZStwb3B1bGF0aW9uK21lZGlhbl9pbmNvbWUsZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjUxMDYgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9ODA3NjApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAyMSBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+aG91c2luZ19tZWRpYW5fYWdlK3BvcHVsYXRpb24rbWVkaWFuX2luY29tZSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNTEwNCAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD04MDc3MCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDIyIG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH5sb25naXR1ZGUraG91c2luZ19tZWRpYW5fYWdlK21lZGlhbl9pbmNvbWUsZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjUwOTcgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9ODA4MzApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAyMyBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+aG91c2luZ19tZWRpYW5fYWdlK21lZGlhbl9pbmNvbWUsZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjUwOTYgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9Nzk5MzApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAyNCBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+bG9uZ2l0dWRlK3RvdGFsX3Jvb21zK3BvcHVsYXRpb24rbWVkaWFuX2luY29tZSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNDc3NCAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD03OTkzMCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDI1IG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH50b3RhbF9yb29tcytwb3B1bGF0aW9uK21lZGlhbl9pbmNvbWUsZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjQ3NTcgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9ODM1MTApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAyNiBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+bG9uZ2l0dWRlK3BvcHVsYXRpb24rbWVkaWFuX2luY29tZSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNDc1NyAsIHBvZHLDrWFtb3MgY29uc2lkZXJhciB1biBhanVzdGUgbW9kZXJhZG8uIE5vIHNlIGFwcmVjaWEgUmVncmVzacOzbiBhbCBvcmlnZW4NCg0KIyMjIyBTdXB1ZXN0b3MgZGUgbG9zIFJlc2lkdWFsZXMNCg0KKipOb3JtYWxpZGFkIHkgTWVkaWEgY2VybyoqDQoNCiRIXzAkOiByZXNpZHVhbGVzIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQokSF8xJDogcmVzaWR1YWxlcyBubyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KYGBge3J9DQpyPC1yZXNpZHVhbHMobW0yKQ0Ka3MudGVzdChyLHBub3JtLG1lYW49MCxzZD04MzU5MCkNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgbG9zIHJlc2lkdWFsZXMgbm8gdGllbmVuIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvLiBQb3IgbG8gcXVlIHByb2NlZGVtb3MgY29uIGVsIDI3IG1lam9yIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH5sb25naXR1ZGUrbWVkaWFuX2luY29tZSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNDc1ICwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbTIpDQpsaWxsaWUudGVzdChyKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBjb24gZWwgMjggbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlsb25naXR1ZGUgaG91c2luZ19tZWRpYW5fYWdlIHBvcHVsYXRpb24gbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tMiA8LSBsbShtZWRpYW5faG91c2VfdmFsdWUgfmxvbmdpdHVkZSt0b3RhbF9yb29tcyttZWRpYW5faW5jb21lLGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAgMC40NzUgLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmtzLnRlc3Qocixwbm9ybSxtZWFuPTAsc2Q9ODM2NDApDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlbW9zIGNvbiBlbCAyOSBtZWpvciBtb2RlbG8NCg0KYGBge3J9DQojCWxvbmdpdHVkZSBob3VzaW5nX21lZGlhbl9hZ2UgcG9wdWxhdGlvbiBtZWRpYW5faW5jb21lIG9jZWFuX3Byb3hpbWl0eQ0KbW0yIDwtIGxtKG1lZGlhbl9ob3VzZV92YWx1ZSB+cG9wdWxhdGlvbittZWRpYW5faW5jb21lLGRhdGE9YmFzZSkNCnN1bW1hcnkobW0yKQ0KY29uZmludChtbTIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgcXVlIGFsZ3VuYSB2YXJpYWJsZSBzZWEgc2lnbmlmaWNhdGl2YQ0KDQpFbCBtb2RlbG8gY3VlbnRhIGNvbiB1biAkUl4yJCBBanVzdGFkbyBkZSAgMC40NzQ2ICwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbTIpDQpsaWxsaWUudGVzdChyKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyB0aWVuZW4gZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8uIFBvciBsbyBxdWUgcHJvY2VkZW1vcyBjb24gZWwgMzAgbWVqb3IgbW9kZWxvDQoNCmBgYHtyfQ0KIwlsb25naXR1ZGUgaG91c2luZ19tZWRpYW5fYWdlIHBvcHVsYXRpb24gbWVkaWFuX2luY29tZSBvY2Vhbl9wcm94aW1pdHkNCm1tMiA8LSBsbShtZWRpYW5faG91c2VfdmFsdWUgfm1lZGlhbl9pbmNvbWUsZGF0YT1iYXNlKQ0Kc3VtbWFyeShtbTIpDQpjb25maW50KG1tMikNCmBgYA0KUmVjaGF6byAkSF8wJCBzaSBwLSB2YWxvciBcPCDOsSwgZGFkbyBxdWUgbnVlc3RybyBwLXZhbG9yIGVzIGlndWFsIGEgJDIuMiBcdGltZXMgMTBeey0xNn0kIGNvbmNsdWltb3MgcXVlIHNlIHJlY2hhemEgJEhfMCQsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBxdWUgYWxndW5hIHZhcmlhYmxlIHNlYSBzaWduaWZpY2F0aXZhDQoNCkVsIG1vZGVsbyBjdWVudGEgY29uIHVuICRSXjIkIEFqdXN0YWRvIGRlICAwLjQ3MzggLCBwb2Ryw61hbW9zIGNvbnNpZGVyYXIgdW4gYWp1c3RlIG1vZGVyYWRvLiBObyBzZSBhcHJlY2lhIFJlZ3Jlc2nDs24gYWwgb3JpZ2VuDQoNCiMjIyMgU3VwdWVzdG9zIGRlIGxvcyBSZXNpZHVhbGVzDQoNCioqTm9ybWFsaWRhZCB5IE1lZGlhIGNlcm8qKg0KDQokSF8wJDogcmVzaWR1YWxlcyBwcm92aWVuZW4gZGUgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIG1lZGlhIGNlcm8NCg0KJEhfMSQ6IHJlc2lkdWFsZXMgbm8gcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCmBgYHtyfQ0KcjwtcmVzaWR1YWxzKG1tMikNCmxpbGxpZS50ZXN0KHIpDQpgYGANClJlY2hhem8gJEhfMCQgc2kgcC0gdmFsb3IgXDwgzrEsIGRhZG8gcXVlIG51ZXN0cm8gcC12YWxvciBlcyBpZ3VhbCBhICQyLjIgXHRpbWVzIDEwXnstMTZ9JCBjb25jbHVpbW9zIHF1ZSBzZSByZWNoYXphICRIXzAkLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxvcyByZXNpZHVhbGVzIG5vIHRpZW5lbiBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vyby4gUG9yIGxvIHF1ZSBwcm9jZWRlZXJlbW9zIGNvbiB0cmFuc2Zvcm1hY2lvbmVzIGFsIG1vZGVsbw0KDQpgYGB7cn0NCiMJbG9uZ2l0dWRlIGhvdXNpbmdfbWVkaWFuX2FnZSBwb3B1bGF0aW9uIG1lZGlhbl9pbmNvbWUgb2NlYW5fcHJveGltaXR5DQptbTIgPC0gbG0obWVkaWFuX2hvdXNlX3ZhbHVlIH4gcG9seShtZWRpYW5faW5jb21lLCAzLCByYXcgPSBUUlVFKSxkYXRhPWJhc2UpDQpzdW1tYXJ5KG1tMikNCmNvbmZpbnQobW0yKQ0KYGBgDQpSZWNoYXpvICRIXzAkIHNpIHAtIHZhbG9yIFw8IM6xLCBkYWRvIHF1ZSBudWVzdHJvIHAtdmFsb3IgZXMgaWd1YWwgYSAkMi4yIFx0aW1lcyAxMF57LTE2fSQgY29uY2x1aW1vcyBxdWUgc2UgcmVjaGF6YSAkSF8wJCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIHF1ZSBhbGd1bmEgdmFyaWFibGUgc2VhIHNpZ25pZmljYXRpdmENCg0KRWwgbW9kZWxvIGN1ZW50YSBjb24gdW4gJFJeMiQgQWp1c3RhZG8gZGUgIDAuNDM0ICwgcG9kcsOtYW1vcyBjb25zaWRlcmFyIHVuIGFqdXN0ZSBtb2RlcmFkby4gTm8gc2UgYXByZWNpYSBSZWdyZXNpw7NuIGFsIG9yaWdlbg0KDQojIyMjIFN1cHVlc3RvcyBkZSBsb3MgUmVzaWR1YWxlcw0KDQoqKk5vcm1hbGlkYWQgeSBNZWRpYSBjZXJvKioNCg0KJEhfMCQ6IHJlc2lkdWFsZXMgcHJvdmllbmVuIGRlIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbiBtZWRpYSBjZXJvDQoNCiRIXzEkOiByZXNpZHVhbGVzIG5vIHByb3ZpZW5lbiBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgY2Vybw0KDQpgYGB7cn0NCnI8LXJlc2lkdWFscyhtbTIpDQpsaWxsaWUudGVzdChyKQ0KYGBgDQojIyBQcnVlYmFzIGRlIEJvbmRhZCBkZSBBanVzdGUNCiMjIyBsYXRpdHVkIA0KUGVyYSBsYSBsYXRpZHVkIHVzYXJlbW9zIGNvbW8gZGlzdHJpYnVjacOzbiBzb3NwZWNoYWRhIGxhIGxvZy1ub3JtYWwuIEVtcGV6YW1vcyBkZWZpbmllbmRvIGxvcyBwYXJhbWV0cm9zIGVzdGltYWRvcyBtZWRpYW50ZSBlc3RpbWFjacOzbiBwb3IgbWF4aW1hIHZlcm9zaW1pbGl0dWQgDQpgYGB7cn0NCmhoPC1iYXNlJGxhdGl0dWRlDQojRXN0aW1hY2nDs24gZGUgUGFyYW1ldHJvcw0KI2luc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpICAjIFNpIG5vIGxvIHRpZW5lcw0KbGlicmFyeShmaXRkaXN0cnBsdXMpDQojIEVzdGltYWNpw7NuIGRlIHBhcsOhbWV0cm9zIGRlIGxhIGxvZ25vcm0NCmFqdXN0ZSA8LSBmaXRkaXN0KGhoLCAibG5vcm0iKQ0KcHJpbnQoYWp1c3RlKQ0KDQpgYGANCiRIXzAkOiBMYSB2YXJpYWJsZSBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KJEhfMSQ6IExhIHZhcmlhYmxlIG5vIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nIG5vcm1hbA0KDQpgYGB7cn0NCmJyZWFrcyA8LSBwcmV0dHkoaGgsIG4gPSAxMCkNCmludGVydmFsb3M9Y3V0KGhoLGJyZWFrcz1icmVha3MpDQp0YWJsYV9mcmVjdWVuY2lhIDwtIHRhYmxlKGludGVydmFsb3MpDQojR2VuZXJhbW9zIG51ZXN0cmEgcHJvYmFiaWxpZGFkIHBvciBpbnRlcnZhbG8NClByb2JzPC1kaWZmKHBsbm9ybShicmVha3MsbWVhbmxvZyA9IDMuNTcyMDU0ODUsIHNkbG9nID0gMC4wNTk2MzQxMSApKQ0KY29sYV9pbmZpbml0byA8LTEgLSAgcGxub3JtKG1heChicmVha3MpLG1lYW5sb2cgPSAzLjU3MjA1NDg1LCBzZGxvZyA9IDAuMDU5NjM0MTEgKQ0KIyBTdW1hciBsYSBjb2xhIGFsIMO6bHRpbW8gaW50ZXJ2YWxvIA0KUHJvYnNbbGVuZ3RoKFByb2JzKV0gPC0gUHJvYnNbbGVuZ3RoKFByb2JzKV0gKyBjb2xhX2luZmluaXRvIA0KbiAgPC0gbGVuZ3RoKGhoKQ0KZXNwZXJhZGFzIDwtIFByb2JzICogbiANCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkpDQojUHJ1ZWJhIGRlIEJvbmRhZCANCmNoaXNxLnRlc3QodGFibGFfY29tcGxldGEkRnJlY3VlbmNpYSxlc3BlcmFkYXMpDQpgYGANClJlY2hhemFtb3MgSDAgc2kgUC1WYWxvciDiiaQgzrEsIHRvbWFtb3MgdW4gzrEgPTAuMDUsIHBvciBsbyB0YW50byBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBubyByZWNoYXphbW9zIEgwLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nbm9ybWFsDQoNCiMjIyBsb25naXR1ZA0KUGVyYSBsYSBsb25naXR1ZCB1c2FyZW1vcyBjb21vIGRpc3RyaWJ1Y2nDs24gc29zcGVjaGFkYSBsYSBub3JtYWwuIEVtcGV6YW1vcyBkZWZpbmllbmRvIGxvcyBwYXJhbWV0cm9zIGVzdGltYWRvcyBtZWRpYW50ZSBlc3RpbWFjacOzbiBwb3IgbWF4aW1hIHZlcm9zaW1pbGl0dWQgDQpgYGB7cn0NCmhoPC1iYXNlJGxvbmdpdHVkZQ0KI0VzdGltYWNpw7NuIGRlIFBhcmFtZXRyb3MNCiNpbnN0YWxsLnBhY2thZ2VzKCJmaXRkaXN0cnBsdXMiKSAgIyBTaSBubyBsbyB0aWVuZXMNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KIyBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvcyBkZSBsYSBsb2dub3JtDQphanVzdGUgPC0gZml0ZGlzdChoaCwgIm5vcm0iKQ0KcHJpbnQoYWp1c3RlKQ0KDQpgYGANCiRIXzAkOiBMYSB2YXJpYWJsZSBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KJEhfMSQ6IExhIHZhcmlhYmxlIG5vIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nIG5vcm1hbA0KDQpgYGB7cn0NCmJyZWFrcyA8LSBwcmV0dHkoaGgsIG4gPSA1MCkNCmludGVydmFsb3M9Y3V0KGhoLGJyZWFrcz1icmVha3MpDQp0YWJsYV9mcmVjdWVuY2lhIDwtIHRhYmxlKGludGVydmFsb3MpDQojR2VuZXJhbW9zIG51ZXN0cmEgcHJvYmFiaWxpZGFkIHBvciBpbnRlcnZhbG8NClByb2JzPC1kaWZmKHBub3JtKGJyZWFrcyxtZWFuID0gLTExOS41NjM0ODUJLCBzZCA9IDIuMDA1ODM4ICkpDQpjb2xhX2luZmluaXRvIDwtMSAtICBwbG5vcm0obWF4KGJyZWFrcyksbWVhbmxvZyA9IC0xMTkuNTYzNDg1LCBzZGxvZyA9IDIuMDA1ODM4ICkNCiMgU3VtYXIgbGEgY29sYSBhbCDDumx0aW1vIGludGVydmFsbyANClByb2JzW2xlbmd0aChQcm9icyldIDwtIFByb2JzW2xlbmd0aChQcm9icyldICsgY29sYV9pbmZpbml0byANCm4gIDwtIGxlbmd0aChoaCkNCmVzcGVyYWRhcyA8LSBQcm9icyAqIG4gDQoNCnRhYmxhX2NvbXBsZXRhIDwtIGRhdGEuZnJhbWUoDQogIEludGVydmFsbyA9IG5hbWVzKHRhYmxhX2ZyZWN1ZW5jaWEpLA0KICBGcmVjdWVuY2lhID0gYXMudmVjdG9yKHRhYmxhX2ZyZWN1ZW5jaWEpKQ0KI1BydWViYSBkZSBCb25kYWQgDQpjaGlzcS50ZXN0KHRhYmxhX2NvbXBsZXRhJEZyZWN1ZW5jaWEsZXNwZXJhZGFzLHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKQ0KYGBgDQpSZWNoYXphbW9zIEgwIHNpIFAtVmFsb3Ig4omkIM6xLCB0b21hbW9zIHVuIM6xID0wLjA1LCBwb3IgbG8gdGFudG8gcG9kZW1vcyBjb25jbHVpciBxdWUgcmVjaGF6YW1vcyBIMCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBubyBzZSBkaXN0cmlidXllIGRlIGZvcm1hIG5vcm1hbA0KDQojIyMgSG91c2luZyBNZWRpYW4gQWdlDQpQZXJhIGxhIHZhcmlhYmxlIGhvdXNpbmcgbWVkaWFuIGFnZSB1c2FyZW1vcyBjb21vIGRpc3RyaWJ1Y2nDs24gc29zcGVjaGFkYSBsYSBub3JtYWwuIEVtcGV6YW1vcyBkZWZpbmllbmRvIGxvcyBwYXJhbWV0cm9zIGVzdGltYWRvcyBtZWRpYW50ZSBlc3RpbWFjacOzbiBwb3IgbWF4aW1hIHZlcm9zaW1pbGl0dWQgDQpgYGB7cn0NCmhoPC1iYXNlJGhvdXNpbmdfbWVkaWFuX2FnZQ0KI0VzdGltYWNpw7NuIGRlIFBhcmFtZXRyb3MNCiNpbnN0YWxsLnBhY2thZ2VzKCJmaXRkaXN0cnBsdXMiKSAgIyBTaSBubyBsbyB0aWVuZXMNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KIyBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvcyBkZSBsYSBsb2dub3JtDQphanVzdGUgPC0gZml0ZGlzdChoaCwgIm5vcm0iKQ0KcHJpbnQoYWp1c3RlKQ0KDQpgYGANCiRIXzAkOiBMYSB2YXJpYWJsZSBzZSBkaXN0cmlidXllIGRlIGZvcm1hIG5vcm1hbA0KDQokSF8xJDogTGEgdmFyaWFibGUgbm8gc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBub3JtYWwNCg0KYGBge3J9DQpicmVha3MgPC0gcHJldHR5KGhoLCBuID0gMjApDQppbnRlcnZhbG9zPWN1dChoaCxicmVha3M9YnJlYWtzKQ0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShpbnRlcnZhbG9zKQ0KI0dlbmVyYW1vcyBudWVzdHJhIHByb2JhYmlsaWRhZCBwb3IgaW50ZXJ2YWxvDQpQcm9iczwtZGlmZihwbm9ybShicmVha3MsbWVhbiA9IDI4LjM2NDcyLCBzZCA9IDEyLjUwOTk0ICkpDQpjb2xhX2luZmluaXRvIDwtMSAtICBwbm9ybShtYXgoYnJlYWtzKSxtZWFuPSAyOC4zNjQ3Miwgc2QgPSAxMi41MDk5NCApDQojIFN1bWFyIGxhIGNvbGEgYWwgw7psdGltbyBpbnRlcnZhbG8gDQpQcm9ic1tsZW5ndGgoUHJvYnMpXSA8LSBQcm9ic1tsZW5ndGgoUHJvYnMpXSArIGNvbGFfaW5maW5pdG8gDQpuICA8LSBsZW5ndGgoaGgpDQplc3BlcmFkYXMgPC0gUHJvYnMgKiBuIA0KDQp0YWJsYV9jb21wbGV0YSA8LSBkYXRhLmZyYW1lKA0KICBJbnRlcnZhbG8gPSBuYW1lcyh0YWJsYV9mcmVjdWVuY2lhKSwNCiAgRnJlY3VlbmNpYSA9IGFzLnZlY3Rvcih0YWJsYV9mcmVjdWVuY2lhKSkNCiNQcnVlYmEgZGUgQm9uZGFkIA0KY2hpc3EudGVzdCh0YWJsYV9jb21wbGV0YSRGcmVjdWVuY2lhLGVzcGVyYWRhcykNCmBgYA0KUmVjaGF6YW1vcyBIMCBzaSBQLVZhbG9yIOKJpCDOsSwgdG9tYW1vcyB1biDOsSA9MC4wNSwgcG9yIGxvIHRhbnRvIHBvZGVtb3MgY29uY2x1aXIgcXVlIG5vIHJlY2hhemFtb3MgSDAsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBub3JtYWwNCg0KIyMjIFRvdGFsIFJvb21zIA0KUGVyYSBsYSB2YXJpYmFsZSB0b3RhbCByb29tcyB1c2FyZW1vcyBjb21vIGRpc3RyaWJ1Y2nDs24gc29zcGVjaGFkYSBsYSBsb2ctbm9ybWFsLiBFbXBlemFtb3MgZGVmaW5pZW5kbyBsb3MgcGFyYW1ldHJvcyBlc3RpbWFkb3MgbWVkaWFudGUgZXN0aW1hY2nDs24gcG9yIG1heGltYSB2ZXJvc2ltaWxpdHVkIA0KYGBge3J9DQpoaDwtYmFzZSR0b3RhbF9yb29tcw0KI0VzdGltYWNpw7NuIGRlIFBhcmFtZXRyb3MNCiNpbnN0YWxsLnBhY2thZ2VzKCJmaXRkaXN0cnBsdXMiKSAgIyBTaSBubyBsbyB0aWVuZXMNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KIyBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvcyBkZSBsYSBsb2dub3JtDQphanVzdGUgPC0gZml0ZGlzdChoaCwgImxub3JtIikNCnByaW50KGFqdXN0ZSkNCg0KYGBgDQokSF8wJDogTGEgdmFyaWFibGUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2cgbm9ybWFsDQoNCiRIXzEkOiBMYSB2YXJpYWJsZSBubyBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KYGBge3J9DQpicmVha3MgPC0gcHJldHR5KGhoLCBuID0gNTApDQppbnRlcnZhbG9zPWN1dChoaCxicmVha3M9YnJlYWtzKQ0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShpbnRlcnZhbG9zKQ0KI0dlbmVyYW1vcyBudWVzdHJhIHByb2JhYmlsaWRhZCBwb3IgaW50ZXJ2YWxvDQpQcm9iczwtZGlmZihwbG5vcm0oYnJlYWtzLG1lYW5sb2cgPSA3LjYyMjcyNywgc2Rsb2cgPSAwLjc1MDA4MCApKQ0KY29sYV9pbmZpbml0byA8LTEgLSAgcGxub3JtKG1heChicmVha3MpLG1lYW5sb2cgPSA3LjYyMjcyNywgc2Rsb2cgPSAwLjc1MDA4MCApDQojIFN1bWFyIGxhIGNvbGEgYWwgw7psdGltbyBpbnRlcnZhbG8gDQpQcm9ic1tsZW5ndGgoUHJvYnMpXSA8LSBQcm9ic1tsZW5ndGgoUHJvYnMpXSArIGNvbGFfaW5maW5pdG8gDQpuICA8LSBsZW5ndGgoaGgpDQplc3BlcmFkYXMgPC0gUHJvYnMgKiBuIA0KDQp0YWJsYV9jb21wbGV0YSA8LSBkYXRhLmZyYW1lKA0KICBJbnRlcnZhbG8gPSBuYW1lcyh0YWJsYV9mcmVjdWVuY2lhKSwNCiAgRnJlY3VlbmNpYSA9IGFzLnZlY3Rvcih0YWJsYV9mcmVjdWVuY2lhKSkNCiNQcnVlYmEgZGUgQm9uZGFkIA0KY2hpc3EudGVzdCh0YWJsYV9jb21wbGV0YSRGcmVjdWVuY2lhLGVzcGVyYWRhcyxzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSkNCmBgYA0KUmVjaGF6YW1vcyBIMCBzaSBQLVZhbG9yIOKJpCDOsSwgdG9tYW1vcyB1biDOsSA9MC4wNSwgcG9yIGxvIHRhbnRvIHBvZGVtb3MgY29uY2x1aXIgcXVlIG5vIHJlY2hhemFtb3MgSDAsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2dub3JtYWwNCg0KIyMjIFRvdGFsIEJlZHJvb21zDQpQZXJhIGxhIHZhcmlhYmxlIHRvdGFsIGJlZHJvb21zIHVzYXJlbW9zIGNvbW8gZGlzdHJpYnVjacOzbiBzb3NwZWNoYWRhIGxhIGxvZy1ub3JtYWwuIEVtcGV6YW1vcyBkZWZpbmllbmRvIGxvcyBwYXJhbWV0cm9zIGVzdGltYWRvcyBtZWRpYW50ZSBlc3RpbWFjacOzbiBwb3IgbWF4aW1hIHZlcm9zaW1pbGl0dWQgDQpgYGB7cn0NCmhoPC1iYXNlJHRvdGFsX2JlZHJvb21zDQojRXN0aW1hY2nDs24gZGUgUGFyYW1ldHJvcw0KI2luc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpICAjIFNpIG5vIGxvIHRpZW5lcw0KbGlicmFyeShmaXRkaXN0cnBsdXMpDQojIEVzdGltYWNpw7NuIGRlIHBhcsOhbWV0cm9zIGRlIGxhIGxvZ25vcm0NCmFqdXN0ZSA8LSBmaXRkaXN0KGhoLCAibG5vcm0iKQ0KcHJpbnQoYWp1c3RlKQ0KDQpgYGANCiRIXzAkOiBMYSB2YXJpYWJsZSBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KJEhfMSQ6IExhIHZhcmlhYmxlIG5vIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nIG5vcm1hbA0KDQpgYGB7cn0NCmJyZWFrcyA8LSBwcmV0dHkoaGgsIG4gPSAxMCkNCmludGVydmFsb3M9Y3V0KGhoLGJyZWFrcz1icmVha3MpDQp0YWJsYV9mcmVjdWVuY2lhIDwtIHRhYmxlKGludGVydmFsb3MpDQojR2VuZXJhbW9zIG51ZXN0cmEgcHJvYmFiaWxpZGFkIHBvciBpbnRlcnZhbG8NClByb2JzPC1kaWZmKHBsbm9ybShicmVha3MsbWVhbmxvZyA9IDYuMDU1NzkzLCBzZGxvZyA9IDAuNzI4ODQ0ICkpDQpjb2xhX2luZmluaXRvIDwtMSAtICBwbG5vcm0obWF4KGJyZWFrcyksbWVhbmxvZyA9IDYuMDU1NzkzLCBzZGxvZyA9IDAuNzI4ODQ0ICkNCiMgU3VtYXIgbGEgY29sYSBhbCDDumx0aW1vIGludGVydmFsbyANClByb2JzW2xlbmd0aChQcm9icyldIDwtIFByb2JzW2xlbmd0aChQcm9icyldICsgY29sYV9pbmZpbml0byANCm4gIDwtIGxlbmd0aChoaCkNCmVzcGVyYWRhcyA8LSBQcm9icyAqIG4gDQoNCnRhYmxhX2NvbXBsZXRhIDwtIGRhdGEuZnJhbWUoDQogIEludGVydmFsbyA9IG5hbWVzKHRhYmxhX2ZyZWN1ZW5jaWEpLA0KICBGcmVjdWVuY2lhID0gYXMudmVjdG9yKHRhYmxhX2ZyZWN1ZW5jaWEpKQ0KI1BydWViYSBkZSBCb25kYWQgDQpjaGlzcS50ZXN0KHRhYmxhX2NvbXBsZXRhJEZyZWN1ZW5jaWEsZXNwZXJhZGFzLHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKQ0KYGBgDQpSZWNoYXphbW9zIEgwIHNpIFAtVmFsb3Ig4omkIM6xLCB0b21hbW9zIHVuIM6xID0wLjA1LCBwb3IgbG8gdGFudG8gcG9kZW1vcyBjb25jbHVpciBxdWUgbm8gcmVjaGF6YW1vcyBIMCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZ25vcm1hbA0KDQojIyMgUG9wdWxhdGlvbg0KUGVyYSBsYSB2YXJpYWJsZSBQb3B1bGF0aW9uIHVzYXJlbW9zIGNvbW8gZGlzdHJpYnVjacOzbiBzb3NwZWNoYWRhIGxhIGxvZy1ub3JtYWwuIEVtcGV6YW1vcyBkZWZpbmllbmRvIGxvcyBwYXJhbWV0cm9zIGVzdGltYWRvcyBtZWRpYW50ZSBlc3RpbWFjacOzbiBwb3IgbWF4aW1hIHZlcm9zaW1pbGl0dWQgDQpgYGB7cn0NCmhoPC1iYXNlJHBvcHVsYXRpb24NCiNFc3RpbWFjacOzbiBkZSBQYXJhbWV0cm9zDQojaW5zdGFsbC5wYWNrYWdlcygiZml0ZGlzdHJwbHVzIikgICMgU2kgbm8gbG8gdGllbmVzDQpsaWJyYXJ5KGZpdGRpc3RycGx1cykNCiMgRXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3MgZGUgbGEgbG9nbm9ybQ0KYWp1c3RlIDwtIGZpdGRpc3QoaGgsICJsbm9ybSIpDQpwcmludChhanVzdGUpDQoNCmBgYA0KJEhfMCQ6IExhIHZhcmlhYmxlIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nIG5vcm1hbA0KDQokSF8xJDogTGEgdmFyaWFibGUgbm8gc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2cgbm9ybWFsDQoNCmBgYHtyfQ0KYnJlYWtzIDwtIHByZXR0eShoaCwgbiA9IDUwKQ0KaW50ZXJ2YWxvcz1jdXQoaGgsYnJlYWtzPWJyZWFrcykNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCiNHZW5lcmFtb3MgbnVlc3RyYSBwcm9iYWJpbGlkYWQgcG9yIGludGVydmFsbw0KUHJvYnM8LWRpZmYocGxub3JtKGJyZWFrcyxtZWFubG9nID0gNy4wMzU5NDc2LCBzZGxvZyA9IDAuNzM2NDYyNDEgKSkNCmNvbGFfaW5maW5pdG8gPC0xIC0gIHBsbm9ybShtYXgoYnJlYWtzKSxtZWFubG9nID0gNy4wMzU5NDc2LCBzZGxvZyA9IDAuNzM2NDYyNCApDQojIFN1bWFyIGxhIGNvbGEgYWwgw7psdGltbyBpbnRlcnZhbG8gDQpQcm9ic1tsZW5ndGgoUHJvYnMpXSA8LSBQcm9ic1tsZW5ndGgoUHJvYnMpXSArIGNvbGFfaW5maW5pdG8gDQpuICA8LSBsZW5ndGgoaGgpDQplc3BlcmFkYXMgPC0gUHJvYnMgKiBuIA0KDQp0YWJsYV9jb21wbGV0YSA8LSBkYXRhLmZyYW1lKA0KICBJbnRlcnZhbG8gPSBuYW1lcyh0YWJsYV9mcmVjdWVuY2lhKSwNCiAgRnJlY3VlbmNpYSA9IGFzLnZlY3Rvcih0YWJsYV9mcmVjdWVuY2lhKSkNCiNQcnVlYmEgZGUgQm9uZGFkIA0KY2hpc3EudGVzdCh0YWJsYV9jb21wbGV0YSRGcmVjdWVuY2lhLGVzcGVyYWRhcyxzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSkNCmBgYA0KUmVjaGF6YW1vcyBIMCBzaSBQLVZhbG9yIOKJpCDOsSwgdG9tYW1vcyB1biDOsSA9MC4wNSwgcG9yIGxvIHRhbnRvIHBvZGVtb3MgY29uY2x1aXIgcXVlIG5vIHJlY2hhemFtb3MgSDAsIHBvciBsbyBxdWUgaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBjb25jbHVpciBxdWUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2dub3JtYWwNCg0KIyMjIEhvdXNlSG9sZHMNClBlcmEgbGEgdmFyaWFibGUgSG91c2UgSG9sZHMgdXNhcmVtb3MgY29tbyBkaXN0cmlidWNpw7NuIHNvc3BlY2hhZGEgbGEgbG9nLW5vcm1hbC4gRW1wZXphbW9zIGRlZmluaWVuZG8gbG9zIHBhcmFtZXRyb3MgZXN0aW1hZG9zIG1lZGlhbnRlIGVzdGltYWNpw7NuIHBvciBtYXhpbWEgdmVyb3NpbWlsaXR1ZCANCmBgYHtyfQ0KaGg8LWJhc2UkaG91c2Vob2xkcw0KI0VzdGltYWNpw7NuIGRlIFBhcmFtZXRyb3MNCiNpbnN0YWxsLnBhY2thZ2VzKCJmaXRkaXN0cnBsdXMiKSAgIyBTaSBubyBsbyB0aWVuZXMNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KIyBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvcyBkZSBsYSBsb2dub3JtDQphanVzdGUgPC0gZml0ZGlzdChoaCwgImxub3JtIikNCnByaW50KGFqdXN0ZSkNCg0KYGBgDQokSF8wJDogTGEgdmFyaWFibGUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2cgbm9ybWFsDQoNCiRIXzEkOiBMYSB2YXJpYWJsZSBubyBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KYGBge3J9DQpicmVha3MgPC0gcHJldHR5KGhoLCBuID0gNTApDQppbnRlcnZhbG9zPWN1dChoaCxicmVha3M9YnJlYWtzKQ0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShpbnRlcnZhbG9zKQ0KI0dlbmVyYW1vcyBudWVzdHJhIHByb2JhYmlsaWRhZCBwb3IgaW50ZXJ2YWxvDQpQcm9iczwtZGlmZihwbG5vcm0oYnJlYWtzLG1lYW5sb2cgPSA1Ljk4NTIxOTUsIHNkbG9nID0gMC43Mjk4MjQ0ICkpDQpjb2xhX2luZmluaXRvIDwtMSAtICBwbG5vcm0obWF4KGJyZWFrcyksbWVhbmxvZyA9IDUuOTg1MjE5NSwgc2Rsb2cgPSAwLjcyOTgyNDQgKQ0KIyBTdW1hciBsYSBjb2xhIGFsIMO6bHRpbW8gaW50ZXJ2YWxvIA0KUHJvYnNbbGVuZ3RoKFByb2JzKV0gPC0gUHJvYnNbbGVuZ3RoKFByb2JzKV0gKyBjb2xhX2luZmluaXRvIA0KbiAgPC0gbGVuZ3RoKGhoKQ0KZXNwZXJhZGFzIDwtIFByb2JzICogbiANCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkpDQojUHJ1ZWJhIGRlIEJvbmRhZCANCmNoaXNxLnRlc3QodGFibGFfY29tcGxldGEkRnJlY3VlbmNpYSxlc3BlcmFkYXMsc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpDQpgYGANClJlY2hhemFtb3MgSDAgc2kgUC1WYWxvciDiiaQgzrEsIHRvbWFtb3MgdW4gzrEgPTAuMDUsIHBvciBsbyB0YW50byBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBubyByZWNoYXphbW9zIEgwLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nbm9ybWFsDQoNCiMjIyBNZWRpYW4gSW5jb21lDQpQZXJhIGxhIHZhcmlhYmxlIE1lZGlhbiBJbmNvbWUgdXNhcmVtb3MgY29tbyBkaXN0cmlidWNpw7NuIHNvc3BlY2hhZGEgbGEgbG9nLW5vcm1hbC4gRW1wZXphbW9zIGRlZmluaWVuZG8gbG9zIHBhcmFtZXRyb3MgZXN0aW1hZG9zIG1lZGlhbnRlIGVzdGltYWNpw7NuIHBvciBtYXhpbWEgdmVyb3NpbWlsaXR1ZCANCmBgYHtyfQ0KaGg8LWJhc2UkbWVkaWFuX2luY29tZQ0KI0VzdGltYWNpw7NuIGRlIFBhcmFtZXRyb3MNCiNpbnN0YWxsLnBhY2thZ2VzKCJmaXRkaXN0cnBsdXMiKSAgIyBTaSBubyBsbyB0aWVuZXMNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KIyBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvcyBkZSBsYSBsb2dub3JtDQphanVzdGUgPC0gZml0ZGlzdChoaCwgImxub3JtIikNCnByaW50KGFqdXN0ZSkNCg0KYGBgDQokSF8wJDogTGEgdmFyaWFibGUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2cgbm9ybWFsDQoNCiRIXzEkOiBMYSB2YXJpYWJsZSBubyBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KYGBge3J9DQpicmVha3MgPC0gcHJldHR5KGhoLCBuID0gMTAwKQ0KaW50ZXJ2YWxvcz1jdXQoaGgsYnJlYWtzPWJyZWFrcykNCnRhYmxhX2ZyZWN1ZW5jaWEgPC0gdGFibGUoaW50ZXJ2YWxvcykNCiNHZW5lcmFtb3MgbnVlc3RyYSBwcm9iYWJpbGlkYWQgcG9yIGludGVydmFsbw0KUHJvYnM8LWRpZmYocGxub3JtKGJyZWFrcyxtZWFubG9nID0gMS4yMDk0OTEzLCBzZGxvZyA9IDAuNDQxMzk2OCApKQ0KY29sYV9pbmZpbml0byA8LTEgLSAgcGxub3JtKG1heChicmVha3MpLG1lYW5sb2cgPSAxLjIwOTQ5MTMsIHNkbG9nID0gMC40NDEzOTY4ICkNCiMgU3VtYXIgbGEgY29sYSBhbCDDumx0aW1vIGludGVydmFsbyANClByb2JzW2xlbmd0aChQcm9icyldIDwtIFByb2JzW2xlbmd0aChQcm9icyldICsgY29sYV9pbmZpbml0byANCm4gIDwtIGxlbmd0aChoaCkNCmVzcGVyYWRhcyA8LSBQcm9icyAqIG4gDQoNCnRhYmxhX2NvbXBsZXRhIDwtIGRhdGEuZnJhbWUoDQogIEludGVydmFsbyA9IG5hbWVzKHRhYmxhX2ZyZWN1ZW5jaWEpLA0KICBGcmVjdWVuY2lhID0gYXMudmVjdG9yKHRhYmxhX2ZyZWN1ZW5jaWEpKQ0KI1BydWViYSBkZSBCb25kYWQgDQpjaGlzcS50ZXN0KHRhYmxhX2NvbXBsZXRhJEZyZWN1ZW5jaWEsZXNwZXJhZGFzLHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKQ0KYGBgDQpSZWNoYXphbW9zIEgwIHNpIFAtVmFsb3Ig4omkIM6xLCB0b21hbW9zIHVuIM6xID0wLjA1LCBwb3IgbG8gdGFudG8gcG9kZW1vcyBjb25jbHVpciBxdWUgcmVjaGF6YW1vcyBIMCwgcG9yIGxvIHF1ZSBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBwYXJhIGNvbmNsdWlyIHF1ZSBubyBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZ25vcm1hbA0KDQojIyMgTWVkaWFuIEhvdXNlIFZhbHVlDQpQZXJhIGxhIGEgcHJlZGVjaXIgdXNhcmVtb3MgY29tbyBkaXN0cmlidWNpw7NuIHNvc3BlY2hhZGEgbGEgbG9nLW5vcm1hbC4gRW1wZXphbW9zIGRlZmluaWVuZG8gbG9zIHBhcmFtZXRyb3MgZXN0aW1hZG9zIG1lZGlhbnRlIGVzdGltYWNpw7NuIHBvciBtYXhpbWEgdmVyb3NpbWlsaXR1ZCANCmBgYHtyfQ0KaGg8LWJhc2UkbWVkaWFuX2hvdXNlX3ZhbHVlDQojRXN0aW1hY2nDs24gZGUgUGFyYW1ldHJvcw0KI2luc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpICAjIFNpIG5vIGxvIHRpZW5lcw0KbGlicmFyeShmaXRkaXN0cnBsdXMpDQojIEVzdGltYWNpw7NuIGRlIHBhcsOhbWV0cm9zIGRlIGxhIGxvZ25vcm0NCmFqdXN0ZSA8LSBmaXRkaXN0KGhoLCAibG5vcm0iKQ0KcHJpbnQoYWp1c3RlKQ0KDQpgYGANCiRIXzAkOiBMYSB2YXJpYWJsZSBzZSBkaXN0cmlidXllIGRlIGZvcm1hIGxvZyBub3JtYWwNCg0KJEhfMSQ6IExhIHZhcmlhYmxlIG5vIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nIG5vcm1hbA0KDQpgYGB7cn0NCmJyZWFrcyA8LSBwcmV0dHkoaGgsIG4gPSAxNDMpDQppbnRlcnZhbG9zPWN1dChoaCxicmVha3M9YnJlYWtzKQ0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShpbnRlcnZhbG9zKQ0KI0dlbmVyYW1vcyBudWVzdHJhIHByb2JhYmlsaWRhZCBwb3IgaW50ZXJ2YWxvDQpQcm9iczwtZGlmZihwbG5vcm0oYnJlYWtzLG1lYW5sb2cgPSAxMi4wMzIzMTUwLCBzZGxvZyA9IDAuNTMyMDk4MiApKQ0KY29sYV9pbmZpbml0byA8LTEgLSAgcGxub3JtKG1heChicmVha3MpLG1lYW5sb2cgPSAxMi4wMzIzMTUwLCBzZGxvZyA9IDAuNTMyMDk4MgkgKQ0KIyBTdW1hciBsYSBjb2xhIGFsIMO6bHRpbW8gaW50ZXJ2YWxvIA0KUHJvYnNbbGVuZ3RoKFByb2JzKV0gPC0gUHJvYnNbbGVuZ3RoKFByb2JzKV0gKyBjb2xhX2luZmluaXRvIA0KbiAgPC0gbGVuZ3RoKGhoKQ0KZXNwZXJhZGFzIDwtIFByb2JzICogbiANCg0KdGFibGFfY29tcGxldGEgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWxvID0gbmFtZXModGFibGFfZnJlY3VlbmNpYSksDQogIEZyZWN1ZW5jaWEgPSBhcy52ZWN0b3IodGFibGFfZnJlY3VlbmNpYSkpDQojUHJ1ZWJhIGRlIEJvbmRhZCANCmNoaXNxLnRlc3QodGFibGFfY29tcGxldGEkRnJlY3VlbmNpYSxlc3BlcmFkYXMsc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpDQpgYGANClJlY2hhemFtb3MgSDAgc2kgUC1WYWxvciDiiaQgzrEsIHRvbWFtb3MgdW4gzrEgPTAuMDUsIHBvciBsbyB0YW50byBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBubyByZWNoYXphbW9zIEgwLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nbm9ybWFsDQoNCiMjIFBydWViYSBkZSBIaXBvdGVzaXMNCg0KTGEgcHJpbWVyIHZhcmlhYmxlIHF1ZSB1c2FyZW1vcyBwYXJhIG51ZXN0cmFzIHBydWViYXMgZGUgaGlwb3Rlc2lzIHNlcsOhICoqSG91c2luZyBNZWRpYW4gQWdlKioNCg0KIyMjIFQgVGVzIGRlIGRvcyBtdWVzdHJhcw0Kwr9IYXkgZGlmZXJlbmNpYSBlbiBsYSBlZGFkIG1lZGlhbmEgZGUgdml2aWVuZGFzIGVudHJlIHpvbmFzIGNlcmNhbmFzIGFsIG9jw6lhbm8geSB6b25hcyB0aWVycmEgYWRlbnRybz8NCmBgYHtyfQ0KdC50ZXN0KGhvdXNpbmdfbWVkaWFuX2FnZSB+IG9jZWFuX3Byb3hpbWl0eSwgZGF0YSA9IGJhc2UsIHN1YnNldCA9IG9jZWFuX3Byb3hpbWl0eSAlaW4lIGMoIklOTEFORCIsICJORUFSIE9DRUFOIikpDQoNCmBgYA0KIyMjIyBIaXBvdGVzaXMNCiRIXzAkOiBObyBoYXkgZGlmZXJlbmNpYSBlbiBsYSBlZGFkIG1lZGlhbmEgZGUgbGFzIHZpdmllbmRhcyBlbnRyZSBsb3MgZ3J1cG9zIElOTEFORCB5IE5FQVIgT0NFQU4uDQoNCiRIXzEkOiBTaSBoYXkgZGlmZXJlbmNpYSBlbiBsYSBlZGFkIG1lZGlhbmEgZGUgbGFzIHZpdmllbmRhcyBlbnRyZSBsb3MgZ3J1cG9zIElOTEFORCB5IE5FQVIgT0NFQU4uDQoNClJlY2hhemFtb3MgSDAgc2kgUC1WYWxvciDiiaQgzrEsIHRvbWFtb3MgdW4gzrEgPTAuMDUsIHBvciBsbyB0YW50byBwb2RlbW9zIGNvbmNsdWlyIHF1ZSByZWNoYXphbW9zIEgwLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIHNpIGhheSBkaWZlcmVuY2lhIGVudHJlIGxhcyB2aXZpZW5kYXMgcXVlIHNlIGVuY3VlbnRyYW4gY2VyY2EgZGVsIG9jZWFubyB5IGxhcyBxdWUgc2UgZW5jdWVudHJhbiB0aWVycmEgZGVudHJvDQoNCkFob3JhIGJpZW4sIHF1ZXJlbW9zIHByb2JhciBxdWUgc29uIG3DoXMgbnVldmFzIGxhIGNhc2FzIGNlcmNhcyBhbCBvY2Vhbm8NCg0KIyMjIyBIaXBvdGVzaXMNCiRIXzAkOiBMb3MgZ3J1cG9zIGRlIGNhc2EgTkVBUiBPQ0VBTiBzb24gbcOhcyBhbnRpZ3VhcyBxdWUgbG9zIGdydXBvcyBJTkxBTkQuDQoNCiRIXzEkOiBMb3MgZ3J1cG9zIGRlIGNhc2EgTkVBUiBPQ0VBTiBzb24gbcOhcyByZWNpZW50ZXMgcXVlIGxvcyBncnVwb3MgSU5MQU5ELg0KYGBge3J9DQp0LnRlc3QoDQogIGhvdXNpbmdfbWVkaWFuX2FnZSB+IG9jZWFuX3Byb3hpbWl0eSwNCiAgZGF0YSA9IGJhc2UsDQogIHN1YnNldCA9IG9jZWFuX3Byb3hpbWl0eSAlaW4lIGMoIklOTEFORCIsICJORUFSIE9DRUFOIiksDQogIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLA0KICB2YXIuZXF1YWwgPSBGQUxTRQ0KKQ0KDQpgYGANClJlY2hhemFtb3MgSDAgc2kgUC1WYWxvciDiiaQgzrEsIHRvbWFtb3MgdW4gzrEgPTAuMDUsIHBvciBsbyB0YW50byBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBubyByZWNoYXphbW9zIEgwLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxhcyBjYXNhcyBjZXJjYW5hcyBhbCBvY2Vhbm9zIHNvbiBtw6FzIGFudGlndWFzIHF1ZSBsYXMgbnVldmFzDQoNCkNvbnRpbnVhcmVtb3MgdHJhbnNmb3JtYW5kbyBudWVzdHJhIHZhcmlhYmxlICoqT2NlYW4gUHJveGltaXR5KiogYSB1bmEgZGlzdHJpYnVjacOzbiBiaW5vbWlhbCwgZG9uZGUgZGlzdGluZ3VpcmVtb3MgZW50cmUgbGFzIHByb3BpZWRhZGVzIGNlcmNhIGFsIG9jZWFubyB5IGFxdWVsbGFzIHF1ZSBubyBsbyBlc3Rhbg0KDQpgYGB7cn0NCmJhc2UkbmVhcl9vY2Vhbl9iaW4gPC0gaWZlbHNlKGJhc2Ukb2NlYW5fcHJveGltaXR5ID09ICJORUFSIE9DRUFOIiwgMSwgMCkNCnByaW50KHRhYmxlKGJhc2UkbmVhcl9vY2Vhbl9iaW4pKQ0KYGBgDQpRdWVyZW1vcyBjb21wcm9iYXIgc2kgYWwgbWVub3MgdW4gY3VhcnRvIGRlIGxhcyBjYXNhcyBlc3RhbiBjZXJjYW5hcyBhbCBvY2Vhbm8NCg0KIyMjIyBIaXBvdGVzaXMNCiRIXzAkOiBMb3MgZ3J1cG9zIGRlIGNhc2EgTkVBUiBPQ0VBTiByZXByZXNlbnRhbiBwb3IgbG8gbWVub3MgZWwgMjUlLg0KDQokSF8xJDpMb3MgZ3J1cG9zIGRlIGNhc2EgTkVBUiBPQ0VBTiByZXByZXNlbnRhbiBtZW5vcyBkZWwgMjUlLg0KDQpgYGB7cn0NCnByb3AudGVzdChzdW0oYmFzZSRuZWFyX29jZWFuX2JpbiksIGxlbmd0aChiYXNlJG5lYXJfb2NlYW5fYmluKSwgcCA9IDAuMjUsIGFsdGVybmF0aXZlID0gImxlc3MiKQ0KDQpgYGANClJlY2hhemFtb3MgSDAgc2kgUC1WYWxvciDiiaQgzrEsIHRvbWFtb3MgdW4gzrEgPTAuMDUsIHBvciBsbyB0YW50byBwb2RlbW9zIGNvbmNsdWlyIHF1ZSByZWNoYXphbW9zIEgwLCBwb3IgbG8gcXVlIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgY29uY2x1aXIgcXVlIGxhcyBjYXNhcyBjZXJjYW5hcyBhbCBvY2Vhbm9zIHNvbiBtZW5vcyBkZWwgMjUlDQoNCg0KIyMgQ29uY2x1c2lvbmVzDQoNClBhcmEgbWkgdHJhYmFqbyBjb24gbGEgYmFzZSBkZSBjYXNhcyBlbiBjYWxpZm9ybmlhIHNlIGJ1c2NvIHJlc3BvbmRlciBhIGxhIHByZWd1bnRhIGRlIGN1YWwgZXMgZWwgY29zdG8gZGUgdW5hIGNhc2Egc2Vnw7puIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIHN1IHViaWNhY2nDs24uIFNlIHByb2Jhcm9uIHRvZG9zIGxvcyBtb2RlbG9zIHBvc2libGVzIGRlIHJlZ3Jlc2nDs24sIHRhbnRvIG3Dumx0aXBsZSBjb21vIHVuaXZhcmlhZGEuIENvbW8gbWVqb3IgbW9kZWxvIG5vcyBkaW8gZWwgc2lndWllbnRlOg0KDQokJA0KXHRleHR7TWVkaWFuIEhvdXNlIFZhbHVlfSA9IC0yMjM5OTguOTMgIC0yMzgwLjMxIFxjZG90IFx0ZXh0e2xvbmdpdHVkZX0gKyA5MjIuMTIgXGNkb3QgIFx0ZXh0e2hvdXNpbmdfbWVkaWFuX2FnZX0gXFwgKyAxMC44OCBcY2RvdCBcdGV4dHt0b3RhbF9yb29tc30gIC0xNi4yIFxjZG90IFx0ZXh0e3BvcHVsYXRpb259ICArICAzMzY5Mi42NiBcY2RvdCBcdGV4dHttZWRpYW5faW5jb21lfSAtMzQ0Ni40IFxjZG90IFx0ZXh0e05FQVJfQkFZfSBcXCArICAxMDg0NC4xMyBcY2RvdCBcdGV4dHtORUFSX09DRUFOfSAgLTc0NjE3LjUwIFxjZG90IFx0ZXh0e0lOTEFORH0gKyAgMTg0ODM4LjQzIFxjZG90IFx0ZXh0e0lTTEFORH0gDQokJA0KDQpDb24gdW4gYWp1c3RlIGRlIDAuNTgwMSB5IG51ZXN0cmFzIHZhcmlhYmxlcyBhcG9ydGFuIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCnwgVmFyaWFibGUgfCBBcG9ydGFjaW9uIHwgQ29tZW50YXJpb3MgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAtMjM4MC4zMSBMb25naXR1ZGUgfCBOZWdhdGl2YSB8IExhIExvbmdpdHVkIHRpZW5lIHVuYSByZWxhY2nDs24gaW52ZXJzYSBhbCB2YWxvciBkZSBsYSBjYXNhIHwNCnwgOTIyLjEyIEhvdXNpbmcgTWVkaWFuIEFnZSB8IFBvc3RpdmEgfCBMYSBlZGFkIHRpZW5lIHVuYSByZWxhY2nDs24gZGlyZWN0YSBjb24gZWwgdmFsb3IgZGUgbGEgY2FzYSB8DQp8ICsgMTAuODggVG90YWwgUm9vbXMgfCBQb3NpdGl2YSB8IExhIGNhbnRpZGFkIGRlIGhhYml0YWNpb25lcyBhZmVjdGEgcG9zaXRpdmFtZW50ZSBhIGxhIGVkYWQgZGUgYWwgdmFsb3IgZGUgbGEgY2FzYSB8DQp8IC0xNi4yUG9wdWxhdGlvbiB8IE5lZ2F0aXZhIHwgTGEgcG9ibGFjacOzbiBhZmVjdGEgaW52ZXJzYW1lbnRlIGFsIHZhbG9yIGRlIGxhIGNhc2EgfA0KfCAzMzY5Mi42NiBNZWRpYW4gSW5jb21lIHwgUG9zaXRpdmEgfCBFbCBpbmdyZXNvIGFmZWN0YSBkZSBtYW5lcmEgZGlyZWN0YSBhbCB2YWxvciBkZSBsYSBjYXNhIHwNCnwgLTM0NDYuNCBPY2VhbiBQcm94aW1pdHkgSU5MQU5EIHwgTmVnYXRpdmEgfCBDdWFuZG8gbGEgcHJveGltaWRhZCBhbCBvY8OpYW5vIHNlIGVuY3VlbnRyYSBlbiBsYSBjYXRlZ29yw61hIElOTEFORCBhZmVjdGEgZGUgbWFuZXJhIGludmVyc2EgYWwgdmFsb3IgZGUgbGEgY2FzYSB8DQp8IC03NDYxNy41MCBPY2VhbiBQcm94aW1pdHkgSVNMQU5EIHwgUG9zaXRpdmEgfCBDdWFuZG8gc2UgZW5jdWVudHJhIGVuIGxhIGNhdGVnb3LDrWEgSVNMQU5EIGFmZWN0YSBkZSBtYW5lcmEgZGlyZWN0YSB8DQp8ICAxODQ4MzguNDMgT2NlYW4gUHJveGltaXR5IE5lYXIgYmF5IHwgUG9zaXRpdmEgfCBDdWFuZG8gc2UgZW5jdWVudHJhIGNlcmNhIGRlIGxhIGJhaMOtYSBhZmVjdGEgZGUgbWFuZXJhIGRpcmVjdGEgYWwgdmFsb3IgZGUgbGEgY2FzYSB8DQp8MTA4NDQuMU9jZWFuIFByb3hpbWl0eSBOZWFyIE9jZWFuIHwgUG9zaXRpdmEgfCBDdWFuZG8gc2UgZW5jdWVudHJhIGNlcmNhIGRlbCBvY2Vhbm8gYWZlY3RhIGRlIG1hbmVyYSBkaXJlY3RhIGFsIHZhbG9yIGRlIGxhIGNhc2EgfA0KDQpBc2kgbWlzbW8gcG9kZW1vcyByZXNwb25kZXIgbGFzIHNpZ3VpZW50ZXMgcHJlZ3VudGFzOiANCg0KLSDCv0N1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgcG9kYW1vcyBlbmNvbnRyYXIgdW5hIGNhc2EgY29uIG1lbm9zIGRlIDEwMCB2ZWNpbm9zIChob3VzZWhvbGQpPw0KRGFkbyBxdWUgbnVlc3RyYSB2YXJpYWJsZSBIb3VzZWhvbGQgc2FiZW1vcyBxdWUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBsb2dub3JtYWwgZGFkbyBhIGxhcyBwcnVlYmFzIGRlIGJvbmRhZCBkZSBhanVzdGUNCmBgYHtyfQ0KcGxub3JtKDEwMCwsbWVhbmxvZyA9IDUuOTg1MjE5NSwgc2Rsb2cgPSAwLjcyOTgyNDQgKQ0KDQpgYGANCkV4aXN0ZSB1bmEgcHJvYmFiaWxpZGFkIGRlIDAuMDI5MyBkZSBlbmNvbnRyYXIgdW5hIGNhc2EgY29uIG1lbm9zIGRlIDEwMCB2ZWNpbm9zDQoNCg0KLSDCv0N1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgcG9kYW1vcyBlbmNvbnRyYXIgdW5hIGRlIG1lbm9zIGRlIDE1IGHDsW9zIGRlIGFudGlnw7xlZGFkPw0KRGFkbyBxdWUgbnVlc3RyYSB2YXJpYWJsZSBob3VzaW5nIG1lZGlhbiBhZ2Ugc2FiZW1vcyBxdWUgc2UgZGlzdHJpYnV5ZSBkZSBmb3JtYSBub3JtYWwgZGFkbyBhIGxhcyBwcnVlYmFzIGRlIGJvbmRhZCBkZSBhanVzdGUNCmBgYHtyfQ0KcG5vcm0oMTUsbWVhbiA9IDI4LjM2NDcyLCBzZCA9IDEyLjUwOTk0ICkNCg0KYGBgDQpFeGlzdGUgdW5hIHByb2JhYmlsaWRhZCBkZSAwLjE0MjcgZGUgZW5jb250cmFyIHVuYSBjYXNhIG1lbm9yIGEgMTUgYcOxb3MNCg0KDQotIMK/UXXDqSBwcm9iYWJpbGlkYWQgdGVudGVtb3MgZGUgZW5jb250cmFyIHVuYSBjYXNhIHF1ZSBzZSBlbmN1ZW50cmUgZW50cmUgbGEgbGF0aXR1ZCAzNSB5IDM2Pw0KUGFyYSBsYSBsYXRpdHVkIHNlZ3VuIGxhIHBydWViYSBkZSBib25kYWQgZGUgYWp1c3RlIHNlIGRpc3RyaWJ1eWUgZGUgZm9ybWEgbG9nLW5vcm1hbA0KYGBge3J9DQpwbG5vcm0oMzYsbWVhbmxvZyA9IDMuNTcyMDU0ODUsIHNkbG9nID0gMC4wNTk2MzQxMSApIC0gcGxub3JtKDM1LG1lYW5sb2cgPSAzLjU3MjA1NDg1LCBzZGxvZyA9IDAuMDU5NjM0MTEgKQ0KDQpgYGANCkV4aXN0ZSB1bmEgcHJvYmFiaWxpZGFkIGRlIDAuMTg2NSBkZSBlbmNvbnRyYXIgdW5hIGNhc2EgZW50cmUgZXNhcyBjb29yZGVuYWRhcw0KDQotIFNlIGVzdGEgYnVzY2FuZG8gdW5hIGNhc2EgcXVlIGxhIHBvYmxhY2nDs24gZGVsIGFscmVkZWRvciBzZWEgZW50cmUgODAwIHkgMTAwMCwgwr9DdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgZW5jb250cmFyIGFsZ28gYXPDrT8NCmBgYHtyfQ0KcGxub3JtKDEwMDAsbWVhbmxvZyA9IDcuMDM1OTQ3Niwgc2Rsb2cgPSAwLjczNjQ2MjQxICkgLSBwbG5vcm0oODAwLG1lYW5sb2cgPSA3LjAzNTk0NzYsIHNkbG9nID0gMC43MzY0NjI0MSApDQpgYGANCkV4aXN0ZSB1bmEgcHJvYmFiaWxpZGFkIGRlIDAuMTE0MiBkZSBlbmNvbnRyYXIgdW5hIGNhc2EgY29uIGVudHJlIDEwMDAgeSA4MDAgdmVjaW5vcw0KDQoNCi0gU2UgZXN0w6EgYnVzY2FuZG8gdW5hIGNhc2EgcXVlIGVsIHRvdGFsIGRlIGRvcm1pdG9yaW9zIG5vIHNlYSBtZW5vciBkZSAzNTAsIMK/Q3XDoWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIGVuY29udHJhciBhbGdvIGFzw60/DQoNCmBgYHtyfQ0KMS1wbG5vcm0oMzUwLG1lYW5sb2cgPSA2LjA1NTc5Mywgc2Rsb2cgPSAwLjcyODg0NCApDQoNCmBgYA0KRXhpc3RlIHVuYSBwcm9iYWJsaWRhZCBkZSAwLjYwNyBkZSBlbmNvbnRyYXIgdW5hIGNhc2FzIHF1ZSBlbCB0b3RhbCBkZSBkb3JtaXRvcmlvcyBkZSBsYSBjYXNhIHNlYSBtYXlvciBhIDM1MA0KDQoNCg==