Name: Ruowei Fischer

UCID: M14820974

Part 2A. Practice of modeling a binary response using logistic regression.

Create binary responses

Step 1. From now on, please work on the cleaned FAA data set you prepared by carrying out Steps 1-9 in Part 1 of the project. Create two binary variables below and attach them to your data set. long.landing = 1 if distance > 2500; =0 otherwise risky.landing = 1 if distance > 3000; =0 otherwise. Discard the continuous data you have for “distance”, and assume we are given the binary data of “long.landing” and “risky.landing” only.
FAA1 <- read.csv("FAA1.csv", header = TRUE)
FAA2 <- read.csv("FAA2.csv", header = TRUE)
FAA2 <- FAA2[-c(151:200), ]
FAA <- merge(FAA1, FAA2, by = c("aircraft","no_pasg", "speed_ground","speed_air","height", "pitch", "distance"), all = TRUE)
FAA$aircraft_num <- ifelse(FAA$aircraft == "airbus", 1, 0)
FAA<- subset(FAA, duration > 40)
#remove speed_ground that's less than 30 or greater than 140
FAA<- subset(FAA, speed_ground >=30 & speed_ground <=140)
#remove speed_air that's less than 30 or greater than 140
FAA<- subset(FAA, speed_air >=30 & speed_ground <=140)
#remove height that's less than 6 meters
FAA<- subset(FAA, height >=6)
#remove distance that's over 6000 feet
FAA <- subset(FAA, distance < 6000)
#export the wrangled data to csv for
write.csv(FAA, "FAA_wrangled.csv", row.names = FALSE)
#create additional variables
FAA$long.landing <- ifelse(FAA$distance > 2500, 1, 0)
FAA$risky.landing <- ifelse(FAA$distance > 3000, 1, 0)
#discard variable distance
FAA <- FAA[, -7]
attach(FAA)

Identifying important factors using the binary data of “long.landing”.

Step 2. Use a pie chart or a histogram to show the distribution of “long.landing”.
# Calculate the frequency distribution of long.landing
long_landing_counts <- round(table(long.landing)/length(long.landing)*100,1)

# Label the pie chart slices
labels <- paste(names(long_landing_counts), ": ", long_landing_counts,"%", sep = "")

# Create the pie chart
pie(
  long_landing_counts,
  labels = labels,
  main = "Distribution of Long Landing",
  col = c("lightblue", "salmon") # Custom colors for 0 and 1
)

Step 3. Perform single-factor regression analysis for each of the potential risk factors, in a similar way to what you did in Steps 13-15 of Part 1. But here the response “long.landing” is binary. You may consider using logistic regression. Provide a table that ranks the factors from the most important to the least. This table contains 5 columns: the names of variables, the size of the regression coefficient, the odds ratio, the direction of the regression coefficient (positive or negative), and the p-value.
library(dplyr)
# List of predictors
predictors <- c("aircraft_num", "no_pasg", "speed_ground", "speed_air", "height", "pitch", "duration")
# Initialize an empty data frame to store results
single_reg <- data.frame(
  Variable = character(),
  Coefficient = numeric(),
  Odds_Ratio = numeric(),
  Direction = character(),
  P_Value = numeric(),
  stringsAsFactors = FALSE
)
# Perform logistic regression for each predictor
for (var in predictors) {
  # Build the formula dynamically
  formula <- as.formula(paste("long.landing ~", var))
  # Fit logistic regression model
  model <- glm(formula, data = FAA, family = binomial)
  # Extract coefficients and p-value
  coef_value <- coef(summary(model))[2, 1]       # Regression coefficient
  p_value <- (coef(summary(model))[2, 4])       # P-value
  odds_ratio <- round(exp(coef_value), 3)                # Odds ratio
  direction <- ifelse(coef_value > 0, "Positive", "Negative")
  # Append results to the data frame
  single_reg <- rbind(single_reg, data.frame(
    Variable = var,
    Coefficient = abs(coef_value), # Use absolute value for ranking
    Odds_Ratio = odds_ratio,
    Direction = direction,
    P_Value = p_value
  ))
}
# Rank factors by the size of the coefficient
single_reg <- single_reg %>% arrange(desc(Coefficient))

