Install Packages
#install.packages("tidyverse")
#install.packages("psych")
Library Packages
#library(tidyverse)
#library(readr)
#library(dplyr)
#library(scales)
#library(ggplot2)
#library(psych)
Read dataset
US_Scores <- read_csv('school_scores.csv',show_col_types = TRUE)
Rows: 577 Columns: 99── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): State.Code, State.Name
dbl (97): Year, Total.Math, Total.Test-takers, Total.Verbal, Academic Subjects.Arts/Music.Average GPA...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(US_Scores)
Create a summary of the dataset to view all columns and
components
summary(US_Scores)
Year State.Code State.Name Total.Math Total.Test-takers Total.Verbal
Min. :2005 Length:577 Length:577 Min. :383.0 Min. : 134 Min. :401.0
1st Qu.:2007 Class :character Class :character 1st Qu.:504.0 1st Qu.: 2536 1st Qu.:496.0
Median :2010 Mode :character Mode :character Median :527.0 Median : 6468 Median :522.0
Mean :2010 Mean :535.7 Mean : 27914 Mean :531.3
3rd Qu.:2013 3rd Qu.:571.0 3rd Qu.: 35799 3rd Qu.:572.0
Max. :2015 Max. :619.0 Max. :241553 Max. :612.0
Academic Subjects.Arts/Music.Average GPA Academic Subjects.Arts/Music.Average Years
Min. :3.430 Min. :1.200
1st Qu.:3.760 1st Qu.:2.100
Median :3.850 Median :2.300
Mean :3.823 Mean :2.289
3rd Qu.:3.900 3rd Qu.:2.500
Max. :3.960 Max. :3.100
Academic Subjects.English.Average GPA Academic Subjects.English.Average Years
Min. :3.030 Min. :3.500
1st Qu.:3.350 1st Qu.:3.900
Median :3.510 Median :3.900
Mean :3.501 Mean :3.929
3rd Qu.:3.670 3rd Qu.:4.000
Max. :3.880 Max. :4.100
Academic Subjects.Foreign Languages.Average GPA Academic Subjects.Foreign Languages.Average Years
Min. :3.030 Min. :1.800
1st Qu.:3.300 1st Qu.:2.600
Median :3.460 Median :2.800
Mean :3.453 Mean :2.851
3rd Qu.:3.630 3rd Qu.:3.100
Max. :3.790 Max. :3.600
Academic Subjects.Mathematics.Average GPA Academic Subjects.Mathematics.Average Years
Min. :2.85 Min. :3.200
1st Qu.:3.12 1st Qu.:3.800
Median :3.30 Median :3.900
Mean :3.31 Mean :3.939
3rd Qu.:3.51 3rd Qu.:4.100
Max. :3.76 Max. :4.400
Academic Subjects.Natural Sciences.Average GPA Academic Subjects.Natural Sciences.Average Years
Min. :2.870 Min. :2.800
1st Qu.:3.250 1st Qu.:3.500
Median :3.420 Median :3.600
Mean :3.418 Mean :3.632
3rd Qu.:3.600 3rd Qu.:3.800
Max. :3.820 Max. :4.200
Academic Subjects.Social Sciences/History.Average GPA
Min. :3.050
1st Qu.:3.380
Median :3.530
Mean :3.522
3rd Qu.:3.680
Max. :3.880
Academic Subjects.Social Sciences/History.Average Years Family Income.Between 20-40k.Math
Min. :3.000 Min. : 0.0
1st Qu.:3.500 1st Qu.:471.0
Median :3.600 Median :495.0
Mean :3.619 Mean :500.2
3rd Qu.:3.700 3rd Qu.:533.0
Max. :4.000 Max. :643.0
Family Income.Between 20-40k.Test-takers Family Income.Between 20-40k.Verbal
Min. : 5 Min. :387.0
1st Qu.: 214 1st Qu.:466.0
Median : 580 Median :496.0
Mean : 3234 Mean :501.3
3rd Qu.: 3179 3rd Qu.:536.0
Max. :35446 Max. :634.0
Family Income.Between 40-60k.Math Family Income.Between 40-60k.Test-takers
Min. :381.0 Min. : 10
1st Qu.:493.0 1st Qu.: 236
Median :519.0 Median : 636
Mean :522.8 Mean : 2847
3rd Qu.:554.0 3rd Qu.: 3386
Max. :629.0 Max. :28124
Family Income.Between 40-60k.Verbal Family Income.Between 60-80k.Math
Min. :414.0 Min. :249.0
1st Qu.:489.0 1st Qu.:506.0
Median :517.0 Median :531.0
Mean :523.1 Mean :533.6
3rd Qu.:558.0 3rd Qu.:564.0
Max. :628.0 Max. :630.0
Family Income.Between 60-80k.Test-takers Family Income.Between 60-80k.Verbal
Min. : 8 Min. :232.0
1st Qu.: 199 1st Qu.:501.0
Median : 523 Median :527.0
Mean : 2270 Mean :533.8
3rd Qu.: 2791 3rd Qu.:571.0
Max. :17937 Max. :645.0
Family Income.Between 80-100k.Math Family Income.Between 80-100k.Test-takers
Min. :398.0 Min. : 5
1st Qu.:519.0 1st Qu.: 164
Median :539.0 Median : 441
Mean :547.1 Mean : 1804
3rd Qu.:575.0 3rd Qu.: 2130
Max. :646.0 Max. :15358
Family Income.Between 80-100k.Verbal Family Income.Less than 20k.Math
Min. :433.0 Min. : 0.0
1st Qu.:514.0 1st Qu.:438.0
Median :536.0 Median :465.0
Mean :544.6 Mean :461.7
3rd Qu.:580.0 3rd Qu.:510.0
Max. :651.0 Max. :589.0
Family Income.Less than 20k.Test-takers Family Income.Less than 20k.Verbal
Min. : 1 Min. : 0.0
1st Qu.: 124 1st Qu.:429.0
Median : 347 Median :464.0
Mean : 2433 Mean :458.4
3rd Qu.: 2129 3rd Qu.:501.0
Max. :42551 Max. :579.0
Family Income.More than 100k.Math Family Income.More than 100k.Test-takers
Min. : 0.0 Min. : 2
1st Qu.:548.0 1st Qu.: 427
Median :565.0 Median : 1000
Mean :565.8 Mean : 4141
3rd Qu.:587.0 3rd Qu.: 4405
Max. :637.0 Max. :46127
Family Income.More than 100k.Verbal GPA.A minus.Math GPA.A minus.Test-takers GPA.A minus.Verbal
Min. : 0.0 Min. : 0 Min. : 0 Min. : 0.0
1st Qu.:538.0 1st Qu.:532 1st Qu.: 460 1st Qu.:526.0
Median :555.0 Median :552 Median : 1217 Median :547.0
Mean :560.5 Mean :550 Mean : 4955 Mean :543.7
3rd Qu.:590.0 3rd Qu.:569 3rd Qu.: 6372 3rd Qu.:566.0
Max. :637.0 Max. :619 Max. :45869 Max. :609.0
GPA.A plus.Math GPA.A plus.Test-takers GPA.A plus.Verbal GPA.A.Math GPA.A.Test-takers
Min. : 0.0 Min. : 0 Min. : 0.0 Min. : 0 Min. : 0
1st Qu.:607.0 1st Qu.: 274 1st Qu.:595.0 1st Qu.:565 1st Qu.: 680
Median :624.0 Median : 524 Median :616.0 Median :588 Median : 1390
Mean :621.7 Mean : 1592 Mean :613.1 Mean :585 Mean : 4925
3rd Qu.:644.0 3rd Qu.: 1792 3rd Qu.:637.0 3rd Qu.:605 3rd Qu.: 6112
Max. :683.0 Max. :12184 Max. :672.0 Max. :655 Max. :42656
GPA.A.Verbal GPA.B.Math GPA.B.Test-takers GPA.B.Verbal GPA.C.Math GPA.C.Test-takers
Min. : 0.0 Min. : 0.0 Min. : 0 Min. : 0 Min. : 0.0 Min. : 0
1st Qu.:556.0 1st Qu.:472.0 1st Qu.: 676 1st Qu.:470 1st Qu.:413.0 1st Qu.: 93
Median :580.0 Median :492.0 Median : 2282 Median :493 Median :436.0 Median : 445
Mean :576.8 Mean :490.5 Mean : 11729 Mean :491 Mean :426.2 Mean : 2620
3rd Qu.:600.0 3rd Qu.:511.0 3rd Qu.: 14745 3rd Qu.:517 3rd Qu.:457.0 3rd Qu.: 3060
Max. :637.0 Max. :564.0 Max. :104693 Max. :562 Max. :553.0 Max. :22802
GPA.C.Verbal GPA.D or lower.Math GPA.D or lower.Test-takers GPA.D or lower.Verbal
Min. : 0.0 Min. : 0.0 Min. : 0.00 Min. : 0.0
1st Qu.:415.0 1st Qu.: 0.0 1st Qu.: 2.00 1st Qu.: 0.0
Median :440.0 Median :389.0 Median : 12.00 Median :394.0
Mean :431.6 Mean :266.6 Mean : 90.76 Mean :272.4
3rd Qu.:464.0 3rd Qu.:428.0 3rd Qu.: 90.00 3rd Qu.:432.0
Max. :548.0 Max. :648.0 Max. :2061.00 Max. :632.0
GPA.No response.Math GPA.No response.Test-takers GPA.No response.Verbal Gender.Female.Math
Min. : 0 Min. : 0 Min. : 0.0 Min. :368.0
1st Qu.: 0 1st Qu.: 107 1st Qu.: 0.0 1st Qu.:488.0
Median :446 Median : 399 Median :462.0 Median :510.0
Mean :304 Mean : 1953 Mean :315.6 Mean :518.4
3rd Qu.:496 3rd Qu.: 2206 3rd Qu.:510.0 3rd Qu.:551.0
Max. :589 Max. :26744 Max. :616.0 Max. :611.0
Gender.Female.Test-takers Gender.Female.Verbal Gender.Male.Math Gender.Male.Test-takers
Min. : 73 Min. :399.0 Min. :394.0 Min. : 61
1st Qu.: 1357 1st Qu.:493.0 1st Qu.:521.0 1st Qu.: 1177
Median : 3428 Median :519.0 Median :546.0 Median : 2979
Mean : 15012 Mean :528.3 Mean :553.9 Mean : 12911
3rd Qu.: 18698 3rd Qu.:569.0 3rd Qu.:592.0 3rd Qu.: 16718
Max. :133217 Max. :611.0 Max. :640.0 Max. :108336
Gender.Male.Verbal Score Ranges.Between 200 to 300.Math.Females
Min. :403.0 Min. : 0.0
1st Qu.:499.0 1st Qu.: 12.0
Median :525.0 Median : 102.0
Mean :534.9 Mean : 441.3
3rd Qu.:577.0 3rd Qu.: 518.0
Max. :635.0 Max. :4294.0
Score Ranges.Between 200 to 300.Math.Males Score Ranges.Between 200 to 300.Math.Total
Min. : 0.0 Min. : 0.0
1st Qu.: 8.0 1st Qu.: 20.0
Median : 60.0 Median : 162.0
Mean : 308.4 Mean : 705.2
3rd Qu.: 468.0 3rd Qu.: 628.0
Max. :3034.0 Max. :6772.0
Score Ranges.Between 200 to 300.Verbal.Females Score Ranges.Between 200 to 300.Verbal.Males
Min. : 0.0 Min. : 0.0
1st Qu.: 12.0 1st Qu.: 14.0
Median : 46.0 Median : 83.0
Mean : 387.7 Mean : 651.1
3rd Qu.: 357.0 3rd Qu.: 570.0
Max. :5111.0 Max. :20348.0
Score Ranges.Between 200 to 300.Verbal.Total Score Ranges.Between 300 to 400.Math.Females
Min. : 0.0 Min. : 1
1st Qu.: 26.0 1st Qu.: 95
Median : 74.0 Median : 599
Mean : 752.7 Mean : 2181
3rd Qu.: 790.0 3rd Qu.: 1972
Max. :10603.0 Max. :24977
Score Ranges.Between 300 to 400.Math.Males Score Ranges.Between 300 to 400.Math.Total
Min. : 1 Min. : 0
1st Qu.: 57 1st Qu.: 149
Median : 144 Median : 937
Mean : 1279 Mean : 3450
3rd Qu.: 1389 3rd Qu.: 3288
Max. :13740 Max. :38161
Score Ranges.Between 300 to 400.Verbal.Females Score Ranges.Between 300 to 400.Verbal.Males
Min. : 1 Min. : 1
1st Qu.: 52 1st Qu.: 74
Median : 206 Median : 368
Mean : 2018 Mean : 1957
3rd Qu.: 1827 3rd Qu.: 2081
Max. :22544 Max. :26188
Score Ranges.Between 300 to 400.Verbal.Total Score Ranges.Between 400 to 500.Math.Females
Min. : 2 Min. : 0
1st Qu.: 110 1st Qu.: 333
Median : 394 Median : 670
Mean : 3670 Mean : 4598
3rd Qu.: 3530 3rd Qu.: 5262
Max. :41262 Max. :43758
Score Ranges.Between 400 to 500.Math.Males Score Ranges.Between 400 to 500.Math.Total
Min. : 0 Min. : 0
1st Qu.: 125 1st Qu.: 493
Median : 442 Median : 1096
Mean : 3143 Mean : 7738
3rd Qu.: 3412 3rd Qu.: 8698
Max. :29254 Max. :73012
Score Ranges.Between 400 to 500.Verbal.Females Score Ranges.Between 400 to 500.Verbal.Males
Min. : 1 Min. : 2
1st Qu.: 198 1st Qu.: 223
Median : 595 Median : 892
Mean : 4539 Mean : 5541
3rd Qu.: 5082 3rd Qu.: 5351
Max. :45918 Max. :164622
Score Ranges.Between 400 to 500.Verbal.Total Score Ranges.Between 500 to 600.Math.Females
Min. : 0 Min. : 4
1st Qu.: 354 1st Qu.: 369
Median : 1063 Median : 1006
Mean : 8190 Mean : 4333
3rd Qu.: 9280 3rd Qu.: 5593
Max. :80535 Max. :35778
Score Ranges.Between 500 to 600.Math.Males Score Ranges.Between 500 to 600.Math.Total
Min. : 3 Min. : 6
1st Qu.: 292 1st Qu.: 651
Median : 798 Median : 1830
Mean : 3790 Mean : 8125
3rd Qu.: 5163 3rd Qu.:10753
Max. :31702 Max. :67480
Score Ranges.Between 500 to 600.Verbal.Females Score Ranges.Between 500 to 600.Verbal.Males
Min. : 4 Min. : 4
1st Qu.: 356 1st Qu.: 318
Median : 995 Median : 871
Mean : 4351 Mean : 3760
3rd Qu.: 5835 3rd Qu.: 5341
Max. :37455 Max. :31449
Score Ranges.Between 500 to 600.Verbal.Total Score Ranges.Between 600 to 700.Math.Females
Min. : 1 Min. : 10
1st Qu.: 663 1st Qu.: 284
Median : 1888 Median : 699
Mean : 8113 Mean : 2888
3rd Qu.:11266 3rd Qu.: 3242
Max. :68869 Max. :66431
Score Ranges.Between 600 to 700.Math.Males Score Ranges.Between 600 to 700.Math.Total
Min. : 15 Min. : 26
1st Qu.: 328 1st Qu.: 609
Median : 732 Median : 1462
Mean : 3167 Mean : 6056
3rd Qu.: 4178 3rd Qu.: 7308
Max. :49941 Max. :116372
Score Ranges.Between 600 to 700.Verbal.Females Score Ranges.Between 600 to 700.Verbal.Males
Min. : 13 Min. : 10
1st Qu.: 319 1st Qu.: 302
Median : 718 Median : 672
Mean : 2914 Mean : 2678
3rd Qu.: 3329 3rd Qu.: 3215
Max. :71360 Max. :56513
Score Ranges.Between 600 to 700.Verbal.Total Score Ranges.Between 700 to 800.Math.Females
Min. : 23 Min. : 2.0
1st Qu.: 617 1st Qu.: 83.0
Median : 1383 Median : 223.0
Mean : 5592 Mean : 792.6
3rd Qu.: 6521 3rd Qu.: 821.0
Max. :127873 Max. :24126.0
Score Ranges.Between 700 to 800.Math.Males Score Ranges.Between 700 to 800.Math.Total
Min. : 1 Min. : 1
1st Qu.: 163 1st Qu.: 251
Median : 406 Median : 645
Mean : 1307 Mean : 2099
3rd Qu.: 1475 3rd Qu.: 2301
Max. :30815 Max. :54941
Score Ranges.Between 700 to 800.Verbal.Females Score Ranges.Between 700 to 800.Verbal.Males
Min. : 2.0 Min. : 2.0
1st Qu.: 123.0 1st Qu.: 121.0
Median : 295.0 Median : 295.0
Mean : 849.8 Mean : 847.3
3rd Qu.: 987.0 3rd Qu.: 970.0
Max. :21826.0 Max. :20460.0
Score Ranges.Between 700 to 800.Verbal.Total
Min. : 4
1st Qu.: 246
Median : 605
Mean : 1697
3rd Qu.: 1971
Max. :42286
Create a subset of various states for analysis
# The states chosen for this subset are from various regions of the country
Five_State_Scores <- subset(US_Scores, State.Name == "North Dakota" |
State.Name == "California" |
State.Name == "Florida" |
State.Name == "Texas" |
State.Name == "New York")
Five_State_Scores
Data Visualization of math SAT test scores
ggplot( data = Five_State_Scores, mapping = aes(x = Year, y = Total.Math, linetype = State.Name)) +
geom_point() +
geom_smooth(mapping = aes(color = State.Name)) +
scale_x_continuous(breaks = pretty_breaks()) +
labs(title = "ND, FL, CA, TX, NY Math Scores",
y = "Math Test Scores")

