library(dplyr)
library(ggplot2)
library(Amelia)
train <- read.csv("~/Desktop/house/train.csv", stringsAsFactors = FALSE)
test <- read.csv("~/Desktop/house/test.csv", stringsAsFactors = FALSE)
missmap(train)

missmap(test)

table(train$PoolQC)
Ex Fa Gd
2 2 3
table(test$PoolQC)
Ex Gd
2 1
table(train$MiscVal)
0 54 350 400 450 480 500 560 600 620 700 800 1150
1408 1 1 11 4 2 8 1 4 1 5 1 1
1200 1300 1400 2000 2500 3500 8300 15500
2 1 1 4 1 1 1 1
table(test$MiscVal)
0 80 300 400 420 450 455 460 490 500 600 650 700
1408 1 1 7 1 5 1 1 1 5 4 3 2
750 900 1000 1200 1500 1512 2000 2500 3000 4500 6500 12500 17000
1 1 1 1 3 1 3 1 2 2 1 1 1
table(train$Fireplaces)
0 1 2 3
690 650 115 5
table(test$LotFrontage)
21 22 24 25 26 28 30 31 32 33 34 35 36 37 38 39 40 41 42 43
27 1 30 1 3 1 5 1 3 2 6 10 2 2 3 5 4 8 8 11
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
10 7 2 3 10 1 60 12 14 14 4 7 14 14 10 14 133 9 22 30
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
24 49 11 10 25 9 63 7 22 15 24 52 14 6 21 11 68 12 16 8
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
9 36 5 6 12 4 23 8 5 5 6 8 6 3 4 3 12 1 6 3
104 105 106 107 108 109 110 112 113 114 115 117 118 119 120 121 123 124 125 126
2 6 3 4 3 2 9 3 3 3 1 1 2 1 7 1 1 2 3 1
128 129 130 131 133 134 135 136 140 149 150 155 160 195 200
2 2 2 1 1 1 1 1 1 1 1 1 2 1 1
Garage
train$GarageCond <- ifelse(is.na(train$GarageCond), yes=0, no=train$GarageCond)
train$GarageCond <- ifelse(train$GarageCond == "Ex", yes=5, no=train$GarageCond)
train$GarageCond <- ifelse(train$GarageCond == "Gd", yes=4, no=train$GarageCond)
train$GarageCond <- ifelse(train$GarageCond == "TA", yes=3, no=train$GarageCond)
train$GarageCond <- ifelse(train$GarageCond == "Fa", yes=2, no=train$GarageCond)
train$GarageCond <- ifelse(train$GarageCond == "Po", yes=1, no=train$GarageCond)
test$GarageCond <- ifelse(is.na(test$GarageCond), yes=0, no=test$GarageCond)
test$GarageCond <- ifelse(test$GarageCond == "Ex", yes=5, no=test$GarageCond)
test$GarageCond <- ifelse(test$GarageCond == "Gd", yes=4, no=test$GarageCond)
test$GarageCond <- ifelse(test$GarageCond == "TA", yes=3, no=test$GarageCond)
test$GarageCond <- ifelse(test$GarageCond == "Fa", yes=2, no=test$GarageCond)
test$GarageCond <- ifelse(test$GarageCond == "Po", yes=1, no=test$GarageCond)
train$GarageQual <- ifelse(is.na(train$GarageQual), yes=0, no=train$GarageQual)
train$GarageQual <- ifelse(train$GarageQual == "Ex", yes=5, no=train$GarageQual)
train$GarageQual <- ifelse(train$GarageQual == "Gd", yes=4, no=train$GarageQual)
train$GarageQual <- ifelse(train$GarageQual == "TA", yes=3, no=train$GarageQual)
train$GarageQual <- ifelse(train$GarageQual == "Fa", yes=2, no=train$GarageQual)
train$GarageQual <- ifelse(train$GarageQual == "Po", yes=1, no=train$GarageQual)
test$GarageQual <- ifelse(is.na(test$GarageQual), yes=0, no=test$GarageQual)
test$GarageQual <- ifelse(test$GarageQual == "Ex", yes=5, no=test$GarageQual)
test$GarageQual <- ifelse(test$GarageQual == "Gd", yes=4, no=test$GarageQual)
test$GarageQual <- ifelse(test$GarageQual == "TA", yes=3, no=test$GarageQual)
test$GarageQual <- ifelse(test$GarageQual == "Fa", yes=2, no=test$GarageQual)
test$GarageQual <- ifelse(test$GarageQual == "Po", yes=1, no=test$GarageQual)
train$GarageFinish <- ifelse(is.na(train$GarageFinish), yes=0, no=train$GarageFinish)
train$GarageFinish <- ifelse(train$GarageFinish == "Fin", yes=3, no=train$GarageFinish)
train$GarageFinish <- ifelse(train$GarageFinish == "RFn", yes=2, no=train$GarageFinish)
train$GarageFinish <- ifelse(train$GarageFinish == "Unf", yes=1, no=train$GarageFinish)
test$GarageFinish <- ifelse(is.na(test$GarageFinish), yes=0, no=test$GarageFinish)
test$GarageFinish <- ifelse(test$GarageFinish == "Fin", yes=3, no=test$GarageFinish)
test$GarageFinish <- ifelse(test$GarageFinish == "RFn", yes=2, no=test$GarageFinish)
test$GarageFinish <- ifelse(test$GarageFinish == "Unf", yes=1, no=test$GarageFinish)
test$GarageCars <- ifelse(is.na(test$GarageCars), yes=0, no=test$GarageCars)
garlm <- lm(data = train, formula = GarageArea ~ GarageCars)
pgar <- predict(object = garlm, newdata = test)
test$GarageArea <- ifelse(is.na(test$GarageArea), yes=pgar, no=test$GarageArea)
PoolQC to Numbers
train$PoolQC <- ifelse(is.na(train$PoolQC), yes=0, no=train$PoolQC)
train$PoolQC <- ifelse(train$PoolQC == "Ex", yes=10, no=train$PoolQC)
train$PoolQC <- ifelse(train$PoolQC == "Gd", yes=8, no=train$PoolQC)
train$PoolQC <- ifelse(train$PoolQC == "Fa", yes=3, no=train$PoolQC)
test$PoolQC <- ifelse(is.na(test$PoolQC), yes=0, no=test$PoolQC)
test$PoolQC <- ifelse(test$PoolQC == "Ex", yes=10, no=test$PoolQC)
test$PoolQC <- ifelse(test$PoolQC == "Gd", yes=8, no=test$PoolQC)
Fence to Numbers
train$Fence <- ifelse(is.na(train$Fence), yes=0, no=train$Fence)
train$Fence <- ifelse(train$Fence == "MnWw", yes=1, no=train$Fence)
train$Fence <- ifelse(train$Fence == "GdWo", yes=2, no=train$Fence)
train$Fence <- ifelse(train$Fence == "MnPrv", yes=3, no=train$Fence)
train$Fence <- ifelse(train$Fence == "GdPrv", yes=4, no=train$Fence)
test$Fence <- ifelse(is.na(test$Fence), yes=0, no=test$Fence)
test$Fence <- ifelse(test$Fence == "MnWw", yes=1, no=test$Fence)
test$Fence <- ifelse(test$Fence == "GdWo", yes=2, no=test$Fence)
test$Fence <- ifelse(test$Fence == "MnPrv", yes=3, no=test$Fence)
test$Fence <- ifelse(test$Fence == "GdPrv", yes=4, no=test$Fence)
Alley and Street to Numbers
train$Alley <- ifelse(is.na(train$Alley), yes=0, no=train$Alley)
train$Alley <- ifelse(train$Alley == "Grvl", yes=1, no=train$Alley)
train$Alley <- ifelse(train$Alley == "Pave", yes=2, no=train$Alley)
test$Alley <- ifelse(is.na(test$Alley), yes=0, no=test$Alley)
test$Alley <- ifelse(test$Alley == "Grvl", yes=1, no=test$Alley)
test$Alley <- ifelse(test$Alley == "Pave", yes=2, no=test$Alley)
train$Street <- ifelse(train$Street == "Grvl", yes=1, no=train$Street)
train$Street <- ifelse(train$Street == "Pave", yes=2, no=train$Street)
test$Street <- ifelse(test$Street == "Grvl", yes=1, no=test$Street)
test$Street <- ifelse(test$Street == "Pave", yes=2, no=test$Street)
Fireplace
train$FireplaceQu <- ifelse(is.na(train$FireplaceQu), yes=0, no=train$FireplaceQu)
train$FireplaceQu <- ifelse(train$FireplaceQu == "Ex", yes=5, no=train$FireplaceQu)
train$FireplaceQu <- ifelse(train$FireplaceQu == "Gd", yes=4, no=train$FireplaceQu)
train$FireplaceQu <- ifelse(train$FireplaceQu == "TA", yes=3, no=train$FireplaceQu)
train$FireplaceQu <- ifelse(train$FireplaceQu == "Fa", yes=2, no=train$FireplaceQu)
train$FireplaceQu <- ifelse(train$FireplaceQu == "Po", yes=1, no=train$FireplaceQu)
test$FireplaceQu <- ifelse(is.na(test$FireplaceQu), yes=0, no=test$FireplaceQu)
test$FireplaceQu <- ifelse(test$FireplaceQu == "Ex", yes=5, no=test$FireplaceQu)
test$FireplaceQu <- ifelse(test$FireplaceQu == "Gd", yes=4, no=test$FireplaceQu)
test$FireplaceQu <- ifelse(test$FireplaceQu == "TA", yes=3, no=test$FireplaceQu)
test$FireplaceQu <- ifelse(test$FireplaceQu == "Fa", yes=2, no=test$FireplaceQu)
test$FireplaceQu <- ifelse(test$FireplaceQu == "Po", yes=1, no=test$FireplaceQu)
Varios
train$LotFrontage <- ifelse(is.na(train$LotFrontage),
yes = mean(train$LotFrontage, na.rm = TRUE),
no = train$LotFrontage)
test$LotFrontage <- ifelse(is.na(test$LotFrontage),
yes = mean(test$LotFrontage, na.rm = TRUE),
no = test$LotFrontage)
test$Utilities <- ifelse(is.na(test$Utilities), yes="AllPub", no=test$Utilities)
test$MSZoning <- ifelse(is.na(test$MSZoning), yes="C", no=test$MSZoning)
test$MSZoning <- ifelse(test$MSZoning == "C (all)", yes="C", no=test$MSZoning)
train$MSZoning <- ifelse(train$MSZoning == "C (all)", yes="C", no=train$MSZoning)
table(test$Utilities)
AllPub
1459
lm <- lm(data = train, formula = SalePrice ~ YrSold + MiscVal + Fence + MSSubClass + MSZoning + LotArea + Utilities + Neighborhood + HouseStyle + OverallQual + OverallCond + YearBuilt + Foundation + GarageArea + PoolArea + MiscVal + SaleCondition + Condition1 + Condition2)
predicted_price <- predict(object = lm, newdata = test)
price <- data.frame(Id = test$Id, SalePrice = round(predicted_price,0))
price$SalePrice <- ifelse (price$SalePrice<0, yes=mean(price$SalePrice), no=price$SalePrice)
write.csv(price, file="prices.csv", row.names = FALSE)
LS0tCnRpdGxlOiAiSG91c2UgUHJpY2VzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KEFtZWxpYSkKYGBgCgoKYGBge3J9CnRyYWluIDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvaG91c2UvdHJhaW4uY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp0ZXN0IDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvaG91c2UvdGVzdC5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKYGBge3J9Cm1pc3NtYXAodHJhaW4pCm1pc3NtYXAodGVzdCkKCnRhYmxlKHRyYWluJFBvb2xRQykKdGFibGUodGVzdCRQb29sUUMpCgp0YWJsZSh0cmFpbiRNaXNjVmFsKQp0YWJsZSh0ZXN0JE1pc2NWYWwpCgp0YWJsZSh0cmFpbiRGaXJlcGxhY2VzKQp0YWJsZSh0ZXN0JExvdEZyb250YWdlKQpgYGAKCkdhcmFnZQoKYGBge3J9CnRyYWluJEdhcmFnZUNvbmQgPC0gaWZlbHNlKGlzLm5hKHRyYWluJEdhcmFnZUNvbmQpLCB5ZXM9MCwgbm89dHJhaW4kR2FyYWdlQ29uZCkKdHJhaW4kR2FyYWdlQ29uZCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlQ29uZCA9PSAiRXgiLCB5ZXM9NSwgbm89dHJhaW4kR2FyYWdlQ29uZCkKdHJhaW4kR2FyYWdlQ29uZCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlQ29uZCA9PSAiR2QiLCB5ZXM9NCwgbm89dHJhaW4kR2FyYWdlQ29uZCkKdHJhaW4kR2FyYWdlQ29uZCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlQ29uZCA9PSAiVEEiLCB5ZXM9Mywgbm89dHJhaW4kR2FyYWdlQ29uZCkKdHJhaW4kR2FyYWdlQ29uZCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlQ29uZCA9PSAiRmEiLCB5ZXM9Miwgbm89dHJhaW4kR2FyYWdlQ29uZCkKdHJhaW4kR2FyYWdlQ29uZCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlQ29uZCA9PSAiUG8iLCB5ZXM9MSwgbm89dHJhaW4kR2FyYWdlQ29uZCkKCnRlc3QkR2FyYWdlQ29uZCA8LSBpZmVsc2UoaXMubmEodGVzdCRHYXJhZ2VDb25kKSwgeWVzPTAsIG5vPXRlc3QkR2FyYWdlQ29uZCkKdGVzdCRHYXJhZ2VDb25kIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZUNvbmQgPT0gIkV4IiwgeWVzPTUsIG5vPXRlc3QkR2FyYWdlQ29uZCkKdGVzdCRHYXJhZ2VDb25kIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZUNvbmQgPT0gIkdkIiwgeWVzPTQsIG5vPXRlc3QkR2FyYWdlQ29uZCkKdGVzdCRHYXJhZ2VDb25kIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZUNvbmQgPT0gIlRBIiwgeWVzPTMsIG5vPXRlc3QkR2FyYWdlQ29uZCkKdGVzdCRHYXJhZ2VDb25kIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZUNvbmQgPT0gIkZhIiwgeWVzPTIsIG5vPXRlc3QkR2FyYWdlQ29uZCkKdGVzdCRHYXJhZ2VDb25kIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZUNvbmQgPT0gIlBvIiwgeWVzPTEsIG5vPXRlc3QkR2FyYWdlQ29uZCkKCnRyYWluJEdhcmFnZVF1YWwgPC0gaWZlbHNlKGlzLm5hKHRyYWluJEdhcmFnZVF1YWwpLCB5ZXM9MCwgbm89dHJhaW4kR2FyYWdlUXVhbCkKdHJhaW4kR2FyYWdlUXVhbCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlUXVhbCA9PSAiRXgiLCB5ZXM9NSwgbm89dHJhaW4kR2FyYWdlUXVhbCkKdHJhaW4kR2FyYWdlUXVhbCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlUXVhbCA9PSAiR2QiLCB5ZXM9NCwgbm89dHJhaW4kR2FyYWdlUXVhbCkKdHJhaW4kR2FyYWdlUXVhbCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlUXVhbCA9PSAiVEEiLCB5ZXM9Mywgbm89dHJhaW4kR2FyYWdlUXVhbCkKdHJhaW4kR2FyYWdlUXVhbCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlUXVhbCA9PSAiRmEiLCB5ZXM9Miwgbm89dHJhaW4kR2FyYWdlUXVhbCkKdHJhaW4kR2FyYWdlUXVhbCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlUXVhbCA9PSAiUG8iLCB5ZXM9MSwgbm89dHJhaW4kR2FyYWdlUXVhbCkKCnRlc3QkR2FyYWdlUXVhbCA8LSBpZmVsc2UoaXMubmEodGVzdCRHYXJhZ2VRdWFsKSwgeWVzPTAsIG5vPXRlc3QkR2FyYWdlUXVhbCkKdGVzdCRHYXJhZ2VRdWFsIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZVF1YWwgPT0gIkV4IiwgeWVzPTUsIG5vPXRlc3QkR2FyYWdlUXVhbCkKdGVzdCRHYXJhZ2VRdWFsIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZVF1YWwgPT0gIkdkIiwgeWVzPTQsIG5vPXRlc3QkR2FyYWdlUXVhbCkKdGVzdCRHYXJhZ2VRdWFsIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZVF1YWwgPT0gIlRBIiwgeWVzPTMsIG5vPXRlc3QkR2FyYWdlUXVhbCkKdGVzdCRHYXJhZ2VRdWFsIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZVF1YWwgPT0gIkZhIiwgeWVzPTIsIG5vPXRlc3QkR2FyYWdlUXVhbCkKdGVzdCRHYXJhZ2VRdWFsIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZVF1YWwgPT0gIlBvIiwgeWVzPTEsIG5vPXRlc3QkR2FyYWdlUXVhbCkKCnRyYWluJEdhcmFnZUZpbmlzaCA8LSBpZmVsc2UoaXMubmEodHJhaW4kR2FyYWdlRmluaXNoKSwgeWVzPTAsIG5vPXRyYWluJEdhcmFnZUZpbmlzaCkKdHJhaW4kR2FyYWdlRmluaXNoIDwtIGlmZWxzZSh0cmFpbiRHYXJhZ2VGaW5pc2ggPT0gIkZpbiIsIHllcz0zLCBubz10cmFpbiRHYXJhZ2VGaW5pc2gpCnRyYWluJEdhcmFnZUZpbmlzaCA8LSBpZmVsc2UodHJhaW4kR2FyYWdlRmluaXNoID09ICJSRm4iLCB5ZXM9Miwgbm89dHJhaW4kR2FyYWdlRmluaXNoKQp0cmFpbiRHYXJhZ2VGaW5pc2ggPC0gaWZlbHNlKHRyYWluJEdhcmFnZUZpbmlzaCA9PSAiVW5mIiwgeWVzPTEsIG5vPXRyYWluJEdhcmFnZUZpbmlzaCkKCnRlc3QkR2FyYWdlRmluaXNoIDwtIGlmZWxzZShpcy5uYSh0ZXN0JEdhcmFnZUZpbmlzaCksIHllcz0wLCBubz10ZXN0JEdhcmFnZUZpbmlzaCkKdGVzdCRHYXJhZ2VGaW5pc2ggPC0gaWZlbHNlKHRlc3QkR2FyYWdlRmluaXNoID09ICJGaW4iLCB5ZXM9Mywgbm89dGVzdCRHYXJhZ2VGaW5pc2gpCnRlc3QkR2FyYWdlRmluaXNoIDwtIGlmZWxzZSh0ZXN0JEdhcmFnZUZpbmlzaCA9PSAiUkZuIiwgeWVzPTIsIG5vPXRlc3QkR2FyYWdlRmluaXNoKQp0ZXN0JEdhcmFnZUZpbmlzaCA8LSBpZmVsc2UodGVzdCRHYXJhZ2VGaW5pc2ggPT0gIlVuZiIsIHllcz0xLCBubz10ZXN0JEdhcmFnZUZpbmlzaCkKCnRlc3QkR2FyYWdlQ2FycyA8LSBpZmVsc2UoaXMubmEodGVzdCRHYXJhZ2VDYXJzKSwgeWVzPTAsIG5vPXRlc3QkR2FyYWdlQ2FycykKCmdhcmxtIDwtIGxtKGRhdGEgPSB0cmFpbiwgZm9ybXVsYSA9IEdhcmFnZUFyZWEgfiBHYXJhZ2VDYXJzKQpwZ2FyIDwtIHByZWRpY3Qob2JqZWN0ID0gZ2FybG0sIG5ld2RhdGEgPSB0ZXN0KQp0ZXN0JEdhcmFnZUFyZWEgPC0gaWZlbHNlKGlzLm5hKHRlc3QkR2FyYWdlQXJlYSksIHllcz1wZ2FyLCBubz10ZXN0JEdhcmFnZUFyZWEpCmBgYAoKClBvb2xRQyB0byBOdW1iZXJzCgpgYGB7cn0KdHJhaW4kUG9vbFFDIDwtIGlmZWxzZShpcy5uYSh0cmFpbiRQb29sUUMpLCB5ZXM9MCwgbm89dHJhaW4kUG9vbFFDKQp0cmFpbiRQb29sUUMgPC0gaWZlbHNlKHRyYWluJFBvb2xRQyA9PSAiRXgiLCB5ZXM9MTAsIG5vPXRyYWluJFBvb2xRQykKdHJhaW4kUG9vbFFDIDwtIGlmZWxzZSh0cmFpbiRQb29sUUMgPT0gIkdkIiwgeWVzPTgsIG5vPXRyYWluJFBvb2xRQykKdHJhaW4kUG9vbFFDIDwtIGlmZWxzZSh0cmFpbiRQb29sUUMgPT0gIkZhIiwgeWVzPTMsIG5vPXRyYWluJFBvb2xRQykKCnRlc3QkUG9vbFFDIDwtIGlmZWxzZShpcy5uYSh0ZXN0JFBvb2xRQyksIHllcz0wLCBubz10ZXN0JFBvb2xRQykKdGVzdCRQb29sUUMgPC0gaWZlbHNlKHRlc3QkUG9vbFFDID09ICJFeCIsIHllcz0xMCwgbm89dGVzdCRQb29sUUMpCnRlc3QkUG9vbFFDIDwtIGlmZWxzZSh0ZXN0JFBvb2xRQyA9PSAiR2QiLCB5ZXM9OCwgbm89dGVzdCRQb29sUUMpCmBgYAoKRmVuY2UgIHRvIE51bWJlcnMKCmBgYHtyfQp0cmFpbiRGZW5jZSA8LSBpZmVsc2UoaXMubmEodHJhaW4kRmVuY2UpLCB5ZXM9MCwgbm89dHJhaW4kRmVuY2UpCnRyYWluJEZlbmNlIDwtIGlmZWxzZSh0cmFpbiRGZW5jZSA9PSAiTW5XdyIsIHllcz0xLCBubz10cmFpbiRGZW5jZSkKdHJhaW4kRmVuY2UgPC0gaWZlbHNlKHRyYWluJEZlbmNlID09ICJHZFdvIiwgeWVzPTIsIG5vPXRyYWluJEZlbmNlKQp0cmFpbiRGZW5jZSA8LSBpZmVsc2UodHJhaW4kRmVuY2UgPT0gIk1uUHJ2IiwgeWVzPTMsIG5vPXRyYWluJEZlbmNlKQp0cmFpbiRGZW5jZSA8LSBpZmVsc2UodHJhaW4kRmVuY2UgPT0gIkdkUHJ2IiwgeWVzPTQsIG5vPXRyYWluJEZlbmNlKQoKdGVzdCRGZW5jZSA8LSBpZmVsc2UoaXMubmEodGVzdCRGZW5jZSksIHllcz0wLCBubz10ZXN0JEZlbmNlKQp0ZXN0JEZlbmNlIDwtIGlmZWxzZSh0ZXN0JEZlbmNlID09ICJNbld3IiwgeWVzPTEsIG5vPXRlc3QkRmVuY2UpCnRlc3QkRmVuY2UgPC0gaWZlbHNlKHRlc3QkRmVuY2UgPT0gIkdkV28iLCB5ZXM9Miwgbm89dGVzdCRGZW5jZSkKdGVzdCRGZW5jZSA8LSBpZmVsc2UodGVzdCRGZW5jZSA9PSAiTW5QcnYiLCB5ZXM9Mywgbm89dGVzdCRGZW5jZSkKdGVzdCRGZW5jZSA8LSBpZmVsc2UodGVzdCRGZW5jZSA9PSAiR2RQcnYiLCB5ZXM9NCwgbm89dGVzdCRGZW5jZSkKCmBgYAoKQWxsZXkgYW5kIFN0cmVldCB0byBOdW1iZXJzCgpgYGB7cn0KdHJhaW4kQWxsZXkgPC0gaWZlbHNlKGlzLm5hKHRyYWluJEFsbGV5KSwgeWVzPTAsIG5vPXRyYWluJEFsbGV5KQp0cmFpbiRBbGxleSA8LSBpZmVsc2UodHJhaW4kQWxsZXkgPT0gIkdydmwiLCB5ZXM9MSwgbm89dHJhaW4kQWxsZXkpCnRyYWluJEFsbGV5IDwtIGlmZWxzZSh0cmFpbiRBbGxleSA9PSAiUGF2ZSIsIHllcz0yLCBubz10cmFpbiRBbGxleSkKCnRlc3QkQWxsZXkgPC0gaWZlbHNlKGlzLm5hKHRlc3QkQWxsZXkpLCB5ZXM9MCwgbm89dGVzdCRBbGxleSkKdGVzdCRBbGxleSA8LSBpZmVsc2UodGVzdCRBbGxleSA9PSAiR3J2bCIsIHllcz0xLCBubz10ZXN0JEFsbGV5KQp0ZXN0JEFsbGV5IDwtIGlmZWxzZSh0ZXN0JEFsbGV5ID09ICJQYXZlIiwgeWVzPTIsIG5vPXRlc3QkQWxsZXkpCgp0cmFpbiRTdHJlZXQgPC0gaWZlbHNlKHRyYWluJFN0cmVldCA9PSAiR3J2bCIsIHllcz0xLCBubz10cmFpbiRTdHJlZXQpCnRyYWluJFN0cmVldCA8LSBpZmVsc2UodHJhaW4kU3RyZWV0ID09ICJQYXZlIiwgeWVzPTIsIG5vPXRyYWluJFN0cmVldCkKCnRlc3QkU3RyZWV0IDwtIGlmZWxzZSh0ZXN0JFN0cmVldCA9PSAiR3J2bCIsIHllcz0xLCBubz10ZXN0JFN0cmVldCkKdGVzdCRTdHJlZXQgPC0gaWZlbHNlKHRlc3QkU3RyZWV0ID09ICJQYXZlIiwgeWVzPTIsIG5vPXRlc3QkU3RyZWV0KQpgYGAKCkZpcmVwbGFjZQpgYGB7cn0KdHJhaW4kRmlyZXBsYWNlUXUgPC0gaWZlbHNlKGlzLm5hKHRyYWluJEZpcmVwbGFjZVF1KSwgeWVzPTAsIG5vPXRyYWluJEZpcmVwbGFjZVF1KQp0cmFpbiRGaXJlcGxhY2VRdSA8LSBpZmVsc2UodHJhaW4kRmlyZXBsYWNlUXUgPT0gIkV4IiwgeWVzPTUsIG5vPXRyYWluJEZpcmVwbGFjZVF1KQp0cmFpbiRGaXJlcGxhY2VRdSA8LSBpZmVsc2UodHJhaW4kRmlyZXBsYWNlUXUgPT0gIkdkIiwgeWVzPTQsIG5vPXRyYWluJEZpcmVwbGFjZVF1KQp0cmFpbiRGaXJlcGxhY2VRdSA8LSBpZmVsc2UodHJhaW4kRmlyZXBsYWNlUXUgPT0gIlRBIiwgeWVzPTMsIG5vPXRyYWluJEZpcmVwbGFjZVF1KQp0cmFpbiRGaXJlcGxhY2VRdSA8LSBpZmVsc2UodHJhaW4kRmlyZXBsYWNlUXUgPT0gIkZhIiwgeWVzPTIsIG5vPXRyYWluJEZpcmVwbGFjZVF1KQp0cmFpbiRGaXJlcGxhY2VRdSA8LSBpZmVsc2UodHJhaW4kRmlyZXBsYWNlUXUgPT0gIlBvIiwgeWVzPTEsIG5vPXRyYWluJEZpcmVwbGFjZVF1KQoKdGVzdCRGaXJlcGxhY2VRdSA8LSBpZmVsc2UoaXMubmEodGVzdCRGaXJlcGxhY2VRdSksIHllcz0wLCBubz10ZXN0JEZpcmVwbGFjZVF1KQp0ZXN0JEZpcmVwbGFjZVF1IDwtIGlmZWxzZSh0ZXN0JEZpcmVwbGFjZVF1ID09ICJFeCIsIHllcz01LCBubz10ZXN0JEZpcmVwbGFjZVF1KQp0ZXN0JEZpcmVwbGFjZVF1IDwtIGlmZWxzZSh0ZXN0JEZpcmVwbGFjZVF1ID09ICJHZCIsIHllcz00LCBubz10ZXN0JEZpcmVwbGFjZVF1KQp0ZXN0JEZpcmVwbGFjZVF1IDwtIGlmZWxzZSh0ZXN0JEZpcmVwbGFjZVF1ID09ICJUQSIsIHllcz0zLCBubz10ZXN0JEZpcmVwbGFjZVF1KQp0ZXN0JEZpcmVwbGFjZVF1IDwtIGlmZWxzZSh0ZXN0JEZpcmVwbGFjZVF1ID09ICJGYSIsIHllcz0yLCBubz10ZXN0JEZpcmVwbGFjZVF1KQp0ZXN0JEZpcmVwbGFjZVF1IDwtIGlmZWxzZSh0ZXN0JEZpcmVwbGFjZVF1ID09ICJQbyIsIHllcz0xLCBubz10ZXN0JEZpcmVwbGFjZVF1KQpgYGAKClZhcmlvcwpgYGB7cn0KdHJhaW4kTG90RnJvbnRhZ2UgPC0gaWZlbHNlKGlzLm5hKHRyYWluJExvdEZyb250YWdlKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMgPSBtZWFuKHRyYWluJExvdEZyb250YWdlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gPSB0cmFpbiRMb3RGcm9udGFnZSkKdGVzdCRMb3RGcm9udGFnZSA8LSBpZmVsc2UoaXMubmEodGVzdCRMb3RGcm9udGFnZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gbWVhbih0ZXN0JExvdEZyb250YWdlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gPSB0ZXN0JExvdEZyb250YWdlKQp0ZXN0JFV0aWxpdGllcyA8LSBpZmVsc2UoaXMubmEodGVzdCRVdGlsaXRpZXMpLCB5ZXM9IkFsbFB1YiIsIG5vPXRlc3QkVXRpbGl0aWVzKQp0ZXN0JE1TWm9uaW5nIDwtIGlmZWxzZShpcy5uYSh0ZXN0JE1TWm9uaW5nKSwgeWVzPSJDIiwgbm89dGVzdCRNU1pvbmluZykKdGVzdCRNU1pvbmluZyA8LSBpZmVsc2UodGVzdCRNU1pvbmluZyA9PSAiQyAoYWxsKSIsIHllcz0iQyIsIG5vPXRlc3QkTVNab25pbmcpCnRyYWluJE1TWm9uaW5nIDwtIGlmZWxzZSh0cmFpbiRNU1pvbmluZyA9PSAiQyAoYWxsKSIsIHllcz0iQyIsIG5vPXRyYWluJE1TWm9uaW5nKQoKdGFibGUodGVzdCRVdGlsaXRpZXMpCmBgYAoKCmBgYHtyfQpsbSA8LSBsbShkYXRhID0gdHJhaW4sIGZvcm11bGEgPSBTYWxlUHJpY2UgfiBZclNvbGQgKyBNaXNjVmFsICsgRmVuY2UgKyBNU1N1YkNsYXNzICsgTVNab25pbmcgKyBMb3RBcmVhICsgVXRpbGl0aWVzICsgTmVpZ2hib3Job29kICsgSG91c2VTdHlsZSArIE92ZXJhbGxRdWFsICsgT3ZlcmFsbENvbmQgKyBZZWFyQnVpbHQgKyBGb3VuZGF0aW9uICsgR2FyYWdlQXJlYSArIFBvb2xBcmVhICsgTWlzY1ZhbCArIFNhbGVDb25kaXRpb24gKyBDb25kaXRpb24xICsgQ29uZGl0aW9uMikKcHJlZGljdGVkX3ByaWNlIDwtIHByZWRpY3Qob2JqZWN0ID0gbG0sIG5ld2RhdGEgPSB0ZXN0KQpwcmljZSA8LSBkYXRhLmZyYW1lKElkID0gdGVzdCRJZCwgU2FsZVByaWNlID0gcm91bmQocHJlZGljdGVkX3ByaWNlLDApKQpwcmljZSRTYWxlUHJpY2UgPC0gaWZlbHNlIChwcmljZSRTYWxlUHJpY2U8MCwgeWVzPW1lYW4ocHJpY2UkU2FsZVByaWNlKSwgbm89cHJpY2UkU2FsZVByaWNlKQp3cml0ZS5jc3YocHJpY2UsIGZpbGU9InByaWNlcy5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAoK