We are considering a data set to answer some follow on questions about that data set. We are considering this data based on a Satisfaction Survey:

Find the mean and median satisfaction ratings

# Creating the dataset
RespondentID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
Age <- c(25, 34, 28, 45, 30, 22, 40, 35, 29, 50, 31, 38, 27, 42, 26, 33, 39, 28, 46, 31)
Gender <- c("Female", "Male", "Non-binary", "Male", "Female", "Female", "Male", "Non-binary", "Female", "Male", 
            "Female", "Male", "Female", "Non-binary", "Male", "Female", "Male", "Female", "Non-binary", "Male")
Satisfaction <- c(8, 6, 7, 5, 9, 7, 4, 6, 8, 7, 9, 6, 7, 8, 5, 8, 7, 6, 7, 5)
Department <- c("HR", "IT", "Finance", "Marketing", "HR", "IT", "Finance", "Marketing", "HR", "Finance",
                "Marketing", "IT", "HR", "Finance", "Marketing", "IT", "HR", "Finance", "Marketing", "IT")

# Combining into a data frame
data <- data.frame(RespondentID, Age, Gender, Satisfaction, Department)

# Calculating mean and median satisfaction
mean_satisfaction <- mean(data$Satisfaction)
median_satisfaction <- median(data$Satisfaction)

# Printing the results
cat("Mean Satisfaction:", mean_satisfaction, "\n")
Mean Satisfaction: 6.75 
cat("Median Satisfaction:", median_satisfaction, "\n")
Median Satisfaction: 7 

We want to know the average ages of respondents in the HR department.

# Create a vector of ages for respondents in the 'HR' department
hr_ages <- data$Age[data$Department == 'HR']

# Compute the average age of respondents in the 'HR' department
average_age_hr <- mean(hr_ages)

# Print the average age
average_age_hr
[1] 30
# Convert the Age and Satisfaction columns into a matrix
age_satisfaction_matrix <- as.matrix(data[, c("Age", "Satisfaction")])

# Create a data frame from the matrix to compute mean satisfaction by age group
age_groups <- cut(age_satisfaction_matrix[, 1], breaks = seq(20, 60, by = 10), right = FALSE)
mean_satisfaction_by_age_group <- tapply(age_satisfaction_matrix[, 2], age_groups, mean)

# Print the mean satisfaction rating for each age group
mean_satisfaction_by_age_group
 [20,30)  [30,40)  [40,50)  [50,60) 
6.857143 7.000000 6.000000 7.000000 

After learning the mean satisfaction rating for each age group, we want to know the mean satisfaction rating by department.

# Assuming the 'data' data frame is already created

# Calculate mean satisfaction ratings by department
mean_satisfaction <- aggregate(Satisfaction ~ Department, data = data, FUN = mean)

# Convert the result to a matrix
satisfaction_matrix <- as.matrix(mean_satisfaction[, -1])
rownames(satisfaction_matrix) <- mean_satisfaction$Department

# Display the matrix
print(satisfaction_matrix)
          [,1]
Finance    6.4
HR         7.8
IT         6.4
Marketing  6.4

We want to know how many rows and columns are in the data frame.

# Get the number of rows and columns
dimensions <- dim(data)
rows <- dimensions[1]
cols <- dimensions[2]

# Summary of Gender and Department columns
gender_summary <- summary(data$Gender)
department_summary <- summary(data$Department)

# Print the results
print(paste("Number of rows:", rows))
[1] "Number of rows: 20"
print(paste("Number of columns:", cols))
[1] "Number of columns: 5"
print("Summary of Gender:")
[1] "Summary of Gender:"
print(gender_summary)
   Length     Class      Mode 
       20 character character 
print("Summary of Department:")
[1] "Summary of Department:"
print(department_summary)
   Length     Class      Mode 
       20 character character 

We want to find the average satisfaction rate of those aged 30-40.

# Assuming the 'data' data frame is already created

# Filter the data frame for respondents aged between 30 and 40
filtered_data <- subset(data, Age >= 30 & Age <= 40)

# Calculate the average satisfaction rating for this age group
average_satisfaction <- mean(filtered_data$Satisfaction)

# Print the average satisfaction rating
print(paste("Average satisfaction rating for respondents aged 30 to 40:", average_satisfaction))
[1] "Average satisfaction rating for respondents aged 30 to 40: 6.66666666666667"

We want a histogram of the age column.

# Load necessary library for visualization
library(ggplot2)