Data Visualization of verbal SAT test scores
ggplot( data = Five_State_Scores, mapping = aes(x = Year, y = Total.Verbal, linetype = State.Name)) +
geom_smooth(mapping = aes(color = State.Name)) +
geom_point() +
scale_x_continuous(breaks = pretty_breaks()) +
labs(title = "ND, FL, CA, TX, NY Verbal Scores",
y = "Verbal Test Scores")

Examining the top 5 states
# Get the top 5 states by count
top_states <- head(sort(table(US_Scores$State.Code), decreasing = TRUE), 5)
# Subset the data to only include the top 5 platforms
top_states_5 <- subset(US_Scores, State.Code %in% names(top_states))
# Create the ggplot with the data
ggplot(data = top_states_5, mapping = aes(x = Year, y = `Academic Subjects.Mathematics.Average Years`, color = State.Code)) +
geom_smooth() +
geom_line() +
scale_x_continuous(breaks = pretty_breaks()) +
labs(title = "1.1 - Average Math GPA Scores by State & Year (Top 5)",
x = "Year",
y = "Math GPA (Average)",
color = "State Code") +
theme_minimal()

Grouping data by Year to then calculate the average test-takers
scores for each gender
US_Scores$YearGroup <- cut(US_Scores$Year,
breaks = seq(2005, 2016, by = 1), # Adjusted the upper limit to 2015
labels = c("2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"))
Creating the average test scores for both Male and Female test
scores
topscores <- US_Scores %>%
group_by(YearGroup) %>%
summarize(
Avg_Female_TestTakers = mean(`Gender.Female.Test-takers`),
Avg_Male_TestTakers = mean(`Gender.Male.Test-takers`)
) %>%
ungroup()
Creating a bar chart for data visualization
ggplot(topscores, aes(x = YearGroup)) +
geom_bar(aes(y = Avg_Female_TestTakers, fill = "Female"), stat = "identity", position = "dodge", width = 0.7) +
geom_bar(aes(y = Avg_Male_TestTakers, fill = "Male"), stat = "identity", position = "dodge", width = 0.7) +
labs(title = "Average Test-Takers", x = "Year Group", y = "Average Test-Takers") +
scale_fill_manual(values = c("Female" = "red", "Male" = "blue")) +
theme_minimal() +
geom_text(aes(x = YearGroup, y = round(Avg_Female_TestTakers), label = round(Avg_Female_TestTakers)),
position = position_dodge(width = 0.7), vjust = 1.65, size = 3) +
geom_text(aes(x = YearGroup, y = round(Avg_Male_TestTakers), label = round(Avg_Male_TestTakers)),
position = position_dodge(width = 0.7), vjust = -0.65, size = 3) +
scale_x_discrete(labels = c("2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"))

