Assignment

Theme for this Project is Data Transformation.

For this project: 1. Create a .CSV file (or optionally, a MySQL database!) that includes all of the information included in the dataset. You’re encouraged to use a “wide” structure similar to how the information appears in the discussion item, so that you can practice tidying and transformations as described below. 2. Read the information from your .CSV file into R, and use tidyr and dplyr as needed to tidy and transform your data. [Most of your grade will be based on this step!] 3. Perform the analysis requested in the discussion item.

Collaborators: Magnus Skonberg

Read Dataset

The dataset was pulled from the larger Kaggle dataset (the 1st 20 students), transposed in Excel (rows became columns), and then saved as a .csv.

The Student Performance in Exams dataset, containing column names (representing Student numbers), is read from GitHub.

# 
theURL <- c("https://raw.githubusercontent.com/CUNYSPS-RickRN/DATA607/master/student_performance.csv")
student_performance_df <- read_csv(theURL)
## Parsed with column specification:
## cols(
##   .default = col_character()
## )
## See spec(...) for full column specifications.
glimpse(data)
## function (..., list = character(), package = NULL, lib.loc = NULL, verbose = getOption("verbose"), 
##     envir = .GlobalEnv, overwrite = TRUE)

Tidy & Transform

This phase will tidy and transform the Student Performance in Exams dataset. It’s readily apparent that each column represents observations for each student. Therefore, pivot_longer used to tidy data to represent observations comprised of Parental Level of Education and scores for Math, Reading, and Writing.

# Pivot table
student_pivot_df <- gather(student_performance_df, "Student", "Score", 2:21, factor_key=TRUE)

#
student_pivot_df <- spread(student_pivot_df, "Student Num", "Score")

# resequence columns
student_pivot_df <- select(student_pivot_df, Student, `Parental Level of Education`, `Math Score`, `Reading Score`, `Writing Score`)

student_pivot_df
## # A tibble: 20 x 5
##    Student `Parental Level of Educ~ `Math Score` `Reading Score` `Writing Score`
##    <fct>   <chr>                    <chr>        <chr>           <chr>          
##  1 1       bachelor's degree        72           72              74             
##  2 2       some college             69           90              88             
##  3 3       master's degree          90           95              93             
##  4 4       associate's degree       47           57              44             
##  5 5       some college             76           78              75             
##  6 6       associate's degree       71           83              78             
##  7 7       some college             88           95              92             
##  8 8       some college             40           43              39             
##  9 9       high school              64           64              67             
## 10 10      high school              38           60              50             
## 11 11      associate's degree       58           54              52             
## 12 12      associate's degree       40           52              43             
## 13 13      high school              65           81              73             
## 14 14      some college             78           72              70             
## 15 15      master's degree          50           53              58             
## 16 16      some high school         69           75              78             
## 17 17      high school              88           89              86             
## 18 18      some high school         18           32              28             
## 19 19      master's degree          46           42              46             
## 20 20      associate's degree       54           58              61
Parental_LOE_factors <- factor(student_pivot_df$`Parental Level of Education`)
levels(Parental_LOE_factors)
## [1] "associate's degree" "bachelor's degree"  "high school"       
## [4] "master's degree"    "some college"       "some high school"
# Categorize parent education level

upper_ed <- filter(student_pivot_df, (`Parental Level of Education` == "master's degree" | `Parental Level of Education` == "bachelor's degree"))

mid_ed <- filter(student_pivot_df, (`Parental Level of Education` == "some college" | `Parental Level of Education` == "associate's degree"))

low_ed <- filter(student_pivot_df, (`Parental Level of Education` == "high school" | `Parental Level of Education` == "some high school"))


# Calculate average score per parent education level for each exam [future-do as func]

# Those with an upper level: bachelor's or master's
u_avg_math <- sum(as.numeric(upper_ed$`Math Score`)) / nrow(upper_ed)
u_avg_read <- sum(as.numeric(upper_ed$`Reading Score`)) / nrow(upper_ed)
u_avg_write <- sum(as.numeric(upper_ed$`Writing Score`)) / nrow(upper_ed)

# Those with an mid level: some college or associate's
m_avg_math <- sum(as.numeric(mid_ed$`Math Score`)) / nrow(mid_ed)
m_avg_read <- sum(as.numeric(mid_ed$`Reading Score`)) / nrow(mid_ed)
m_avg_write <- sum(as.numeric(mid_ed$`Writing Score`)) / nrow(mid_ed)