# Create a histogram of the Age column
ggplot(data, aes(x = Age)) +
  geom_histogram(binwidth = 5, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histogram of Ages", x = "Age", y = "Frequency") +
  theme_minimal()

We want a histogram based off the Satisfaction Ratings

# Load necessary library for visualization
library(ggplot2)

# Create a histogram of the Satisfaction ratings
ggplot(data, aes(x = Satisfaction)) +
  geom_histogram(binwidth = 1, fill = "green", color = "black", alpha = 0.7) +
  labs(title = "Histogram of Satisfaction Ratings", x = "Satisfaction Rating", y = "Frequency") +
  theme_minimal()

library(ggplot2)

# Create the boxplot
ggplot(data, aes(x = Department, y = Satisfaction)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Boxplot of Satisfaction Ratings by Department",
       x = "Department",
       y = "Satisfaction Rating") +
  theme_minimal()

We want to create box plots from the data frames given for satisfaction by department. Now we want a second boxplot based off age by gender.

# Load necessary library
library(ggplot2)

# Create the boxplot for Age by Gender
ggplot(data, aes(x = Gender, y = Age)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Boxplot of Age by Gender",
       x = "Gender",
       y = "Age") +
  theme_minimal()

We now need to identify outliers using the IQR method.

# Create the data frame
data <- data.frame(
  Satisfaction = c(8, 6, 7, 5, 9, 7, 4, 6, 8, 7, 9, 6, 7, 8, 5, 8, 7, 6, 7, 5)
)

# Calculate Q1 and Q3
Q1 <- quantile(data$Satisfaction, 0.25)
Q3 <- quantile(data$Satisfaction, 0.75)

# Calculate IQR
IQR_value <- IQR(data$Satisfaction)

# Determine outlier thresholds
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value

# Identify outliers
outliers <- data$Satisfaction[data$Satisfaction < lower_bound | data$Satisfaction > upper_bound]

# Print outliers
print(outliers)
numeric(0)

Using a boxplot, we need to identify any outliers in Satisfaction ratings.

# Load necessary library
library(ggplot2)

# Create boxplot
ggplot(data, aes(x = Department, y = Satisfaction)) +
  geom_boxplot() +
  labs(title = "Boxplot of Satisfaction Ratings by Department",
       x = "Department",
       y = "Satisfaction Rating") +
  theme_minimal()

We want to show linear regression to predict Satisfaction based on Age.

# Fit the linear regression model
model <- lm(Satisfaction ~ Age, data = data)

# Summary of the model
summary(model)

Call:
lm(formula = Satisfaction ~ Age, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.54574 -0.79895  0.03224  0.98160  2.15040 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.89620    1.42944   5.524 3.03e-05 ***
Age         -0.03376    0.04111  -0.821    0.422    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.384 on 18 degrees of freedom
Multiple R-squared:  0.03612,   Adjusted R-squared:  -0.01743 
F-statistic: 0.6746 on 1 and 18 DF,  p-value: 0.4222

We want to create a scatter plot with a regression line. We want to find the relationship between Satisfaction and Age.

# Load necessary library
library(ggplot2)

# Create scatter plot with regression line
ggplot(data, aes(x = Age, y = Satisfaction)) +
  geom_point() +  # Add points for the scatter plot
  geom_smooth(method = "lm", se = FALSE, color = "blue") +  # Add the regression line
  labs(title = "Scatter Plot of Age vs. Satisfaction",
       x = "Age",
       y = "Satisfaction Rating") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

LS0tDQp0aXRsZTogIlByZXNlbnRhdGlvbiAzIEpvc2UgU2FsYXphciINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCldlIGFyZSBjb25zaWRlcmluZyBhIGRhdGEgc2V0IHRvIGFuc3dlciBzb21lIGZvbGxvdyBvbiBxdWVzdGlvbnMgYWJvdXQgdGhhdCBkYXRhIHNldC4NCldlIGFyZSBjb25zaWRlcmluZyB0aGlzIGRhdGEgYmFzZWQgb24gYSBTYXRpc2ZhY3Rpb24gU3VydmV5Og0KDQpGaW5kIHRoZSBtZWFuIGFuZCBtZWRpYW4gc2F0aXNmYWN0aW9uIHJhdGluZ3MgDQoNCmBgYHtyfQ0KIyBDcmVhdGluZyB0aGUgZGF0YXNldA0KUmVzcG9uZGVudElEIDwtIGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwKQ0KQWdlIDwtIGMoMjUsIDM0LCAyOCwgNDUsIDMwLCAyMiwgNDAsIDM1LCAyOSwgNTAsIDMxLCAzOCwgMjcsIDQyLCAyNiwgMzMsIDM5LCAyOCwgNDYsIDMxKQ0KR2VuZGVyIDwtIGMoIkZlbWFsZSIsICJNYWxlIiwgIk5vbi1iaW5hcnkiLCAiTWFsZSIsICJGZW1hbGUiLCAiRmVtYWxlIiwgIk1hbGUiLCAiTm9uLWJpbmFyeSIsICJGZW1hbGUiLCAiTWFsZSIsIA0KICAgICAgICAgICAgIkZlbWFsZSIsICJNYWxlIiwgIkZlbWFsZSIsICJOb24tYmluYXJ5IiwgIk1hbGUiLCAiRmVtYWxlIiwgIk1hbGUiLCAiRmVtYWxlIiwgIk5vbi1iaW5hcnkiLCAiTWFsZSIpDQpTYXRpc2ZhY3Rpb24gPC0gYyg4LCA2LCA3LCA1LCA5LCA3LCA0LCA2LCA4LCA3LCA5LCA2LCA3LCA4LCA1LCA4LCA3LCA2LCA3LCA1KQ0KRGVwYXJ0bWVudCA8LSBjKCJIUiIsICJJVCIsICJGaW5hbmNlIiwgIk1hcmtldGluZyIsICJIUiIsICJJVCIsICJGaW5hbmNlIiwgIk1hcmtldGluZyIsICJIUiIsICJGaW5hbmNlIiwNCiAgICAgICAgICAgICAgICAiTWFya2V0aW5nIiwgIklUIiwgIkhSIiwgIkZpbmFuY2UiLCAiTWFya2V0aW5nIiwgIklUIiwgIkhSIiwgIkZpbmFuY2UiLCAiTWFya2V0aW5nIiwgIklUIikNCg0KIyBDb21iaW5pbmcgaW50byBhIGRhdGEgZnJhbWUNCmRhdGEgPC0gZGF0YS5mcmFtZShSZXNwb25kZW50SUQsIEFnZSwgR2VuZGVyLCBTYXRpc2ZhY3Rpb24sIERlcGFydG1lbnQpDQoNCiMgQ2FsY3VsYXRpbmcgbWVhbiBhbmQgbWVkaWFuIHNhdGlzZmFjdGlvbg0KbWVhbl9zYXRpc2ZhY3Rpb24gPC0gbWVhbihkYXRhJFNhdGlzZmFjdGlvbikNCm1lZGlhbl9zYXRpc2ZhY3Rpb24gPC0gbWVkaWFuKGRhdGEkU2F0aXNmYWN0aW9uKQ0KDQojIFByaW50aW5nIHRoZSByZXN1bHRzDQpjYXQoIk1lYW4gU2F0aXNmYWN0aW9uOiIsIG1lYW5fc2F0aXNmYWN0aW9uLCAiXG4iKQ0KY2F0KCJNZWRpYW4gU2F0aXNmYWN0aW9uOiIsIG1lZGlhbl9zYXRpc2ZhY3Rpb24sICJcbiIpDQoNCmBgYA0KV2Ugd2FudCB0byBrbm93IHRoZSBhdmVyYWdlIGFnZXMgb2YgcmVzcG9uZGVudHMgaW4gdGhlIEhSIGRlcGFydG1lbnQuDQpgYGB7cn0NCiMgQ3JlYXRlIGEgdmVjdG9yIG9mIGFnZXMgZm9yIHJlc3BvbmRlbnRzIGluIHRoZSAnSFInIGRlcGFydG1lbnQNCmhyX2FnZXMgPC0gZGF0YSRBZ2VbZGF0YSREZXBhcnRtZW50ID09ICdIUiddDQoNCiMgQ29tcHV0ZSB0aGUgYXZlcmFnZSBhZ2Ugb2YgcmVzcG9uZGVudHMgaW4gdGhlICdIUicgZGVwYXJ0bWVudA0KYXZlcmFnZV9hZ2VfaHIgPC0gbWVhbihocl9hZ2VzKQ0KDQojIFByaW50IHRoZSBhdmVyYWdlIGFnZQ0KYXZlcmFnZV9hZ2VfaHINCg0KYGBgDQpgYGB7cn0NCiMgQ29udmVydCB0aGUgQWdlIGFuZCBTYXRpc2ZhY3Rpb24gY29sdW1ucyBpbnRvIGEgbWF0cml4DQphZ2Vfc2F0aXNmYWN0aW9uX21hdHJpeCA8LSBhcy5tYXRyaXgoZGF0YVssIGMoIkFnZSIsICJTYXRpc2ZhY3Rpb24iKV0pDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSBmcm9tIHRoZSBtYXRyaXggdG8gY29tcHV0ZSBtZWFuIHNhdGlzZmFjdGlvbiBieSBhZ2UgZ3JvdXANCmFnZV9ncm91cHMgPC0gY3V0KGFnZV9zYXRpc2ZhY3Rpb25fbWF0cml4WywgMV0sIGJyZWFrcyA9IHNlcSgyMCwgNjAsIGJ5ID0gMTApLCByaWdodCA9IEZBTFNFKQ0KbWVhbl9zYXRpc2ZhY3Rpb25fYnlfYWdlX2dyb3VwIDwtIHRhcHBseShhZ2Vfc2F0aXNmYWN0aW9uX21hdHJpeFssIDJdLCBhZ2VfZ3JvdXBzLCBtZWFuKQ0KDQojIFByaW50IHRoZSBtZWFuIHNhdGlzZmFjdGlvbiByYXRpbmcgZm9yIGVhY2ggYWdlIGdyb3VwDQptZWFuX3NhdGlzZmFjdGlvbl9ieV9hZ2VfZ3JvdXANCg0KYGBgDQpBZnRlciBsZWFybmluZyB0aGUgbWVhbiBzYXRpc2ZhY3Rpb24gcmF0aW5nIGZvciBlYWNoIGFnZSBncm91cCwgd2Ugd2FudCB0byBrbm93IHRoZSBtZWFuIHNhdGlzZmFjdGlvbiByYXRpbmcgYnkgZGVwYXJ0bWVudC4NCmBgYHtyfQ0KIyBBc3N1bWluZyB0aGUgJ2RhdGEnIGRhdGEgZnJhbWUgaXMgYWxyZWFkeSBjcmVhdGVkDQoNCiMgQ2FsY3VsYXRlIG1lYW4gc2F0aXNmYWN0aW9uIHJhdGluZ3MgYnkgZGVwYXJ0bWVudA0KbWVhbl9zYXRpc2ZhY3Rpb24gPC0gYWdncmVnYXRlKFNhdGlzZmFjdGlvbiB+IERlcGFydG1lbnQsIGRhdGEgPSBkYXRhLCBGVU4gPSBtZWFuKQ0KDQojIENvbnZlcnQgdGhlIHJlc3VsdCB0byBhIG1hdHJpeA0Kc2F0aXNmYWN0aW9uX21hdHJpeCA8LSBhcy5tYXRyaXgobWVhbl9zYXRpc2ZhY3Rpb25bLCAtMV0pDQpyb3duYW1lcyhzYXRpc2ZhY3Rpb25fbWF0cml4KSA8LSBtZWFuX3NhdGlzZmFjdGlvbiREZXBhcnRtZW50DQoNCiMgRGlzcGxheSB0aGUgbWF0cml4DQpwcmludChzYXRpc2ZhY3Rpb25fbWF0cml4KQ0KYGBgDQpXZSB3YW50IHRvIGtub3cgaG93IG1hbnkgcm93cyBhbmQgY29sdW1ucyBhcmUgaW4gdGhlIGRhdGEgZnJhbWUuDQpgYGB7cn0NCiMgR2V0IHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucw0KZGltZW5zaW9ucyA8LSBkaW0oZGF0YSkNCnJvd3MgPC0gZGltZW5zaW9uc1sxXQ0KY29scyA8LSBkaW1lbnNpb25zWzJdDQoNCiMgU3VtbWFyeSBvZiBHZW5kZXIgYW5kIERlcGFydG1lbnQgY29sdW1ucw0KZ2VuZGVyX3N1bW1hcnkgPC0gc3VtbWFyeShkYXRhJEdlbmRlcikNCmRlcGFydG1lbnRfc3VtbWFyeSA8LSBzdW1tYXJ5KGRhdGEkRGVwYXJ0bWVudCkNCg0KIyBQcmludCB0aGUgcmVzdWx0cw0KcHJpbnQocGFzdGUoIk51bWJlciBvZiByb3dzOiIsIHJvd3MpKQ0KcHJpbnQocGFzdGUoIk51bWJlciBvZiBjb2x1bW5zOiIsIGNvbHMpKQ0KcHJpbnQoIlN1bW1hcnkgb2YgR2VuZGVyOiIpDQpwcmludChnZW5kZXJfc3VtbWFyeSkNCnByaW50KCJTdW1tYXJ5IG9mIERlcGFydG1lbnQ6IikNCnByaW50KGRlcGFydG1lbnRfc3VtbWFyeSkNCg0KYGBgDQpXZSB3YW50IHRvIGZpbmQgdGhlIGF2ZXJhZ2Ugc2F0aXNmYWN0aW9uIHJhdGUgb2YgdGhvc2UgYWdlZCAzMC00MC4NCmBgYHtyfQ0KIyBBc3N1bWluZyB0aGUgJ2RhdGEnIGRhdGEgZnJhbWUgaXMgYWxyZWFkeSBjcmVhdGVkDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZyYW1lIGZvciByZXNwb25kZW50cyBhZ2VkIGJldHdlZW4gMzAgYW5kIDQwDQpmaWx0ZXJlZF9kYXRhIDwtIHN1YnNldChkYXRhLCBBZ2UgPj0gMzAgJiBBZ2UgPD0gNDApDQoNCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHNhdGlzZmFjdGlvbiByYXRpbmcgZm9yIHRoaXMgYWdlIGdyb3VwDQphdmVyYWdlX3NhdGlzZmFjdGlvbiA8LSBtZWFuKGZpbHRlcmVkX2RhdGEkU2F0aXNmYWN0aW9uKQ0KDQojIFByaW50IHRoZSBhdmVyYWdlIHNhdGlzZmFjdGlvbiByYXRpbmcNCnByaW50KHBhc3RlKCJBdmVyYWdlIHNhdGlzZmFjdGlvbiByYXRpbmcgZm9yIHJlc3BvbmRlbnRzIGFnZWQgMzAgdG8gNDA6IiwgYXZlcmFnZV9zYXRpc2ZhY3Rpb24pKQ0KDQpgYGANCldlIHdhbnQgYSBoaXN0b2dyYW0gb2YgdGhlIGFnZSBjb2x1bW4uDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeSBmb3IgdmlzdWFsaXphdGlvbg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgQWdlIGNvbHVtbg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQWdlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGZpbGwgPSAiYmx1ZSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgQWdlcyIsIHggPSAiQWdlIiwgeSA9ICJGcmVxdWVuY3kiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpXZSB3YW50IGEgaGlzdG9ncmFtIGJhc2VkIG9mZiB0aGUgU2F0aXNmYWN0aW9uIFJhdGluZ3MNCmBgYHtyfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5IGZvciB2aXN1YWxpemF0aW9uDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgQ3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZSBTYXRpc2ZhY3Rpb24gcmF0aW5ncw0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gU2F0aXNmYWN0aW9uKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAiZ3JlZW4iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArDQogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtIG9mIFNhdGlzZmFjdGlvbiBSYXRpbmdzIiwgeCA9ICJTYXRpc2ZhY3Rpb24gUmF0aW5nIiwgeSA9ICJGcmVxdWVuY3kiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSB0aGUgYm94cGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gRGVwYXJ0bWVudCwgeSA9IFNhdGlzZmFjdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIikgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgU2F0aXNmYWN0aW9uIFJhdGluZ3MgYnkgRGVwYXJ0bWVudCIsDQogICAgICAgeCA9ICJEZXBhcnRtZW50IiwNCiAgICAgICB5ID0gIlNhdGlzZmFjdGlvbiBSYXRpbmciKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCldlIHdhbnQgdG8gY3JlYXRlIGJveCBwbG90cyBmcm9tIHRoZSBkYXRhIGZyYW1lcyBnaXZlbiBmb3Igc2F0aXNmYWN0aW9uIGJ5IGRlcGFydG1lbnQuIE5vdyB3ZSB3YW50IGEgc2Vjb25kIGJveHBsb3QgYmFzZWQgb2ZmIGFnZSBieSBnZW5kZXIuDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSB0aGUgYm94cGxvdCBmb3IgQWdlIGJ5IEdlbmRlcg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gR2VuZGVyLCB5ID0gQWdlKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGdyZWVuIikgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgQWdlIGJ5IEdlbmRlciIsDQogICAgICAgeCA9ICJHZW5kZXIiLA0KICAgICAgIHkgPSAiQWdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQpXZSBub3cgbmVlZCB0byBpZGVudGlmeSBvdXRsaWVycyB1c2luZyB0aGUgSVFSIG1ldGhvZC4NCmBgYHtyfQ0KIyBDcmVhdGUgdGhlIGRhdGEgZnJhbWUNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgU2F0aXNmYWN0aW9uID0gYyg4LCA2LCA3LCA1LCA5LCA3LCA0LCA2LCA4LCA3LCA5LCA2LCA3LCA4LCA1LCA4LCA3LCA2LCA3LCA1KQ0KKQ0KDQojIENhbGN1bGF0ZSBRMSBhbmQgUTMNClExIDwtIHF1YW50aWxlKGRhdGEkU2F0aXNmYWN0aW9uLCAwLjI1KQ0KUTMgPC0gcXVhbnRpbGUoZGF0YSRTYXRpc2ZhY3Rpb24sIDAuNzUpDQoNCiMgQ2FsY3VsYXRlIElRUg0KSVFSX3ZhbHVlIDwtIElRUihkYXRhJFNhdGlzZmFjdGlvbikNCg0KIyBEZXRlcm1pbmUgb3V0bGllciB0aHJlc2hvbGRzDQpsb3dlcl9ib3VuZCA8LSBRMSAtIDEuNSAqIElRUl92YWx1ZQ0KdXBwZXJfYm91bmQgPC0gUTMgKyAxLjUgKiBJUVJfdmFsdWUNCg0KIyBJZGVudGlmeSBvdXRsaWVycw0Kb3V0bGllcnMgPC0gZGF0YSRTYXRpc2ZhY3Rpb25bZGF0YSRTYXRpc2ZhY3Rpb24gPCBsb3dlcl9ib3VuZCB8IGRhdGEkU2F0aXNmYWN0aW9uID4gdXBwZXJfYm91bmRdDQoNCiMgUHJpbnQgb3V0bGllcnMNCnByaW50KG91dGxpZXJzKQ0KDQpgYGANClVzaW5nIGEgYm94cGxvdCwgd2UgbmVlZCB0byBpZGVudGlmeSBhbnkgb3V0bGllcnMgaW4gU2F0aXNmYWN0aW9uIHJhdGluZ3MuDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSBib3hwbG90DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBEZXBhcnRtZW50LCB5ID0gU2F0aXNmYWN0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBvZiBTYXRpc2ZhY3Rpb24gUmF0aW5ncyBieSBEZXBhcnRtZW50IiwNCiAgICAgICB4ID0gIkRlcGFydG1lbnQiLA0KICAgICAgIHkgPSAiU2F0aXNmYWN0aW9uIFJhdGluZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KV2Ugd2FudCB0byBzaG93IGxpbmVhciByZWdyZXNzaW9uIHRvIHByZWRpY3QgU2F0aXNmYWN0aW9uIGJhc2VkIG9uIEFnZS4NCmBgYHtyfQ0KIyBGaXQgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQptb2RlbCA8LSBsbShTYXRpc2ZhY3Rpb24gfiBBZ2UsIGRhdGEgPSBkYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsKQ0KDQpgYGANCldlIHdhbnQgdG8gY3JlYXRlIGEgc2NhdHRlciBwbG90IHdpdGggYSByZWdyZXNzaW9uIGxpbmUuIFdlIHdhbnQgdG8gZmluZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gU2F0aXNmYWN0aW9uIGFuZCBBZ2UuDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSBzY2F0dGVyIHBsb3Qgd2l0aCByZWdyZXNzaW9uIGxpbmUNCmdncGxvdChkYXRhLCBhZXMoeCA9IEFnZSwgeSA9IFNhdGlzZmFjdGlvbikpICsNCiAgZ2VvbV9wb2ludCgpICsgICMgQWRkIHBvaW50cyBmb3IgdGhlIHNjYXR0ZXIgcGxvdA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibHVlIikgKyAgIyBBZGQgdGhlIHJlZ3Jlc3Npb24gbGluZQ0KICBsYWJzKHRpdGxlID0gIlNjYXR0ZXIgUGxvdCBvZiBBZ2UgdnMuIFNhdGlzZmFjdGlvbiIsDQogICAgICAgeCA9ICJBZ2UiLA0KICAgICAgIHkgPSAiU2F0aXNmYWN0aW9uIFJhdGluZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0K