LS0tCnRpdGxlOiAiVS5TLiBFZHVjYXRpb24gRWZmaWNpZW5jeSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgSW5zdGFsbCBQYWNrYWdlcwpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCiNpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpCmBgYAojIExpYnJhcnkgUGFja2FnZXMKYGBge3J9CiNsaWJyYXJ5KHRpZHl2ZXJzZSkKI2xpYnJhcnkocmVhZHIpCiNsaWJyYXJ5KGRwbHlyKQojbGlicmFyeShzY2FsZXMpCiNsaWJyYXJ5KGdncGxvdDIpCiNsaWJyYXJ5KHBzeWNoKQpgYGAKIyBSZWFkIGRhdGFzZXQKYGBge3J9ClVTX1Njb3JlcyA8LSByZWFkX2Nzdignc2Nob29sX3Njb3Jlcy5jc3YnLHNob3dfY29sX3R5cGVzID0gVFJVRSkKaGVhZChVU19TY29yZXMpCmBgYAojIENyZWF0ZSBhIHN1bW1hcnkgb2YgdGhlIGRhdGFzZXQgdG8gdmlldyBhbGwgY29sdW1ucyBhbmQgY29tcG9uZW50cwpgYGB7cn0Kc3VtbWFyeShVU19TY29yZXMpCmBgYAoKIyBDcmVhdGUgYSBzdWJzZXQgb2YgdmFyaW91cyBzdGF0ZXMgZm9yIGFuYWx5c2lzCmBgYHtyfQojIFRoZSBzdGF0ZXMgY2hvc2VuIGZvciB0aGlzIHN1YnNldCBhcmUgZnJvbSB2YXJpb3VzIHJlZ2lvbnMgb2YgdGhlIGNvdW50cnkKCkZpdmVfU3RhdGVfU2NvcmVzIDwtIHN1YnNldChVU19TY29yZXMsIFN0YXRlLk5hbWUgPT0gIk5vcnRoIERha290YSIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLk5hbWUgPT0gIkNhbGlmb3JuaWEiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5OYW1lID09ICJGbG9yaWRhIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLk5hbWUgPT0gIlRleGFzIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUuTmFtZSA9PSAiTmV3IFlvcmsiKQpGaXZlX1N0YXRlX1Njb3JlcwpgYGAKIyBEYXRhIFZpc3VhbGl6YXRpb24gb2YgbWF0aCBTQVQgdGVzdCBzY29yZXMKYGBge3J9CmdncGxvdCggZGF0YSA9IEZpdmVfU3RhdGVfU2NvcmVzLCBtYXBwaW5nID0gYWVzKHggPSBZZWFyLCB5ID0gVG90YWwuTWF0aCwgbGluZXR5cGUgPSBTdGF0ZS5OYW1lKSkgKwogICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyhjb2xvciA9IFN0YXRlLk5hbWUpKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoKSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiTkQsIEZMLCBDQSwgVFgsIE5ZIE1hdGggU2NvcmVzIiwKICAgICAgICAgICAgIHkgPSAiTWF0aCBUZXN0IFNjb3JlcyIpCmBgYAojIERhdGEgVmlzdWFsaXphdGlvbiBvZiB2ZXJiYWwgU0FUIHRlc3Qgc2NvcmVzCmBgYHtyfQpnZ3Bsb3QoIGRhdGEgPSBGaXZlX1N0YXRlX1Njb3JlcywgbWFwcGluZyA9IGFlcyh4ID0gWWVhciwgeSA9IFRvdGFsLlZlcmJhbCwgbGluZXR5cGUgPSBTdGF0ZS5OYW1lKSkgKwogICAgICAgIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoY29sb3IgPSBTdGF0ZS5OYW1lKSkgKwogICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoKSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiTkQsIEZMLCBDQSwgVFgsIE5ZIFZlcmJhbCBTY29yZXMiLAogICAgICAgICAgICAgeSA9ICJWZXJiYWwgVGVzdCBTY29yZXMiKQpgYGAKIyBFeGFtaW5pbmcgdGhlIHRvcCA1IHN0YXRlcwpgYGB7cn0KIyBHZXQgdGhlIHRvcCA1IHN0YXRlcyBieSBjb3VudAp0b3Bfc3RhdGVzIDwtIGhlYWQoc29ydCh0YWJsZShVU19TY29yZXMkU3RhdGUuQ29kZSksIGRlY3JlYXNpbmcgPSBUUlVFKSwgNSkKCiMgU3Vic2V0IHRoZSBkYXRhIHRvIG9ubHkgaW5jbHVkZSB0aGUgdG9wIDUgcGxhdGZvcm1zCnRvcF9zdGF0ZXNfNSA8LSBzdWJzZXQoVVNfU2NvcmVzLCBTdGF0ZS5Db2RlICVpbiUgbmFtZXModG9wX3N0YXRlcykpCgojIENyZWF0ZSB0aGUgZ2dwbG90IHdpdGggdGhlIGRhdGEKZ2dwbG90KGRhdGEgPSB0b3Bfc3RhdGVzXzUsIG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsIHkgPSBgQWNhZGVtaWMgU3ViamVjdHMuTWF0aGVtYXRpY3MuQXZlcmFnZSBZZWFyc2AsIGNvbG9yID0gU3RhdGUuQ29kZSkpICsKICBnZW9tX3Ntb290aCgpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoKSkgKwogIGxhYnModGl0bGUgPSAiMS4xIC0gQXZlcmFnZSBNYXRoIEdQQSBTY29yZXMgYnkgU3RhdGUgJiBZZWFyIChUb3AgNSkiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTWF0aCBHUEEgKEF2ZXJhZ2UpIiwKICAgICAgIGNvbG9yID0gIlN0YXRlIENvZGUiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAojIEdyb3VwaW5nIGRhdGEgYnkgWWVhciB0byB0aGVuIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB0ZXN0LXRha2VycyBzY29yZXMgZm9yIGVhY2ggZ2VuZGVyCmBgYHtyfQpVU19TY29yZXMkWWVhckdyb3VwIDwtIGN1dChVU19TY29yZXMkWWVhciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjAwNSwgMjAxNiwgYnkgPSAxKSwgICMgQWRqdXN0ZWQgdGhlIHVwcGVyIGxpbWl0IHRvIDIwMTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjIwMDUiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIpKQpgYGAKIyBDcmVhdGluZyB0aGUgYXZlcmFnZSB0ZXN0IHNjb3JlcyBmb3IgYm90aCBNYWxlIGFuZCBGZW1hbGUgdGVzdCBzY29yZXMKYGBge3J9CnRvcHNjb3JlcyA8LSBVU19TY29yZXMgJT4lCiAgZ3JvdXBfYnkoWWVhckdyb3VwKSAlPiUKICBzdW1tYXJpemUoCiAgICBBdmdfRmVtYWxlX1Rlc3RUYWtlcnMgPSBtZWFuKGBHZW5kZXIuRmVtYWxlLlRlc3QtdGFrZXJzYCksCiAgICBBdmdfTWFsZV9UZXN0VGFrZXJzID0gbWVhbihgR2VuZGVyLk1hbGUuVGVzdC10YWtlcnNgKQogICkgJT4lCiAgdW5ncm91cCgpCmBgYAoKIyBDcmVhdGluZyBhIGJhciBjaGFydCBmb3IgZGF0YSB2aXN1YWxpemF0aW9uCmBgYHtyfQpnZ3Bsb3QodG9wc2NvcmVzLCBhZXMoeCA9IFllYXJHcm91cCkpICsKICBnZW9tX2JhcihhZXMoeSA9IEF2Z19GZW1hbGVfVGVzdFRha2VycywgZmlsbCA9ICJGZW1hbGUiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgd2lkdGggPSAwLjcpICsKICBnZW9tX2JhcihhZXMoeSA9IEF2Z19NYWxlX1Rlc3RUYWtlcnMsIGZpbGwgPSAiTWFsZSIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCB3aWR0aCA9IDAuNykgKwogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBUZXN0LVRha2VycyIsIHggPSAiWWVhciBHcm91cCIsIHkgPSAiQXZlcmFnZSBUZXN0LVRha2VycyIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJGZW1hbGUiID0gInJlZCIsICJNYWxlIiA9ICJibHVlIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGdlb21fdGV4dChhZXMoeCA9IFllYXJHcm91cCwgeSA9IHJvdW5kKEF2Z19GZW1hbGVfVGVzdFRha2VycyksIGxhYmVsID0gcm91bmQoQXZnX0ZlbWFsZV9UZXN0VGFrZXJzKSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43KSwgdmp1c3QgPSAxLjY1LCBzaXplID0gMykgKwogIGdlb21fdGV4dChhZXMoeCA9IFllYXJHcm91cCwgeSA9IHJvdW5kKEF2Z19NYWxlX1Rlc3RUYWtlcnMpLCBsYWJlbCA9IHJvdW5kKEF2Z19NYWxlX1Rlc3RUYWtlcnMpKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpLCB2anVzdCA9IC0wLjY1LCBzaXplID0gMykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiMjAwNSIsICIyMDA2IiwgIjIwMDciLCAiMjAwOCIsICIyMDA5IiwgIjIwMTAiLCAiMjAxMSIsICIyMDEyIiwgIjIwMTMiLCAiMjAxNCIsICIyMDE1IikpCmBgYA==