Introduction
Understanding the factors that influence educational outcomes is
vital for ensuring equitable learning opportunities across regions. In
this analysis, we examine how county-level characteristics in West
Virginia—including school spending, income levels, unemployment rates,
and graduation rates—affect student proficiency in science. By analyzing
data from state assessment results, spending records, demographic
sources, and graduation statistics, we aim to identify key predictors of
educational success.
Thesis: County-level socio-economic indicators,
particularly household income and graduation rates, have a stronger
influence on science proficiency than school spending alone.
library(rpart) library(rpart.plot)
Load & Clean Data Sets
Load Spending Data
New names:
Load Unemployment Data
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
dat <- vroom(...)
problems(dat)Rows: 62 Columns: 5── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): County, FIPS, Rank within US (of 3143 counties)
dbl (2): Value (Percent), People (Unemployed)
ℹ 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.
Load Income Data
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
dat <- vroom(...)
problems(dat)
Load Graduation Rate Data
Rows: 55 Columns: 18── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (18): County Number, County Name, All, White, Black, Hispanic, Asian, Indian, Multi-Racial, Pacific Islander, Male, ...
ℹ 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.
Join Data
Correlation Matrix
Warning: package ‘ggcorrplot’ was built under R version 4.4.3

Histograms of Variables
county school school_name
Length:55 Length:55 Length:55
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
population_group subgroup science_proficiency
Length:55 Length:55 Min. :14.81
Class :character Class :character 1st Qu.:21.45
Mode :character Mode :character Median :24.36
Mean :25.30
3rd Qu.:29.39
Max. :41.80
proficiency name enroll
Min. :14.81 Length:55 Min. : 800
1st Qu.:21.45 Class :character 1st Qu.: 1654
Median :24.36 Mode :character Median : 3177
Mean :25.30 Mean : 4586
3rd Qu.:29.39 3rd Qu.: 5104
Max. :41.80 Max. :24392
tfedrev tstrev tlocrev
Min. : 1511 Min. : 3895 Min. : 1956
1st Qu.: 4991 1st Qu.: 12668 1st Qu.: 8194
Median : 10158 Median : 26858 Median : 14813
Mean : 13312 Mean : 34234 Mean : 25032
3rd Qu.: 14518 3rd Qu.: 39496 3rd Qu.: 33333
Max. :109522 Max. :176062 Max. :145623
totalexp ppcstot unemployment_rate
Min. : 13954 Min. :11885 Min. : 2.600
1st Qu.: 26486 1st Qu.:13151 1st Qu.: 5.050
Median : 48642 Median :13777 Median : 6.400
Mean : 69482 Mean :14466 Mean : 7.055
3rd Qu.: 81172 3rd Qu.:15236 3rd Qu.: 8.500
Max. :416491 Max. :23563 Max. :15.100
FIPS median_income graduation_rate
Length:55 Min. : 39226 Min. : 79.56
Class :character 1st Qu.: 61577 1st Qu.: 89.98
Mode :character Median : 70457 Median : 93.33
Mean : 70170 Mean : 93.05
3rd Qu.: 76648 3rd Qu.: 96.23
Max. :118108 Max. :100.00
fips
Length:55
Class :character
Mode :character


PCA Analysis
Importance of components:
PC1 PC2 PC3 PC4
Standard deviation 2.3632 1.5442 0.98195 0.95018
Proportion of Variance 0.5077 0.2168 0.08766 0.08208
Cumulative Proportion 0.5077 0.7245 0.81214 0.89422
PC5 PC6 PC7 PC8
Standard deviation 0.8630 0.51713 0.28106 0.26001
Proportion of Variance 0.0677 0.02431 0.00718 0.00615
Cumulative Proportion 0.9619 0.98623 0.99341 0.99956
PC9 PC10 PC11
Standard deviation 0.05522 0.04256 1.403e-16
Proportion of Variance 0.00028 0.00016 0.000e+00
Cumulative Proportion 0.99984 1.00000 1.000e+00