# Those with a low level: high school
l_avg_math <- sum(as.numeric(low_ed$`Math Score`)) / nrow(low_ed)
l_avg_read <- sum(as.numeric(low_ed$`Reading Score`)) / nrow(low_ed)
l_avg_write <- sum(as.numeric(low_ed$`Writing Score`)) / nrow(low_ed)


c("Upper level avgs - Math: ",u_avg_math, " Reading: ",u_avg_read, " Writing: ", u_avg_write)
## [1] "Upper level avgs - Math: " "64.5"                     
## [3] " Reading: "                "65.5"                     
## [5] " Writing: "                "67.75"
c("Mid level avgs - Math: ",m_avg_math, " Reading: ",m_avg_read, " Writing: ", m_avg_write)
## [1] "Mid level avgs - Math: " "62.1"                   
## [3] " Reading: "              "68.2"                   
## [5] " Writing: "              "64.2"
c("Lower level avgs - Math: ",l_avg_math, " Reading: ",l_avg_read, " Writing: ", l_avg_write)
## [1] "Lower level avgs - Math: " "57"                       
## [3] " Reading: "                "66.8333333333333"         
## [5] " Writing: "                "63.6666666666667"

Analysis

Three sets of graphs show for each level of parental education level the students’ average scores in Math, Reading, and Writing.

##Plot the average score v parent education level for Math
barplot(c(u_avg_math, m_avg_math, l_avg_math), beside=TRUE, main = "Avg Math Score v Parent Education Level", xlab = "Parent Education Level", ylab = "Avg Math Score", ylim = c(0, 70), names.arg = c("Upper", "Mid", "Lower"), col=c("#6699FF", "#6699FF", "#6699FF"), border="white")

text(0.75, 50, as.character(u_avg_math))
text(1.90, 50, as.character(m_avg_math))
text(3.10, 50, as.character(l_avg_math))

##Plot the average score v parent education level for Reading
barplot(c(u_avg_read, m_avg_read, l_avg_read), beside=TRUE, main = "Avg Reading Score v Parent Education Level", xlab = "Parent Education Level", ylab = "Avg Reading Score", ylim = c(0, 75), names.arg = c("Upper", "Mid", "Lower"), col=c("#FF9933", "#FF9933", "#FF9933"), border="white")

text(0.75, 50, as.character(u_avg_read))
text(1.90, 50, as.character(m_avg_read))
text(3.10, 50, as.character(l_avg_read))

##Plot the average score v parent education level for Writing
barplot(c(u_avg_write, m_avg_write, l_avg_write), beside=TRUE, main = "Avg Writing Score v Parent Education Level", xlab = "Parent Education Level", ylab = "Avg Writing Score", ylim = c(0, 75), names.arg = c("Upper", "Mid", "Lower"), col=c("#66CC99", "#66CC99", "#66CC99"), border="white")

text(0.75, 50, as.character(u_avg_write))
text(1.90, 50, as.character(m_avg_write))
text(3.10, 50, as.character(l_avg_write))

Summary

In Math, the average student scores were better when parents had Master or Bachelor degrees and lower average student scores followed parents with high school education.

In Writing, students whose parents have attained higher degrees score higher than students whose parents have an Associate’s degree or lower.

Interestingly, for Reading, students whose parents have higher levels of education with Masters or Bachelors degrees scored the lower than students whose parents only have a high school education.

