1 Introduction

The RMS Titanic was a British luxury passenger liner that sank during its maiden voyage en route to New York City from Southampton, England, killing about 1,500 passengers and ship personnel. It is one of the most famous tragedies in modern history, it inspired numerous stories, several films, and a musical and has been the subject of much scholarship and scientific speculation.

This report will continue the scientific exploration of the Titanic. The estimated 2,224 passengers all have their own stories of escape or death in the wreck. It is believed, however, that studying the underlying information about these passengers can provide insight on why certain people survived.

RMS Titanic
RMS Titanic

2 Data Source

The data set used in this report is sourced from Kaggle.com. It was orignially created for a machine learning competition hosted by Kaggle. The link for this data set is https://www.kaggle.com/c/titanic. The data is originally split into seperate train and testing data sets for purposes of the competition. The train data is used in this report for more observations and the complete set of variables.

The data was uploaded to a GitHub repository for perpetual online access. This report will source the data from this repository (URL, https://raw.githubusercontent.com/ncbrechbill/STA321/refs/heads/main/STA321/titanic.csv)

This data contains 891 observations on 12 variables. Any observations of N/A in variables of interest will be removed. The variables are:

  1. PassengerID: A unique identifier
  2. Survived: The survival status of the passenger (0 = No, 1 = Yes)
  3. Pclass: The passengers ticket class (1st, 2nd, or 3rd)
  4. Name: The passengers name
  5. Sex: The passengers sex
  6. Age: The passengers age in years
  7. sibSp: Number of siblings/spouse aboard
  8. Parch: Number of parents/children aboard
  9. Ticket: Passenger’s ticket number
  10. Fare: Passengers boarding fare in USD
  11. Cabin: The passengers cabin
  12. Embarked: Location which passenger embarked (C = Cherbourg, Q = Queenstown, S = Southampton)
url = "https://raw.githubusercontent.com/ncbrechbill/STA321/refs/heads/main/STA321/titanic.csv"
titanic <- read.csv(url)
data <- na.omit(select(titanic, Survived, Age, Sex, Pclass))
data$Pclass <- as.factor(data$Pclass)

3 Research Question

In many retellings of the Titanic’s story, the excerpt arises of “Women and Children first” when loading the lifeboats for escape. This suggests that age could factor greatly into one’s survival of the catastrophe. This report investigates the relationship between a passenger’s age and their likelihood of survival on the Titanic. To address this, a simple logistic regression model is applied, with survival (survived vs. not survived) as the binary outcome variable and passenger age as the predictor. This approach allows us to evaluate whether age significantly affected survival odds, estimate the direction and magnitude of the effect, and assess the model’s ability to explain variation in survival outcomes.

4 Exploratory Data Analysis

Under simple logistic regression, only one variable is examined, and thus, a simple check of the variable distribution provides insight to any issues of skew.

4.1 Figures

#Histogram for response distribution
hist(data$Age, probability = TRUE, 
     main = "Age Distribution", 
     xlab="Age", 
     col = "lightgray", 
     border="black")
lines(density(data$Age, adjust=2), col="maroon") 

pander(summary(data$Age))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.42 20.12 28 29.7 38 80
label <- factor(data$Survived,
                        levels = c(0, 1),
                        labels = c("Did Not Survive", "Survived"))
summary_table <- cbind(
  Frequency = table(label),
  Proportion = prop.table(table(label)))

pander(summary_table)
  Frequency Proportion
Did Not Survive 424 0.5938
Survived 290 0.4062

4.2 Analysis

The histogram suggests slight right-skew, which is to be expected with age distributions in most situations. No transformation will be applied.

The frequency of survival does not imply a class imbalance that would result in bias.

5 Logistic Regression Model

5.1 Standard Model

With non-survival coded = 0, this level is the reference level used by R, and survival = 1 is the event level.

#Build GLM
s.logit = glm(Survived ~ Age, 
              family = binomial(link = "logit"),  # family is the binomial, logit(p) = log(p/(1-p))!
              data = data)
result = summary(s.logit)
pander(result)
  Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.05672 0.1736 -0.3268 0.7438
Age -0.01096 0.00533 -2.057 0.03969

(Dispersion parameter for binomial family taken to be 1 )

Null deviance: 964.5 on 713 degrees of freedom
Residual deviance: 960.2 on 712 degrees of freedom
pander(confint(s.logit))
  2.5 % 97.5 %
(Intercept) -0.3971 0.2841
Age -0.02151 -0.0005832

Age shows a negative relationship with a passengers survival with coefficient \(\beta_1\) = -0.01096 , p = 0.03969. This is supported by the \(\beta_1\) 95% confidence interval of [-0.02151, -0.0005832], which excludes the null value zero.

5.2 Odds Ratio Model

For more practical use, the coefficient has been transformed into an odds ratio.

# Odds ratio
model.coef.stats = summary(s.logit)$coef
odds.ratio = exp(coef(s.logit))
out.stats = cbind(model.coef.stats, odds.ratio = odds.ratio)                 
pander(out.stats,caption = "Simple Logistic Regression Model with Odds Ratios")
Simple Logistic Regression Model with Odds Ratios
  Estimate Std. Error z value Pr(>|z|) odds.ratio
(Intercept) -0.05672 0.1736 -0.3268 0.7438 0.9449
Age -0.01096 0.00533 -2.057 0.03969 0.9891

The odds ratio of survival by age is 98.9%. This indicates that every year of age reduces one’s odds by 1.1%. This may not make a great difference for people a few years apart, but certainly indicates a difference between a child and an elder.

5.3 Analysis

While a statistically significant relationship could be found, it is apparent that age alone is not a strong predictor of one’s odds of surviving this catastrophe. The slight drop in deviance suggests that age can be an useful predictor, however it is likely not the only predictor that would predict a passengers fate. Further research using multiple logistic regression will likely find that multiple factors, including age, are important to predicting one’s survival.

5.4 Application

Using the logistic regression model, we can determine a few hypethetical passenger’s odds of survival at different ages. This helps conceptualize the differences between these ages, assuming age the only cause of difference in survival odds.

# Create a new dataframe with some example ages
new_passengers <- data.frame(Age = c(5, 20, 30, 50, 70))

# Predict probabilities of survival
pred_probs <- predict(s.logit, newdata = new_passengers, type = "response")

# Convert probabilities to odds
pred_odds <- pred_probs / (1 - pred_probs)

# Combine results into a summary table
predictions <- data.frame(
  Age = new_passengers$Age,
  Probability_of_Survival = round(pred_probs, 3),
  Odds_of_Survival = round(pred_odds, 3)
)

pander(print(predictions))

Age Probability_of_Survival Odds_of_Survival 1 5 0.472 0.894 2 20 0.431 0.759 3 30 0.405 0.680 4 50 0.353 0.546 5 70 0.305 0.439

Age Probability_of_Survival Odds_of_Survival
5 0.472 0.894
20 0.431 0.759
30 0.405 0.68
50 0.353 0.546
70 0.305 0.439

5.5 Discussion

Age was found to have an impact on a passengers odds of survival. Every year of age of a passenger decreased the odds of their survival by 1.1%. It is important to notes that survival of this tragedy has many complex factors to consider. It is expected, however, that age will be likely to persist with a negative relationship to survival odds. It may also be worth noting that the relationship may not be entirely linear, and that survival factors may change at certain ages. For example, the youngest passenger aboard was Master Assad Alexander Thomas at about 4 months old. This passenger survived, but their survival was certainly dependent on those around them, and not their own actions. Consider the ages which a child may be seen as “independent”, though certainly not capable of their own survival (such as 1 year old Miss. Maria (“Mary”) Nakid.)

6 Multiple Logistic Regression

6.1 Standard Model

As before, survival is coded as the event level. As a qualitative factor, passenger class was coded with first class as the baseline.

#Build GLM
m.logit = glm(Survived ~ Age + Sex + Pclass, 
              family = binomial(link = "logit"),  # family is the binomial, logit(p) = log(p/(1-p))!
              data = data)
mresult = summary(m.logit)
pander(mresult)
  Estimate Std. Error z value Pr(>|z|)
(Intercept) 3.777 0.4011 9.416 4.682e-21
Age -0.03699 0.007656 -4.831 1.359e-06
Sexmale -2.523 0.2074 -12.16 4.811e-34
Pclass2 -1.31 0.2781 -4.71 2.472e-06
Pclass3 -2.581 0.2814 -9.169 4.761e-20

(Dispersion parameter for binomial family taken to be 1 )

Null deviance: 964.5 on 713 degrees of freedom
Residual deviance: 647.3 on 709 degrees of freedom
pander(confint(m.logit))
  2.5 % 97.5 %
(Intercept) 3.015 4.589
Age -0.05229 -0.02223
Sexmale -2.939 -2.125
Pclass2 -1.863 -0.7718
Pclass3 -3.147 -2.042

6.2 Odds-Ratio Model

Odds-ratio conversions allow for easier interpretation.

# Odds ratio
m.model.coef.stats = summary(m.logit)$coef
m.odds.ratio = exp(coef(m.logit))
m.out.stats = cbind(m.model.coef.stats, odds.ratio = m.odds.ratio)                 
pander(m.out.stats,caption = "Multiple Logistic Regression Model with Odds Ratios")
Multiple Logistic Regression Model with Odds Ratios
  Estimate Std. Error z value Pr(>|z|) odds.ratio
(Intercept) 3.777 0.4011 9.416 4.682e-21 43.69
Age -0.03699 0.007656 -4.831 1.359e-06 0.9637
Sexmale -2.523 0.2074 -12.16 4.811e-34 0.08024
Pclass2 -1.31 0.2781 -4.71 2.472e-06 0.2699
Pclass3 -2.581 0.2814 -9.169 4.761e-20 0.07573

6.3 Discussion

All predictors were found to be significant. Every year of age would reduce a passengers odds of survival by about 4%. Being male reduced odds of survival by about 92%. Compared to first class passengers, 2nd class passengers had 73% reduced odds of survival, and 3rd class passengers had 93% reduced odds of survival.

LS0tDQp0aXRsZTogIkxvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWxzOiBUaXRhbmljIg0KYXV0aG9yOiAiTm9haCBCcmVjaGJpbGwiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19oZWlnaHQ6IDYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDIwcHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQo8L3N0eWxlPg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICBsaWJyYXJ5KHBhbmRlcikNCn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoZSBSTVMgVGl0YW5pYyB3YXMgYSBCcml0aXNoIGx1eHVyeSBwYXNzZW5nZXIgbGluZXIgdGhhdCBzYW5rIGR1cmluZyBpdHMgbWFpZGVuIHZveWFnZSBlbiByb3V0ZSB0byBOZXcgWW9yayBDaXR5IGZyb20gU291dGhhbXB0b24sIEVuZ2xhbmQsIGtpbGxpbmcgYWJvdXQgMSw1MDAgcGFzc2VuZ2VycyBhbmQgc2hpcCBwZXJzb25uZWwuIEl0IGlzIG9uZSBvZiB0aGUgbW9zdCBmYW1vdXMgdHJhZ2VkaWVzIGluIG1vZGVybiBoaXN0b3J5LCBpdCBpbnNwaXJlZCBudW1lcm91cyBzdG9yaWVzLCBzZXZlcmFsIGZpbG1zLCBhbmQgYSBtdXNpY2FsIGFuZCBoYXMgYmVlbiB0aGUgc3ViamVjdCBvZiBtdWNoIHNjaG9sYXJzaGlwIGFuZCBzY2llbnRpZmljIHNwZWN1bGF0aW9uLg0KDQpUaGlzIHJlcG9ydCB3aWxsIGNvbnRpbnVlIHRoZSBzY2llbnRpZmljIGV4cGxvcmF0aW9uIG9mIHRoZSBUaXRhbmljLiBUaGUgZXN0aW1hdGVkIDIsMjI0IHBhc3NlbmdlcnMgYWxsIGhhdmUgdGhlaXIgb3duIHN0b3JpZXMgb2YgZXNjYXBlIG9yIGRlYXRoIGluIHRoZSB3cmVjay4gSXQgaXMgYmVsaWV2ZWQsIGhvd2V2ZXIsIHRoYXQgc3R1ZHlpbmcgdGhlIHVuZGVybHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgcGFzc2VuZ2VycyBjYW4gcHJvdmlkZSBpbnNpZ2h0IG9uIHdoeSBjZXJ0YWluIHBlb3BsZSBzdXJ2aXZlZC4NCg0KIVtSTVMgVGl0YW5pY10oaW1hZ2VzL2NsaXBib2FyZC0yMDQxNzY4NDIyLnBuZykNCg0KIyBEYXRhIFNvdXJjZQ0KDQpUaGUgZGF0YSBzZXQgdXNlZCBpbiB0aGlzIHJlcG9ydCBpcyBzb3VyY2VkIGZyb20gS2FnZ2xlLmNvbS4gSXQgd2FzIG9yaWduaWFsbHkgY3JlYXRlZCBmb3IgYSBtYWNoaW5lIGxlYXJuaW5nIGNvbXBldGl0aW9uIGhvc3RlZCBieSBLYWdnbGUuIFRoZSBsaW5rIGZvciB0aGlzIGRhdGEgc2V0IGlzIDxodHRwczovL3d3dy5rYWdnbGUuY29tL2MvdGl0YW5pYz4uIFRoZSBkYXRhIGlzIG9yaWdpbmFsbHkgc3BsaXQgaW50byBzZXBlcmF0ZSB0cmFpbiBhbmQgdGVzdGluZyBkYXRhIHNldHMgZm9yIHB1cnBvc2VzIG9mIHRoZSBjb21wZXRpdGlvbi4gVGhlIHRyYWluIGRhdGEgaXMgdXNlZCBpbiB0aGlzIHJlcG9ydCBmb3IgbW9yZSBvYnNlcnZhdGlvbnMgYW5kIHRoZSBjb21wbGV0ZSBzZXQgb2YgdmFyaWFibGVzLg0KDQpUaGUgZGF0YSB3YXMgdXBsb2FkZWQgdG8gYSBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgcGVycGV0dWFsIG9ubGluZSBhY2Nlc3MuIFRoaXMgcmVwb3J0IHdpbGwgc291cmNlIHRoZSBkYXRhIGZyb20gdGhpcyByZXBvc2l0b3J5IChVUkwsIDxodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbmNicmVjaGJpbGwvU1RBMzIxL3JlZnMvaGVhZHMvbWFpbi9TVEEzMjEvdGl0YW5pYy5jc3Y+KQ0KDQpUaGlzIGRhdGEgY29udGFpbnMgODkxIG9ic2VydmF0aW9ucyBvbiAxMiB2YXJpYWJsZXMuIEFueSBvYnNlcnZhdGlvbnMgb2YgTi9BIGluIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCB3aWxsIGJlIHJlbW92ZWQuIFRoZSB2YXJpYWJsZXMgYXJlOg0KDQoxLiAgKipQYXNzZW5nZXJJRCoqOiBBIHVuaXF1ZSBpZGVudGlmaWVyDQoyLiAgKipTdXJ2aXZlZCoqOiBUaGUgc3Vydml2YWwgc3RhdHVzIG9mIHRoZSBwYXNzZW5nZXIgKDAgPSBObywgMSA9IFllcykNCjMuICAqKlBjbGFzcyoqOiBUaGUgcGFzc2VuZ2VycyB0aWNrZXQgY2xhc3MgKDFzdCwgMm5kLCBvciAzcmQpDQo0LiAgKipOYW1lKio6IFRoZSBwYXNzZW5nZXJzIG5hbWUNCjUuICAqKlNleCoqOiBUaGUgcGFzc2VuZ2VycyBzZXgNCjYuICAqKkFnZSoqOiBUaGUgcGFzc2VuZ2VycyBhZ2UgaW4geWVhcnMNCjcuICAqKnNpYlNwKio6IE51bWJlciBvZiBzaWJsaW5ncy9zcG91c2UgYWJvYXJkDQo4LiAgKipQYXJjaCoqOiBOdW1iZXIgb2YgcGFyZW50cy9jaGlsZHJlbiBhYm9hcmQNCjkuICAqKlRpY2tldCoqOiBQYXNzZW5nZXIncyB0aWNrZXQgbnVtYmVyDQoxMC4gKipGYXJlKio6IFBhc3NlbmdlcnMgYm9hcmRpbmcgZmFyZSBpbiBVU0QNCjExLiAqKkNhYmluKio6IFRoZSBwYXNzZW5nZXJzIGNhYmluDQoxMi4gKipFbWJhcmtlZCoqOiBMb2NhdGlvbiB3aGljaCBwYXNzZW5nZXIgZW1iYXJrZWQgKEMgPSBDaGVyYm91cmcsIFEgPSBRdWVlbnN0b3duLCBTID0gU291dGhhbXB0b24pDQoNCmBgYHtyfQ0KdXJsID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9uY2JyZWNoYmlsbC9TVEEzMjEvcmVmcy9oZWFkcy9tYWluL1NUQTMyMS90aXRhbmljLmNzdiINCnRpdGFuaWMgPC0gcmVhZC5jc3YodXJsKQ0KZGF0YSA8LSBuYS5vbWl0KHNlbGVjdCh0aXRhbmljLCBTdXJ2aXZlZCwgQWdlLCBTZXgsIFBjbGFzcykpDQpkYXRhJFBjbGFzcyA8LSBhcy5mYWN0b3IoZGF0YSRQY2xhc3MpDQpgYGANCg0KIyBSZXNlYXJjaCBRdWVzdGlvbg0KDQpJbiBtYW55IHJldGVsbGluZ3Mgb2YgdGhlIFRpdGFuaWMncyBzdG9yeSwgdGhlIGV4Y2VycHQgYXJpc2VzIG9mICJXb21lbiBhbmQgQ2hpbGRyZW4gZmlyc3QiIHdoZW4gbG9hZGluZyB0aGUgbGlmZWJvYXRzIGZvciBlc2NhcGUuIFRoaXMgc3VnZ2VzdHMgdGhhdCBhZ2UgY291bGQgZmFjdG9yIGdyZWF0bHkgaW50byBvbmUncyBzdXJ2aXZhbCBvZiB0aGUgY2F0YXN0cm9waGUuIFRoaXMgcmVwb3J0IGludmVzdGlnYXRlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBwYXNzZW5nZXLigJlzIGFnZSBhbmQgdGhlaXIgbGlrZWxpaG9vZCBvZiBzdXJ2aXZhbCBvbiB0aGUgVGl0YW5pYy4gVG8gYWRkcmVzcyB0aGlzLCBhIHNpbXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGlzIGFwcGxpZWQsIHdpdGggc3Vydml2YWwgKHN1cnZpdmVkIHZzLiBub3Qgc3Vydml2ZWQpIGFzIHRoZSBiaW5hcnkgb3V0Y29tZSB2YXJpYWJsZSBhbmQgcGFzc2VuZ2VyIGFnZSBhcyB0aGUgcHJlZGljdG9yLiBUaGlzIGFwcHJvYWNoIGFsbG93cyB1cyB0byBldmFsdWF0ZSB3aGV0aGVyIGFnZSBzaWduaWZpY2FudGx5IGFmZmVjdGVkIHN1cnZpdmFsIG9kZHMsIGVzdGltYXRlIHRoZSBkaXJlY3Rpb24gYW5kIG1hZ25pdHVkZSBvZiB0aGUgZWZmZWN0LCBhbmQgYXNzZXNzIHRoZSBtb2RlbOKAmXMgYWJpbGl0eSB0byBleHBsYWluIHZhcmlhdGlvbiBpbiBzdXJ2aXZhbCBvdXRjb21lcy4NCg0KIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzDQoNClVuZGVyIHNpbXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uLCBvbmx5IG9uZSB2YXJpYWJsZSBpcyBleGFtaW5lZCwgYW5kIHRodXMsIGEgc2ltcGxlIGNoZWNrIG9mIHRoZSB2YXJpYWJsZSBkaXN0cmlidXRpb24gcHJvdmlkZXMgaW5zaWdodCB0byBhbnkgaXNzdWVzIG9mIHNrZXcuDQoNCiMjIEZpZ3VyZXMNCg0KYGBge3J9DQojSGlzdG9ncmFtIGZvciByZXNwb25zZSBkaXN0cmlidXRpb24NCmhpc3QoZGF0YSRBZ2UsIHByb2JhYmlsaXR5ID0gVFJVRSwgDQogICAgIG1haW4gPSAiQWdlIERpc3RyaWJ1dGlvbiIsIA0KICAgICB4bGFiPSJBZ2UiLCANCiAgICAgY29sID0gImxpZ2h0Z3JheSIsIA0KICAgICBib3JkZXI9ImJsYWNrIikNCmxpbmVzKGRlbnNpdHkoZGF0YSRBZ2UsIGFkanVzdD0yKSwgY29sPSJtYXJvb24iKSANCnBhbmRlcihzdW1tYXJ5KGRhdGEkQWdlKSkNCg0KDQoNCmxhYmVsIDwtIGZhY3RvcihkYXRhJFN1cnZpdmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkRpZCBOb3QgU3Vydml2ZSIsICJTdXJ2aXZlZCIpKQ0Kc3VtbWFyeV90YWJsZSA8LSBjYmluZCgNCiAgRnJlcXVlbmN5ID0gdGFibGUobGFiZWwpLA0KICBQcm9wb3J0aW9uID0gcHJvcC50YWJsZSh0YWJsZShsYWJlbCkpKQ0KDQpwYW5kZXIoc3VtbWFyeV90YWJsZSkNCmBgYA0KDQojIyBBbmFseXNpcw0KDQpUaGUgaGlzdG9ncmFtIHN1Z2dlc3RzIHNsaWdodCByaWdodC1za2V3LCB3aGljaCBpcyB0byBiZSBleHBlY3RlZCB3aXRoIGFnZSBkaXN0cmlidXRpb25zIGluIG1vc3Qgc2l0dWF0aW9ucy4gTm8gdHJhbnNmb3JtYXRpb24gd2lsbCBiZSBhcHBsaWVkLg0KDQpUaGUgZnJlcXVlbmN5IG9mIHN1cnZpdmFsIGRvZXMgbm90IGltcGx5IGEgY2xhc3MgaW1iYWxhbmNlIHRoYXQgd291bGQgcmVzdWx0IGluIGJpYXMuDQoNCiMgTG9naXN0aWMgUmVncmVzc2lvbiBNb2RlbA0KDQojIyBTdGFuZGFyZCBNb2RlbA0KDQpXaXRoIG5vbi1zdXJ2aXZhbCBjb2RlZCA9IDAsIHRoaXMgbGV2ZWwgaXMgdGhlIHJlZmVyZW5jZSBsZXZlbCB1c2VkIGJ5IFIsIGFuZCBzdXJ2aXZhbCA9IDEgaXMgdGhlIGV2ZW50IGxldmVsLg0KDQpgYGB7cn0NCiNCdWlsZCBHTE0NCnMubG9naXQgPSBnbG0oU3Vydml2ZWQgfiBBZ2UsIA0KICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksICAjIGZhbWlseSBpcyB0aGUgYmlub21pYWwsIGxvZ2l0KHApID0gbG9nKHAvKDEtcCkpIQ0KICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCnJlc3VsdCA9IHN1bW1hcnkocy5sb2dpdCkNCnBhbmRlcihyZXN1bHQpDQpwYW5kZXIoY29uZmludChzLmxvZ2l0KSkNCmBgYA0KDQpBZ2Ugc2hvd3MgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgd2l0aCBhIHBhc3NlbmdlcnMgc3Vydml2YWwgd2l0aCBjb2VmZmljaWVudCAkXGJldGFfMSQgPSAtMC4wMTA5NiAsIHAgPSAwLjAzOTY5LiBUaGlzIGlzIHN1cHBvcnRlZCBieSB0aGUgJFxiZXRhXzEkIDk1JSBjb25maWRlbmNlIGludGVydmFsIG9mIFstMC4wMjE1MSwgLTAuMDAwNTgzMl0sIHdoaWNoIGV4Y2x1ZGVzIHRoZSBudWxsIHZhbHVlIHplcm8uDQoNCiMjIE9kZHMgUmF0aW8gTW9kZWwNCg0KRm9yIG1vcmUgcHJhY3RpY2FsIHVzZSwgdGhlIGNvZWZmaWNpZW50IGhhcyBiZWVuIHRyYW5zZm9ybWVkIGludG8gYW4gb2RkcyByYXRpby4NCg0KYGBge3J9DQojIE9kZHMgcmF0aW8NCm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KHMubG9naXQpJGNvZWYNCm9kZHMucmF0aW8gPSBleHAoY29lZihzLmxvZ2l0KSkNCm91dC5zdGF0cyA9IGNiaW5kKG1vZGVsLmNvZWYuc3RhdHMsIG9kZHMucmF0aW8gPSBvZGRzLnJhdGlvKSAgICAgICAgICAgICAgICAgDQpwYW5kZXIob3V0LnN0YXRzLGNhcHRpb24gPSAiU2ltcGxlIExvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWwgd2l0aCBPZGRzIFJhdGlvcyIpDQpgYGANCg0KVGhlIG9kZHMgcmF0aW8gb2Ygc3Vydml2YWwgYnkgYWdlIGlzIDk4LjklLiBUaGlzIGluZGljYXRlcyB0aGF0IGV2ZXJ5IHllYXIgb2YgYWdlIHJlZHVjZXMgb25lJ3Mgb2RkcyBieSAqKjEuMSUqKi4gVGhpcyBtYXkgbm90IG1ha2UgYSBncmVhdCBkaWZmZXJlbmNlIGZvciBwZW9wbGUgYSBmZXcgeWVhcnMgYXBhcnQsIGJ1dCBjZXJ0YWlubHkgaW5kaWNhdGVzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY2hpbGQgYW5kIGFuIGVsZGVyLg0KDQojIyBBbmFseXNpcw0KDQpXaGlsZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGNvdWxkIGJlIGZvdW5kLCBpdCBpcyBhcHBhcmVudCB0aGF0IGFnZSBhbG9uZSBpcyBub3QgYSBzdHJvbmcgcHJlZGljdG9yIG9mIG9uZSdzIG9kZHMgb2Ygc3Vydml2aW5nIHRoaXMgY2F0YXN0cm9waGUuIFRoZSBzbGlnaHQgZHJvcCBpbiBkZXZpYW5jZSBzdWdnZXN0cyB0aGF0IGFnZSBjYW4gYmUgYW4gdXNlZnVsIHByZWRpY3RvciwgaG93ZXZlciBpdCBpcyBsaWtlbHkgbm90IHRoZSBvbmx5IHByZWRpY3RvciB0aGF0IHdvdWxkIHByZWRpY3QgYSBwYXNzZW5nZXJzIGZhdGUuIEZ1cnRoZXIgcmVzZWFyY2ggdXNpbmcgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiB3aWxsIGxpa2VseSBmaW5kIHRoYXQgbXVsdGlwbGUgZmFjdG9ycywgaW5jbHVkaW5nIGFnZSwgYXJlIGltcG9ydGFudCB0byBwcmVkaWN0aW5nIG9uZSdzIHN1cnZpdmFsLg0KDQojIyBBcHBsaWNhdGlvbg0KDQpVc2luZyB0aGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCwgd2UgY2FuIGRldGVybWluZSBhIGZldyBoeXBldGhldGljYWwgcGFzc2VuZ2VyJ3Mgb2RkcyBvZiBzdXJ2aXZhbCBhdCBkaWZmZXJlbnQgYWdlcy4gVGhpcyBoZWxwcyBjb25jZXB0dWFsaXplIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIGFnZXMsIGFzc3VtaW5nIGFnZSB0aGUgb25seSBjYXVzZSBvZiBkaWZmZXJlbmNlIGluIHN1cnZpdmFsIG9kZHMuDQoNCmBgYHtyfQ0KIyBDcmVhdGUgYSBuZXcgZGF0YWZyYW1lIHdpdGggc29tZSBleGFtcGxlIGFnZXMNCm5ld19wYXNzZW5nZXJzIDwtIGRhdGEuZnJhbWUoQWdlID0gYyg1LCAyMCwgMzAsIDUwLCA3MCkpDQoNCiMgUHJlZGljdCBwcm9iYWJpbGl0aWVzIG9mIHN1cnZpdmFsDQpwcmVkX3Byb2JzIDwtIHByZWRpY3Qocy5sb2dpdCwgbmV3ZGF0YSA9IG5ld19wYXNzZW5nZXJzLCB0eXBlID0gInJlc3BvbnNlIikNCg0KIyBDb252ZXJ0IHByb2JhYmlsaXRpZXMgdG8gb2Rkcw0KcHJlZF9vZGRzIDwtIHByZWRfcHJvYnMgLyAoMSAtIHByZWRfcHJvYnMpDQoNCiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBzdW1tYXJ5IHRhYmxlDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKA0KICBBZ2UgPSBuZXdfcGFzc2VuZ2VycyRBZ2UsDQogIFByb2JhYmlsaXR5X29mX1N1cnZpdmFsID0gcm91bmQocHJlZF9wcm9icywgMyksDQogIE9kZHNfb2ZfU3Vydml2YWwgPSByb3VuZChwcmVkX29kZHMsIDMpDQopDQoNCnBhbmRlcihwcmludChwcmVkaWN0aW9ucykpDQpgYGANCg0KIyMgRGlzY3Vzc2lvbg0KDQpBZ2Ugd2FzIGZvdW5kIHRvIGhhdmUgYW4gaW1wYWN0IG9uIGEgcGFzc2VuZ2VycyBvZGRzIG9mIHN1cnZpdmFsLiBFdmVyeSB5ZWFyIG9mIGFnZSBvZiBhIHBhc3NlbmdlciBkZWNyZWFzZWQgdGhlIG9kZHMgb2YgdGhlaXIgc3Vydml2YWwgYnkgKioxLjElKiouIEl0IGlzIGltcG9ydGFudCB0byBub3RlcyB0aGF0IHN1cnZpdmFsIG9mIHRoaXMgdHJhZ2VkeSBoYXMgbWFueSBjb21wbGV4IGZhY3RvcnMgdG8gY29uc2lkZXIuIEl0IGlzIGV4cGVjdGVkLCBob3dldmVyLCB0aGF0IGFnZSB3aWxsIGJlIGxpa2VseSB0byBwZXJzaXN0IHdpdGggYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgdG8gc3Vydml2YWwgb2Rkcy4gSXQgbWF5IGFsc28gYmUgd29ydGggbm90aW5nIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBtYXkgbm90IGJlIGVudGlyZWx5IGxpbmVhciwgYW5kIHRoYXQgc3Vydml2YWwgZmFjdG9ycyBtYXkgY2hhbmdlIGF0IGNlcnRhaW4gYWdlcy4gRm9yIGV4YW1wbGUsIHRoZSB5b3VuZ2VzdCBwYXNzZW5nZXIgYWJvYXJkIHdhcyBNYXN0ZXIgQXNzYWQgQWxleGFuZGVyIFRob21hcyBhdCBhYm91dCA0IG1vbnRocyBvbGQuIFRoaXMgcGFzc2VuZ2VyIHN1cnZpdmVkLCBidXQgdGhlaXIgc3Vydml2YWwgd2FzIGNlcnRhaW5seSBkZXBlbmRlbnQgb24gdGhvc2UgYXJvdW5kIHRoZW0sIGFuZCBub3QgdGhlaXIgb3duIGFjdGlvbnMuIENvbnNpZGVyIHRoZSBhZ2VzIHdoaWNoIGEgY2hpbGQgbWF5IGJlIHNlZW4gYXMgImluZGVwZW5kZW50IiwgdGhvdWdoIGNlcnRhaW5seSBub3QgY2FwYWJsZSBvZiB0aGVpciBvd24gc3Vydml2YWwgKHN1Y2ggYXMgMSB5ZWFyIG9sZCBNaXNzLiBNYXJpYSAoIk1hcnkiKSBOYWtpZC4pDQoNCiMgTXVsdGlwbGUgTG9naXN0aWMgUmVncmVzc2lvbg0KDQojIyBTdGFuZGFyZCBNb2RlbA0KDQpBcyBiZWZvcmUsIHN1cnZpdmFsIGlzIGNvZGVkIGFzIHRoZSBldmVudCBsZXZlbC4gQXMgYSBxdWFsaXRhdGl2ZSBmYWN0b3IsIHBhc3NlbmdlciBjbGFzcyB3YXMgY29kZWQgd2l0aCBmaXJzdCBjbGFzcyBhcyB0aGUgYmFzZWxpbmUuDQoNCmBgYHtyfQ0KI0J1aWxkIEdMTQ0KbS5sb2dpdCA9IGdsbShTdXJ2aXZlZCB+IEFnZSArIFNleCArIFBjbGFzcywgDQogICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwgICMgZmFtaWx5IGlzIHRoZSBiaW5vbWlhbCwgbG9naXQocCkgPSBsb2cocC8oMS1wKSkhDQogICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KbXJlc3VsdCA9IHN1bW1hcnkobS5sb2dpdCkNCnBhbmRlcihtcmVzdWx0KQ0KcGFuZGVyKGNvbmZpbnQobS5sb2dpdCkpDQpgYGANCg0KIyMgT2Rkcy1SYXRpbyBNb2RlbA0KDQpPZGRzLXJhdGlvIGNvbnZlcnNpb25zIGFsbG93IGZvciBlYXNpZXIgaW50ZXJwcmV0YXRpb24uDQoNCmBgYHtyfQ0KIyBPZGRzIHJhdGlvDQptLm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KG0ubG9naXQpJGNvZWYNCm0ub2Rkcy5yYXRpbyA9IGV4cChjb2VmKG0ubG9naXQpKQ0KbS5vdXQuc3RhdHMgPSBjYmluZChtLm1vZGVsLmNvZWYuc3RhdHMsIG9kZHMucmF0aW8gPSBtLm9kZHMucmF0aW8pICAgICAgICAgICAgICAgICANCnBhbmRlcihtLm91dC5zdGF0cyxjYXB0aW9uID0gIk11bHRpcGxlIExvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWwgd2l0aCBPZGRzIFJhdGlvcyIpDQpgYGANCg0KIyMgRGlzY3Vzc2lvbg0KDQpBbGwgcHJlZGljdG9ycyB3ZXJlIGZvdW5kIHRvIGJlIHNpZ25pZmljYW50LiBFdmVyeSB5ZWFyIG9mIGFnZSB3b3VsZCByZWR1Y2UgYSBwYXNzZW5nZXJzIG9kZHMgb2Ygc3Vydml2YWwgYnkgYWJvdXQgNCUuIEJlaW5nIG1hbGUgcmVkdWNlZCBvZGRzIG9mIHN1cnZpdmFsIGJ5IGFib3V0IDkyJS4gQ29tcGFyZWQgdG8gZmlyc3QgY2xhc3MgcGFzc2VuZ2VycywgMm5kIGNsYXNzIHBhc3NlbmdlcnMgaGFkIDczJSByZWR1Y2VkIG9kZHMgb2Ygc3Vydml2YWwsIGFuZCAzcmQgY2xhc3MgcGFzc2VuZ2VycyBoYWQgOTMlIHJlZHVjZWQgb2RkcyBvZiBzdXJ2aXZhbC4NCg==