Supervised Models
Linear Regression Model
Call:
lm(formula = proficiency ~ ., data = train)
Residuals:
Min 1Q Median 3Q Max
-8.7269 -3.7901 0.4995 2.9807 8.1894
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.482e+00 1.504e+01 -0.564 0.576
graduation_rate 2.860e-02 1.685e-01 0.170 0.866
unemployment_rate 4.211e-01 2.973e-01 1.416 0.164
median_income 3.033e-04 5.905e-05 5.136 6.84e-06
ppcstot 4.697e-04 3.102e-04 1.514 0.138
(Intercept)
graduation_rate
unemployment_rate
median_income ***
ppcstot
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.527 on 42 degrees of freedom
Multiple R-squared: 0.4377, Adjusted R-squared: 0.3842
F-statistic: 8.174 on 4 and 42 DF, p-value: 5.717e-05
[1] 4.586167
Data Tree

[1] 7.627723
Cause & Effect Chart

Proficiency by County in West Viriginia

Conclusion and Recommendations
Conclusion: - Proficiency is most strongly related to median income
and graduation rate. - Total per-pupil cost had weaker correlations with
outcomes than expected. - PCA suggests counties form clusters based on
socio-economic metrics.
Recommendations: - Invest in support for low-income counties. -
Address socio-economic inequities alongside educational spending.
LS0tDQp0aXRsZTogIldWIENvdW50eSBFZHVjYXRpb24gT3V0Y29tZXMgUHJlZGljdGlvbiINCmF1dGhvcjogJ0VtbWEgRnJpZGxleScNCmRhdGU6ICdNYXkgMSwgMjAyNScNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgSW50cm9kdWN0aW9uDQoNClVuZGVyc3RhbmRpbmcgdGhlIGZhY3RvcnMgdGhhdCBpbmZsdWVuY2UgZWR1Y2F0aW9uYWwgb3V0Y29tZXMgaXMgdml0YWwgZm9yIGVuc3VyaW5nIGVxdWl0YWJsZSBsZWFybmluZyBvcHBvcnR1bml0aWVzIGFjcm9zcyByZWdpb25zLiBJbiB0aGlzIGFuYWx5c2lzLCB3ZSBleGFtaW5lIGhvdyBjb3VudHktbGV2ZWwgY2hhcmFjdGVyaXN0aWNzIGluIFdlc3QgVmlyZ2luaWHigJRpbmNsdWRpbmcgc2Nob29sIHNwZW5kaW5nLCBpbmNvbWUgbGV2ZWxzLCB1bmVtcGxveW1lbnQgcmF0ZXMsIGFuZCBncmFkdWF0aW9uIHJhdGVz4oCUYWZmZWN0IHN0dWRlbnQgcHJvZmljaWVuY3kgaW4gc2NpZW5jZS4gQnkgYW5hbHl6aW5nIGRhdGEgZnJvbSBzdGF0ZSBhc3Nlc3NtZW50IHJlc3VsdHMsIHNwZW5kaW5nIHJlY29yZHMsIGRlbW9ncmFwaGljIHNvdXJjZXMsIGFuZCBncmFkdWF0aW9uIHN0YXRpc3RpY3MsIHdlIGFpbSB0byBpZGVudGlmeSBrZXkgcHJlZGljdG9ycyBvZiBlZHVjYXRpb25hbCBzdWNjZXNzLg0KDQoqKlRoZXNpcyoqOiBDb3VudHktbGV2ZWwgc29jaW8tZWNvbm9taWMgaW5kaWNhdG9ycywgcGFydGljdWxhcmx5IGhvdXNlaG9sZCBpbmNvbWUgYW5kIGdyYWR1YXRpb24gcmF0ZXMsIGhhdmUgYSBzdHJvbmdlciBpbmZsdWVuY2Ugb24gc2NpZW5jZSBwcm9maWNpZW5jeSB0aGFuIHNjaG9vbCBzcGVuZGluZyBhbG9uZS4NCg0KbGlicmFyeShycGFydCkNCmxpYnJhcnkocnBhcnQucGxvdCkNCg0KIyBMb2FkICYgQ2xlYW4gRGF0YSBTZXRzDQoNCiMjIExvYWQgQXNzZXNzbWVudCBEYXRhDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeShyZWFkeGwpDQphc3Nlc3NtZW50X3BhdGggPC0gJ0hpc3RvcmljYWxfQXNzZXNzbWVudFJlc3VsdHNfU1kxNS10by1TWTIxLnhsc3gnDQoNCg0KdF9hc3Nlc3NfcmF3X3NjaG9vbCA8LSByZWFkX2V4Y2VsKHBhdGggPSBhc3Nlc3NtZW50X3BhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdTWTIxIFNjaG9vbCAmIERpc3RyaWN0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2IyOmY3MzEyJykNCg0KDQp0X2Fzc2Vzc19yYXdfc2NpZW5jZSA8LSByZWFkX2V4Y2VsKHBhdGggPSBhc3Nlc3NtZW50X3BhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdTWTIxIFNjaG9vbCAmIERpc3RyaWN0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2RiMzpkYjczMTInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoJ3NjaWVuY2VfcHJvZmljaWVuY3knKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gJyoqJykNCg0KdF9hc3Nlc3NfcmF3IDwtIHRfYXNzZXNzX3Jhd19zY2hvb2wgJT4lDQogIGJpbmRfY29scyh0X2Fzc2Vzc19yYXdfc2NpZW5jZSkgJT4lIA0KICBqYW5pdG9yOjpjbGVhbl9uYW1lcygpICANCg0KDQojIFJlbW92ZSBzdWJncm91cHMNCnRfYXNzZXNzIDwtIHRfYXNzZXNzX3JhdyAlPiUgDQogIGZpbHRlcihzY2hvb2wgPT0gOTk5KSAlPiUgDQogIGZpbHRlcihwb3B1bGF0aW9uX2dyb3VwID09ICdUb3RhbCBQb3B1bGF0aW9uJykgJT4lIA0KICBmaWx0ZXIoY291bnR5ICE9ICdTdGF0ZXdpZGUnKSAlPiUgDQogIG11dGF0ZShwcm9maWNpZW5jeSA9IHNjaWVuY2VfcHJvZmljaWVuY3kpIA0KDQpwcmludCh0X2Fzc2VzcykNCmBgYA0KDQojIyBMb2FkIFNwZW5kaW5nIERhdGENCg0KYGBge3IgZWNobz1GQUxTRX0NCnNwZW5kaW5nX3BhdGggPC0gJ2Vsc2VjMjJ0LnhscycNCg0KdF9zcGVuZGluZ19yYXcgPC0gcmVhZF9leGNlbChwYXRoID0gc3BlbmRpbmdfcGF0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gJ2Vsc2VjMjJ0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2ExOmdiMTQxMDYnKSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0KDQpjb29wZXJhdGVzIDwtIGMoJ01PVU5UQUlOIFNUQVRFIEVEVUNBVElPTkFMIFNFUlZJQ0VTIENPT1BFUkFUSVZFJywNCiAgICAgICAgICAgICAgICAnRUFTVEVSTiBQQU5IQU5ETEUgSU5TVFJVQ1RJT05BTCBDT09QRVJBVElWRScsDQogICAgICAgICAgICAgICAgJ1NPVVRIRVJOIEVEVUNBVElPTkFMIFNFUlZJQ0VTIENPT1BFUkFUSVZFJykNCg0KdF9zcGVuZGluZyA8LSB0X3NwZW5kaW5nX3JhdyAlPiUgDQogIGZpbHRlcihzdGF0ZSA9PSA0OSkgJT4lIA0KICBmaWx0ZXIoIW5hbWUgJWluJSBjb29wZXJhdGVzKSAlPiUgDQogIHNlbGVjdChuYW1lLCBlbnJvbGwsIHRmZWRyZXYsIHRzdHJldiwgdGxvY3JldiwgdG90YWxleHAsIHBwY3N0b3QpICU+JSANCiAgbXV0YXRlKGNvdW50eSA9IHN0cl90b190aXRsZShzdHJfc3BsaXRfaShuYW1lLCAnICcsMSkpLA0KICAgICAgICAgY291bnR5ID0gaWZlbHNlKGNvdW50eSA9PSAnTWMnLCAnTWNEb3dlbGwnLCBjb3VudHkpKQ0KDQoNCnByaW50KHRfc3BlbmRpbmcpDQpgYGANCg0KIyMgTG9hZCBVbmVtcGxveW1lbnQgRGF0YQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQp0X2RlbW9ncmFwaGljX3VuZW1wbG95ZWQgPC0gcmVhZF9jc3YoJ3VuZW1wbG95ZWQuY3N2JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEgPSAnTi9BJykgJT4lDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBmaWx0ZXIoY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywNCiAgICAgICAgIGNvdW50eSAhPSAnVW5pdGVkIFN0YXRlcycsDQogICAgICAgICAhaXMubmEodmFsdWVfcGVyY2VudCkgKSAlPiUgDQogIHNlbGVjdChjb3VudHksIHZhbHVlX3BlcmNlbnQpICU+JQ0KICByZW5hbWUodW5lbXBsb3ltZW50X3JhdGUgPSB2YWx1ZV9wZXJjZW50KQ0KDQoNCnByaW50KHRfZGVtb2dyYXBoaWNfdW5lbXBsb3llZCkNCmBgYA0KDQojIyBMb2FkIEluY29tZSBEYXRhDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQoNCiMgUmVhZCB0aGUgZmlsZSwgc2tpcHBpbmcgdGhlIGZpcnN0IDQgcm93cyBvZiBtZXRhZGF0YQ0KZGF0YV9wYXRoIDwtICJIRFB1bHNlX2RhdGFfZXhwb3J0LmNzdiINCmRmIDwtIHJlYWRfY3N2KGRhdGFfcGF0aCwgc2tpcCA9IDQsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQoNCiMgQ2xlYW4gbnVtZXJpYyBjb2x1bW5zDQp0X2RlbW9ncmFwaGljX2luY29tZSA8LSBkZiAlPiUNCiAgc2VsZWN0KC1gUmFuayB3aXRoaW4gVVMgKG9mIDMxMzkgY291bnRpZXMpYCkgJT4lDQogIHJlbmFtZSgNCiAgICBjb3VudHkgPSBDb3VudHksDQogICAgbWVkaWFuX2luY29tZSA9IGBWYWx1ZSAoRG9sbGFycylgDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBtZWRpYW5faW5jb21lID0gcGFyc2VfbnVtYmVyKGFzLmNoYXJhY3RlcihtZWRpYW5faW5jb21lKSkNCiAgKQ0KDQojIEZpbHRlciBvdXQgc3VtbWFyeSByb3dzIGxpa2UgIlVuaXRlZCBTdGF0ZXMiDQp0X2RlbW9ncmFwaGljX2luY29tZSA8LSB0X2RlbW9ncmFwaGljX2luY29tZSAlPiUNCiAgZmlsdGVyKCFjb3VudHkgJWluJSBjKCJXZXN0IFZpcmdpbmlhIiwgIlVuaXRlZCBTdGF0ZXMiKSkNCg0KIyBSZW1vdmUgcm93cyA1NiB0aHJvdWdoIDYyIChSIGlzIDEtYmFzZWQgaW5kZXhpbmcpDQp0X2RlbW9ncmFwaGljX2luY29tZSA8LSB0X2RlbW9ncmFwaGljX2luY29tZSAlPiUgc2xpY2UoLTU2Oi02MikNCg0KIyBWaWV3IGNsZWFuZWQgZGF0YQ0KcHJpbnQodF9kZW1vZ3JhcGhpY19pbmNvbWUpDQoNCg0KDQpgYGANCg0KIyMgTG9hZCBHcmFkdWF0aW9uIFJhdGUgRGF0YQ0KYGBge3IgZWNobz1GQUxTRX0NCiMgTG9hZCB0aGUgY2xlYW5lZCBDU1YNCmdyYWRfcGF0aCA8LSAiRm91ciBZZWFyIEdyYWR1YXRpb24gUmF0ZSBieSBDb3VudHkgJiBTdWJncm91cF8yMDI1MDQzMC5jc3YiDQpncmFkX3JhdyA8LSByZWFkX2NzdihncmFkX3BhdGgpDQoNCiMgQ2xlYW46IHJlbmFtZSAnQ291bnR5IE5hbWUnIHRvICdjb3VudHknIGFuZCBjbGVhbiBwZXJjZW50YWdlIGNvbHVtbnMNCnRfZ3JhZHVhdGlvbl9yYXRlIDwtIGdyYWRfcmF3ICU+JQ0KICBzZWxlY3QoJ0NvdW50eSBOYW1lJywgJ0FsbCcpICU+JSANCiAgcmVuYW1lKGNvdW50eSA9IGBDb3VudHkgTmFtZWAsIGdyYWR1YXRpb25fcmF0ZSA9ICdBbGwnKSAlPiUNCiAgbXV0YXRlKGFjcm9zcygtY291bnR5LCB+IGFzLm51bWVyaWMoc3RyX3JlbW92ZShhcy5jaGFyYWN0ZXIoLiksICIlIikpKSkgJT4lDQogIG11dGF0ZShjb3VudHkgPSBzdHJfdG9fdGl0bGUoc3RyX3JlcGxhY2UoY291bnR5LCAiIENvdW50eSIsICIiKSkgJT4lIHN0cl90cmltKCkpDQoNCnByaW50KHRfZ3JhZHVhdGlvbl9yYXRlKQ0KDQpgYGANCg0KDQojIEpvaW4gRGF0YQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZml4X2NvdW50eV9uYW1lcyA8LSBmdW5jdGlvbihkZikgew0KICBkZiAlPiUgDQogICAgbXV0YXRlKGNvdW50eSA9IHN0cl90b190aXRsZShjb3VudHkpLA0KICAgICAgICAgICBjb3VudHkgPSBzdHJfcmVwbGFjZShjb3VudHksICIgQ291bnR5JCIsICIiKSwNCiAgICAgICAgICAgY291bnR5ID0gc3RyX3RyaW0oY291bnR5KSkNCn0NCg0KdF9hc3Nlc3MgPC0gZml4X2NvdW50eV9uYW1lcyh0X2Fzc2VzcykNCnRfc3BlbmRpbmcgPC0gZml4X2NvdW50eV9uYW1lcyh0X3NwZW5kaW5nKQ0KdF9kZW1vZ3JhcGhpY191bmVtcGxveWVkIDwtIGZpeF9jb3VudHlfbmFtZXModF9kZW1vZ3JhcGhpY191bmVtcGxveWVkKQ0KdF9kZW1vZ3JhcGhpY19pbmNvbWUgPC0gZml4X2NvdW50eV9uYW1lcyh0X2RlbW9ncmFwaGljX2luY29tZSkNCg0KDQoNCiMgTWVyZ2UgZGF0YQ0KDQpjb3VudHlfY29scyA8LSBzZWxlY3QodF9hc3Nlc3MsIGNvdW50eSkNCg0KdCA8LSB0X2Fzc2VzcyAlPiUgDQogIGxlZnRfam9pbih0X3NwZW5kaW5nLCBieSA9ICJjb3VudHkiKSAlPiUgDQogIGxlZnRfam9pbih0X2RlbW9ncmFwaGljX3VuZW1wbG95ZWQsIGJ5ID0gImNvdW50eSIpICU+JQ0KICBsZWZ0X2pvaW4odF9kZW1vZ3JhcGhpY19pbmNvbWUsIGJ5ID0gImNvdW50eSIpICU+JQ0KICBsZWZ0X2pvaW4odF9ncmFkdWF0aW9uX3JhdGUsIGJ5ID0gImNvdW50eSIpICU+JQ0KICBkcm9wX25hKCkNCmBgYA0KDQoNCiMgQ29ycmVsYXRpb24gTWF0cml4DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpudW1lcmljX3QgPC0gdCAlPiUgDQogIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkNCg0KbGlicmFyeShnZ2NvcnJwbG90KQ0KDQpjb3JfbWF0cml4IDwtIGNvcihudW1lcmljX3QsIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQ0KDQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIA0KICAgICAgICAgICBoYy5vcmRlciA9IFRSVUUsIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwgDQogICAgICAgICAgIGxhYiA9IFRSVUUsDQogICAgICAgICAgIGNvbG9ycyA9IGMoInJlZCIsICJ3aGl0ZSIsICJncmVlbiIpKQ0KDQpgYGANCiMgSGlzdG9ncmFtcyBvZiBWYXJpYWJsZXMNCg0KYGBge3IgZWNobz1GQUxTRX0NCnN1bW1hcnkodCkNCmdncGxvdCh0LCBhZXMoeCA9IHByb2ZpY2llbmN5KSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KSArIA0KICBsYWJzKHRpdGxlID0gIlNjaWVuY2UgUHJvZmljaWVuY3kgRGlzdHJpYnV0aW9uIikNCg0KZ2dwbG90KHQsIGFlcyh4ID0gZ3JhZHVhdGlvbl9yYXRlKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KSArIA0KICBsYWJzKHRpdGxlID0gIkdyYWR1YXRpb24gUmF0ZSBEaXN0cmlidXRpb24iKQ0KDQpgYGANCg0KIyBQQ0EgQW5hbHlzaXMNCg0KYGBge3IgZWNobz1GQUxTRX0NCnBjYV9kYXRhIDwtIHQgJT4lIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkgJT4lIHNjYWxlKCkNCnBjYV9yZXN1bHQgPC0gcHJjb21wKHBjYV9kYXRhLCBjZW50ZXIgPSBUUlVFLCBzY2FsZS4gPSBUUlVFKQ0Kc3VtbWFyeShwY2FfcmVzdWx0KQ0KYmlwbG90KHBjYV9yZXN1bHQsIHNjYWxlID0gMCkNCmBgYA0KDQojIFN1cGVydmlzZWQgTW9kZWxzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpzZXQuc2VlZCgxMjMpDQptb2RlbF9kYXRhIDwtIHQgJT4lIA0KICBzZWxlY3QocHJvZmljaWVuY3ksIGdyYWR1YXRpb25fcmF0ZSwgdW5lbXBsb3ltZW50X3JhdGUsIG1lZGlhbl9pbmNvbWUsIHBwY3N0b3QpICU+JSANCiAgZHJvcF9uYSgpDQoNCnNwbGl0IDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24obW9kZWxfZGF0YSRwcm9maWNpZW5jeSwgcCA9IDAuOCwgbGlzdCA9IEZBTFNFKQ0KdHJhaW4gPC0gbW9kZWxfZGF0YVtzcGxpdCwgXQ0KdGVzdCA8LSBtb2RlbF9kYXRhWy1zcGxpdCwgXQ0KYGBgDQoNCiMgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwNCg0KYGBge3IgZWNobz1GQUxTRX0NCmxtX21vZGVsIDwtIGxtKHByb2ZpY2llbmN5IH4gLiwgZGF0YSA9IHRyYWluKQ0Kc3VtbWFyeShsbV9tb2RlbCkNClJNU0UocHJlZGljdChsbV9tb2RlbCwgdGVzdCksIHRlc3QkcHJvZmljaWVuY3kpDQpgYGANCiMgRGF0YSBUcmVlDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp0cmVlX21vZGVsIDwtIHJwYXJ0KHByb2ZpY2llbmN5IH4gLiwgZGF0YSA9IHRyYWluKQ0KcnBhcnQucGxvdCh0cmVlX21vZGVsKQ0KUk1TRShwcmVkaWN0KHRyZWVfbW9kZWwsIHRlc3QpLCB0ZXN0JHByb2ZpY2llbmN5KQ0KYGBgDQojIENhdXNlICYgRWZmZWN0IENoYXJ0DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QodCwgYWVzKHggPSBtZWRpYW5faW5jb21lLCB5ID0gcHJvZmljaWVuY3kpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgbGFicyh0aXRsZSA9ICJJbmNvbWUgdnMgUHJvZmljaWVuY3kiKQ0KYGBgDQojIFByb2ZpY2llbmN5IGJ5IENvdW50eSBpbiBXZXN0IFZpcmlnaW5pYQ0KDQpgYGB7dW5kZWZpbmVkIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHVzbWFwKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIE1ha2Ugc3VyZSAnZmlwcycgaXMgcHJlc2VudCBhbmQgbnVtZXJpYyAocmVxdWlyZWQgYnkgdXNtYXApDQojIEFzc3VtZSAndCcgaGFzIGEgY29sdW1uIG5hbWVkICdGSVBTJyBvciBzaW1pbGFyDQp0IDwtIHQgJT4lDQogIG11dGF0ZShmaXBzID0gYXMuY2hhcmFjdGVyKEZJUFMpKSAgIyBvciBjaGFuZ2UgJ0ZJUFMnIHRvIHlvdXIgYWN0dWFsIGNvbHVtbg0KDQojIFBsb3QNCnBsb3RfdXNtYXAoZGF0YSA9IHQsIHJlZ2lvbnMgPSAiY291bnRpZXMiLCBpbmNsdWRlID0gIldWIiwgdmFsdWVzID0gInByb2ZpY2llbmN5IikgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobmFtZSA9ICJQcm9maWNpZW5jeSIsIGxvdyA9ICJyZWQiLCBoaWdoID0gImJsdWUiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9maWNpZW5jeSBieSBDb3VudHkgaW4gV1YiKQ0KDQoNCmBgYA0KIyBDb25jbHVzaW9uIGFuZCBSZWNvbW1lbmRhdGlvbnMNCkNvbmNsdXNpb246DQotIFByb2ZpY2llbmN5IGlzIG1vc3Qgc3Ryb25nbHkgcmVsYXRlZCB0byBtZWRpYW4gaW5jb21lIGFuZCBncmFkdWF0aW9uIHJhdGUuDQotIFRvdGFsIHBlci1wdXBpbCBjb3N0IGhhZCB3ZWFrZXIgY29ycmVsYXRpb25zIHdpdGggb3V0Y29tZXMgdGhhbiBleHBlY3RlZC4NCi0gUENBIHN1Z2dlc3RzIGNvdW50aWVzIGZvcm0gY2x1c3RlcnMgYmFzZWQgb24gc29jaW8tZWNvbm9taWMgbWV0cmljcy4NCg0KUmVjb21tZW5kYXRpb25zOg0KLSBJbnZlc3QgaW4gc3VwcG9ydCBmb3IgbG93LWluY29tZSBjb3VudGllcy4NCi0gQWRkcmVzcyBzb2Npby1lY29ub21pYyBpbmVxdWl0aWVzIGFsb25nc2lkZSBlZHVjYXRpb25hbCBzcGVuZGluZy4NCg0KIyBSUHVicyBVUkwNCmh0dHBzOi8vcnB1YnMuY29tL2VmMDA1Mi8xMzA0Njc0DQoNCiMgUmVmZXJlbmNlcw0KR3JhZHVhdGlvbiBSYXRlIERhdGE6IGh0dHBzOi8vem9vbXd2LmsxMi53di51cy9EYXNoYm9hcmQvZGFzaGJvYXJkLzIxMTEgDQo=