LS0tDQp0aXRsZTogIkQ2MDdfUDAyX0RTMiINCmF1dGhvcjogIlJpY2tSTiINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIG9wZW5pbnRybzo6bGFiX3JlcG9ydDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQoNCmBgYA0KDQoNCmBgYHtyIHN0ZXBfc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBBc3NpZ25tZW50DQoNCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoNClRoZW1lIGZvciB0aGlzIFByb2plY3QgaXMgRGF0YSBUcmFuc2Zvcm1hdGlvbi4gIA0KDQpGb3IgdGhpcyBwcm9qZWN0Og0KMS4gQ3JlYXRlIGEgLkNTViBmaWxlIChvciBvcHRpb25hbGx5LCBhIE15U1FMIGRhdGFiYXNlISkgdGhhdCBpbmNsdWRlcyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZSBkYXRhc2V0LiBZb3XigJlyZSBlbmNvdXJhZ2VkIHRvIHVzZSBhIOKAnHdpZGXigJ0gc3RydWN0dXJlIHNpbWlsYXIgdG8gaG93IHRoZSBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIHRoZSBkaXNjdXNzaW9uIGl0ZW0sIHNvIHRoYXQgeW91IGNhbiBwcmFjdGljZSB0aWR5aW5nIGFuZCB0cmFuc2Zvcm1hdGlvbnMgYXMgZGVzY3JpYmVkIGJlbG93Lg0KMi4gUmVhZCB0aGUgaW5mb3JtYXRpb24gZnJvbSB5b3VyIC5DU1YgZmlsZSBpbnRvIFIsIGFuZCB1c2UgdGlkeXIgYW5kIGRwbHlyIGFzIG5lZWRlZCB0byB0aWR5IGFuZCB0cmFuc2Zvcm0geW91ciBkYXRhLiBbTW9zdCBvZiB5b3VyIGdyYWRlIHdpbGwgYmUgYmFzZWQgb24gdGhpcyBzdGVwIV0NCjMuIFBlcmZvcm0gdGhlIGFuYWx5c2lzIHJlcXVlc3RlZCBpbiB0aGUgZGlzY3Vzc2lvbiBpdGVtLg0KDQoNCkNvbGxhYm9yYXRvcnM6IE1hZ251cyBTa29uYmVyZw0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCg0KIyBSZWFkIERhdGFzZXQNCg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KVGhlIGRhdGFzZXQgd2FzIHB1bGxlZCBmcm9tIHRoZSBsYXJnZXIgS2FnZ2xlIGRhdGFzZXQgKHRoZSAxc3QgMjAgc3R1ZGVudHMpLCB0cmFuc3Bvc2VkIGluIEV4Y2VsIChyb3dzIGJlY2FtZSBjb2x1bW5zKSwgYW5kIHRoZW4gc2F2ZWQgYXMgYSAuY3N2Lg0KDQpUaGUgU3R1ZGVudCBQZXJmb3JtYW5jZSBpbiBFeGFtcyBkYXRhc2V0LCBjb250YWluaW5nIGNvbHVtbiBuYW1lcyAocmVwcmVzZW50aW5nIFN0dWRlbnQgbnVtYmVycyksIGlzIHJlYWQgZnJvbSBHaXRIdWIuICANCg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCg0KDQpgYGB7ciBzdGVwX3JlYWRfZHMsIGVjaG89VFJVRSB9DQojIA0KdGhlVVJMIDwtIGMoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9DVU5ZU1BTLVJpY2tSTi9EQVRBNjA3L21hc3Rlci9zdHVkZW50X3BlcmZvcm1hbmNlLmNzdiIpDQpzdHVkZW50X3BlcmZvcm1hbmNlX2RmIDwtIHJlYWRfY3N2KHRoZVVSTCkNCg0KZ2xpbXBzZShkYXRhKQ0KDQpgYGANCg0KIyBUaWR5ICYgVHJhbnNmb3JtDQoNCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoNClRoaXMgcGhhc2Ugd2lsbCB0aWR5IGFuZCB0cmFuc2Zvcm0gdGhlIFN0dWRlbnQgUGVyZm9ybWFuY2UgaW4gRXhhbXMgZGF0YXNldC4gIEl0J3MgcmVhZGlseSBhcHBhcmVudCB0aGF0IGVhY2ggY29sdW1uIHJlcHJlc2VudHMgb2JzZXJ2YXRpb25zIGZvciBlYWNoIHN0dWRlbnQuICBUaGVyZWZvcmUsIHBpdm90X2xvbmdlciB1c2VkIHRvIHRpZHkgZGF0YSB0byByZXByZXNlbnQgb2JzZXJ2YXRpb25zIGNvbXByaXNlZCBvZiBQYXJlbnRhbCBMZXZlbCBvZiBFZHVjYXRpb24gYW5kIHNjb3JlcyBmb3IgTWF0aCwgUmVhZGluZywgYW5kIFdyaXRpbmcuDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCmBgYHtyIHN0ZXBfdGlkeSwgZWNobz1UUlVFfQ0KIyBQaXZvdCB0YWJsZQ0Kc3R1ZGVudF9waXZvdF9kZiA8LSBnYXRoZXIoc3R1ZGVudF9wZXJmb3JtYW5jZV9kZiwgIlN0dWRlbnQiLCAiU2NvcmUiLCAyOjIxLCBmYWN0b3Jfa2V5PVRSVUUpDQoNCiMNCnN0dWRlbnRfcGl2b3RfZGYgPC0gc3ByZWFkKHN0dWRlbnRfcGl2b3RfZGYsICJTdHVkZW50IE51bSIsICJTY29yZSIpDQoNCiMgcmVzZXF1ZW5jZSBjb2x1bW5zDQpzdHVkZW50X3Bpdm90X2RmIDwtIHNlbGVjdChzdHVkZW50X3Bpdm90X2RmLCBTdHVkZW50LCBgUGFyZW50YWwgTGV2ZWwgb2YgRWR1Y2F0aW9uYCwgYE1hdGggU2NvcmVgLCBgUmVhZGluZyBTY29yZWAsIGBXcml0aW5nIFNjb3JlYCkNCg0Kc3R1ZGVudF9waXZvdF9kZg0KDQoNClBhcmVudGFsX0xPRV9mYWN0b3JzIDwtIGZhY3RvcihzdHVkZW50X3Bpdm90X2RmJGBQYXJlbnRhbCBMZXZlbCBvZiBFZHVjYXRpb25gKQ0KbGV2ZWxzKFBhcmVudGFsX0xPRV9mYWN0b3JzKQ0KDQojIENhdGVnb3JpemUgcGFyZW50IGVkdWNhdGlvbiBsZXZlbA0KDQp1cHBlcl9lZCA8LSBmaWx0ZXIoc3R1ZGVudF9waXZvdF9kZiwgKGBQYXJlbnRhbCBMZXZlbCBvZiBFZHVjYXRpb25gID09ICJtYXN0ZXIncyBkZWdyZWUiIHwgYFBhcmVudGFsIExldmVsIG9mIEVkdWNhdGlvbmAgPT0gImJhY2hlbG9yJ3MgZGVncmVlIikpDQoNCm1pZF9lZCA8LSBmaWx0ZXIoc3R1ZGVudF9waXZvdF9kZiwgKGBQYXJlbnRhbCBMZXZlbCBvZiBFZHVjYXRpb25gID09ICJzb21lIGNvbGxlZ2UiIHwgYFBhcmVudGFsIExldmVsIG9mIEVkdWNhdGlvbmAgPT0gImFzc29jaWF0ZSdzIGRlZ3JlZSIpKQ0KDQpsb3dfZWQgPC0gZmlsdGVyKHN0dWRlbnRfcGl2b3RfZGYsIChgUGFyZW50YWwgTGV2ZWwgb2YgRWR1Y2F0aW9uYCA9PSAiaGlnaCBzY2hvb2wiIHwgYFBhcmVudGFsIExldmVsIG9mIEVkdWNhdGlvbmAgPT0gInNvbWUgaGlnaCBzY2hvb2wiKSkNCg0KDQojIENhbGN1bGF0ZSBhdmVyYWdlIHNjb3JlIHBlciBwYXJlbnQgZWR1Y2F0aW9uIGxldmVsIGZvciBlYWNoIGV4YW0gW2Z1dHVyZS1kbyBhcyBmdW5jXQ0KDQojIFRob3NlIHdpdGggYW4gdXBwZXIgbGV2ZWw6IGJhY2hlbG9yJ3Mgb3IgbWFzdGVyJ3MNCnVfYXZnX21hdGggPC0gc3VtKGFzLm51bWVyaWModXBwZXJfZWQkYE1hdGggU2NvcmVgKSkgLyBucm93KHVwcGVyX2VkKQ0KdV9hdmdfcmVhZCA8LSBzdW0oYXMubnVtZXJpYyh1cHBlcl9lZCRgUmVhZGluZyBTY29yZWApKSAvIG5yb3codXBwZXJfZWQpDQp1X2F2Z193cml0ZSA8LSBzdW0oYXMubnVtZXJpYyh1cHBlcl9lZCRgV3JpdGluZyBTY29yZWApKSAvIG5yb3codXBwZXJfZWQpDQoNCiMgVGhvc2Ugd2l0aCBhbiBtaWQgbGV2ZWw6IHNvbWUgY29sbGVnZSBvciBhc3NvY2lhdGUncw0KbV9hdmdfbWF0aCA8LSBzdW0oYXMubnVtZXJpYyhtaWRfZWQkYE1hdGggU2NvcmVgKSkgLyBucm93KG1pZF9lZCkNCm1fYXZnX3JlYWQgPC0gc3VtKGFzLm51bWVyaWMobWlkX2VkJGBSZWFkaW5nIFNjb3JlYCkpIC8gbnJvdyhtaWRfZWQpDQptX2F2Z193cml0ZSA8LSBzdW0oYXMubnVtZXJpYyhtaWRfZWQkYFdyaXRpbmcgU2NvcmVgKSkgLyBucm93KG1pZF9lZCkNCg0KIyBUaG9zZSB3aXRoIGEgbG93IGxldmVsOiBoaWdoIHNjaG9vbA0KbF9hdmdfbWF0aCA8LSBzdW0oYXMubnVtZXJpYyhsb3dfZWQkYE1hdGggU2NvcmVgKSkgLyBucm93KGxvd19lZCkNCmxfYXZnX3JlYWQgPC0gc3VtKGFzLm51bWVyaWMobG93X2VkJGBSZWFkaW5nIFNjb3JlYCkpIC8gbnJvdyhsb3dfZWQpDQpsX2F2Z193cml0ZSA8LSBzdW0oYXMubnVtZXJpYyhsb3dfZWQkYFdyaXRpbmcgU2NvcmVgKSkgLyBucm93KGxvd19lZCkNCg0KDQpjKCJVcHBlciBsZXZlbCBhdmdzIC0gTWF0aDogIix1X2F2Z19tYXRoLCAiIFJlYWRpbmc6ICIsdV9hdmdfcmVhZCwgIiBXcml0aW5nOiAiLCB1X2F2Z193cml0ZSkNCmMoIk1pZCBsZXZlbCBhdmdzIC0gTWF0aDogIixtX2F2Z19tYXRoLCAiIFJlYWRpbmc6ICIsbV9hdmdfcmVhZCwgIiBXcml0aW5nOiAiLCBtX2F2Z193cml0ZSkNCmMoIkxvd2VyIGxldmVsIGF2Z3MgLSBNYXRoOiAiLGxfYXZnX21hdGgsICIgUmVhZGluZzogIixsX2F2Z19yZWFkLCAiIFdyaXRpbmc6ICIsIGxfYXZnX3dyaXRlKQ0KDQoNCmBgYA0KDQojIEFuYWx5c2lzDQoNCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoNClRocmVlIHNldHMgb2YgZ3JhcGhzIHNob3cgZm9yIGVhY2ggbGV2ZWwgb2YgcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVsIHRoZSBzdHVkZW50cycgYXZlcmFnZQ0Kc2NvcmVzIGluIE1hdGgsIFJlYWRpbmcsIGFuZCBXcml0aW5nLg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCg0KYGBge3Igc3RlcF9hbmFseXNpc30NCiMjUGxvdCB0aGUgYXZlcmFnZSBzY29yZSB2IHBhcmVudCBlZHVjYXRpb24gbGV2ZWwgZm9yIE1hdGgNCmJhcnBsb3QoYyh1X2F2Z19tYXRoLCBtX2F2Z19tYXRoLCBsX2F2Z19tYXRoKSwgYmVzaWRlPVRSVUUsIG1haW4gPSAiQXZnIE1hdGggU2NvcmUgdiBQYXJlbnQgRWR1Y2F0aW9uIExldmVsIiwgeGxhYiA9ICJQYXJlbnQgRWR1Y2F0aW9uIExldmVsIiwgeWxhYiA9ICJBdmcgTWF0aCBTY29yZSIsIHlsaW0gPSBjKDAsIDcwKSwgbmFtZXMuYXJnID0gYygiVXBwZXIiLCAiTWlkIiwgIkxvd2VyIiksIGNvbD1jKCIjNjY5OUZGIiwgIiM2Njk5RkYiLCAiIzY2OTlGRiIpLCBib3JkZXI9IndoaXRlIikNCg0KdGV4dCgwLjc1LCA1MCwgYXMuY2hhcmFjdGVyKHVfYXZnX21hdGgpKQ0KdGV4dCgxLjkwLCA1MCwgYXMuY2hhcmFjdGVyKG1fYXZnX21hdGgpKQ0KdGV4dCgzLjEwLCA1MCwgYXMuY2hhcmFjdGVyKGxfYXZnX21hdGgpKQ0KDQojI1Bsb3QgdGhlIGF2ZXJhZ2Ugc2NvcmUgdiBwYXJlbnQgZWR1Y2F0aW9uIGxldmVsIGZvciBSZWFkaW5nDQpiYXJwbG90KGModV9hdmdfcmVhZCwgbV9hdmdfcmVhZCwgbF9hdmdfcmVhZCksIGJlc2lkZT1UUlVFLCBtYWluID0gIkF2ZyBSZWFkaW5nIFNjb3JlIHYgUGFyZW50IEVkdWNhdGlvbiBMZXZlbCIsIHhsYWIgPSAiUGFyZW50IEVkdWNhdGlvbiBMZXZlbCIsIHlsYWIgPSAiQXZnIFJlYWRpbmcgU2NvcmUiLCB5bGltID0gYygwLCA3NSksIG5hbWVzLmFyZyA9IGMoIlVwcGVyIiwgIk1pZCIsICJMb3dlciIpLCBjb2w9YygiI0ZGOTkzMyIsICIjRkY5OTMzIiwgIiNGRjk5MzMiKSwgYm9yZGVyPSJ3aGl0ZSIpDQoNCnRleHQoMC43NSwgNTAsIGFzLmNoYXJhY3Rlcih1X2F2Z19yZWFkKSkNCnRleHQoMS45MCwgNTAsIGFzLmNoYXJhY3RlcihtX2F2Z19yZWFkKSkNCnRleHQoMy4xMCwgNTAsIGFzLmNoYXJhY3RlcihsX2F2Z19yZWFkKSkNCg0KIyNQbG90IHRoZSBhdmVyYWdlIHNjb3JlIHYgcGFyZW50IGVkdWNhdGlvbiBsZXZlbCBmb3IgV3JpdGluZw0KYmFycGxvdChjKHVfYXZnX3dyaXRlLCBtX2F2Z193cml0ZSwgbF9hdmdfd3JpdGUpLCBiZXNpZGU9VFJVRSwgbWFpbiA9ICJBdmcgV3JpdGluZyBTY29yZSB2IFBhcmVudCBFZHVjYXRpb24gTGV2ZWwiLCB4bGFiID0gIlBhcmVudCBFZHVjYXRpb24gTGV2ZWwiLCB5bGFiID0gIkF2ZyBXcml0aW5nIFNjb3JlIiwgeWxpbSA9IGMoMCwgNzUpLCBuYW1lcy5hcmcgPSBjKCJVcHBlciIsICJNaWQiLCAiTG93ZXIiKSwgY29sPWMoIiM2NkNDOTkiLCAiIzY2Q0M5OSIsICIjNjZDQzk5IiksIGJvcmRlcj0id2hpdGUiKQ0KDQp0ZXh0KDAuNzUsIDUwLCBhcy5jaGFyYWN0ZXIodV9hdmdfd3JpdGUpKQ0KdGV4dCgxLjkwLCA1MCwgYXMuY2hhcmFjdGVyKG1fYXZnX3dyaXRlKSkNCnRleHQoMy4xMCwgNTAsIGFzLmNoYXJhY3RlcihsX2F2Z193cml0ZSkpDQoNCmBgYA0KDQojIFN1bW1hcnkNCg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KSW4gTWF0aCwgdGhlIGF2ZXJhZ2Ugc3R1ZGVudCBzY29yZXMgd2VyZSBiZXR0ZXIgd2hlbiBwYXJlbnRzIGhhZCBNYXN0ZXIgb3IgQmFjaGVsb3IgZGVncmVlcyBhbmQgbG93ZXIgYXZlcmFnZSBzdHVkZW50IHNjb3JlcyBmb2xsb3dlZCBwYXJlbnRzIHdpdGggaGlnaCBzY2hvb2wgZWR1Y2F0aW9uLg0KDQpJbiBXcml0aW5nLCBzdHVkZW50cyB3aG9zZSBwYXJlbnRzIGhhdmUgYXR0YWluZWQgaGlnaGVyIGRlZ3JlZXMgc2NvcmUgaGlnaGVyIHRoYW4gc3R1ZGVudHMgd2hvc2UgcGFyZW50cyBoYXZlIGFuIEFzc29jaWF0ZSdzIGRlZ3JlZSBvciBsb3dlci4NCg0KSW50ZXJlc3RpbmdseSwgZm9yIFJlYWRpbmcsIHN0dWRlbnRzIHdob3NlIHBhcmVudHMgaGF2ZSBoaWdoZXIgbGV2ZWxzIG9mIGVkdWNhdGlvbiB3aXRoIE1hc3RlcnMgb3IgQmFjaGVsb3JzIGRlZ3JlZXMgc2NvcmVkIHRoZSBsb3dlciB0aGFuIHN0dWRlbnRzIHdob3NlIHBhcmVudHMgb25seSBoYXZlIGEgaGlnaCBzY2hvb2wgZWR1Y2F0aW9uLg0KDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCg==