Conceptual points
- Q1: Can you express in layman’s terms what a
“standard deviation” of a variable is?
- A1: A standard deviation tells you how spread out
the values of a variable are around the average. If the standard
deviation is small, most values are close to the average. If it’s large,
values are scattered far from the average. Think of it like this: if the
average income is $50,000, a small standard deviation means most people
earn close to $50,000, while a large one means some earn $20,000 and
others $80,000. It’s basically a measure of “how much do values
typically differ from the mean?”
- Q2: What are the “residuals” of the regression? How
are they calculated?
- A2: Residuals are the mistakes your model makes –
the difference between what actually happened (the observed Y) and what
your model predicted would happen (the estimated Y). They are calculated
as: Residual = Observed Y – Predicted Y. If someone actually earns
$60,000 but your model predicted $55,000, the residual is $5,000.
Residuals represent the “fundamental uncertainty” King et al. discuss –
all the random stuff (weather, illness, luck) that affects Y but isn’t
captured by your explanatory variables X. In their framework, this is
the stochastic component f(θ, α) from Equation 1.
- Q3: What is a variance-covariance matrix?
- A3: A variance-covariance matrix is a table that
summarizes two things about your parameter estimates. The diagonal
contains the variances of each parameter. Variance measures how spread
out an estimate is. For example, if you estimate a coefficient to be 5
with a variance of 4 (standard deviation = 2), the true value probably
lies somewhere around 5 ± 2, roughly between 3 and 7. The larger the
variance, the more uncertain you are about that estimate. The
off-diagonal elements contain the covariances, which tell you how two
estimates move together. Imagine you estimate two coefficients: b₁
(effect of education) and b₂ (effect of experience). If their covariance
is negative, it means: when your model overestimates the effect of
education, it typically underestimates the effect of experience – they
compensate for each other. If the covariance is positive, they move in
the same direction. If it’s zero, they are independent. This matters
because when you simulate parameters (as King et al. recommend), you
need to draw values that respect these connections. If you ignore the
covariances and simulate each parameter independently, you get
unrealistic combinations and your uncertainty estimates will be wrong.
Standard errors alone only tell you about each parameter individually,
but the covariance matrix gives you the complete map of how your
uncertainties are connected.
- Q4:: What is the role of the variance-covariance
matrix in the King et al. article?
- A4: In King et al., the variance-covariance matrix
is the engine of their entire simulation approach. Their method works in
three steps: first, estimate the model and record the point estimates
(γ̂) and the variance-covariance matrix V(γ̂). Then, draw simulated
parameter values from a multivariate normal distribution using those two
pieces of information. The variance-covariance matrix determines how
spread out and correlated these simulated draws are.
- Q5: Can you explain what the covariance matrix is
good for in this example?
- A5: In practical terms, the covariance matrix
allows researchers to do something powerful: translate raw regression
output into quantities that anyone can understand, while properly
accounting for uncertainty. For example, instead of saying “the
coefficient on education is 0.3 with a standard error of 0.1,” you can
say “an extra year of education increases your income by $1,500 on
average, plus or minus about $500.” The covariance matrix makes this
possible because when you calculate quantities like predicted values or
first differences, the uncertainty in those quantities depends on the
uncertainty in all the parameters together – not just one at a time. The
covariance matrix captures those connections. Without it, you would
either ignore uncertainty entirely (just plugging in point estimates) or
underestimate/overestimate it (by treating parameters as independent
when they’re not).
- Q6: What is the difference between fundamental and
estimation uncertainty?
- A6: Estimation uncertainty comes from not having
infinite data. We estimate β and α from a sample, so our estimates are
imperfect. If we had more observations, our estimates would be more
precise. This type of uncertainty can be reduced by collecting more
data. Fundamental uncertainty comes from the randomness of the world
itself. Even if you knew the exact parameter values (eliminating all
estimation uncertainty), you still couldn’t predict Y perfectly because
countless random factors (weather, illness, mood, luck) influence Y but
aren’t in your model. This is the stochastic component – the randomness
built into the real world. This uncertainty cannot be reduced by
collecting more data; it’s inherent to the phenomenon. As King et
al. put it: estimation uncertainty is about not knowing the parameters
perfectly, while fundamental uncertainty is about the world being
inherently unpredictable.
- Q7: What is the difference between expected and
predicted values of Y, and how does this relate to fundamental
vs. estimation uncertainty? When am I interested in one rather than the
other?
- A7: Expected values (E(Y)) give you the average
outcome for a given set of X values. They only contain estimation
uncertainty – the variability comes solely from not knowing the
parameters perfectly. Fundamental uncertainty is averaged away.
Predicted values (Ŷ) give you a specific outcome for a given set of X
values. They contain both estimation uncertainty AND fundamental
uncertainty. So predicted values have a wider confidence interval than
expected values, even though their average is roughly the same. When to
use which: Use expected values when you care about the average effect of
a variable – for example: “on average, how many more assistants does a
candidate-centered MEP have compared to a party-centered one?” You want
to highlight the systematic pattern, not random noise. Use predicted
values when you care about a specific case – for example: “how many
assistants will this particular MEP actually have?” Here you need to
account for all the random factors that could push the actual outcome
away from the average. Election forecasting is another example – you
don’t just want the expected winner, you want to know how likely an
upset is. The key intuition: expected values tell you about the signal,
predicted values tell you about the signal plus noise.
Exercises in R
- Q1: Can you re-fit model 2 with each MEP’s national
party size in the national parliament as a predictor?
- A1: Adding SeatsNatPal.prop (party size in the
national parliament) to model 2 yields a coefficient of -0.184, but it
is not statistically significant (p = 0.768). The other coefficients
remain largely unchanged: OpenList increases slightly from 0.829 to
0.937, and LaborCost stays at about -0.068. The model’s R² barely
changes (from 0.081 to 0.085), suggesting that party size does not
meaningfully improve the model. Note that 17 observations are lost due
to missing data on party size (N drops from 739 to 722).
setwd('/Users/davidhamad/Documents/Cand.Scient.Pol/2. Semester/Statistical models beyond linear regression - applied statistics for political scientists/3) Linear regression')
load("MEP2014.rda")
df <- MEP2014
mod2 <- lm(LocalAssistants ~ OpenList + LaborCost, df)
mod2.party <- lm(LocalAssistants ~ OpenList + LaborCost + SeatsNatPal.prop, df)
stargazer(mod2, mod2.party, type = "text")
===================================================================
Dependent variable:
-----------------------------------------------
LocalAssistants
(1) (2)
-------------------------------------------------------------------
OpenList 0.829*** 0.937***
(0.228) (0.227)
LaborCost -0.070*** -0.068***
(0.010) (0.010)
SeatsNatPal.prop -0.184
(0.625)
Constant 4.127*** 4.057***
(0.286) (0.352)
-------------------------------------------------------------------
Observations 739 722
R2 0.081 0.085
Adjusted R2 0.079 0.081
Residual Std. Error 3.083 (df = 736) 3.009 (df = 718)
F Statistic 32.612*** (df = 2; 736) 22.200*** (df = 3; 718)
===================================================================
Note: *p<0.1; **p<0.05; ***p<0.01
- Q2: What is the marginal effect of party size on
MEP’s local investment?
- A2: The marginal effect of party size is the
coefficient: -0.184. This means that a one-unit increase in party size
(from 0% to 100% of national parliament seats) is associated with 0.18
fewer local assistants, on average. However, since the effect is not
statistically significant, we cannot distinguish it from zero. In
substantive terms, party size does not appear to affect how many local
assistants an MEP hires, once we control for the electoral system and
labor costs.
- Q3: Create two scenarios, justify your choice and
calculate the first difference between the two.
- A3: I chose two scenarios based on the quartiles of
the party size variable (Q1 = 0.09, Q3 = 0.40), to ensure they represent
realistic values in the data. All other variables are held at their
means (OpenList = 0, LaborCost = 22.96). The predicted staff size for a
small party is 2.47 (95% CI: 2.09–2.85) and for a large party is 2.41
(95% CI: 2.08–2.75). The first difference is -0.06, meaning that moving
from a small to a large national party is associated with essentially no
change in local staff size. The confidence intervals overlap almost
entirely, confirming that the difference is not statistically
significant.
summary(df$SeatsNatPal.prop)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.00000 0.08769 0.29738 0.26110 0.40426 0.66834 17
eff <- ggpredict(mod2.party, terms = "SeatsNatPal.prop [0.09, 0.40]")
- Q4: Visualize the effect of party size on MEP’s
local investment.
- A4: The plot shows a nearly flat line with a wide
confidence interval, visually confirming that party size has no
meaningful effect on the number of local assistants. This is consistent
with the non-significant coefficient from the regression.
eff_full <- ggpredict(mod2.party, terms = "SeatsNatPal.prop")
eff_full %>%
plot +
ylab("Predicted local staff size") +
xlab("Party size in national parliament (proportion)") +
ggtitle("Effect of national party size on MEP local staff",
subtitle = "Controlling for OpenList and LaborCost")

