Analysis
The following code chunk reads the data into the R environment.
# Read in the formatted results
raw_data <- read.csv("results/results_12-14(3).csv")
# Fix first column name issue from excel
colnames(raw_data)[1] <- "list"
# Remove columns that won't be used
raw_data %<>% subset(select=c(list:gender, q6.response.categorized:rating))
# Sort the data into experimental data and filler data
raw_data %>% subset(item.type=="experimental") %>% droplevels -> experiment_data
raw_data %>% subset(item.type=="filler") %>% droplevels -> filler_data
The following table summarizes the ratings by condition. The lowest-rated conditions are those with an embedded island and a long extraction (island|long). This is the expected island effect. Another easily observable pattern is that the indefinite conditions are rated lower across the board compared to the corresponding definite condition.
# Make sure the ratings are numeric so they can be averaged
experiment_data$rating %<>% as.numeric
# Reorder factor levels so that the baseline levels come first
experiment_data$ec.type <- relevel(experiment_data$ec.type, "non.isl")
experiment_data$dependency.length <- relevel(experiment_data$dependency.length, "short")
# Group the data in long format according to these properties
experiment_data %>%
group_by(ec.type, dependency.length, definiteness) %>%
summarize(mean.rating = mean(rating),
sd.rating = sd(rating),
n = n(),
se.rating = sd.rating/sqrt(n)) -> descriptive_summary
# Save the data for use in other scripts
saveRDS(descriptive_summary, file = "expt1_descriptive_summary")
# Present in a table
print(descriptive_summary)
It is worth comparing the two different kinds of islands used directly (RC islands and CP complement to noun islands). Although traditionally both of these clause types are included in the Complex NP Constraint, there is agreement that extraction from adjuncts is generally less allowed than extraction from complements. As shown in the table below, every condition with a CP complement to N (N-CP in the table) is rated slightly higher than its corresponding RC condition.
The following plot represents the overall ratings. The left side shows all the definite conditions, and when compared to the right side (indefinite conditions), one can see that the indefinite conditions are rated lower overall than the definite conditions; the ratings are shifted down but display the same general pattern.
The following plot represents the island conditions, comparing the ratings across the two island types.
Calculating the DD scores (island strength)
# Copy raw ratings to another data frame I can modify
raw_data -> raw_data_shrt
# Paste the length and structure conditions together
raw_data_shrt$structureXlength <- paste(raw_data_shrt$ec.type, "x", raw_data_shrt$dependency.length)
# Calculate z-scores
raw_data_shrt %>%
group_by(subject) %>% # Group raw results by subject
mutate(z_rating = scale(rating)) %>% # Get z-scores for each subject's ratings
ungroup %>% # Undo group by subject
subset(item.type == "experimental") %>% droplevels %>% # Select only experimental conditions, drop unused levels
group_by(definiteness, structureXlength, item.set) %>% # Group by definiteness, pasted structureXlength, and item set
summarize(mean_z_rating = mean(z_rating)) %>% # Average the z-scores per condition per item
group_by(definiteness, structureXlength) %>% # Group this summary by condition only so that means of each condition per item set can be averaged
summarize(mean_z_ratings = mean(mean_z_rating)) -> summary_zscores # Get the mean of the mean z-scores
print(summary_zscores)
# Get table to start making DD scores
z_DDs <- summary_zscores %>% spread(structureXlength, mean_z_ratings)
# Calculate D1, add to table
z_DDs$D1 <- z_DDs$`non.isl x long` - z_DDs$`isl x long`
# Calculate D2, add to table
z_DDs$D2 <- z_DDs$`non.isl x short` - z_DDs$`isl x short`
# Calculate DD, add to table
z_DDs$DD <- z_DDs$D1 - z_DDs$D2
print(z_DDs)
Ordinal regression analyses
# Reassign contrasts
contrasts(experiment_data$definiteness) <- c(-0.5, 0.5)
contrasts(experiment_data$ec.type) <- c(0.5, -0.5)
contrasts(experiment_data$dependency.length) <- c(0.5, -0.5)
# Make sure the ratings are a factor, rather than numbers
experiment_data$rating %<>% as.factor
# Run simple effects analysis w/ rating as dependent variable, and definiteness, structure, and length and their interactions as fixed effects
clm(rating ~ definiteness * ec.type * dependency.length, data = experiment_data) -> clm.def_ectype
summary(clm.def_ectype)
formula: rating ~ definiteness * ec.type * dependency.length
data: experiment_data
Coefficients:
Estimate Std. Error z value Pr(>|z|)
definiteness1 -0.485471 0.115190 -4.215 2.50e-05 ***
ec.type1 1.331746 0.121241 10.984 < 2e-16 ***
dependency.length1 2.153736 0.129317 16.655 < 2e-16 ***
definiteness1:ec.type1 -0.005638 0.229327 -0.025 0.980
definiteness1:dependency.length1 -0.126322 0.229682 -0.550 0.582
ec.type1:dependency.length1 -1.584530 0.238251 -6.651 2.92e-11 ***
definiteness1:ec.type1:dependency.length1 0.008292 0.458784 0.018 0.986
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Threshold coefficients:
Estimate Std. Error z value
1|2 -2.46784 0.11344 -21.755
2|3 -1.22807 0.08523 -14.409
3|4 -0.27012 0.07424 -3.638
4|5 0.54304 0.07367 7.371
5|6 1.48061 0.08265 17.915
Does the type of island have any effect on transparency to extraction? Let’s include island type as a fixed effect.
## Make sure ratings are a factor
experiment_data$rating %<>% factor
## Reassign contrasts
contrasts(experiment_data$island.type) <- c(0.5, -0.5)
## Run clm analysis
clm(rating ~ definiteness * ec.type * dependency.length * island.type, data = experiment_data) -> clm.w.island.type
summary(clm.w.island.type)
formula: rating ~ definiteness * ec.type * dependency.length * island.type
data: experiment_data
Coefficients:
Estimate Std. Error z value Pr(>|z|)
definiteness1 -0.515398 0.115868 -4.448 8.66e-06 ***
ec.type1 1.364246 0.121955 11.186 < 2e-16 ***
dependency.length1 2.188875 0.129987 16.839 < 2e-16 ***
island.type1 0.588257 0.116146 5.065 4.09e-07 ***
definiteness1:ec.type1 0.007104 0.230461 0.031 0.975
definiteness1:dependency.length1 -0.119952 0.230835 -0.520 0.603
ec.type1:dependency.length1 -1.628827 0.239307 -6.806 1.00e-11 ***
definiteness1:island.type1 0.271805 0.230526 1.179 0.238
ec.type1:island.type1 -0.290002 0.230782 -1.257 0.209
dependency.length1:island.type1 -0.300368 0.231074 -1.300 0.194
definiteness1:ec.type1:dependency.length1 0.021228 0.461083 0.046 0.963
definiteness1:ec.type1:island.type1 -0.266892 0.460756 -0.579 0.562
definiteness1:dependency.length1:island.type1 0.268622 0.461020 0.583 0.560
ec.type1:dependency.length1:island.type1 0.278444 0.461669 0.603 0.546
definiteness1:ec.type1:dependency.length1:island.type1 0.459113 0.921796 0.498 0.618
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Threshold coefficients:
Estimate Std. Error z value
1|2 -2.52152 0.11628 -21.685
2|3 -1.23754 0.08623 -14.352
3|4 -0.25760 0.07497 -3.436
4|5 0.56949 0.07449 7.645
5|6 1.51554 0.08358 18.134
A significant effect of island type would have shown up as a three-way interaction between structure (ec.type), length (dependency.length), and island type, but this interaction was not significant (p=0.546).
Mixed effects model by subjects and by items
Cumulative Link Mixed Model fitted with the Laplace approximation
formula: rating ~ definiteness * ec.type * dependency.length + (1 + definiteness *
ec.type * dependency.length | subject) + (1 + definiteness *
ec.type * dependency.length | item.set)
data: experiment_data
Random effects:
Groups Name Variance Std.Dev. Corr
item.set (Intercept) 1.7862 1.3365
definitenessind 0.1050 0.3241 0.073
ec.typenon.isl 2.0225 1.4221 -0.850 -0.504
dependency.lengthshort 2.8047 1.6747 -0.613 -0.228
definitenessind:ec.typenon.isl 0.3558 0.5965 0.552 -0.004
definitenessind:dependency.lengthshort 0.4556 0.6750 -0.579 -0.480
ec.typenon.isl:dependency.lengthshort 0.4607 0.6788 0.816 0.413
definitenessind:ec.typenon.isl:dependency.lengthshort 0.9804 0.9901 0.901 0.122
subject (Intercept) 0.5943 0.7709
definitenessind 0.9241 0.9613 0.053
ec.typenon.isl 3.0084 1.7345 -0.563 0.523
dependency.lengthshort 0.7174 0.8470 0.097 -0.357
definitenessind:ec.typenon.isl 2.0440 1.4297 0.292 -0.516
definitenessind:dependency.lengthshort 1.1113 1.0542 -0.480 -0.240
ec.typenon.isl:dependency.lengthshort 1.9321 1.3900 0.104 -0.073
definitenessind:ec.typenon.isl:dependency.lengthshort 2.5198 1.5874 0.232 0.067
0.785
-0.625 -0.478
0.731 0.252 -0.770
-0.852 -0.760 0.189 -0.325
-0.898 -0.758 0.784 -0.692 0.692
0.100
-0.736 0.182
0.471 0.515 -0.544
-0.684 -0.543 0.323 -0.362
-0.209 -0.777 -0.277 -0.334 0.281
Number of groups: subject 32, item.set 32
Coefficients:
Estimate Std. Error z value Pr(>|z|)
definiteness1 -0.7634 0.1757 -4.345 1.39e-05 ***
ec.type1 -1.9688 0.2523 -7.802 6.10e-15 ***
dependency.length1 -3.2657 0.3306 -9.877 < 2e-16 ***
definiteness1:ec.type1 0.1490 0.4126 0.361 0.718
definiteness1:dependency.length1 0.1955 0.3421 0.572 0.568
ec.type1:dependency.length1 -2.2987 0.4679 -4.913 8.97e-07 ***
definiteness1:ec.type1:dependency.length1 -0.1072 0.6335 -0.169 0.866
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Threshold coefficients:
Estimate Std. Error z value
1|2 -3.5965 0.2744 -13.108
2|3 -1.8514 0.2482 -7.459
3|4 -0.4478 0.2391 -1.873
4|5 0.7636 0.2386 3.200
5|6 2.1879 0.2480 8.824
Sprouse, Jon, Matthew W. Wagers, and Colin Phillips. 2012. “A test of the relation between working memory capacity and syntactic island effects.” Language 88 (1): 82–123.
LS0tDQp0aXRsZTogIlJDIHN1YmV4dHJhY3Rpb24gaW4gRW5nbGlzaDogRXhwZXJpbWVudCAxIG5vdGVib29rIg0KYXV0aG9yOiBKYWtlIFcuIFZpbmNlbnQgKCYjMTA2OyYjMTE5OyYjMTE4OyYjMTA1OyYjMTEwOyYjOTk7JiMxMDE7biYjNjQ7JiMxMTc7YyYjMTE1O2MuZSYjMTAwO3UpDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjc3M6IHN0eWxlLmNzcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIGtlZXBfdGV4OiB5ZXMNCmJpYmxpb2dyYXBoeTogLi4vLi4vLi4vLi4vLi4vLi4vRG9jdW1lbnRzL2xpYnJhcnkuYmliDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkob3JkaW5hbCkNCmxpYnJhcnkoa25pdHIpDQojIyBTZXQgd29ya2luZyBkaXJlY3RvcnkNCnNldHdkKCJDOi9Vc2Vycy9qYWtldy9PbmVEcml2ZS9Eb2N1bWVudHMvU2Nob29sL1VDU0MgR3JhZCBzY2hvb2wvUVAyL0V4cGVyaW1lbnQgMS8iKQ0KIyMgTG9hZCBzYXZlZCBjbG1tIGFuYWx5c2lzDQpyZWFkUkRTKCJjbG1tX2RlZl9lY3R5cGUucmRzIikgLT4gY2xtbS5kZWZfZWN0eXBlDQpgYGANCg0KIyBNb3RpdmF0aW9uDQoNCkV4cGVyaW1lbnQgMSB3YXMgZGVzaWduZWQgdG8gdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IGluIHRyYW5zaXRpdmUgb2JqZWN0IGNvbnRleHRzLCB0aGUgZGVmaW5pdGVuZXNzIG9mIGEgRFAgY29udGFpbmluZyBhIFJDIGltcGFjdHMgdGhlIGFjY2VwdGFiaWxpdHkgb2YgZXh0cmFjdGluIGZyb20gdGhhdCBSQy4NCg0KIyBEZXNpZ24NCg0KVGhpcyBleHBlcmltZW50IHVzZXMgdGhlICJsZW5ndGggYnkgY29tcGxleGl0eSIgZGVzaWduIGZvdW5kIGluIEBTcHJvdXNlMjAxMiBhbmQgb3RoZXJzLiBPbiB0b3Agb2YgdGhlIG5lY2Vzc2FyeSBsZW5ndGggYW5kIGNvbXBsZXhpdHkgKGVtYmVkZGVkIGNsYXVzZSBzdHJ1Y3R1cmUpIGZhY3RvcnMsIHRoaXMgZXhwZXJpbWVudCBhZGRzIGEgZGVmaW5pdGVuZXNzIGZhY3RvciBzbyB0aGF0IHRoZSBzdHJlbmd0aCBvZiB0aGUgaXNsYW5kIGNhbiBiZSBnYXVnZWQgaW4gYm90aCBkZWZpbml0ZSBhbmQgaW5kZWZpbml0ZSBlbnZpcm9ubWVudHMuDQoNCjEuICoqRmFjdG9ycyoqDQogICAgYS4gPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+TGVuZ3RoPC9zcGFuPiAob2YgZGVwZW5kZW5jeSkNCiAgICAgICAgaS4gPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+c2hvcnQ8L3NwYW4+IChtYXRyaXggc3ViamVjdCBleHRyYWN0aW9uKQ0KICAgICAgICBpaS4gPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+bG9uZzwvc3Bhbj4gKGVtYmVkZGVkIG9iamVjdCBleHRyYWN0aW9uKQ0KICAgIGIuIDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPlN0cnVjdHVyZTwvc3Bhbj4gKG9mIGVtYmVkZGVkIGNsYXVzZSkNCiAgICAgICAgaS4gPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+bm9uLWlzbGFuZDwvc3Bhbj4gKGVtYmVkZGVkICp0aGF0Ki1jbGF1c2UpDQogICAgICAgIGlpLiA8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5pc2xhbmQ8L3NwYW4+IChlbWJlZGRlZCBSQyBvciBDUCBjb21wbGVtZW50IHRvIE4pDQogICAgYy4gPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+RGVmaW5pdGVuZXNzIG9mIHRoZSBlbWJlZGRpbmcvaW50ZXJ2ZW5pbmcgRFANCiAgICAgICAgaS4gPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+ZGVmaW5pdGU8L3NwYW4+ICgqdGhlKi1EUCkNCiAgICAgICAgaWkuIDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPmluZGVmaW5pdGU8L3NwYW4+ICgqYSotRFAgb3IgYmFyZSBwbHVyYWwpDQoNClR3byBzYW1wbGUgaXRlbSBzZXRzIGFyZSBnaXZlbiBiZWxvdy4gSGFsZiBvZiB0aGUgaXRlbXMgdXNlZCBhIFJDIGFzIHRoZSBpc2xhbmQsIGFuZCB0aGUgb3RoZXIgaGFsZiB1c2VkIGEgQ1AgY29tcGxlbWVudCB0byBOIGFzIHRoZSBpc2xhbmQuIFRoZXNlIGl0ZW1zIGhhZCBhIHNsaWdodGx5IGRpZmZlcmVudCBkZXNpZ24uDQoNCjIuICoqU2FtcGxlIGl0ZW0qKiAoaXNsYW5kID0gUkMpDQogICAgYS4gV2hvIGFwcHJlY2lhdGVkIHRoYXQgdGhlIHN0dWRlbnRzIGZpbmlzaGVkIHRoZSBvcHRpb25hbCBhc3NpZ25tZW50PzxkaXYgY2xhc3M9ImFsaWducmlnaHQiPig8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5ub24taXNsYW5kfHNob3J0fGRlZmluaXRlPC9zcGFuPik8L2Rpdj4NCiAgICBiLiBXaG8gYXBwcmVjaWF0ZWQgdGhhdCBzdHVkZW50cyBmaW5pc2hlZCB0aGUgb3B0aW9uYWwgYXNzaWdubWVudD8gPGRpdiBjbGFzcz0iYWxpZ25yaWdodCI+KDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPm5vbi1pc2xhbmR8c2hvcnR8aW5kZWZpbml0ZTwvc3Bhbj4pPC9kaXY+DQogICAgYy4gV2hhdCBkaWQgUGF0dHkgYXBwcmVjaWF0ZSB0aGF0IHRoZSBzdHVkZW50cyBmaW5pc2hlZD8gPGRpdiBjbGFzcz0iYWxpZ25yaWdodCI+KDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPm5vbi1pc2xhbmR8bG9uZ3xkZWZpbml0ZTwvc3Bhbj4pPC9kaXY+DQogICAgZC4gV2hhdCBkaWQgUGF0dHkgYXBwcmVjaWF0ZSB0aGF0IHN0dWRlbnRzIGZpbmlzaGVkPyA8ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0Ij4oPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+bm9uLWlzbGFuZHxsb25nfGluZGVmaW5pdGU8L3NwYW4+KTwvZGl2Pg0KICAgIGUuIFdobyBhcHByZWNpYXRlZCB0aGUgc3R1ZGVudHMgd2hvIGZpbmlzaGVkIHRoZSBvcHRpb25hbCBhc3NpZ25tZW50PyA8ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0Ij4oPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+aXNsYW5kfHNob3J0fGRlZmluaXRlPC9zcGFuPik8L2Rpdj4NCiAgICBmLiBXaG8gYXBwcmVjaWF0ZWQgc3R1ZGVudHMgd2hvIGZpbmlzaGVkIHRoZSBvcHRpb25hbCBhc3NpZ25tZW50PyA8ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0Ij4oPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+aXNsYW5kfHNob3J0fGluZGVmaW5pdGU8L3NwYW4+KTwvZGl2Pg0KICAgIGcuIFdoYXQgZGlkIFBhdHR5IGFwcHJlY2lhdGUgdGhlIHN0dWRlbnRzIHdobyBmaW5pc2hlZD8gPGRpdiBjbGFzcz0iYWxpZ25yaWdodCI+KDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPmlzbGFuZHxsb25nfGRlZmluaXRlPC9zcGFuPik8L2Rpdj4NCiAgICBoLiBXaGF0IGRpZCBQYXR0eSBhcHByZWNpYXRlIHN0dWRlbnRzIHdobyBmaW5pc2hlZD8gPGRpdiBjbGFzcz0iYWxpZ25yaWdodCI+KDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPmlzbGFuZHxsb25nfGluZGVmaW5pdGU8L3NwYW4+KTwvZGl2Pg0KDQozLiAqKlNhbXBsZSBpdGVtKiogKGlzbGFuZCA9IENQIGNvbXBsZW1lbnQgdG8gTikNCiAgICBhLiBXaG8gY2xhaW1lZCB0aGF0IHRoZSB1bml2ZXJzaXR5IHdhbnRzIHRvIGhpcmUgU3RhbmxleT88ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0Ij4oPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+bm9uLWlzbGFuZHxzaG9ydHxkZWZpbml0ZTwvc3Bhbj4pPC9kaXY+DQogICAgYi4gV2hvIGNsYWltZWQgdGhhdCBhIHVuaXZlcnNpdHkgd2FudHMgdG8gaGlyZSBTdGFubGV5PzxkaXYgY2xhc3M9ImFsaWducmlnaHQiPig8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5ub24taXNsYW5kfHNob3J0fGluZGVmaW5pdGU8L3NwYW4+KTwvZGl2Pg0KICAgIGMuIFdobyBkaWQgU2FsYXphciBjbGFpbSB0aGF0IHRoZSB1bml2ZXJzaXR5IHdhbnRzIHRvIGhpcmU/PGRpdiBjbGFzcz0iYWxpZ25yaWdodCI+KDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPm5vbi1pc2xhbmR8bG9uZ3xkZWZpbml0ZTwvc3Bhbj4pPC9kaXY+DQogICAgZC4gV2hvIGRpZCBTYWxhemFyIGNsYWltIHRoYXQgYSB1bml2ZXJzaXR5IHdhbnRzIHRvIGhpcmU/PGRpdiBjbGFzcz0iYWxpZ25yaWdodCI+KDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPm5vbi1pc2xhbmR8bG9uZ3xpbmRlZmluaXRlPC9zcGFuPik8L2Rpdj4NCiAgICBlLiBXaG8gaGVhcmQgdGhlIGNsYWltIHRoYXQgdGhlIHVuaXZlcnNpdHkgd2FudHMgdG8gaGlyZSBTdGFubGV5PzxkaXYgY2xhc3M9ImFsaWducmlnaHQiPig8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5pc2xhbmR8c2hvcnR8ZGVmaW5pdGU8L3NwYW4+KTwvZGl2Pg0KICAgIGYuIFdobyBoZWFyZCBhIGNsYWltIHRoYXQgdGhlIHVuaXZlcnNpdHkgd2FudHMgdG8gaGlyZSBTdGFubGV5PzxkaXYgY2xhc3M9ImFsaWducmlnaHQiPig8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5pc2xhbmR8c2hvcnR8aW5kZWZpbml0ZTwvc3Bhbj4pPC9kaXY+DQogICAgZy4gV2hvIGRpZCBTYWxhemFyIGhlYXIgdGhlIGNsYWltIHRoYXQgdGhlIHVuaXZlcnNpdHkgd2FudHMgdG8gaGlyZT88ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0Ij4oPHNwYW4gY2xhc3M9InNtYWxsY2FwcyI+aXNsYW5kfGxvbmd8ZGVmaW5pdGU8L3NwYW4+KTwvZGl2Pg0KICAgIGguIFdobyBkaWQgU2FsYXphciBoZWFyIGEgY2xhaW0gdGhhdCB0aGUgdW5pdmVyc2l0eSB3YW50cyB0byBoaXJlPzxkaXYgY2xhc3M9ImFsaWducmlnaHQiPig8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5pc2xhbmR8bG9uZ3xpbmRlZmluaXRlPC9zcGFuPik8L2Rpdj4NCg0KIyBBbmFseXNpcw0KDQpUaGUgZm9sbG93aW5nIGNvZGUgY2h1bmsgcmVhZHMgdGhlIGRhdGEgaW50byB0aGUgUiBlbnZpcm9ubWVudC4NCg0KYGBge3IgZ2V0RGF0YX0NCiMgUmVhZCBpbiB0aGUgZm9ybWF0dGVkIHJlc3VsdHMNCnJhd19kYXRhIDwtIHJlYWQuY3N2KCJyZXN1bHRzL3Jlc3VsdHNfMTItMTQoMykuY3N2IikNCg0KIyBGaXggZmlyc3QgY29sdW1uIG5hbWUgaXNzdWUgZnJvbSBleGNlbA0KY29sbmFtZXMocmF3X2RhdGEpWzFdIDwtICJsaXN0Ig0KDQojIFJlbW92ZSBjb2x1bW5zIHRoYXQgd29uJ3QgYmUgdXNlZA0KcmF3X2RhdGEgJTw+JSBzdWJzZXQoc2VsZWN0PWMobGlzdDpnZW5kZXIsIHE2LnJlc3BvbnNlLmNhdGVnb3JpemVkOnJhdGluZykpDQoNCiMgU29ydCB0aGUgZGF0YSBpbnRvIGV4cGVyaW1lbnRhbCBkYXRhIGFuZCBmaWxsZXIgZGF0YQ0KcmF3X2RhdGEgJT4lIHN1YnNldChpdGVtLnR5cGU9PSJleHBlcmltZW50YWwiKSAlPiUgZHJvcGxldmVscyAtPiBleHBlcmltZW50X2RhdGENCnJhd19kYXRhICU+JSBzdWJzZXQoaXRlbS50eXBlPT0iZmlsbGVyIikgJT4lIGRyb3BsZXZlbHMgLT4gZmlsbGVyX2RhdGENCmBgYA0KDQpUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIHJhdGluZ3MgYnkgY29uZGl0aW9uLiBUaGUgbG93ZXN0LXJhdGVkIGNvbmRpdGlvbnMgYXJlIHRob3NlIHdpdGggYW4gZW1iZWRkZWQgaXNsYW5kIGFuZCBhIGxvbmcgZXh0cmFjdGlvbiAoPHNwYW4gc3R5bGUgPSAic21hbGxjYXBzIj5pc2xhbmR8bG9uZzwvc3Bhbj4pLiBUaGlzIGlzIHRoZSBleHBlY3RlZCBpc2xhbmQgZWZmZWN0LiBBbm90aGVyIGVhc2lseSBvYnNlcnZhYmxlIHBhdHRlcm4gaXMgdGhhdCB0aGUgaW5kZWZpbml0ZSBjb25kaXRpb25zIGFyZSByYXRlZCBsb3dlciBhY3Jvc3MgdGhlIGJvYXJkIGNvbXBhcmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRlIGNvbmRpdGlvbi4NCg0KYGBgIHtyIGRlc2NyaXB0aXZlU3VtbWFyeX0NCiMgTWFrZSBzdXJlIHRoZSByYXRpbmdzIGFyZSBudW1lcmljIHNvIHRoZXkgY2FuIGJlIGF2ZXJhZ2VkDQpleHBlcmltZW50X2RhdGEkcmF0aW5nICU8PiUgYXMubnVtZXJpYw0KDQojIFJlb3JkZXIgZmFjdG9yIGxldmVscyBzbyB0aGF0IHRoZSBiYXNlbGluZSBsZXZlbHMgY29tZSBmaXJzdA0KZXhwZXJpbWVudF9kYXRhJGVjLnR5cGUgPC0gcmVsZXZlbChleHBlcmltZW50X2RhdGEkZWMudHlwZSwgIm5vbi5pc2wiKQ0KZXhwZXJpbWVudF9kYXRhJGRlcGVuZGVuY3kubGVuZ3RoIDwtIHJlbGV2ZWwoZXhwZXJpbWVudF9kYXRhJGRlcGVuZGVuY3kubGVuZ3RoLCAic2hvcnQiKQ0KDQojIEdyb3VwIHRoZSBkYXRhIGluIGxvbmcgZm9ybWF0IGFjY29yZGluZyB0byB0aGVzZSBwcm9wZXJ0aWVzDQpleHBlcmltZW50X2RhdGEgJT4lDQogIGdyb3VwX2J5KGVjLnR5cGUsIGRlcGVuZGVuY3kubGVuZ3RoLCBkZWZpbml0ZW5lc3MpICU+JQ0KICBzdW1tYXJpemUobWVhbi5yYXRpbmcgPSBtZWFuKHJhdGluZyksDQogICAgICAgICAgICBzZC5yYXRpbmcgPSBzZChyYXRpbmcpLA0KICAgICAgICAgICAgbiA9IG4oKSwNCiAgICAgICAgICAgIHNlLnJhdGluZyA9IHNkLnJhdGluZy9zcXJ0KG4pKSAtPiBkZXNjcmlwdGl2ZV9zdW1tYXJ5DQoNCiMgU2F2ZSB0aGUgZGF0YSBmb3IgdXNlIGluIG90aGVyIHNjcmlwdHMNCnNhdmVSRFMoZGVzY3JpcHRpdmVfc3VtbWFyeSwgZmlsZSA9ICJleHB0MV9kZXNjcmlwdGl2ZV9zdW1tYXJ5IikNCg0KIyBQcmVzZW50IGluIGEgdGFibGUNCnByaW50KGRlc2NyaXB0aXZlX3N1bW1hcnkpDQpgYGANCg0KSXQgaXMgd29ydGggY29tcGFyaW5nIHRoZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIGlzbGFuZHMgdXNlZCBkaXJlY3RseSAoUkMgaXNsYW5kcyBhbmQgQ1AgY29tcGxlbWVudCB0byBub3VuIGlzbGFuZHMpLiBBbHRob3VnaCB0cmFkaXRpb25hbGx5IGJvdGggb2YgdGhlc2UgY2xhdXNlIHR5cGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgQ29tcGxleCBOUCBDb25zdHJhaW50LCB0aGVyZSBpcyBhZ3JlZW1lbnQgdGhhdCBleHRyYWN0aW9uIGZyb20gYWRqdW5jdHMgaXMgZ2VuZXJhbGx5IGxlc3MgYWxsb3dlZCB0aGFuIGV4dHJhY3Rpb24gZnJvbSBjb21wbGVtZW50cy4gQXMgc2hvd24gaW4gdGhlIHRhYmxlIGJlbG93LCBldmVyeSBjb25kaXRpb24gd2l0aCBhIENQIGNvbXBsZW1lbnQgdG8gTiAoTi1DUCBpbiB0aGUgdGFibGUpIGlzIHJhdGVkIHNsaWdodGx5IGhpZ2hlciB0aGFuIGl0cyBjb3JyZXNwb25kaW5nIFJDIGNvbmRpdGlvbi4NCg0KYGBge3IgZGVzY3JpcHRpdmVTdW1tYXJ5SXNsYW5kc0J5VHlwZSwgZWNobyA9IEZBTFNFfQ0KIyBTdWJzZXQgdGhlIGRhdGEgc28gaXQgb25seSBpbmNsdWRlcyB0aGUgaXNsYW5kIGNvbmRpdGlvbnMNCmV4cGVyaW1lbnRfZGF0YSAlPiUgc3Vic2V0KGVjLnR5cGUgPT0gImlzbCIpIC0+IGV4cGVyaW1lbnRfZGF0YV9pc2wNCg0KIyBPcmdhbml6ZSB0aGUgZGF0YSBieSBpc2xhbmQgdHlwZSBhbmQgY29uZGl0aW9uDQpleHBlcmltZW50X2RhdGFfaXNsICU+JQ0KICBncm91cF9ieShpc2xhbmQudHlwZSwgZGVwZW5kZW5jeS5sZW5ndGgsIGRlZmluaXRlbmVzcykgJT4lDQogIHN1bW1hcml6ZShtZWFuLnJhdGluZyA9IG1lYW4ocmF0aW5nKSwNCiAgICAgICAgICAgIHNkLnJhdGluZyA9IHNkKHJhdGluZyksDQogICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgc2UucmF0aW5nID0gc2QucmF0aW5nL3NxcnQobikpIC0+IGRlc2NyaXB0aXZlX3N1bW1hcnlfaXNsDQoNCiMgUHJlc2VudCBpbiBhIHRhYmxlDQpwcmludChkZXNjcmlwdGl2ZV9zdW1tYXJ5X2lzbCkNCmBgYA0KDQpUaGUgZm9sbG93aW5nIHBsb3QgcmVwcmVzZW50cyB0aGUgb3ZlcmFsbCByYXRpbmdzLiBUaGUgbGVmdCBzaWRlIHNob3dzIGFsbCB0aGUgZGVmaW5pdGUgY29uZGl0aW9ucywgYW5kIHdoZW4gY29tcGFyZWQgdG8gdGhlIHJpZ2h0IHNpZGUgKGluZGVmaW5pdGUgY29uZGl0aW9ucyksIG9uZSBjYW4gc2VlIHRoYXQgdGhlIGluZGVmaW5pdGUgY29uZGl0aW9ucyBhcmUgcmF0ZWQgbG93ZXIgb3ZlcmFsbCB0aGFuIHRoZSBkZWZpbml0ZSBjb25kaXRpb25zOyB0aGUgcmF0aW5ncyBhcmUgc2hpZnRlZCBkb3duIGJ1dCBkaXNwbGF5IHRoZSBzYW1lIGdlbmVyYWwgcGF0dGVybi4NCg0KYGBgIHtyIGRlc2NyaXB0aXZlUGxvdCwgZWNobz1GQUxTRX0NCiMgUGxvdCB0aGUgcmF0aW5ncyBhdmVyYWdlcw0KZGVzY3JpcHRpdmVfc3VtbWFyeSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGVwZW5kZW5jeS5sZW5ndGgsDQogICAgICAgICAgICAgeSA9IG1lYW4ucmF0aW5nLA0KICAgICAgICAgICAgIGNvbG9yID0gZWMudHlwZSwNCiAgICAgICAgICAgICBncm91cCA9IGVjLnR5cGUpKSAtPiBkZXNjcmlwdGl2ZV9wbG90DQoNCiMgRmFjZXQgYnkgZGVmaW5pdGVuZXNzDQpkZXNjcmlwdGl2ZV9wbG90ICsgZmFjZXRfZ3JpZCgufmRlZmluaXRlbmVzcykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIENoYW5nZSB0aGUgZGVmYXVsdCBsYWJlbHMNCiAgbGFicyh4ID0gIkxlbmd0aCIsDQogICAgICAgeSA9ICJNZWFuIHJhdGluZyIsDQogICAgICAgY29sb3IgPSAiU3RydWN0dXJlIikgKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOb24taXNsYW5kIiwgIklzbGFuZCIpKSArDQogICMgQWRkIGVycm9yIGJhcnMgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGVycm9ycyBpbiBkZXNjcmlwdGl2ZV9zdW1tYXJ5DQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuLnJhdGluZyAtIHNlLnJhdGluZywNCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IG1lYW4ucmF0aW5nICsgc2UucmF0aW5nLA0KICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUpKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbCA9IGVjLnR5cGUpLA0KICAgICAgICAgICAgIHNpemUgPSAzKSArDQogICMgQ2hhbmdlIGZvbnQgc2l6ZXMNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAuNSwgTkEsIDAuNSwgTkEsICJjbSIpKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihOQSwgMC41LCBOQSwgMC41LCAiY20iKSkpIC0+IGRlc2NyaXB0aXZlX3Bsb3QNCg0KIyBQcmludCB0aGUgcGxvdA0KcHJpbnQoZGVzY3JpcHRpdmVfcGxvdCkNCmBgYA0KDQpUaGUgZm9sbG93aW5nIHBsb3QgcmVwcmVzZW50cyB0aGUgaXNsYW5kIGNvbmRpdGlvbnMsIGNvbXBhcmluZyB0aGUgcmF0aW5ncyBhY3Jvc3MgdGhlIHR3byBpc2xhbmQgdHlwZXMuDQoNCmBgYHtyIGRlc2NyaXB0aXZlUGxvdElzbCwgZWNobyA9IEZBTFNFfQ0KZGVzY3JpcHRpdmVfc3VtbWFyeV9pc2wgJT4lDQogIGdncGxvdChhZXMoeCA9IGRlcGVuZGVuY3kubGVuZ3RoLA0KICAgICAgICAgICAgIHkgPSBtZWFuLnJhdGluZywNCiAgICAgICAgICAgICBjb2xvciA9IGlzbGFuZC50eXBlLA0KICAgICAgICAgICAgIGdyb3VwID0gaXNsYW5kLnR5cGUpKSAtPiBkZXNjcmlwdGl2ZV9wbG90X2lzbA0KDQpkZXNjcmlwdGl2ZV9wbG90X2lzbCArIGZhY2V0X2dyaWQoLn5kZWZpbml0ZW5lc3MpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh4ID0gIkxlbmd0aCIsDQogICAgICAgeSA9ICJNZWFuIHJhdGluZyIsDQogICAgICAgY29sb3VyID0gIklzbGFuZCB0eXBlIikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2wgPSBpc2xhbmQudHlwZSksDQogICAgICAgICAgICAgc2l6ZSA9IDMpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW4ucmF0aW5nIC0gc2UucmF0aW5nLA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbi5yYXRpbmcgKyBzZS5yYXRpbmcsDQogICAgICAgICAgICAgICAgICAgIGNvbCA9IGlzbGFuZC50eXBlKSwNCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oMC41LCBOQSwgMC41LCBOQSwgImNtIikpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oTkEsIDAuNSwgTkEsIDAuNSwgImNtIikpKSAtPiBkZXNjcmlwdGl2ZV9wbG90X2lzbA0KZGVzY3JpcHRpdmVfcGxvdF9pc2wNCmBgYA0KDQo8IS0tIFRoZSB0d28gZm9sbG93aW5nIHBsb3RzIGFyZSBiYXNlZCBvbiB0aGUgc3Vic2V0IG9mIHRoZSBkYXRhIHRoYXQgaGFzIHRoZSBSQyBpdGVtIHNldHMgc2VwYXJhdGVkIGZyb20gdGhlIE4tQ1AgaXRlbSBzZXRzLCByZXNwZWN0aXZlbHkuIC0tPg0KYGBge3IgcmF0aW5nc1Bsb3RSQywgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQojIyBTdWJzZXQgUkMgaXRlbSBzZXRzDQpleHBlcmltZW50X2RhdGEgJT4lIHN1YnNldChpc2xhbmQudHlwZSA9PSAiUkMiKSAtPiBleHBlcmltZW50X2RhdGFfUkMNCiMjIE9yZ2FuaXplDQpleHBlcmltZW50X2RhdGFfUkMgJT4lDQogIGdyb3VwX2J5KGRlcGVuZGVuY3kubGVuZ3RoLCBkZWZpbml0ZW5lc3MpICU+JQ0KICBzdW1tYXJpemUobWVhbi5yYXRpbmcgPSBtZWFuKHJhdGluZyksDQogICAgICAgICAgICBzZC5yYXRpbmcgPSBzZChyYXRpbmcpLA0KICAgICAgICAgICAgbiA9IG4oKSwNCiAgICAgICAgICAgIHNlLnJhdGluZyA9IHNkLnJhdGluZy9zcXJ0KG4pKSAtPiBkZXNjcmlwdGl2ZV9zdW1tYXJ5X1JDDQojIyBNYWtlIGEgcGxvdA0KZGVzY3JpcHRpdmVfc3VtbWFyeV9SQyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGVwZW5kZW5jeS5sZW5ndGgsIHkgPSBtZWFuLnJhdGluZykpIC0+IGRlc2NyaXB0aXZlX3Bsb3RfUkMNCmRlc2NyaXB0aXZlX3Bsb3RfUkMgKyBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBtZWFuLnJhdGluZyAtIHNlLnJhdGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuLnJhdGluZyArIHNlLnJhdGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGRlZmluaXRlbmVzcykpDQpgYGANCg0KYGBge3IgcmF0aW5nc1Bsb3ROQ1AsIGVjaG89IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQpleHBlcmltZW50X2RhdGEgJT4lIHN1YnNldChpc2xhbmQudHlwZSA9PSAiTi1DUCIpLT4gZXhwZXJpbWVudF9kYXRhX05DUA0KZXhwZXJpbWVudF9kYXRhX05DUCAlPiUNCiAgZ3JvdXBfYnkoZGVwZW5kZW5jeS5sZW5ndGgsIGRlZmluaXRlbmVzcykgJT4lDQogIHN1bW1hcml6ZShtZWFuLnJhdGluZyA9IG1lYW4ocmF0aW5nKSwNCiAgICAgICAgICAgIHNkLnJhdGluZyA9IHNkKHJhdGluZyksDQogICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgc2UucmF0aW5nID0gc2QucmF0aW5nL3NxcnQobikpIC0+IGRlc2NyaXB0aXZlX3N1bW1hcnlfTkNQDQojIyBNYWtlIGEgcGxvdA0KZGVzY3JpcHRpdmVfc3VtbWFyeV9OQ1AgJT4lDQogIGdncGxvdChhZXMoeCA9IGRlcGVuZGVuY3kubGVuZ3RoLCB5ID0gbWVhbi5yYXRpbmcpKSAtPiBkZXNjcmlwdGl2ZV9wbG90X05DUA0KZGVzY3JpcHRpdmVfcGxvdF9OQ1AgKyBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBtZWFuLnJhdGluZyAtIHNlLnJhdGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbi5yYXRpbmcgKyBzZS5yYXRpbmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gZGVmaW5pdGVuZXNzKSkNCmBgYA0KDQpgYGB7ciByYXRpbmdzUGxvdCwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQojIyBUaGlzIHByb2R1Y2VzIGEgcmF0aW5ncyBwbG90IHRoYXQgYWJzdHJhY3RzIGF3YXkgZnJvbSBkZWZpbml0ZW5lc3MNCmV4cGVyaW1lbnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gcmF0aW5nKSkgLT4gcmF0aW5nc19wbG90DQoNCnJhdGluZ3NfcGxvdCArIGZhY2V0X2dyaWQoZWMudHlwZSB+IGRlcGVuZGVuY3kubGVuZ3RoKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnM9NikNCmBgYA0KDQo8IS0tICMjIyMgTm93IGxvb2tpbmcgb25seSBhdCBpc2xhbmRzLi4uIC0tPg0KDQpgYGB7ciByYXRpbmdzUGxvdElzbGFuZCwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQpleHBlcmltZW50X2RhdGEgJT4lIHN1YnNldChlYy50eXBlPT0iaXNsIikgJT4lIGRyb3BsZXZlbHMgJT4lIGdncGxvdChhZXMoeCA9IHJhdGluZykpIC0+IGlzbF9yYXRpbmdzX3Bsb3QNCg0KaXNsX3JhdGluZ3NfcGxvdCArIGZhY2V0X2dyaWQoZGVmaW5pdGVuZXNzIH4gZGVwZW5kZW5jeS5sZW5ndGgpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz02KQ0KYGBgDQoNCmBgYHtyIHJhdGluZ3NQbG90SXNsYW5kRmlsbEJ5RGVmLCBlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCiMjIE1ha2Ugc3VyZSB0aGUgcmF0aW5ncyBjb2x1bW4gaXMgbnVtZXJpYw0KZXhwZXJpbWVudF9kYXRhJHJhdGluZyAlPD4lIGFzLm51bWVyaWMNCg0KIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBqdXN0IHdpdGggYSBkaWZmZXJlbnQgdmFyaWFibGUgYXNzaWduZWQgdG8gdGhlIGdyYXBoDQpleHBlcmltZW50X2RhdGEgJT4lIHN1YnNldChlYy50eXBlPT0iaXNsIikgJT4lIGRyb3BsZXZlbHMgJT4lIGdncGxvdChhZXMoeCA9IHJhdGluZykpIC0+IGlzbF9yYXRpbmdzX3Bsb3RfZGVmRmlsbA0KDQojIyBSZWR1Y2UgdGhlIGZhY2V0aW5nIHNvIHRoYXQgdGhlcmUgYXJlIG9ubHkgdHdvIGJsb2NrcyBpbiB0aGUgZ3JhcGg6IGxvbmcgYW5kIHNob3J0DQojIyBGaWxsIGJ5IGRlZmluaXRlbmVzcy4NCmlzbF9yYXRpbmdzX3Bsb3RfZGVmRmlsbCArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGZhY2V0X2dyaWQoLiB+IGRlcGVuZGVuY3kubGVuZ3RoKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnM9NiwNCiAgICAgICAgICAgICAgICAgYWVzKGZpbGwgPSBkZWZpbml0ZW5lc3M9PSJkZWYiKSwNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICAjIyBFZGl0IHRoZSBsYWJlbHMNCiAgbGFicyh4ID0gIlJhdGluZyIsDQogICAgICAgeSA9ICJDb3VudCAob2YgcmF0aW5nKSIpICsNCiAgIyMgRWRpdCB0aGUgbGVnZW5kIHRpdGxlIGFuZCBsYWJlbHMNCiAgIyMgVXNpbmcgZmlsbCBoZXJlIGIvYyB0aGUgaGlzdG9ncmFtIHdhcyBnZW5lcmF0ZWQgdXNpbmcgJ2ZpbGwnDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUoIkRlZmluaXRlbmVzcyIsIGxhYmVscyA9IGMoIkluZGVmaW5pdGUiLCAiRGVmaW5pdGUiKSkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpIC0+IGlzbF9yYXRpbmdzX3Bsb3RfZGVmRmlsbA0KaXNsX3JhdGluZ3NfcGxvdF9kZWZGaWxsDQpgYGANCg0KIyMgQ2FsY3VsYXRpbmcgdGhlIEREIHNjb3JlcyAoaXNsYW5kIHN0cmVuZ3RoKQ0KDQpgYGB7ciB6c2NvcmVzX2Zvcl9ERHN9DQojIENvcHkgcmF3IHJhdGluZ3MgdG8gYW5vdGhlciBkYXRhIGZyYW1lIEkgY2FuIG1vZGlmeQ0KcmF3X2RhdGEgLT4gcmF3X2RhdGFfc2hydA0KDQojIFBhc3RlIHRoZSBsZW5ndGggYW5kIHN0cnVjdHVyZSBjb25kaXRpb25zIHRvZ2V0aGVyDQpyYXdfZGF0YV9zaHJ0JHN0cnVjdHVyZVhsZW5ndGggPC0gcGFzdGUocmF3X2RhdGFfc2hydCRlYy50eXBlLCAieCIsIHJhd19kYXRhX3NocnQkZGVwZW5kZW5jeS5sZW5ndGgpDQoNCiMgQ2FsY3VsYXRlIHotc2NvcmVzDQpyYXdfZGF0YV9zaHJ0ICU+JQ0KICBncm91cF9ieShzdWJqZWN0KSAlPiUgIyBHcm91cCByYXcgcmVzdWx0cyBieSBzdWJqZWN0DQogIG11dGF0ZSh6X3JhdGluZyA9IHNjYWxlKHJhdGluZykpICU+JSAjIEdldCB6LXNjb3JlcyBmb3IgZWFjaCBzdWJqZWN0J3MgcmF0aW5ncw0KICB1bmdyb3VwICU+JSAjIFVuZG8gZ3JvdXAgYnkgc3ViamVjdA0KICBzdWJzZXQoaXRlbS50eXBlID09ICJleHBlcmltZW50YWwiKSAlPiUgZHJvcGxldmVscyAlPiUgIyBTZWxlY3Qgb25seSBleHBlcmltZW50YWwgY29uZGl0aW9ucywgZHJvcCB1bnVzZWQgbGV2ZWxzDQogIGdyb3VwX2J5KGRlZmluaXRlbmVzcywgc3RydWN0dXJlWGxlbmd0aCwgaXRlbS5zZXQpICU+JSAjIEdyb3VwIGJ5IGRlZmluaXRlbmVzcywgcGFzdGVkIHN0cnVjdHVyZVhsZW5ndGgsIGFuZCBpdGVtIHNldA0KICBzdW1tYXJpemUobWVhbl96X3JhdGluZyA9IG1lYW4oel9yYXRpbmcpKSAlPiUgIyBBdmVyYWdlIHRoZSB6LXNjb3JlcyBwZXIgY29uZGl0aW9uIHBlciBpdGVtDQogIGdyb3VwX2J5KGRlZmluaXRlbmVzcywgc3RydWN0dXJlWGxlbmd0aCkgJT4lICMgR3JvdXAgdGhpcyBzdW1tYXJ5IGJ5IGNvbmRpdGlvbiBvbmx5IHNvIHRoYXQgbWVhbnMgb2YgZWFjaCBjb25kaXRpb24gcGVyIGl0ZW0gc2V0IGNhbiBiZSBhdmVyYWdlZA0KICBzdW1tYXJpemUobWVhbl96X3JhdGluZ3MgPSBtZWFuKG1lYW5fel9yYXRpbmcpKSAtPiBzdW1tYXJ5X3pzY29yZXMgIyBHZXQgdGhlIG1lYW4gb2YgdGhlIG1lYW4gei1zY29yZXMNCnByaW50KHN1bW1hcnlfenNjb3JlcykNCg0KIyBHZXQgdGFibGUgdG8gc3RhcnQgbWFraW5nIEREIHNjb3Jlcw0Kel9ERHMgPC0gc3VtbWFyeV96c2NvcmVzICU+JSBzcHJlYWQoc3RydWN0dXJlWGxlbmd0aCwgbWVhbl96X3JhdGluZ3MpDQoNCiMgQ2FsY3VsYXRlIEQxLCBhZGQgdG8gdGFibGUNCnpfRERzJEQxIDwtIHpfRERzJGBub24uaXNsIHggbG9uZ2AgLSB6X0REcyRgaXNsIHggbG9uZ2ANCg0KIyBDYWxjdWxhdGUgRDIsIGFkZCB0byB0YWJsZQ0Kel9ERHMkRDIgPC0gel9ERHMkYG5vbi5pc2wgeCBzaG9ydGAgLSB6X0REcyRgaXNsIHggc2hvcnRgDQoNCiMgQ2FsY3VsYXRlIERELCBhZGQgdG8gdGFibGUNCnpfRERzJEREIDwtIHpfRERzJEQxIC0gel9ERHMkRDINCnByaW50KHpfRERzKQ0KYGBgDQoNCmBgYHtyIEREc19ieWl0ZW0sIGluY2x1ZGUgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KIyBQYXN0ZSBpdGVtLnNldCBhbmQgZGVmaW5pdGVuZXNzIHRvZ2V0aGVyDQpyYXdfZGF0YV9zaHJ0IC0+IHJhd19kYXRhX3NocnQyDQpyYXdfZGF0YV9zaHJ0MiRpdGVtX2RlZmluaXRlbmVzcyA8LSBwYXN0ZShyYXdfZGF0YV9zaHJ0MiRpdGVtLnNldCwiXyIsIHJhd19kYXRhX3NocnQyJGRlZmluaXRlbmVzcykNCg0KIyBHZXQgei1zY29yZXMgZm9yIGVhY2ggaXRlbQ0KcmF3X2RhdGFfc2hydDIgJT4lDQogIGdyb3VwX2J5KHN1YmplY3QpICU+JSAjIEdyb3VwIHJhdyByZXN1bHRzIGJ5IHN1YmplY3QNCiAgbXV0YXRlKHpfcmF0aW5nID0gc2NhbGUocmF0aW5nKSkgJT4lICMgR2V0IHotc2NvcmVzIGZvciBlYWNoIHN1YmplY3QncyByYXRpbmdzDQogIHVuZ3JvdXAgJT4lICMgVW5kbyBncm91cCBieSBzdWJqZWN0DQogIHN1YnNldChpdGVtLnR5cGUgPT0gImV4cGVyaW1lbnRhbCIpICU+JSBkcm9wbGV2ZWxzICU+JSAjIFNlbGVjdCBvbmx5IGV4cGVyaW1lbnRhbCBjb25kaXRpb25zLCBkcm9wIHVudXNlZCBsZXZlbHMNCiAgZ3JvdXBfYnkoaXRlbV9kZWZpbml0ZW5lc3MsIHN0cnVjdHVyZVhsZW5ndGgpICU+JSAjIEdyb3VwIGJ5IHBhc3RlZCBpdGVtIGFuZCBkZWZpbml0ZW5lc3MsIHBhc3RlZCBzdHJ1Y3R1cmVYbGVuZ3RoLCBhbmQgaXRlbSBzZXQNCiAgc3VtbWFyaXplKG1lYW5fel9yYXRpbmcgPSBtZWFuKHpfcmF0aW5nKSkgLT4gc3VtbWFyeV96c2NvcmVzX2J5aXRlbSAjIEF2ZXJhZ2UgdGhlIHotc2NvcmVzIHBlciBjb25kaXRpb24gcGVyIGl0ZW0NCnByaW50KHN1bW1hcnlfenNjb3Jlc19ieWl0ZW0pDQojIENhbGN1bGF0ZSBERCBzY29yZXMNCiMgR2V0IHRhYmxlIHRvIHN0YXJ0IG1ha2luZyBERCBzY29yZXMNCnpfRERzX2J5aXRlbSA8LSBzdW1tYXJ5X3pzY29yZXNfYnlpdGVtICU+JSBzcHJlYWQoc3RydWN0dXJlWGxlbmd0aCwgbWVhbl96X3JhdGluZykNCg0KIyBDYWxjdWxhdGUgRDEsIGFkZCB0byB0YWJsZQ0Kel9ERHNfYnlpdGVtJEQxIDwtIHpfRERzX2J5aXRlbSRgbm9uLmlzbCB4IGxvbmdgIC0gel9ERHNfYnlpdGVtJGBpc2wgeCBsb25nYA0KDQojIENhbGN1bGF0ZSBEMiwgYWRkIHRvIHRhYmxlDQp6X0REc19ieWl0ZW0kRDIgPC0gel9ERHNfYnlpdGVtJGBub24uaXNsIHggc2hvcnRgIC0gel9ERHNfYnlpdGVtJGBpc2wgeCBzaG9ydGANCg0KIyBDYWxjdWxhdGUgREQsIGFkZCB0byB0YWJsZQ0Kel9ERHNfYnlpdGVtJEREIDwtIHpfRERzX2J5aXRlbSREMSAtIHpfRERzX2J5aXRlbSREMg0KcHJpbnQoel9ERHNfYnlpdGVtKQ0KDQojIEdldCBpdGVtcyB3aG9zZSBERHMgYXJlIGxlc3MgdGhhbiAwLjI1DQpzdWJzZXQoel9ERHNfYnlpdGVtWzFdLCB6X0REc19ieWl0ZW0kREQgPCAwLjI1KQ0KYGBgDQoNCg0KIyMgT3JkaW5hbCByZWdyZXNzaW9uIGFuYWx5c2VzDQoNCmBgYCB7ciBjb250cmFzdHN9DQojIFJlYXNzaWduIGNvbnRyYXN0cw0KY29udHJhc3RzKGV4cGVyaW1lbnRfZGF0YSRkZWZpbml0ZW5lc3MpIDwtIGMoLTAuNSwgMC41KQ0KY29udHJhc3RzKGV4cGVyaW1lbnRfZGF0YSRlYy50eXBlKSA8LSBjKDAuNSwgLTAuNSkNCmNvbnRyYXN0cyhleHBlcmltZW50X2RhdGEkZGVwZW5kZW5jeS5sZW5ndGgpIDwtIGMoMC41LCAtMC41KQ0KYGBgDQoNCmBgYHtyIGNsbUFuYWx5c2lzfQ0KIyBNYWtlIHN1cmUgdGhlIHJhdGluZ3MgYXJlIGEgZmFjdG9yLCByYXRoZXIgdGhhbiBudW1iZXJzDQpleHBlcmltZW50X2RhdGEkcmF0aW5nICU8PiUgYXMuZmFjdG9yDQoNCiMgUnVuIHNpbXBsZSBlZmZlY3RzIGFuYWx5c2lzIHcvIHJhdGluZyBhcyBkZXBlbmRlbnQgdmFyaWFibGUsIGFuZCBkZWZpbml0ZW5lc3MsIHN0cnVjdHVyZSwgYW5kIGxlbmd0aCBhbmQgdGhlaXIgaW50ZXJhY3Rpb25zIGFzIGZpeGVkIGVmZmVjdHMNCmNsbShyYXRpbmcgfiBkZWZpbml0ZW5lc3MgKiBlYy50eXBlICogZGVwZW5kZW5jeS5sZW5ndGgsIGRhdGEgPSBleHBlcmltZW50X2RhdGEpIC0+IGNsbS5kZWZfZWN0eXBlDQpzdW1tYXJ5KGNsbS5kZWZfZWN0eXBlKQ0KYGBgDQoNCkRvZXMgdGhlIHR5cGUgb2YgaXNsYW5kIGhhdmUgYW55IGVmZmVjdCBvbiB0cmFuc3BhcmVuY3kgdG8gZXh0cmFjdGlvbj8gTGV0J3MgaW5jbHVkZSBpc2xhbmQgdHlwZSBhcyBhIGZpeGVkIGVmZmVjdC4NCg0KYGBge3Igd2l0aElzbGFuZFR5cGV9DQojIyBNYWtlIHN1cmUgcmF0aW5ncyBhcmUgYSBmYWN0b3INCmV4cGVyaW1lbnRfZGF0YSRyYXRpbmcgJTw+JSBmYWN0b3INCg0KIyMgUmVhc3NpZ24gY29udHJhc3RzDQpjb250cmFzdHMoZXhwZXJpbWVudF9kYXRhJGlzbGFuZC50eXBlKSA8LSBjKDAuNSwgLTAuNSkNCg0KIyMgUnVuIGNsbSBhbmFseXNpcw0KY2xtKHJhdGluZyB+IGRlZmluaXRlbmVzcyAqIGVjLnR5cGUgKiBkZXBlbmRlbmN5Lmxlbmd0aCAqIGlzbGFuZC50eXBlLCBkYXRhID0gZXhwZXJpbWVudF9kYXRhKSAtPiBjbG0udy5pc2xhbmQudHlwZQ0Kc3VtbWFyeShjbG0udy5pc2xhbmQudHlwZSkNCmBgYA0KDQpBIHNpZ25pZmljYW50IGVmZmVjdCBvZiA8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5pc2xhbmQgdHlwZTwvc3Bhbj4gd291bGQgaGF2ZSBzaG93biB1cCBhcyBhIHRocmVlLXdheSBpbnRlcmFjdGlvbiBiZXR3ZWVuIDxzcGFuIGNsYXNzPSJzbWFsbGNhcHMiPnN0cnVjdHVyZTwvc3Bhbj4gKGVjLnR5cGUpLCA8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5sZW5ndGg8L3NwYW4+IChkZXBlbmRlbmN5Lmxlbmd0aCksIGFuZCA8c3BhbiBjbGFzcz0ic21hbGxjYXBzIj5pc2xhbmQgdHlwZTwvc3Bhbj4sIGJ1dCB0aGlzIGludGVyYWN0aW9uIHdhcyBub3Qgc2lnbmlmaWNhbnQgKHA9MC41NDYpLg0KDQoqKk1peGVkIGVmZmVjdHMgbW9kZWwgYnkgc3ViamVjdHMgYW5kIGJ5IGl0ZW1zKioNCg0KYGBge3IgZWNobyA9IEZBTFNFfQ0Kc3VtbWFyeShjbG1tLmRlZl9lY3R5cGUpDQpgYGANCg==