# Print the results
print(single_reg)

By the nature of long.landing value and risky.landing value, if it’s a risky landing, it must be a long landing, so I decided not to include the risky.landing variable in this regression analysis. Based on the regression summary statistics, we can see that speed_air and speed ground has significant impact on increasing the risk of being a long landing. Aircraft’s P value is very close to 0.05 threshold, but it still indicates that there may not be a significant impact.

Step 4. For those significant factors identified in Step 3, visualize its association with “long.landing”. See the slides (pp. 12-21) for Lecture 3.
plot(long.landing ~ speed_ground)

plot(long.landing ~ speed_air)

library(ggplot2)

# Jitter plot for speed_ground vs. long.landing
ggplot(FAA, aes(y = as.factor(long.landing), x = speed_ground)) +
  geom_jitter(width = 0.2, aes(color = as.factor(long.landing))) +
  labs(title = "Jitter Plot: Speed_Ground vs Long Landing",
       x = "Speed Ground)",
       y = "Long Landing (0 = No, 1 = Yes)") +
  scale_color_manual(values = c("blue", "red"), name = "Long Landing") +
  theme_minimal()


# Jitter plot for speed_air vs. long.landing
ggplot(FAA, aes(y = as.factor(long.landing), x = speed_air)) +
  geom_jitter(width = 0.2, aes(color = as.factor(long.landing))) +
  labs(title = "Jitter Plot: Speed_Air vs Long Landing",
       x = "Speed Air",
       y = "Long Landing (0 = No, 1 = Yes)") +
  scale_color_manual(values = c("blue", "red"), name = "Long Landing") +
  theme_minimal()

# Histogram with density line for speed_ground by long.landing
ggplot(FAA, aes(x = speed_ground, fill = as.factor(long.landing), color = as.factor(long.landing))) +
  geom_histogram(aes(y = ..density..), binwidth = 5, position = "identity", alpha = 0.5) +
  geom_density(alpha = 0.7) +
  labs(title = "Histogram and Density: Speed_Ground by Long Landing",
       x = "Speed Ground",
       y = "Density",
       fill = "Long Landing",
       color = "Long Landing") +
  scale_fill_manual(values = c("blue", "red")) +
  scale_color_manual(values = c("blue", "red")) +
  theme_minimal()


# Histogram with density line for speed_air by long.landing
ggplot(FAA, aes(x = speed_air, fill = as.factor(long.landing), color = as.factor(long.landing))) +
  geom_histogram(aes(y = ..density..), binwidth = 5, position = "identity", alpha = 0.5) +
  geom_density(alpha = 0.7) +
  labs(title = "Histogram and Density: Speed_Air by Long Landing",
       x = "Speed Air",
       y = "Density",
       fill = "Long Landing",
       color = "Long Landing") +
  scale_fill_manual(values = c("blue", "red")) +
  scale_color_manual(values = c("blue", "red")) +
  theme_minimal()

Based on the three different plots above, we can see that when speed ground and speed air increase, the risk of having a long landing increase as well, especially when the speed passes 100-105 MPH.

Step 5. Based on the analysis results in Steps 3-4 and the collinearity result seen in Step 16 of Part 1, initiate a “full” model. Fit your model to the data and present your result.
library(faraway)
# Fit the full logistic regression model with speed_air
full_model <- glm(long.landing ~ speed_air, 
                  data = FAA, 
                  family = binomial)

# View the summary of the model
summary(full_model)

Call:
glm(formula = long.landing ~ speed_air, family = binomial, data = FAA)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -52.89273    8.21194  -6.441 1.19e-10 ***
speed_air     0.52234    0.08157   6.404 1.51e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 270.199  on 194  degrees of freedom
Residual deviance:  94.155  on 193  degrees of freedom
AIC: 98.155