Fundamental variation
- Q1: Can you calculate the residuals for model 1,
then model 2 and store them as separate variables in R?
mod1 <- lm(LocalAssistants ~ OpenList, df)
mod2 <- lm(LocalAssistants ~ OpenList + LaborCost, df)
df$resid_mod1 <- residuals(mod1)
df$resid_mod2 <- residuals(mod2)
- Q2: Can you describe the resituals of the two
models in a histogram, then in numbers by calculating the mean and
standard deviation?
ggplot(data.frame(r = residuals(mod1)), aes(r)) +
geom_histogram(bins = 30) +
ggtitle("Residuals: Model 1 (OpenList only)")

ggplot(data.frame(r = residuals(mod2)), aes(r)) +
geom_histogram(bins = 30) +
ggtitle("Residuals: Model 2 (OpenList + LaborCost)")

mean(residuals(mod1))
[1] 4.254603e-16
sd(residuals(mod1))
[1] 3.176834
mean(residuals(mod2))
[1] 5.910172e-16
sd(residuals(mod2))
[1] 3.078466
- Q3: What is the difference between the two sets of
residuals and why?
- A3: Model 2’s residuals have a smaller standard
deviation (3.08 vs 3.18) because adding LaborCost as a predictor
explains more of the variation in LocalAssistants. The R² increases from
0.022 to 0.081, meaning Model 2 captures more of the systematic pattern
in the data, leaving less unexplained variation (i.e. smaller
residuals). In King et al.’s terms, adding a relevant predictor reduces
the fundamental uncertainty – there is less “leftover” randomness that
the model cannot account for.
- Q4: Can you extract the variance-covariance matrix
for model 2?
vcov(mod2)
(Intercept) OpenList LaborCost
(Intercept) 0.081867230 -0.0284615942 -0.0024363118
OpenList -0.028461594 0.0519105737 0.0001759822
LaborCost -0.002436312 0.0001759822 0.0001031140
- Q5: Can you calculate the standard error for the
regression coefficients (parameters) from the variance- covariance
matrix?
- A5: The standard errors are the square root of the
diagonal elements: Intercept = 0.286, OpenList = 0.228, LaborCost =
0.010. These match exactly what summary(mod2) reports – because that’s
where standard errors come from.
sqrt(diag(vcov(mod2)))
(Intercept) OpenList LaborCost
0.28612450 0.22783892 0.01015451
- Q6: Are there any predictors that correlate more
than others?
- A6: The correlation between the Intercept and
LaborCost estimates is -0.84, which is very strong. This means: when the
model overestimates the intercept, it tends to underestimate the effect
of LaborCost, and vice versa. The correlation between Intercept and
OpenList is moderate (-0.44), while OpenList and LaborCost are nearly
independent (0.08).
cov2cor(vcov(mod2))
(Intercept) OpenList LaborCost
(Intercept) 1.0000000 -0.43659249 -0.83853084
OpenList -0.4365925 1.00000000 0.07606449
LaborCost -0.8385308 0.07606449 1.00000000
- Q7: How does this relate to King et al’s
argument?
- A7: King et al. argue that you need the full
variance-covariance matrix – not just individual standard errors – to
properly account for uncertainty. This example shows why: the intercept
and LaborCost are strongly correlated (-0.84). If you simulated these
parameters independently (ignoring that correlation), you would get
unrealistic combinations where both are overestimated simultaneously.
The covariance matrix ensures that when you simulate parameters to
calculate quantities like predicted values or first differences, the
draws respect these connections, giving you accurate confidence
intervals. Without it, your uncertainty estimates would be wrong.
LS0tCnRpdGxlOiAiUHJvYmxlbSBzZXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHs9aHRtbH0KPHN0eWxlPgpib2R5IHsKICB0ZXh0LWFsaWduOiBqdXN0aWZ5OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMS42OwogIG1heC13aWR0aDogODAwcHg7CiAgbWFyZ2luOiBhdXRvOwp9CgpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAyOHB4OwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzMzOwogIHBhZGRpbmctYm90dG9tOiAxMHB4OwogIG1hcmdpbi1ib3R0b206IDMwcHg7Cn0KCmgxIHsKICBmb250LXNpemU6IDIycHg7CiAgbWFyZ2luLXRvcDogNDBweDsKICBjb2xvcjogIzJjM2U1MDsKfQoKbGkgewogIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KPC9zdHlsZT4KYGBgCgojIENvbmNlcHR1YWwgcG9pbnRzCgotICAgKipRMToqKiBDYW4geW91IGV4cHJlc3MgaW4gbGF5bWFu4oCZcyB0ZXJtcyB3aGF0IGEg4oCcc3RhbmRhcmQgZGV2aWF0aW9u4oCdIG9mIGEgdmFyaWFibGUgaXM/Ci0gICAqKkExOioqIEEgc3RhbmRhcmQgZGV2aWF0aW9uIHRlbGxzIHlvdSBob3cgc3ByZWFkIG91dCB0aGUgdmFsdWVzIG9mIGEgdmFyaWFibGUgYXJlIGFyb3VuZCB0aGUgYXZlcmFnZS4gSWYgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBzbWFsbCwgbW9zdCB2YWx1ZXMgYXJlIGNsb3NlIHRvIHRoZSBhdmVyYWdlLiBJZiBpdCdzIGxhcmdlLCB2YWx1ZXMgYXJlIHNjYXR0ZXJlZCBmYXIgZnJvbSB0aGUgYXZlcmFnZS4gVGhpbmsgb2YgaXQgbGlrZSB0aGlzOiBpZiB0aGUgYXZlcmFnZSBpbmNvbWUgaXMgXCQ1MCwwMDAsIGEgc21hbGwgc3RhbmRhcmQgZGV2aWF0aW9uIG1lYW5zIG1vc3QgcGVvcGxlIGVhcm4gY2xvc2UgdG8gXCQ1MCwwMDAsIHdoaWxlIGEgbGFyZ2Ugb25lIG1lYW5zIHNvbWUgZWFybiBcJDIwLDAwMCBhbmQgb3RoZXJzIFwkODAsMDAwLiBJdCdzIGJhc2ljYWxseSBhIG1lYXN1cmUgb2YgImhvdyBtdWNoIGRvIHZhbHVlcyB0eXBpY2FsbHkgZGlmZmVyIGZyb20gdGhlIG1lYW4/IgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotICAgKipRMjoqKiBXaGF0IGFyZSB0aGUg4oCccmVzaWR1YWxz4oCdIG9mIHRoZSByZWdyZXNzaW9uPyBIb3cgYXJlIHRoZXkgY2FsY3VsYXRlZD8KLSAgICoqQTI6KiogUmVzaWR1YWxzIGFyZSB0aGUgbWlzdGFrZXMgeW91ciBtb2RlbCBtYWtlcyDigJMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3aGF0IGFjdHVhbGx5IGhhcHBlbmVkICh0aGUgb2JzZXJ2ZWQgWSkgYW5kIHdoYXQgeW91ciBtb2RlbCBwcmVkaWN0ZWQgd291bGQgaGFwcGVuICh0aGUgZXN0aW1hdGVkIFkpLiBUaGV5IGFyZSBjYWxjdWxhdGVkIGFzOiBSZXNpZHVhbCA9IE9ic2VydmVkIFkg4oCTIFByZWRpY3RlZCBZLiBJZiBzb21lb25lIGFjdHVhbGx5IGVhcm5zIFwkNjAsMDAwIGJ1dCB5b3VyIG1vZGVsIHByZWRpY3RlZCBcJDU1LDAwMCwgdGhlIHJlc2lkdWFsIGlzIFwkNSwwMDAuIFJlc2lkdWFscyByZXByZXNlbnQgdGhlICJmdW5kYW1lbnRhbCB1bmNlcnRhaW50eSIgS2luZyBldCBhbC4gZGlzY3VzcyDigJMgYWxsIHRoZSByYW5kb20gc3R1ZmYgKHdlYXRoZXIsIGlsbG5lc3MsIGx1Y2spIHRoYXQgYWZmZWN0cyBZIGJ1dCBpc24ndCBjYXB0dXJlZCBieSB5b3VyIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBYLiBJbiB0aGVpciBmcmFtZXdvcmssIHRoaXMgaXMgdGhlIHN0b2NoYXN0aWMgY29tcG9uZW50IGYozrgsIM6xKSBmcm9tIEVxdWF0aW9uIDEuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gICAqKlEzOioqIFdoYXQgaXMgYSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeD8KLSAgICoqQTM6KiogQSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBpcyBhIHRhYmxlIHRoYXQgc3VtbWFyaXplcyB0d28gdGhpbmdzIGFib3V0IHlvdXIgcGFyYW1ldGVyIGVzdGltYXRlcy4gVGhlIGRpYWdvbmFsIGNvbnRhaW5zIHRoZSB2YXJpYW5jZXMgb2YgZWFjaCBwYXJhbWV0ZXIuIFZhcmlhbmNlIG1lYXN1cmVzIGhvdyBzcHJlYWQgb3V0IGFuIGVzdGltYXRlIGlzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGVzdGltYXRlIGEgY29lZmZpY2llbnQgdG8gYmUgNSB3aXRoIGEgdmFyaWFuY2Ugb2YgNCAoc3RhbmRhcmQgZGV2aWF0aW9uID0gMiksIHRoZSB0cnVlIHZhbHVlIHByb2JhYmx5IGxpZXMgc29tZXdoZXJlIGFyb3VuZCA1IMKxIDIsIHJvdWdobHkgYmV0d2VlbiAzIGFuZCA3LiBUaGUgbGFyZ2VyIHRoZSB2YXJpYW5jZSwgdGhlIG1vcmUgdW5jZXJ0YWluIHlvdSBhcmUgYWJvdXQgdGhhdCBlc3RpbWF0ZS4gVGhlIG9mZi1kaWFnb25hbCBlbGVtZW50cyBjb250YWluIHRoZSBjb3ZhcmlhbmNlcywgd2hpY2ggdGVsbCB5b3UgaG93IHR3byBlc3RpbWF0ZXMgbW92ZSB0b2dldGhlci4gSW1hZ2luZSB5b3UgZXN0aW1hdGUgdHdvIGNvZWZmaWNpZW50czogYuKCgSAoZWZmZWN0IG9mIGVkdWNhdGlvbikgYW5kIGLigoIgKGVmZmVjdCBvZiBleHBlcmllbmNlKS4gSWYgdGhlaXIgY292YXJpYW5jZSBpcyBuZWdhdGl2ZSwgaXQgbWVhbnM6IHdoZW4geW91ciBtb2RlbCBvdmVyZXN0aW1hdGVzIHRoZSBlZmZlY3Qgb2YgZWR1Y2F0aW9uLCBpdCB0eXBpY2FsbHkgdW5kZXJlc3RpbWF0ZXMgdGhlIGVmZmVjdCBvZiBleHBlcmllbmNlIOKAkyB0aGV5IGNvbXBlbnNhdGUgZm9yIGVhY2ggb3RoZXIuIElmIHRoZSBjb3ZhcmlhbmNlIGlzIHBvc2l0aXZlLCB0aGV5IG1vdmUgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLiBJZiBpdCdzIHplcm8sIHRoZXkgYXJlIGluZGVwZW5kZW50LiBUaGlzIG1hdHRlcnMgYmVjYXVzZSB3aGVuIHlvdSBzaW11bGF0ZSBwYXJhbWV0ZXJzIChhcyBLaW5nIGV0IGFsLiByZWNvbW1lbmQpLCB5b3UgbmVlZCB0byBkcmF3IHZhbHVlcyB0aGF0IHJlc3BlY3QgdGhlc2UgY29ubmVjdGlvbnMuIElmIHlvdSBpZ25vcmUgdGhlIGNvdmFyaWFuY2VzIGFuZCBzaW11bGF0ZSBlYWNoIHBhcmFtZXRlciBpbmRlcGVuZGVudGx5LCB5b3UgZ2V0IHVucmVhbGlzdGljIGNvbWJpbmF0aW9ucyBhbmQgeW91ciB1bmNlcnRhaW50eSBlc3RpbWF0ZXMgd2lsbCBiZSB3cm9uZy4gU3RhbmRhcmQgZXJyb3JzIGFsb25lIG9ubHkgdGVsbCB5b3UgYWJvdXQgZWFjaCBwYXJhbWV0ZXIgaW5kaXZpZHVhbGx5LCBidXQgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGdpdmVzIHlvdSB0aGUgY29tcGxldGUgbWFwIG9mIGhvdyB5b3VyIHVuY2VydGFpbnRpZXMgYXJlIGNvbm5lY3RlZC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTQ6Kio6IFdoYXQgaXMgdGhlIHJvbGUgb2YgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGluIHRoZSBLaW5nIGV0IGFsLiBhcnRpY2xlPwotICAgKipBNCoqOiBJbiBLaW5nIGV0IGFsLiwgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGlzIHRoZSBlbmdpbmUgb2YgdGhlaXIgZW50aXJlIHNpbXVsYXRpb24gYXBwcm9hY2guIFRoZWlyIG1ldGhvZCB3b3JrcyBpbiB0aHJlZSBzdGVwczogZmlyc3QsIGVzdGltYXRlIHRoZSBtb2RlbCBhbmQgcmVjb3JkIHRoZSBwb2ludCBlc3RpbWF0ZXMgKM6zzIIpIGFuZCB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggVijOs8yCKS4gVGhlbiwgZHJhdyBzaW11bGF0ZWQgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIGEgbXVsdGl2YXJpYXRlIG5vcm1hbCBkaXN0cmlidXRpb24gdXNpbmcgdGhvc2UgdHdvIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4gVGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGRldGVybWluZXMgaG93IHNwcmVhZCBvdXQgYW5kIGNvcnJlbGF0ZWQgdGhlc2Ugc2ltdWxhdGVkIGRyYXdzIGFyZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTUqKjogQ2FuIHlvdSBleHBsYWluIHdoYXQgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGlzIGdvb2QgZm9yIGluIHRoaXMgZXhhbXBsZT8KLSAgICoqQTUqKjogSW4gcHJhY3RpY2FsIHRlcm1zLCB0aGUgY292YXJpYW5jZSBtYXRyaXggYWxsb3dzIHJlc2VhcmNoZXJzIHRvIGRvIHNvbWV0aGluZyBwb3dlcmZ1bDogdHJhbnNsYXRlIHJhdyByZWdyZXNzaW9uIG91dHB1dCBpbnRvIHF1YW50aXRpZXMgdGhhdCBhbnlvbmUgY2FuIHVuZGVyc3RhbmQsIHdoaWxlIHByb3Blcmx5IGFjY291bnRpbmcgZm9yIHVuY2VydGFpbnR5LiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBzYXlpbmcgInRoZSBjb2VmZmljaWVudCBvbiBlZHVjYXRpb24gaXMgMC4zIHdpdGggYSBzdGFuZGFyZCBlcnJvciBvZiAwLjEsIiB5b3UgY2FuIHNheSAiYW4gZXh0cmEgeWVhciBvZiBlZHVjYXRpb24gaW5jcmVhc2VzIHlvdXIgaW5jb21lIGJ5IFwkMSw1MDAgb24gYXZlcmFnZSwgcGx1cyBvciBtaW51cyBhYm91dCBcJDUwMC4iIFRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBtYWtlcyB0aGlzIHBvc3NpYmxlIGJlY2F1c2Ugd2hlbiB5b3UgY2FsY3VsYXRlIHF1YW50aXRpZXMgbGlrZSBwcmVkaWN0ZWQgdmFsdWVzIG9yIGZpcnN0IGRpZmZlcmVuY2VzLCB0aGUgdW5jZXJ0YWludHkgaW4gdGhvc2UgcXVhbnRpdGllcyBkZXBlbmRzIG9uIHRoZSB1bmNlcnRhaW50eSBpbiBhbGwgdGhlIHBhcmFtZXRlcnMgdG9nZXRoZXIg4oCTIG5vdCBqdXN0IG9uZSBhdCBhIHRpbWUuIFRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBjYXB0dXJlcyB0aG9zZSBjb25uZWN0aW9ucy4gV2l0aG91dCBpdCwgeW91IHdvdWxkIGVpdGhlciBpZ25vcmUgdW5jZXJ0YWludHkgZW50aXJlbHkgKGp1c3QgcGx1Z2dpbmcgaW4gcG9pbnQgZXN0aW1hdGVzKSBvciB1bmRlcmVzdGltYXRlL292ZXJlc3RpbWF0ZSBpdCAoYnkgdHJlYXRpbmcgcGFyYW1ldGVycyBhcyBpbmRlcGVuZGVudCB3aGVuIHRoZXkncmUgbm90KS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTY6KiogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGZ1bmRhbWVudGFsIGFuZCBlc3RpbWF0aW9uIHVuY2VydGFpbnR5PwotICAgKipBNjoqKiBFc3RpbWF0aW9uIHVuY2VydGFpbnR5IGNvbWVzIGZyb20gbm90IGhhdmluZyBpbmZpbml0ZSBkYXRhLiBXZSBlc3RpbWF0ZSDOsiBhbmQgzrEgZnJvbSBhIHNhbXBsZSwgc28gb3VyIGVzdGltYXRlcyBhcmUgaW1wZXJmZWN0LiBJZiB3ZSBoYWQgbW9yZSBvYnNlcnZhdGlvbnMsIG91ciBlc3RpbWF0ZXMgd291bGQgYmUgbW9yZSBwcmVjaXNlLiBUaGlzIHR5cGUgb2YgdW5jZXJ0YWludHkgY2FuIGJlIHJlZHVjZWQgYnkgY29sbGVjdGluZyBtb3JlIGRhdGEuIEZ1bmRhbWVudGFsIHVuY2VydGFpbnR5IGNvbWVzIGZyb20gdGhlIHJhbmRvbW5lc3Mgb2YgdGhlIHdvcmxkIGl0c2VsZi4gRXZlbiBpZiB5b3Uga25ldyB0aGUgZXhhY3QgcGFyYW1ldGVyIHZhbHVlcyAoZWxpbWluYXRpbmcgYWxsIGVzdGltYXRpb24gdW5jZXJ0YWludHkpLCB5b3Ugc3RpbGwgY291bGRuJ3QgcHJlZGljdCBZIHBlcmZlY3RseSBiZWNhdXNlIGNvdW50bGVzcyByYW5kb20gZmFjdG9ycyAod2VhdGhlciwgaWxsbmVzcywgbW9vZCwgbHVjaykgaW5mbHVlbmNlIFkgYnV0IGFyZW4ndCBpbiB5b3VyIG1vZGVsLiBUaGlzIGlzIHRoZSBzdG9jaGFzdGljIGNvbXBvbmVudCDigJMgdGhlIHJhbmRvbW5lc3MgYnVpbHQgaW50byB0aGUgcmVhbCB3b3JsZC4gVGhpcyB1bmNlcnRhaW50eSBjYW5ub3QgYmUgcmVkdWNlZCBieSBjb2xsZWN0aW5nIG1vcmUgZGF0YTsgaXQncyBpbmhlcmVudCB0byB0aGUgcGhlbm9tZW5vbi4gQXMgS2luZyBldCBhbC4gcHV0IGl0OiBlc3RpbWF0aW9uIHVuY2VydGFpbnR5IGlzIGFib3V0IG5vdCBrbm93aW5nIHRoZSBwYXJhbWV0ZXJzIHBlcmZlY3RseSwgd2hpbGUgZnVuZGFtZW50YWwgdW5jZXJ0YWludHkgaXMgYWJvdXQgdGhlIHdvcmxkIGJlaW5nIGluaGVyZW50bHkgdW5wcmVkaWN0YWJsZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTc6KiogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBwcmVkaWN0ZWQgdmFsdWVzIG9mIFksIGFuZCBob3cgZG9lcyB0aGlzIHJlbGF0ZSB0byBmdW5kYW1lbnRhbCB2cy4gZXN0aW1hdGlvbiB1bmNlcnRhaW50eT8gV2hlbiBhbSBJIGludGVyZXN0ZWQgaW4gb25lIHJhdGhlciB0aGFuIHRoZSBvdGhlcj8KLSAgICoqQTc6KiogRXhwZWN0ZWQgdmFsdWVzIChFKFkpKSBnaXZlIHlvdSB0aGUgYXZlcmFnZSBvdXRjb21lIGZvciBhIGdpdmVuIHNldCBvZiBYIHZhbHVlcy4gVGhleSBvbmx5IGNvbnRhaW4gZXN0aW1hdGlvbiB1bmNlcnRhaW50eSDigJMgdGhlIHZhcmlhYmlsaXR5IGNvbWVzIHNvbGVseSBmcm9tIG5vdCBrbm93aW5nIHRoZSBwYXJhbWV0ZXJzIHBlcmZlY3RseS4gRnVuZGFtZW50YWwgdW5jZXJ0YWludHkgaXMgYXZlcmFnZWQgYXdheS4gUHJlZGljdGVkIHZhbHVlcyAoxbYpIGdpdmUgeW91IGEgc3BlY2lmaWMgb3V0Y29tZSBmb3IgYSBnaXZlbiBzZXQgb2YgWCB2YWx1ZXMuIFRoZXkgY29udGFpbiBib3RoIGVzdGltYXRpb24gdW5jZXJ0YWludHkgQU5EIGZ1bmRhbWVudGFsIHVuY2VydGFpbnR5LiBTbyBwcmVkaWN0ZWQgdmFsdWVzIGhhdmUgYSB3aWRlciBjb25maWRlbmNlIGludGVydmFsIHRoYW4gZXhwZWN0ZWQgdmFsdWVzLCBldmVuIHRob3VnaCB0aGVpciBhdmVyYWdlIGlzIHJvdWdobHkgdGhlIHNhbWUuIFdoZW4gdG8gdXNlIHdoaWNoOiBVc2UgZXhwZWN0ZWQgdmFsdWVzIHdoZW4geW91IGNhcmUgYWJvdXQgdGhlIGF2ZXJhZ2UgZWZmZWN0IG9mIGEgdmFyaWFibGUg4oCTIGZvciBleGFtcGxlOiAib24gYXZlcmFnZSwgaG93IG1hbnkgbW9yZSBhc3Npc3RhbnRzIGRvZXMgYSBjYW5kaWRhdGUtY2VudGVyZWQgTUVQIGhhdmUgY29tcGFyZWQgdG8gYSBwYXJ0eS1jZW50ZXJlZCBvbmU/IiBZb3Ugd2FudCB0byBoaWdobGlnaHQgdGhlIHN5c3RlbWF0aWMgcGF0dGVybiwgbm90IHJhbmRvbSBub2lzZS4gVXNlIHByZWRpY3RlZCB2YWx1ZXMgd2hlbiB5b3UgY2FyZSBhYm91dCBhIHNwZWNpZmljIGNhc2Ug4oCTIGZvciBleGFtcGxlOiAiaG93IG1hbnkgYXNzaXN0YW50cyB3aWxsIHRoaXMgcGFydGljdWxhciBNRVAgYWN0dWFsbHkgaGF2ZT8iIEhlcmUgeW91IG5lZWQgdG8gYWNjb3VudCBmb3IgYWxsIHRoZSByYW5kb20gZmFjdG9ycyB0aGF0IGNvdWxkIHB1c2ggdGhlIGFjdHVhbCBvdXRjb21lIGF3YXkgZnJvbSB0aGUgYXZlcmFnZS4gRWxlY3Rpb24gZm9yZWNhc3RpbmcgaXMgYW5vdGhlciBleGFtcGxlIOKAkyB5b3UgZG9uJ3QganVzdCB3YW50IHRoZSBleHBlY3RlZCB3aW5uZXIsIHlvdSB3YW50IHRvIGtub3cgaG93IGxpa2VseSBhbiB1cHNldCBpcy4gVGhlIGtleSBpbnR1aXRpb246IGV4cGVjdGVkIHZhbHVlcyB0ZWxsIHlvdSBhYm91dCB0aGUgc2lnbmFsLCBwcmVkaWN0ZWQgdmFsdWVzIHRlbGwgeW91IGFib3V0IHRoZSBzaWduYWwgcGx1cyBub2lzZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBFeGVyY2lzZXMgaW4gUgoKLSAgICoqUTE6KiogQ2FuIHlvdSByZS1maXQgbW9kZWwgMiB3aXRoIGVhY2ggTUVQ4oCZcyBuYXRpb25hbCBwYXJ0eSBzaXplIGluIHRoZSBuYXRpb25hbCBwYXJsaWFtZW50IGFzIGEgcHJlZGljdG9yPwotICAgKipBMToqKiBBZGRpbmcgU2VhdHNOYXRQYWwucHJvcCAocGFydHkgc2l6ZSBpbiB0aGUgbmF0aW9uYWwgcGFybGlhbWVudCkgdG8gbW9kZWwgMiB5aWVsZHMgYSBjb2VmZmljaWVudCBvZiAtMC4xODQsIGJ1dCBpdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IDAuNzY4KS4gVGhlIG90aGVyIGNvZWZmaWNpZW50cyByZW1haW4gbGFyZ2VseSB1bmNoYW5nZWQ6IE9wZW5MaXN0IGluY3JlYXNlcyBzbGlnaHRseSBmcm9tIDAuODI5IHRvIDAuOTM3LCBhbmQgTGFib3JDb3N0IHN0YXlzIGF0IGFib3V0IC0wLjA2OC4gVGhlIG1vZGVsJ3MgUsKyIGJhcmVseSBjaGFuZ2VzIChmcm9tIDAuMDgxIHRvIDAuMDg1KSwgc3VnZ2VzdGluZyB0aGF0IHBhcnR5IHNpemUgZG9lcyBub3QgbWVhbmluZ2Z1bGx5IGltcHJvdmUgdGhlIG1vZGVsLiBOb3RlIHRoYXQgMTcgb2JzZXJ2YXRpb25zIGFyZSBsb3N0IGR1ZSB0byBtaXNzaW5nIGRhdGEgb24gcGFydHkgc2l6ZSAoTiBkcm9wcyBmcm9tIDczOSB0byA3MjIpLgoKYGBge3J9CnNldHdkKCcvVXNlcnMvZGF2aWRoYW1hZC9Eb2N1bWVudHMvQ2FuZC5TY2llbnQuUG9sLzIuIFNlbWVzdGVyL1N0YXRpc3RpY2FsIG1vZGVscyBiZXlvbmQgbGluZWFyIHJlZ3Jlc3Npb24gLSBhcHBsaWVkIHN0YXRpc3RpY3MgZm9yIHBvbGl0aWNhbCBzY2llbnRpc3RzLzMpIExpbmVhciByZWdyZXNzaW9uJykKCmxvYWQoIk1FUDIwMTQucmRhIikKCmRmIDwtIE1FUDIwMTQKCm1vZDIgPC0gbG0oTG9jYWxBc3Npc3RhbnRzIH4gT3Blbkxpc3QgKyBMYWJvckNvc3QsIGRmKQoKbW9kMi5wYXJ0eSA8LSBsbShMb2NhbEFzc2lzdGFudHMgfiBPcGVuTGlzdCArIExhYm9yQ29zdCArIFNlYXRzTmF0UGFsLnByb3AsIGRmKQoKc3RhcmdhemVyKG1vZDIsIG1vZDIucGFydHksIHR5cGUgPSAidGV4dCIpCmBgYAoKLS0tCgotICoqUTI6KiogV2hhdCBpcyB0aGUgbWFyZ2luYWwgZWZmZWN0IG9mIHBhcnR5IHNpemUgb24gTUVQ4oCZcyBsb2NhbCBpbnZlc3RtZW50PwotICoqQTI6KiogVGhlIG1hcmdpbmFsIGVmZmVjdCBvZiBwYXJ0eSBzaXplIGlzIHRoZSBjb2VmZmljaWVudDogLTAuMTg0LiBUaGlzIG1lYW5zIHRoYXQgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBwYXJ0eSBzaXplIChmcm9tIDAlIHRvIDEwMCUgb2YgbmF0aW9uYWwgcGFybGlhbWVudCBzZWF0cykgaXMgYXNzb2NpYXRlZCB3aXRoIDAuMTggZmV3ZXIgbG9jYWwgYXNzaXN0YW50cywgb24gYXZlcmFnZS4gSG93ZXZlciwgc2luY2UgdGhlIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGl0IGZyb20gemVyby4gSW4gc3Vic3RhbnRpdmUgdGVybXMsIHBhcnR5IHNpemUgZG9lcyBub3QgYXBwZWFyIHRvIGFmZmVjdCBob3cgbWFueSBsb2NhbCBhc3Npc3RhbnRzIGFuIE1FUCBoaXJlcywgb25jZSB3ZSBjb250cm9sIGZvciB0aGUgZWxlY3RvcmFsIHN5c3RlbSBhbmQgbGFib3IgY29zdHMuCgotLS0KCi0gKipRMzoqKiBDcmVhdGUgdHdvIHNjZW5hcmlvcywganVzdGlmeSB5b3VyIGNob2ljZSBhbmQgY2FsY3VsYXRlIHRoZSBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3by4KLSAqKkEzOioqIEkgY2hvc2UgdHdvIHNjZW5hcmlvcyBiYXNlZCBvbiB0aGUgcXVhcnRpbGVzIG9mIHRoZSBwYXJ0eSBzaXplIHZhcmlhYmxlIChRMSA9IDAuMDksIFEzID0gMC40MCksIHRvIGVuc3VyZSB0aGV5IHJlcHJlc2VudCByZWFsaXN0aWMgdmFsdWVzIGluIHRoZSBkYXRhLiBBbGwgb3RoZXIgdmFyaWFibGVzIGFyZSBoZWxkIGF0IHRoZWlyIG1lYW5zIChPcGVuTGlzdCA9IDAsIExhYm9yQ29zdCA9IDIyLjk2KS4gVGhlIHByZWRpY3RlZCBzdGFmZiBzaXplIGZvciBhIHNtYWxsIHBhcnR5IGlzIDIuNDcgKDk1JSBDSTogMi4wOeKAkzIuODUpIGFuZCBmb3IgYSBsYXJnZSBwYXJ0eSBpcyAyLjQxICg5NSUgQ0k6IDIuMDjigJMyLjc1KS4gVGhlIGZpcnN0IGRpZmZlcmVuY2UgaXMgLTAuMDYsIG1lYW5pbmcgdGhhdCBtb3ZpbmcgZnJvbSBhIHNtYWxsIHRvIGEgbGFyZ2UgbmF0aW9uYWwgcGFydHkgaXMgYXNzb2NpYXRlZCB3aXRoIGVzc2VudGlhbGx5IG5vIGNoYW5nZSBpbiBsb2NhbCBzdGFmZiBzaXplLiBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb3ZlcmxhcCBhbG1vc3QgZW50aXJlbHksIGNvbmZpcm1pbmcgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KCgpgYGB7cn0Kc3VtbWFyeShkZiRTZWF0c05hdFBhbC5wcm9wKQplZmYgPC0gZ2dwcmVkaWN0KG1vZDIucGFydHksIHRlcm1zID0gIlNlYXRzTmF0UGFsLnByb3AgWzAuMDksIDAuNDBdIikKYGBgCgotLS0KCi0gKipRNDoqKiBWaXN1YWxpemUgdGhlIGVmZmVjdCBvZiBwYXJ0eSBzaXplIG9uIE1FUOKAmXMgbG9jYWwgaW52ZXN0bWVudC4KLSAqKkE0OioqIFRoZSBwbG90IHNob3dzIGEgbmVhcmx5IGZsYXQgbGluZSB3aXRoIGEgd2lkZSBjb25maWRlbmNlIGludGVydmFsLCB2aXN1YWxseSBjb25maXJtaW5nIHRoYXQgcGFydHkgc2l6ZSBoYXMgbm8gbWVhbmluZ2Z1bCBlZmZlY3Qgb24gdGhlIG51bWJlciBvZiBsb2NhbCBhc3Npc3RhbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLXNpZ25pZmljYW50IGNvZWZmaWNpZW50IGZyb20gdGhlIHJlZ3Jlc3Npb24uCgpgYGB7cn0KZWZmX2Z1bGwgPC0gZ2dwcmVkaWN0KG1vZDIucGFydHksIHRlcm1zID0gIlNlYXRzTmF0UGFsLnByb3AiKQplZmZfZnVsbCAlPiUKICBwbG90ICsKICB5bGFiKCJQcmVkaWN0ZWQgbG9jYWwgc3RhZmYgc2l6ZSIpICsKICB4bGFiKCJQYXJ0eSBzaXplIGluIG5hdGlvbmFsIHBhcmxpYW1lbnQgKHByb3BvcnRpb24pIikgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBuYXRpb25hbCBwYXJ0eSBzaXplIG9uIE1FUCBsb2NhbCBzdGFmZiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICJDb250cm9sbGluZyBmb3IgT3Blbkxpc3QgYW5kIExhYm9yQ29zdCIpCmBgYAoKLS0tCgojIEZ1bmRhbWVudGFsIHZhcmlhdGlvbgoKLSAqKlExOioqIENhbiB5b3UgY2FsY3VsYXRlIHRoZSByZXNpZHVhbHMgZm9yIG1vZGVsIDEsIHRoZW4gbW9kZWwgMiBhbmQgc3RvcmUgdGhlbSBhcyBzZXBhcmF0ZSB2YXJpYWJsZXMgaW4gUj8KCmBgYHtyfQptb2QxIDwtIGxtKExvY2FsQXNzaXN0YW50cyB+IE9wZW5MaXN0LCBkZikKbW9kMiA8LSBsbShMb2NhbEFzc2lzdGFudHMgfiBPcGVuTGlzdCArIExhYm9yQ29zdCwgZGYpCgpkZiRyZXNpZF9tb2QxIDwtIHJlc2lkdWFscyhtb2QxKQpkZiRyZXNpZF9tb2QyIDwtIHJlc2lkdWFscyhtb2QyKQpgYGAKCi0tLQoKLSAqKlEyOioqIENhbiB5b3UgZGVzY3JpYmUgdGhlIHJlc2l0dWFscyBvZiB0aGUgdHdvIG1vZGVscyBpbiBhIGhpc3RvZ3JhbSwgdGhlbiBpbiBudW1iZXJzIGJ5IGNhbGN1bGF0aW5nIHRoZQptZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24/CgpgYGB7cn0KZ2dwbG90KGRhdGEuZnJhbWUociA9IHJlc2lkdWFscyhtb2QxKSksIGFlcyhyKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKwogIGdndGl0bGUoIlJlc2lkdWFsczogTW9kZWwgMSAoT3Blbkxpc3Qgb25seSkiKQoKZ2dwbG90KGRhdGEuZnJhbWUociA9IHJlc2lkdWFscyhtb2QyKSksIGFlcyhyKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKwogIGdndGl0bGUoIlJlc2lkdWFsczogTW9kZWwgMiAoT3Blbkxpc3QgKyBMYWJvckNvc3QpIikKCm1lYW4ocmVzaWR1YWxzKG1vZDEpKQpzZChyZXNpZHVhbHMobW9kMSkpCgptZWFuKHJlc2lkdWFscyhtb2QyKSkKc2QocmVzaWR1YWxzKG1vZDIpKSAgICAKYGBgCgotLS0KCi0gKipRMzoqKiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIHJlc2lkdWFscyBhbmQgd2h5PwotICoqQTM6KiogTW9kZWwgMidzIHJlc2lkdWFscyBoYXZlIGEgc21hbGxlciBzdGFuZGFyZCBkZXZpYXRpb24gKDMuMDggdnMgMy4xOCkgYmVjYXVzZSBhZGRpbmcgTGFib3JDb3N0IGFzIGEgcHJlZGljdG9yIGV4cGxhaW5zIG1vcmUgb2YgdGhlIHZhcmlhdGlvbiBpbiBMb2NhbEFzc2lzdGFudHMuIFRoZSBSwrIgaW5jcmVhc2VzIGZyb20gMC4wMjIgdG8gMC4wODEsIG1lYW5pbmcgTW9kZWwgMiBjYXB0dXJlcyBtb3JlIG9mIHRoZSBzeXN0ZW1hdGljIHBhdHRlcm4gaW4gdGhlIGRhdGEsIGxlYXZpbmcgbGVzcyB1bmV4cGxhaW5lZCB2YXJpYXRpb24gKGkuZS4gc21hbGxlciByZXNpZHVhbHMpLiBJbiBLaW5nIGV0IGFsLidzIHRlcm1zLCBhZGRpbmcgYSByZWxldmFudCBwcmVkaWN0b3IgcmVkdWNlcyB0aGUgZnVuZGFtZW50YWwgdW5jZXJ0YWludHkg4oCTIHRoZXJlIGlzIGxlc3MgImxlZnRvdmVyIiByYW5kb21uZXNzIHRoYXQgdGhlIG1vZGVsIGNhbm5vdCBhY2NvdW50IGZvci4KCi0tLQoKLSAqKlE0OioqIENhbiB5b3UgZXh0cmFjdCB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggZm9yIG1vZGVsIDI/CgpgYGB7cn0KdmNvdihtb2QyKQpgYGAKCi0tLQoKLSAqKlE1OioqIENhbiB5b3UgY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvciBmb3IgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIChwYXJhbWV0ZXJzKSBmcm9tIHRoZSB2YXJpYW5jZS0KY292YXJpYW5jZSBtYXRyaXg/Ci0gKipBNToqKiBUaGUgc3RhbmRhcmQgZXJyb3JzIGFyZSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGRpYWdvbmFsIGVsZW1lbnRzOiBJbnRlcmNlcHQgPSAwLjI4NiwgT3Blbkxpc3QgPSAwLjIyOCwgTGFib3JDb3N0ID0gMC4wMTAuIFRoZXNlIG1hdGNoIGV4YWN0bHkgd2hhdCBzdW1tYXJ5KG1vZDIpIHJlcG9ydHMg4oCTIGJlY2F1c2UgdGhhdCdzIHdoZXJlIHN0YW5kYXJkIGVycm9ycyBjb21lIGZyb20uCgpgYGB7cn0Kc3FydChkaWFnKHZjb3YobW9kMikpKQpgYGAKCi0tLQoKLSAqKlE2OioqIEFyZSB0aGVyZSBhbnkgcHJlZGljdG9ycyB0aGF0IGNvcnJlbGF0ZSBtb3JlIHRoYW4gb3RoZXJzPwotICoqQTY6KiogVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIEludGVyY2VwdCBhbmQgTGFib3JDb3N0IGVzdGltYXRlcyBpcyAtMC44NCwgd2hpY2ggaXMgdmVyeSBzdHJvbmcuIFRoaXMgbWVhbnM6IHdoZW4gdGhlIG1vZGVsIG92ZXJlc3RpbWF0ZXMgdGhlIGludGVyY2VwdCwgaXQgdGVuZHMgdG8gdW5kZXJlc3RpbWF0ZSB0aGUgZWZmZWN0IG9mIExhYm9yQ29zdCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIEludGVyY2VwdCBhbmQgT3Blbkxpc3QgaXMgbW9kZXJhdGUgKC0wLjQ0KSwgd2hpbGUgT3Blbkxpc3QgYW5kIExhYm9yQ29zdCBhcmUgbmVhcmx5IGluZGVwZW5kZW50ICgwLjA4KS4KCgpgYGB7cn0KY292MmNvcih2Y292KG1vZDIpKQpgYGAKCi0tLQoKLSAqKlE3OioqIEhvdyBkb2VzIHRoaXMgcmVsYXRlIHRvIEtpbmcgZXQgYWzigJlzIGFyZ3VtZW50PwotICoqQTc6KiogS2luZyBldCBhbC4gYXJndWUgdGhhdCB5b3UgbmVlZCB0aGUgZnVsbCB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCDigJMgbm90IGp1c3QgaW5kaXZpZHVhbCBzdGFuZGFyZCBlcnJvcnMg4oCTIHRvIHByb3Blcmx5IGFjY291bnQgZm9yIHVuY2VydGFpbnR5LiBUaGlzIGV4YW1wbGUgc2hvd3Mgd2h5OiB0aGUgaW50ZXJjZXB0IGFuZCBMYWJvckNvc3QgYXJlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQgKC0wLjg0KS4gSWYgeW91IHNpbXVsYXRlZCB0aGVzZSBwYXJhbWV0ZXJzIGluZGVwZW5kZW50bHkgKGlnbm9yaW5nIHRoYXQgY29ycmVsYXRpb24pLCB5b3Ugd291bGQgZ2V0IHVucmVhbGlzdGljIGNvbWJpbmF0aW9ucyB3aGVyZSBib3RoIGFyZSBvdmVyZXN0aW1hdGVkIHNpbXVsdGFuZW91c2x5LiBUaGUgY292YXJpYW5jZSBtYXRyaXggZW5zdXJlcyB0aGF0IHdoZW4geW91IHNpbXVsYXRlIHBhcmFtZXRlcnMgdG8gY2FsY3VsYXRlIHF1YW50aXRpZXMgbGlrZSBwcmVkaWN0ZWQgdmFsdWVzIG9yIGZpcnN0IGRpZmZlcmVuY2VzLCB0aGUgZHJhd3MgcmVzcGVjdCB0aGVzZSBjb25uZWN0aW9ucywgZ2l2aW5nIHlvdSBhY2N1cmF0ZSBjb25maWRlbmNlIGludGVydmFscy4gV2l0aG91dCBpdCwgeW91ciB1bmNlcnRhaW50eSBlc3RpbWF0ZXMgd291bGQgYmUgd3Jvbmcu