Number of Fisher Scoring iterations: 7
odds <- exp(coef(full_model))
paste("Oddes is ", odds)
[1] "Oddes is  1.06900649354914e-23" "Oddes is  1.68596207885757"    
#visualize fitted model
beta.full.model <- coef(full_model)
plot(jitter(long.landing, 0.1) ~ jitter(speed_air), FAA, xlab = "Speed Air", ylab = "Long Landing", pch = ".")
curve(ilogit(beta.full.model[1]+beta.full.model[2]*x), add = TRUE)

The full model can be written as P(long.landing = 1) = exp(-52.89 + 0.52 * speed_air) / 1 + exp(-52.89 + 0.52 * speed_air). For every 1 unit increase in speed_air, the log-odds of a long landing increase by 0.52234, the higher speed_air is associated with a greater likelihood of a long landing. The odds ratio is 1.686, for every 1-unit increase in speed_air, the odds of a long landing are multiplied by approx. 1.686, a 68.6% increase in odds.

LS0tCnRpdGxlOiAiQkFOQSA3MDQyIE1vZHVsZSAyIFByb2plY3QgUGFydCAyQSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMgTmFtZTogUnVvd2VpIEZpc2NoZXIKCiMjIFVDSUQ6IE0xNDgyMDk3NAoKIyMgUGFydCAyQS4gUHJhY3RpY2Ugb2YgbW9kZWxpbmcgYSBiaW5hcnkgcmVzcG9uc2UgdXNpbmcgbG9naXN0aWMgcmVncmVzc2lvbi4KCiMjIyBDcmVhdGUgYmluYXJ5IHJlc3BvbnNlcwoKIyMjIyMgU3RlcCAxLiBGcm9tIG5vdyBvbiwgcGxlYXNlIHdvcmsgb24gdGhlIGNsZWFuZWQgRkFBIGRhdGEgc2V0IHlvdSBwcmVwYXJlZCBieSBjYXJyeWluZyBvdXQgU3RlcHMgMS05IGluIFBhcnQgMSBvZiB0aGUgcHJvamVjdC4gQ3JlYXRlIHR3byBiaW5hcnkgdmFyaWFibGVzIGJlbG93IGFuZCBhdHRhY2ggdGhlbSB0byB5b3VyIGRhdGEgc2V0LiBsb25nLmxhbmRpbmcgPSAxIGlmIGRpc3RhbmNlID4gMjUwMDsgPTAgb3RoZXJ3aXNlIHJpc2t5LmxhbmRpbmcgPSAxIGlmIGRpc3RhbmNlID4gMzAwMDsgPTAgb3RoZXJ3aXNlLiBEaXNjYXJkIHRoZSBjb250aW51b3VzIGRhdGEgeW91IGhhdmUgZm9yIOKAnGRpc3RhbmNl4oCdLCBhbmQgYXNzdW1lIHdlIGFyZSBnaXZlbiB0aGUgYmluYXJ5IGRhdGEgb2Yg4oCcbG9uZy5sYW5kaW5n4oCdIGFuZCDigJxyaXNreS5sYW5kaW5n4oCdIG9ubHkuCgpgYGB7cn0KRkFBMSA8LSByZWFkLmNzdigiRkFBMS5jc3YiLCBoZWFkZXIgPSBUUlVFKQpGQUEyIDwtIHJlYWQuY3N2KCJGQUEyLmNzdiIsIGhlYWRlciA9IFRSVUUpCkZBQTIgPC0gRkFBMlstYygxNTE6MjAwKSwgXQpGQUEgPC0gbWVyZ2UoRkFBMSwgRkFBMiwgYnkgPSBjKCJhaXJjcmFmdCIsIm5vX3Bhc2ciLCAic3BlZWRfZ3JvdW5kIiwic3BlZWRfYWlyIiwiaGVpZ2h0IiwgInBpdGNoIiwgImRpc3RhbmNlIiksIGFsbCA9IFRSVUUpCkZBQSRhaXJjcmFmdF9udW0gPC0gaWZlbHNlKEZBQSRhaXJjcmFmdCA9PSAiYWlyYnVzIiwgMSwgMCkKRkFBPC0gc3Vic2V0KEZBQSwgZHVyYXRpb24gPiA0MCkKI3JlbW92ZSBzcGVlZF9ncm91bmQgdGhhdCdzIGxlc3MgdGhhbiAzMCBvciBncmVhdGVyIHRoYW4gMTQwCkZBQTwtIHN1YnNldChGQUEsIHNwZWVkX2dyb3VuZCA+PTMwICYgc3BlZWRfZ3JvdW5kIDw9MTQwKQojcmVtb3ZlIHNwZWVkX2FpciB0aGF0J3MgbGVzcyB0aGFuIDMwIG9yIGdyZWF0ZXIgdGhhbiAxNDAKRkFBPC0gc3Vic2V0KEZBQSwgc3BlZWRfYWlyID49MzAgJiBzcGVlZF9ncm91bmQgPD0xNDApCiNyZW1vdmUgaGVpZ2h0IHRoYXQncyBsZXNzIHRoYW4gNiBtZXRlcnMKRkFBPC0gc3Vic2V0KEZBQSwgaGVpZ2h0ID49NikKI3JlbW92ZSBkaXN0YW5jZSB0aGF0J3Mgb3ZlciA2MDAwIGZlZXQKRkFBIDwtIHN1YnNldChGQUEsIGRpc3RhbmNlIDwgNjAwMCkKI2V4cG9ydCB0aGUgd3JhbmdsZWQgZGF0YSB0byBjc3YgZm9yCndyaXRlLmNzdihGQUEsICJGQUFfd3JhbmdsZWQuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCiNjcmVhdGUgYWRkaXRpb25hbCB2YXJpYWJsZXMKRkFBJGxvbmcubGFuZGluZyA8LSBpZmVsc2UoRkFBJGRpc3RhbmNlID4gMjUwMCwgMSwgMCkKRkFBJHJpc2t5LmxhbmRpbmcgPC0gaWZlbHNlKEZBQSRkaXN0YW5jZSA+IDMwMDAsIDEsIDApCiNkaXNjYXJkIHZhcmlhYmxlIGRpc3RhbmNlCkZBQSA8LSBGQUFbLCAtN10KYXR0YWNoKEZBQSkKYGBgCgojIyMgSWRlbnRpZnlpbmcgaW1wb3J0YW50IGZhY3RvcnMgdXNpbmcgdGhlIGJpbmFyeSBkYXRhIG9mIOKAnGxvbmcubGFuZGluZ+KAnS4KCiMjIyMjIFN0ZXAgMi4gVXNlIGEgcGllIGNoYXJ0IG9yIGEgaGlzdG9ncmFtIHRvIHNob3cgdGhlIGRpc3RyaWJ1dGlvbiBvZiDigJxsb25nLmxhbmRpbmfigJ0uCgpgYGB7cn0KIyBDYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgbG9uZy5sYW5kaW5nCmxvbmdfbGFuZGluZ19jb3VudHMgPC0gcm91bmQodGFibGUobG9uZy5sYW5kaW5nKS9sZW5ndGgobG9uZy5sYW5kaW5nKSoxMDAsMSkKCiMgTGFiZWwgdGhlIHBpZSBjaGFydCBzbGljZXMKbGFiZWxzIDwtIHBhc3RlKG5hbWVzKGxvbmdfbGFuZGluZ19jb3VudHMpLCAiOiAiLCBsb25nX2xhbmRpbmdfY291bnRzLCIlIiwgc2VwID0gIiIpCgojIENyZWF0ZSB0aGUgcGllIGNoYXJ0CnBpZSgKICBsb25nX2xhbmRpbmdfY291bnRzLAogIGxhYmVscyA9IGxhYmVscywKICBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBMb25nIExhbmRpbmciLAogIGNvbCA9IGMoImxpZ2h0Ymx1ZSIsICJzYWxtb24iKSAjIEN1c3RvbSBjb2xvcnMgZm9yIDAgYW5kIDEKKQpgYGAKCgojIyMjIyBTdGVwIDMuIFBlcmZvcm0gc2luZ2xlLWZhY3RvciByZWdyZXNzaW9uIGFuYWx5c2lzIGZvciBlYWNoIG9mIHRoZSBwb3RlbnRpYWwgcmlzayBmYWN0b3JzLCBpbiBhIHNpbWlsYXIgd2F5IHRvIHdoYXQgeW91IGRpZCBpbiBTdGVwcyAxMy0xNSBvZiBQYXJ0IDEuIEJ1dCBoZXJlIHRoZSByZXNwb25zZSDigJxsb25nLmxhbmRpbmfigJ0gaXMgYmluYXJ5LiBZb3UgbWF5IGNvbnNpZGVyIHVzaW5nIGxvZ2lzdGljIHJlZ3Jlc3Npb24uIFByb3ZpZGUgYSB0YWJsZSB0aGF0IHJhbmtzIHRoZSBmYWN0b3JzIGZyb20gdGhlIG1vc3QgaW1wb3J0YW50IHRvIHRoZSBsZWFzdC4gVGhpcyB0YWJsZSBjb250YWlucyA1IGNvbHVtbnM6IHRoZSBuYW1lcyBvZiB2YXJpYWJsZXMsIHRoZSBzaXplIG9mIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50LCB0aGUgb2RkcyByYXRpbywgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpLCBhbmQgdGhlIHAtdmFsdWUuCgpgYGB7cn0KbGlicmFyeShkcGx5cikKIyBMaXN0IG9mIHByZWRpY3RvcnMKcHJlZGljdG9ycyA8LSBjKCJhaXJjcmFmdF9udW0iLCAibm9fcGFzZyIsICJzcGVlZF9ncm91bmQiLCAic3BlZWRfYWlyIiwgImhlaWdodCIsICJwaXRjaCIsICJkdXJhdGlvbiIpCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIHRvIHN0b3JlIHJlc3VsdHMKc2luZ2xlX3JlZyA8LSBkYXRhLmZyYW1lKAogIFZhcmlhYmxlID0gY2hhcmFjdGVyKCksCiAgQ29lZmZpY2llbnQgPSBudW1lcmljKCksCiAgT2Rkc19SYXRpbyA9IG51bWVyaWMoKSwKICBEaXJlY3Rpb24gPSBjaGFyYWN0ZXIoKSwKICBQX1ZhbHVlID0gbnVtZXJpYygpLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopCiMgUGVyZm9ybSBsb2dpc3RpYyByZWdyZXNzaW9uIGZvciBlYWNoIHByZWRpY3Rvcgpmb3IgKHZhciBpbiBwcmVkaWN0b3JzKSB7CiAgIyBCdWlsZCB0aGUgZm9ybXVsYSBkeW5hbWljYWxseQogIGZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgibG9uZy5sYW5kaW5nIH4iLCB2YXIpKQogICMgRml0IGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWwKICBtb2RlbCA8LSBnbG0oZm9ybXVsYSwgZGF0YSA9IEZBQSwgZmFtaWx5ID0gYmlub21pYWwpCiAgIyBFeHRyYWN0IGNvZWZmaWNpZW50cyBhbmQgcC12YWx1ZQogIGNvZWZfdmFsdWUgPC0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0gICAgICAgIyBSZWdyZXNzaW9uIGNvZWZmaWNpZW50CiAgcF92YWx1ZSA8LSAoY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgNF0pICAgICAgICMgUC12YWx1ZQogIG9kZHNfcmF0aW8gPC0gcm91bmQoZXhwKGNvZWZfdmFsdWUpLCAzKSAgICAgICAgICAgICAgICAjIE9kZHMgcmF0aW8KICBkaXJlY3Rpb24gPC0gaWZlbHNlKGNvZWZfdmFsdWUgPiAwLCAiUG9zaXRpdmUiLCAiTmVnYXRpdmUiKQogICMgQXBwZW5kIHJlc3VsdHMgdG8gdGhlIGRhdGEgZnJhbWUKICBzaW5nbGVfcmVnIDwtIHJiaW5kKHNpbmdsZV9yZWcsIGRhdGEuZnJhbWUoCiAgICBWYXJpYWJsZSA9IHZhciwKICAgIENvZWZmaWNpZW50ID0gYWJzKGNvZWZfdmFsdWUpLCAjIFVzZSBhYnNvbHV0ZSB2YWx1ZSBmb3IgcmFua2luZwogICAgT2Rkc19SYXRpbyA9IG9kZHNfcmF0aW8sCiAgICBEaXJlY3Rpb24gPSBkaXJlY3Rpb24sCiAgICBQX1ZhbHVlID0gcF92YWx1ZQogICkpCn0KIyBSYW5rIGZhY3RvcnMgYnkgdGhlIHNpemUgb2YgdGhlIGNvZWZmaWNpZW50CnNpbmdsZV9yZWcgPC0gc2luZ2xlX3JlZyAlPiUgYXJyYW5nZShkZXNjKENvZWZmaWNpZW50KSkKCiMgUHJpbnQgdGhlIHJlc3VsdHMKcHJpbnQoc2luZ2xlX3JlZykKYGBgCgpCeSB0aGUgbmF0dXJlIG9mIGxvbmcubGFuZGluZyB2YWx1ZSBhbmQgcmlza3kubGFuZGluZyB2YWx1ZSwgaWYgaXQncyBhIHJpc2t5IGxhbmRpbmcsIGl0IG11c3QgYmUgYSBsb25nIGxhbmRpbmcsIHNvIEkgZGVjaWRlZCBub3QgdG8gaW5jbHVkZSB0aGUgcmlza3kubGFuZGluZyB2YXJpYWJsZSBpbiB0aGlzIHJlZ3Jlc3Npb24gYW5hbHlzaXMuIEJhc2VkIG9uIHRoZSByZWdyZXNzaW9uIHN1bW1hcnkgc3RhdGlzdGljcywgd2UgY2FuIHNlZSB0aGF0IHNwZWVkX2FpciBhbmQgc3BlZWQgZ3JvdW5kIGhhcyBzaWduaWZpY2FudCBpbXBhY3Qgb24gaW5jcmVhc2luZyB0aGUgcmlzayBvZiBiZWluZyBhIGxvbmcgbGFuZGluZy4gQWlyY3JhZnQncyBQIHZhbHVlIGlzIHZlcnkgY2xvc2UgdG8gMC4wNSB0aHJlc2hvbGQsIGJ1dCBpdCBzdGlsbCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBtYXkgbm90IGJlIGEgc2lnbmlmaWNhbnQgaW1wYWN0LgoKIyMjIyMgU3RlcCA0LiBGb3IgdGhvc2Ugc2lnbmlmaWNhbnQgZmFjdG9ycyBpZGVudGlmaWVkIGluIFN0ZXAgMywgdmlzdWFsaXplIGl0cyBhc3NvY2lhdGlvbiB3aXRoIOKAnGxvbmcubGFuZGluZ+KAnS4gU2VlIHRoZSBzbGlkZXMgKHBwLiAxMi0yMSkgZm9yIExlY3R1cmUgMy4KCmBgYHtyfQpwbG90KGxvbmcubGFuZGluZyB+IHNwZWVkX2dyb3VuZCkKcGxvdChsb25nLmxhbmRpbmcgfiBzcGVlZF9haXIpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCiMgSml0dGVyIHBsb3QgZm9yIHNwZWVkX2dyb3VuZCB2cy4gbG9uZy5sYW5kaW5nCmdncGxvdChGQUEsIGFlcyh5ID0gYXMuZmFjdG9yKGxvbmcubGFuZGluZyksIHggPSBzcGVlZF9ncm91bmQpKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFlcyhjb2xvciA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpKSkgKwogIGxhYnModGl0bGUgPSAiSml0dGVyIFBsb3Q6IFNwZWVkX0dyb3VuZCB2cyBMb25nIExhbmRpbmciLAogICAgICAgeCA9ICJTcGVlZCBHcm91bmQpIiwKICAgICAgIHkgPSAiTG9uZyBMYW5kaW5nICgwID0gTm8sIDEgPSBZZXMpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpLCBuYW1lID0gIkxvbmcgTGFuZGluZyIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgSml0dGVyIHBsb3QgZm9yIHNwZWVkX2FpciB2cy4gbG9uZy5sYW5kaW5nCmdncGxvdChGQUEsIGFlcyh5ID0gYXMuZmFjdG9yKGxvbmcubGFuZGluZyksIHggPSBzcGVlZF9haXIpKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFlcyhjb2xvciA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpKSkgKwogIGxhYnModGl0bGUgPSAiSml0dGVyIFBsb3Q6IFNwZWVkX0FpciB2cyBMb25nIExhbmRpbmciLAogICAgICAgeCA9ICJTcGVlZCBBaXIiLAogICAgICAgeSA9ICJMb25nIExhbmRpbmcgKDAgPSBObywgMSA9IFllcykiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIiksIG5hbWUgPSAiTG9uZyBMYW5kaW5nIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQojIEhpc3RvZ3JhbSB3aXRoIGRlbnNpdHkgbGluZSBmb3Igc3BlZWRfZ3JvdW5kIGJ5IGxvbmcubGFuZGluZwpnZ3Bsb3QoRkFBLCBhZXMoeCA9IHNwZWVkX2dyb3VuZCwgZmlsbCA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpLCBjb2xvciA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpKSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW53aWR0aCA9IDUsIHBvc2l0aW9uID0gImlkZW50aXR5IiwgYWxwaGEgPSAwLjUpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjcpICsKICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSBhbmQgRGVuc2l0eTogU3BlZWRfR3JvdW5kIGJ5IExvbmcgTGFuZGluZyIsCiAgICAgICB4ID0gIlNwZWVkIEdyb3VuZCIsCiAgICAgICB5ID0gIkRlbnNpdHkiLAogICAgICAgZmlsbCA9ICJMb25nIExhbmRpbmciLAogICAgICAgY29sb3IgPSAiTG9uZyBMYW5kaW5nIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSkgKwogIHRoZW1lX21pbmltYWwoKQoKIyBIaXN0b2dyYW0gd2l0aCBkZW5zaXR5IGxpbmUgZm9yIHNwZWVkX2FpciBieSBsb25nLmxhbmRpbmcKZ2dwbG90KEZBQSwgYWVzKHggPSBzcGVlZF9haXIsIGZpbGwgPSBhcy5mYWN0b3IobG9uZy5sYW5kaW5nKSwgY29sb3IgPSBhcy5mYWN0b3IobG9uZy5sYW5kaW5nKSkpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgYmlud2lkdGggPSA1LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC43KSArCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gYW5kIERlbnNpdHk6IFNwZWVkX0FpciBieSBMb25nIExhbmRpbmciLAogICAgICAgeCA9ICJTcGVlZCBBaXIiLAogICAgICAgeSA9ICJEZW5zaXR5IiwKICAgICAgIGZpbGwgPSAiTG9uZyBMYW5kaW5nIiwKICAgICAgIGNvbG9yID0gIkxvbmcgTGFuZGluZyIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKQmFzZWQgb24gdGhlIHRocmVlIGRpZmZlcmVudCBwbG90cyBhYm92ZSwgd2UgY2FuIHNlZSB0aGF0IHdoZW4gc3BlZWQgZ3JvdW5kIGFuZCBzcGVlZCBhaXIgaW5jcmVhc2UsIHRoZSByaXNrIG9mIGhhdmluZyBhIGxvbmcgbGFuZGluZyBpbmNyZWFzZSBhcyB3ZWxsLCBlc3BlY2lhbGx5IHdoZW4gdGhlIHNwZWVkIHBhc3NlcyAxMDAtMTA1IE1QSC4KCiMjIyMjIFN0ZXAgNS4gQmFzZWQgb24gdGhlIGFuYWx5c2lzIHJlc3VsdHMgaW4gU3RlcHMgMy00IGFuZCB0aGUgY29sbGluZWFyaXR5IHJlc3VsdCBzZWVuIGluIFN0ZXAgMTYgb2YgUGFydCAxLCBpbml0aWF0ZSBhIOKAnGZ1bGzigJ0gbW9kZWwuIEZpdCB5b3VyIG1vZGVsIHRvIHRoZSBkYXRhIGFuZCBwcmVzZW50IHlvdXIgcmVzdWx0LgoKYGBge3J9CmxpYnJhcnkoZmFyYXdheSkKIyBGaXQgdGhlIGZ1bGwgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHNwZWVkX2FpcgpmdWxsX21vZGVsIDwtIGdsbShsb25nLmxhbmRpbmcgfiBzcGVlZF9haXIsIAogICAgICAgICAgICAgICAgICBkYXRhID0gRkFBLCAKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwpCgojIFZpZXcgdGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsCnN1bW1hcnkoZnVsbF9tb2RlbCkKb2RkcyA8LSBleHAoY29lZihmdWxsX21vZGVsKSkKcGFzdGUoIk9kZGVzIGlzICIsIG9kZHMpCgojdmlzdWFsaXplIGZpdHRlZCBtb2RlbApiZXRhLmZ1bGwubW9kZWwgPC0gY29lZihmdWxsX21vZGVsKQpwbG90KGppdHRlcihsb25nLmxhbmRpbmcsIDAuMSkgfiBqaXR0ZXIoc3BlZWRfYWlyKSwgRkFBLCB4bGFiID0gIlNwZWVkIEFpciIsIHlsYWIgPSAiTG9uZyBMYW5kaW5nIiwgcGNoID0gIi4iKQpjdXJ2ZShpbG9naXQoYmV0YS5mdWxsLm1vZGVsWzFdK2JldGEuZnVsbC5tb2RlbFsyXSp4KSwgYWRkID0gVFJVRSkKYGBgCgpUaGUgZnVsbCBtb2RlbCBjYW4gYmUgd3JpdHRlbiBhcyBQKGxvbmcubGFuZGluZyA9IDEpID0gZXhwKC01Mi44OSArIDAuNTIgKiBzcGVlZF9haXIpIC8gMSArIGV4cCgtNTIuODkgKyAwLjUyICogc3BlZWRfYWlyKS4gRm9yIGV2ZXJ5IDEgdW5pdCBpbmNyZWFzZSBpbiBzcGVlZF9haXIsIHRoZSBsb2ctb2RkcyBvZiBhIGxvbmcgbGFuZGluZyBpbmNyZWFzZSBieSAwLjUyMjM0LCB0aGUgaGlnaGVyIHNwZWVkX2FpciBpcyBhc3NvY2lhdGVkIHdpdGggYSBncmVhdGVyIGxpa2VsaWhvb2Qgb2YgYSBsb25nIGxhbmRpbmcuIFRoZSBvZGRzIHJhdGlvIGlzIDEuNjg2LCBmb3IgZXZlcnkgMS11bml0IGluY3JlYXNlIGluIHNwZWVkX2FpciwgdGhlIG9kZHMgb2YgYSBsb25nIGxhbmRpbmcgYXJlIG11bHRpcGxpZWQgYnkgYXBwcm94LiAxLjY4NiwgYSA2OC42JSBpbmNyZWFzZSBpbiBvZGRzLgoKCgoKCgo=