1. Classical Test Theory
In this lecture I explain and illustrate concepts from measurement
theory, with the focus being on reliability. Classical test theory (CTT)
has been the foundation of psychological measurement for many years.
Although measurement theory has evolved over the years to include
Generalizability Theory and Item Response Theory, I will limit my
discussion to CTT as it dovetails nicely with the basic concepts found
in confirmatory factor analysis (CFA). Much of the introduction is
borrowed from a paper I published in 2013. I will use the nouns
instrument, measure, and scale interchangeably to refer to the means by
which we obtain data from people. I created this document in R
Markdown.
1.1 The Beginning
One of the most fundamental tenets of
measurement theory was first proposed by Carl Spearman in 1904 when
working to develop a means to measure individual differences in
intelligence, a stable person characteristic, or trait. Spearman
conceived of every measurement, or observed score, \(X_i\), as consisting of two components, a
true score on the construct of interest, \(T_i\), and an error score, \(e_i\), so we can write:
\[
X_i = T_i + e_i \tag{1}
\]
Because they contain error, observed values of \(X_i\) are considered fallible. The true
score, \(T_i\), is the score that would
be obtained under ideal or perfect conditions of measurement. Spearman’s
formulation has become known as true-score theory or classic measurement
theory (CTT). Because both \(T_i\) and
\(e_i\) are unknowns, this formula
cannot be used to estimate the measurement error in the observed scores
without further assumptions.
Assumption 1: for an individual, the
construct being measured is constant (over some specified time period)
and the errors in measurement are random. This suggests that if an
individual were to be measured an infinite number of times a series of
X values would result, each consisting of the same true score
but differing due to different error scores. Being random, the expected
value of the error scores is zero, \(E(e_i) =
0\). Assumption 2: given assumption 1, the true score is
equal to the expected value of the observed scores over an infinite
number of repeated measurements (made under similar conditions), \(T_i = E(X_i)\). Assumption 3:
observed differences among individuals may be due to differences in
their true scores or due to differences in their error scores. This
implies that the variance of observed scores is a composite of the
variance of true scores and the variance of error scores:
\[
\sigma^2_X = \sigma^2_T + \sigma^2_e \tag{2}
\] and a little algebra shows that \[
\frac{\sigma^2_T}{\sigma^2_X} = 1 - \frac{\sigma^2_e}{\sigma^2_X}
\tag{3}
\]
This last piece, the extent to which a set of measurements is free
from random error variance is reliability. As a
proportion, reliability can range from 0 to 1; it equals 1 when all the
observed variance in a set of measurements is due only to true-score
variance, that is, when there are no random errors of measurement, and
it equals 0 when all the observed variance is due to random error
variance. This definition implies that some measurement errors can be
random while others are systematic. When measurement error is
systematic, it is referred to as bias. In the remainder of this lecture
we focus on random measurement error.
1.2 Covariance and Correlation
Variance is a summary statistic that indicates the variation in a set
of scores from their mean (and standard deviation is the square root of
variance). Covariance indicates the covariation of two sets of scores
from their respective means. Covariance, and correlation have been, and
continue to be extremely useful in measurement theory. To briefly
illustrate covariance assume that we have measured three people on two
variables x and y; their x scores are: 2, 4,
and 6, and their y scores are: 7, 5, and 9. The means are
readily calculated as 4 for x and 7 for y. If we
express each person’s scores as a deviation from the respective means we
get -2, 0, 2 for x and 0, -2, 2 for y, respectively.
If we multiply the pairs of deviation scores, total them up (-2)(0) +
(0)(-2) + (2)(2) = 4, and divide by the number of people contributing
scores, 4/3, we obtain covariance, 1.33. Covariance can be either
positive or negative, can range from negative to positive infinity, and
its magnitude is dependent on the metric(s) of the two variables
involved. Therefore it is difficult to know whether 1.33 represents a
lot or a little covariation.
A more convenient metric for expressing
covariation is the correlation coefficient \(r\). The correlation coefficient has the
advantage that it is standardized; it is equal to 1.0 when there is
perfect positive covariation between the two sets of scores, -1.0 when
there is perfect negative covariation between the two sets of scores,
and equal to 0.0 when there is no covariation. If a covariance is
divided by the product of the standard deviations for x and
y, we obtain \(r(x, y)\), the
correlation between x and y. In the current example
\(r(x, y) = 1.33/(1.63)(1.63) = .50\).
For this reason, we often refer to a correlation as a standardized
covariance. Another useful property of the correlation coefficient
is that its square represents the proportion of variance shared between
x and y. In this example \(r(x, y)^2 = .25\), so we may state that 25%
of the variance in x is shared with y, and 25% of the
variance in y is shared with x.
1.3 Reliability Defined
According to CTT, reliability is the proportion
of variance in a set of measurements associated with true-score
variance. In other words if we could correlate true scores with observed
scores and square the result as, \(r(T_i,
X_i)^2\), this would indicate the proportion of variance in the
observed scores that is shared with the true scores. We can now write a
formal definition:
\[
reliability = r(T_i, X_i)^2 = \frac{\sigma^2_T}{\sigma^2_X} = 1 -
\frac{\sigma^2_e}{\sigma^2_X} \tag{4}
\]
Recall that true scores are never known, and so we must derive a
means of estimating \(r(T_i, X_i)^2\)
from observable scores.
Measurement theorists (psychometricians) have
studied random measurement error for a long time. In two seminal papers
published in the same issue of the British Journal of
Psychology in 1910, Carl Spearman and William Brown showed that
when multiple measurements of a construct (e.g., intelligence, anxiety,
emotional well-being, etc.) are obtained from the same individual and
combined, the ratio of true-score variance to observed-score variance in
the composite score increases. In other words, one way to reduce random
measurement error is to create instruments that contain multiple
measurements and to aggregate these measurements together when defining
the observed score for an individual. Spearman and Brown also showed
that as the number of similar measurements being combined increases, so
does the reliability of the composite scores. In essence, this is why
today most psychological scales are formed by aggregating responses to
multiple items.
1.4 Cronbach’s Coefficient \(\alpha\)
One way of estimating reliability from observed scores on a
multi-item scale is Cronbach’s \(\alpha\). Cronbach developed this
coefficient in 1951 before CFA existed. If we consider a composite score
made up of \(k\) items, then \(\alpha\) is defined as the ratio of
inter-item covariance to composite-score variance weighted by \(k/(k - 1)\). The weight, \(k/(k - 1)\), corrects for the proportion of
variance in any item which is due to the same elements as the
covariance. In other words, \(\alpha\)
is an estimate of the proportion of true-score variance in the
multi-item scale scores. As a proportion it can range from 0.0 to 1.0,
and will only be equal to 1.0 when all the variance in observed scores
is true-score variance. Cronbach’s \(\alpha\) is easily calculated from the item
covariance matrix \(\mathbf C\).
\[\mathbf C =
\begin{bmatrix}
\sigma^2_{1,1} & \sigma_{1,2} & \cdots & \sigma_{1,k} \\
\sigma_{2,1} & \sigma^2_{2,2} & \cdots & \sigma_{2,k} \\
\vdots & \vdots & \ddots & \vdots \\
\sigma_{k,1} & \sigma_{k,2} & \cdots & \sigma^2_{k,k}
\end{bmatrix}\]
The diagonal elements are item variances and the off-diagonal
elements are covariances. The ratio of inter-item covariance to
composite-score variance is equal to 1 minus the ratio of the sum of the
item variances (diagonal elements of \(\mathbf
C\)) to the sum of all the elements in \(\mathbf C\). This ratio first is
calculated, then subtracted from 1, and finally multiplied by \(k/(k - 1)\).
\[
\alpha =\frac{k}{k - 1} \left[1-\frac{\sum_{i=1}^k \sigma^2_{ii}}
{\sum_{i=1}^k \sigma^2_{ii} + 2\sum_{i<j}^k\sigma_{ij}} \right]
\tag{5}
\] Although Cronbach’s \(\alpha\) is by far the most commonly
reported coefficient of reliability, there are others. One of these is
\(\omega\) which can be calculated from
CFA parameter estimates. More on this below.
2. The CFA Model
CFA is a type of structural equation model (SEM) that focuses on the
relations between observed variables and the latent variables (i.e.,
factors) hypothesized to underlie them. I will not go into the math
here. CFA models can be used estimate reliability. When working with SEM
we often rely on diagrams for presenting our hypothesized model and
results. These path diagrams represent observed variables as squares,
latent variables as circles, and causal influence with arrows. Figure 1
is a very basic path diagram illustrating CTT; the variance in the
observed variable X is the sum of unobserved True-score
variance and error variance.
lx<-matrix(1,1,1)
td<-diag(1,nrow(lx))
ph<-matrix(1,1,1)
mod0 <- lisrelModel(LX=lx, TD=td, PH=ph)
semPaths(mod0, as.expression=c("nodes","edges"), sizeMan = 8,
sizeLat = 10, style="lisrel", rotation = 2,
residScale=15, edge.color="black",
edge.label.cex = 1.5, label.cex=1.5, nodeLabels=c("X", "T"), edgeLabels=c("","e"))
Before we consider reliability and CFA models, we need a bit more theory
for dealing with several correlations at the same time.
2.1 Path Analysis Theory
Path Analysis (PA) is a method for decomposing the correlation
coefficients within a system of causally related variables. PA applies
multiple linear regression and was developed by zoologist Sewall Wright
in 1934. Path coefficients are standardized regression coefficients
obtained from a set of inter-related linear regression models. PA
allows/requires the investigator to theorize about the causal relations
among a set of variables and apply his/her thinking to decompose the
correlations among the variables.
To illustrate, consider two variables \(x\) and \(y\) that are correlated. We may theorize
about why they are correlated using PA. They could correlate
because \(x\) causes \(y\) \((x
\rightarrow y)\), or because \(y\) causes \(x\) \((y
\rightarrow x)\), or because \(x\) and \(y\) share a common cause, \(z\), \((x
\leftarrow z \rightarrow y)\). The first two “theories” are
referred to as direct effects, the third one is called a spurious
effect.
PA makes certain assumptions:
1. the relations among the variables are linear,
additive, and causal.
2. The residual terms are uncorrelated. That is,
each residual is not correlated with the variables that precede it in
the model.
3. There is a one-way causal flow in the system.
Reciprocal causation between variables (i.e., feedback loops) is ruled
out.
4. The variables are measured on an
interval-level scale.
5. The variables are measured without random
error.
These assumptions provide part of the framework for applying
structural equation models. We should keep them in mind.
2.2 CTT & CFA
CFA estimates the correlations among observed variables in terms of
underlying latent variables. This is convenient because we can now
represent our CTT-based measurement model in mathematical terms (as a
CFA model) and test it on data. Consider a generic case. We want to
measure individual differences in some construct (anxiety for example).
We know CTT and so we create multiple (three) statements (survey items)
that on the face of it capture the construct of interest. Several
individuals then read the the statements and indicate how much they
agree, or disagree with each. The data can be summarized in a 3x3
covariance matrix.
CTT leads us to hypothesize that the variances
of the three items are influenced by one underlying latent variable
representing our construct, We can map this hypothesis into a CFA model
where the three items \(x_1\), \(x_2\), and \(x_3\) are indicators of one underlying
latent variable, \(\xi_1\). Our model
is shown as a path diagram in Figure 2.
Specifying a generic CFA the model using LISREL notation.
# creating 1 factor w 3 indicators
# Lambda matrices:
lambdax <- matrix(0,3,1)
lambdax[1:3,1] <-1
# Phi matrix:
LatX <- matrix(1,1,1) #phi
# Theta matrix:
thd <- diag(1,nrow(lambdax))
# Combine matrices into a model:
mod1 <- lisrelModel(LX=lambdax, TD=thd, PH=LatX)
Plotting CFA path diagram:
# Plot path diagram using semPlot::semPaths sizelat=4, sizeman=3
#--making path diagram ---------------------mar(bot,lft,top,rgt) was M 6 L 8
semPaths(mod1, as.expression=c("nodes","edges"), sizeMan = 9,
sizeLat = 12, style="lisrel", rotation = 3,
residScale=14, edge.color="black",
edge.label.cex = 1.5, label.cex=1.5)
Figure 2 is the graphicical representation of
our measurement model using LISREL notation. Squares denote observed
variables (indicators) and the circle represents the latent variable or
construct of interest. Each indicator has a coefficient \(\lambda_{i1}\) (lambda) linking it to the
latent variable \(\xi_1\) representing
our construct and a coefficient \(\theta_{ii}\) (theta) expressing its
measurement error variance. PA tells us that two variables may be
correlated because they share a common cause. For example, because \(x_1\) and \(x_2\) share a common cause \(\xi_1\), our model implies that \(r(x_1 x_2) = \lambda_{11}\lambda_{21}\).
The same can be said about the other two correlations, \(r(x_1,x_3) = \lambda_{11}\lambda_{31}\) and
\(r(x_2,x_3) =
\lambda_{21}\lambda_{31}\). If the estimated correlations from
our CFA model are consistent with the observed correlations, there is
support for the hypothesis that the three items are measuring the same
underlying construct.
2.3 Reliability Coefficient \(\omega\)
One way to interpret the \(\lambda_{ij}\) coefficients is to think of
them as correlations between the indicator variables and the latent
variable. Squaring them tells us the proportion of variance shared
between the item and the latent construct it is hypothesized to measure.
In the CTT framework this is the proportion of true-score variance in
the observed variable, so larger values (approaching 1.0) are ideal. We
can use the parameters from our CFA model to estimate the reliability of
our multi-item scale using another index \(\omega\) (omega) which is defined as:
\[
\omega = \frac{\sum^k_{i=1}\lambda_i^2}
{\sum^k_{i=1}\lambda_i^2 + \sum^k_{i=1}\theta_{ii}} \tag{6}
\] The numerator represents true-score variance and the
denominator represents observed variance. Equation 6 can be applied to
standardized coefficients (as is done here) and to undstandardized
coefficients.
2.4 CFA using lavaan
Specifying models in lavaan is pretty straightforward.
There are different operators for specifying various relations among
variables. Latent variables are defined using the =~
operator with the latent variable on the left and the indicator
variables on the right. In the example below I show the R code for the
how to specify and run a very simple CFA model in lavaan.
One nice feature is that we don’t always need the raw data file; we can
work from the covariance matrix, or correlation matrix plus a vector of
standard deviations and the sample size.
3. An Example
This example involves three items hypothesized to measure anxiety
related to COVID-19:
ax1: I am afraid of COVID-19.
ax2: Thinking about COVID-19 makes me feel threatened.
ax3: I am stressed around people because I worry I’ll catch
COVID-19.
The response options were: 1 ‘Strongly Disagree’, 2 ‘Disagree’, 3
‘Neither Agree nor Disagree’, 4 ‘Agree’, and 5 ‘Strongly Agree’. These
items were included in a survey of faculty, staff, and students
(N = 38,921) at a major university in the Southeast United
States during the first few weeks of the pandemic in 2020.
Reading in the data:
# reading in corr matrix
corr <- '
1.000
.728 1.000
.714 .713 1.000 '
# add variable names and convert to full correlation matrix
corrfull <- lavaan::getCov(corr, names=c("ax1","ax2","ax3"))
# add SDs and convert to full covariance matrix
covfull <- lavaan::cor2cov(corrfull, sds=c(1.163, 1.127, 1.169))
# observed covariance matrix N=38921
# vector of means that may be needed (scores range from 1 to 5)
Mns<- c(3.26, 2.76, 3.00)
3.1 Correlation Table
Using sjPlot::tab_corr to create this nice table.
# Uses sjPlot to print a nice looking correlation table
sjPlot::tab_corr(corrfull, na.deletion = "listwise", digits = 3, triangle = "lower",
title = "Correlations among observed variables (N =38,921)",
string.diag=c('1.000','1.000','1.000'))
Correlations among observed variables (N =38,921)
|
|
ax1
|
ax2
|
ax3
|
|
ax1
|
1.000
|
|
|
|
ax2
|
0.728
|
1.000
|
|
|
ax3
|
0.714
|
0.713
|
1.000
|
|
Computed correlation used pearson-method with listwise-deletion.
|
ax1: I am afraid of COVID-19.
ax2: Thinking about COVID-19 makes me feel threatened.
ax3: I am stressed around people because I worry I’ll catch
COVID-19.
CCT posits that because these items are measurements of the same
construct, responses to them should be correlated. Notice that the
correlations range from .713 to .728. Consider the correlation between
the first two items \(r(ax1, ax2) =
.728\). If we square this correlation we get the proportion of
variance that these two items share \(r^2(ax1,
ax2) = .728^2 = 530\).
3.2 CFA of COVID Anxiety Scale
Specify the model:
# specify the CFA model
model1 <- ' COVID_Axty =~ ax1 + ax2 + ax3 '
Running the model:
# fit the path model
fit <- lavaan::cfa(model1, sample.cov=covfull, sample.nobs=38921, std.lv=T)
3.3 Results
Plotting results as path diagram:
# making path CFA diagram
fig3 <- semPlot::semPaths(fit, whatLabels = "std", layout = "tree2",
rotation = 1, style = "lisrel", optimizeLatRes = TRUE, nDigits=3,
structural = FALSE, layoutSplit = FALSE,
intercepts = FALSE, residuals = T,
curve = 3, curvature = 3, nCharNodes = 8,
sizeLat = 24, sizeLat2 = 12, sizeMan = 9,
edge.label.cex = 1.5, label.cex=1.0, residScale=14,
edge.color = "black", edge.label.position = .40, DoNotPlot=T)
#--working with semptools to modify path diagrams
fig3_1 <- fig3 |> semptools::mark_sig(fit, alpha = c("(n.s.)" = 1.00, "*" = .05)) #adding *, ns
plot(fig3_1)
ax1: I am afraid of COVID-19.
ax2: Thinking about COVID-19 makes me feel threatened.
ax3: I am stressed around people because I worry I’ll catch
COVID-19.
Let’s examine the parameter estimates from our model shown in Figure 3.
The \(\lambda\) for ax1 is
.854 and the \(\lambda\) for
ax2 is .853. These are the estimated correlations of these
items with the underlying construct COVID Anxiety. If we think about the
notion of spurious effects from PA, we can say that the reason responses
to these two items are so highly correlated is because they are both
being strongly influenced by the same underlying construct,
COVID-Anxiety. If we multiply these two \(\lambda\)s together we get .728 which is
the observed correlation \(r(ax1,ax2)\)
shown in the correlation table above. The same can be done to reproduce
the other two correlations.
The three \(\theta\)s at the bottom of
Figure 3 show the estimated proportion of measurement error variance in
each item. If considered separately, rather than as a composite, roughly
28% of the variance in each item is measurement error. Squaring the
\(\lambda\)s gives the proportion of
true-score variance being “captured” by each item. Note that because all
coefficients are standardized we have \(\lambda^2 + \theta = 1.0\) for each
item
Full output:
I used the summary() function to
write lavaan results to the console. There is a lot of
output to review. The first bit is model fit statistics. Because this
model is just-identified (there are as many parameters as there are data
elements in the covariance matrix) the degrees of freedom are 0 and the
model fit is perfect. Next we see Parameter Estimates
beginning with the Latent Variables section that shows the factor
loadings \(\lambda_{ij}\). The column
labeled Estimate gives the unstandardized coefficients, and the
column Std.all gives the completely standardized coefficients
that are shown in Figure 3. Next come the Variances. Variables prefixed
with a “.” indicate residual terms so these are the \(\theta_{ii}\) estimates. Finally, we see
the \(R^2\) values indicating the
proportion of variance that each item shares with the latent
variable.
summary(fit, fit.measures=T, standardized=T, rsquare=T)
## lavaan 0.6.15 ended normally after 12 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 6
##
## Number of observations 38921
##
## Model Test User Model:
##
## Test statistic 0.000
## Degrees of freedom 0
##
## Model Test Baseline Model:
##
## Test statistic 64012.579
## Degrees of freedom 3
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.000
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -150279.741
## Loglikelihood unrestricted model (H1) -150279.741
##
## Akaike (AIC) 300571.482
## Bayesian (BIC) 300622.898
## Sample-size adjusted Bayesian (SABIC) 300603.830
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.000
## P-value H_0: RMSEA <= 0.050 NA
## P-value H_0: RMSEA >= 0.080 NA
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.000
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## COVID_Axty =~
## ax1 0.993 0.005 198.586 0.000 0.993 0.854
## ax2 0.961 0.005 198.199 0.000 0.961 0.853
## ax3 0.978 0.005 192.966 0.000 0.978 0.836
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ax1 0.367 0.004 85.404 0.000 0.367 0.271
## .ax2 0.347 0.004 85.954 0.000 0.347 0.273
## .ax3 0.411 0.004 93.077 0.000 0.411 0.301
## COVID_Axty 1.000 1.000 1.000
##
## R-Square:
## Estimate
## ax1 0.729
## ax2 0.727
## ax3 0.699
3.4 Reliability Analysis
The semTools package has a function
compRelSEM that reads the lavaan output and
returns the reliability estimates for each latent variable. Setting the
options ‘tau.eq=T’ and ‘obs.var=T’ produces equivalent to Cronbach’s
reliability coefficient \(\alpha\)
(alpha). Setting ‘tau.eq=F’ produces the \(\omega\) (omega) coefficient of
reliability. In this exmaple the two are quite similar.
relalpha<-semTools::compRelSEM(fit, tau.eq=T, obs.var=T)
The Cronbach’s \(\alpha\) reliability for COVID-Anxiety
Scale (using eq. 5) is 0.8842327.
relomega<-semTools::compRelSEM(fit, tau.eq=F, obs.var=T)
The \(\omega\)
reliability coefficient for COVID-Anxiety Scale (using eq. 6) is
0.8843122.
5. References
Beckstead, J.W. (2013). On measurements and
their quality: Paper 1. Reliability - history, issues and procedures.
International Journal of Nursing Studies, 50 (7),
968-973.
Brown, W., (1910). Some experimental results in the correlation of
mental abilities. British Journal of Psychology 3,
296–322.
Cronbach, L. J. (1951). Coefficient alpha and the internal structure of
tests. Psychometrika, 16 (3), 297–334.
Spearman, C., (1904). General intelligence: objectively determined and
measured. American Journal of Psychology 15, 201–293.
Spearman, C., (1910). Correlation calculated with faulty data.
British Journal of Psychology 3, 271–295.
I Wright, S. (1934). The method of path coefficients. Annals of
Mathematical Statistics, 5, 161-215.
LS0tDQp0aXRsZTogIkFuIEludHJvZHVjdGlvbiB0byBQc3ljaG9tZXRyaWMgTWVhc3VyZW1lbnQgVGhlb3J5ICYgQ29uZmlybWF0b3J5IEZhY3RvciBBbmFseXNpcy4iDQphdXRob3I6ICJKYXNvbiBCZWNrc3RlYWQiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCmlmICghcmVxdWlyZSgicGFjbWFuIikpIGluc3RhbGwucGFja2FnZXMoInBhY21hbiIpDQpsaWJyYXJ5KHBhY21hbikNCiMgTG9hZCBpbnN0YWxsZWQgcGFja2FnZXMsIGluc3RhbGwgYW5kIGxvYWQgdGhlIHBhY2thZ2UgaWYgbm90IGluc3RhbGxlZA0KcGFjbWFuOjpwX2xvYWQoaGVyZSwgcmlvLCBjb25mbGljdGVkLCB0aWR5dmVyc2UsIA0KICAgICAgICAgICAgICAgamFuaXRvciwgc3VtbWFyeXRvb2xzLCBza2ltciwgRGF0YUV4cGxvcmVyLCBpbnNwZWN0ZGYsIEhtaXNjLA0KICAgICAgICAgICAgICAgbGF2YWFuLCBzZW1Ub29scywgc2Vtb3V0cHV0LCBzZW1QbG90LCBzalBsb3QsIHBzeWNoLCByZWFkciwgZHBseXIsDQogICAgICAgICAgICAgICBHUEFyb3RhdGlvbiwgcHN5Y2hUb29scywgc2VtcHRvb2xzLHRpbnl0ZXgpDQpgYGANCg0KIyMgMS4gQ2xhc3NpY2FsIFRlc3QgVGhlb3J5DQpJbiB0aGlzIGxlY3R1cmUgSSBleHBsYWluIGFuZCBpbGx1c3RyYXRlIGNvbmNlcHRzIGZyb20gbWVhc3VyZW1lbnQgdGhlb3J5LCB3aXRoIHRoZSBmb2N1cyBiZWluZyBvbiByZWxpYWJpbGl0eS4gQ2xhc3NpY2FsIHRlc3QgdGhlb3J5IChDVFQpIGhhcyBiZWVuIHRoZSBmb3VuZGF0aW9uIG9mIHBzeWNob2xvZ2ljYWwgbWVhc3VyZW1lbnQgZm9yIG1hbnkgeWVhcnMuIEFsdGhvdWdoIG1lYXN1cmVtZW50IHRoZW9yeSBoYXMgZXZvbHZlZCBvdmVyIHRoZSB5ZWFycyB0byBpbmNsdWRlIEdlbmVyYWxpemFiaWxpdHkgVGhlb3J5IGFuZCBJdGVtIFJlc3BvbnNlIFRoZW9yeSwgSSB3aWxsIGxpbWl0IG15IGRpc2N1c3Npb24gdG8gQ1RUIGFzIGl0IGRvdmV0YWlscyBuaWNlbHkgd2l0aCB0aGUgYmFzaWMgY29uY2VwdHMgZm91bmQgaW4gY29uZmlybWF0b3J5IGZhY3RvciBhbmFseXNpcyAoQ0ZBKS4gTXVjaCBvZiB0aGUgaW50cm9kdWN0aW9uIGlzIGJvcnJvd2VkIGZyb20gYSBwYXBlciBJIHB1Ymxpc2hlZCBpbiAyMDEzLiBJIHdpbGwgdXNlIHRoZSBub3VucyBpbnN0cnVtZW50LCBtZWFzdXJlLCBhbmQgc2NhbGUgaW50ZXJjaGFuZ2VhYmx5IHRvIHJlZmVyIHRvIHRoZSBtZWFucyBieSB3aGljaCB3ZSBvYnRhaW4gZGF0YSBmcm9tIHBlb3BsZS4gSSBjcmVhdGVkIHRoaXMgZG9jdW1lbnQgaW4gUiBNYXJrZG93bi4NCg0KDQojIyMgMS4xIFRoZSBCZWdpbm5pbmcNCnwgT25lIG9mIHRoZSBtb3N0IGZ1bmRhbWVudGFsIHRlbmV0cyBvZiBtZWFzdXJlbWVudCB0aGVvcnkgd2FzIGZpcnN0IHByb3Bvc2VkIGJ5IENhcmwgU3BlYXJtYW4gaW4gMTkwNCB3aGVuIHdvcmtpbmcgdG8gZGV2ZWxvcCBhIG1lYW5zIHRvIG1lYXN1cmUgaW5kaXZpZHVhbCBkaWZmZXJlbmNlcyBpbiBpbnRlbGxpZ2VuY2UsIGEgc3RhYmxlIHBlcnNvbiBjaGFyYWN0ZXJpc3RpYywgb3IgdHJhaXQuIFNwZWFybWFuIGNvbmNlaXZlZCBvZiBldmVyeSBtZWFzdXJlbWVudCwgb3Igb2JzZXJ2ZWQgc2NvcmUsICRYX2kkLCBhcyBjb25zaXN0aW5nIG9mIHR3byBjb21wb25lbnRzLCBhIHRydWUgc2NvcmUgb24gdGhlIGNvbnN0cnVjdCBvZiBpbnRlcmVzdCwgJFRfaSQsIGFuZCBhbiBlcnJvciBzY29yZSwgJGVfaSQsIHNvIHdlIGNhbiB3cml0ZToNCiQkDQpYX2kgPSBUX2kgKyBlX2kgXHRhZ3sxfQ0KJCQNCg0KQmVjYXVzZSB0aGV5IGNvbnRhaW4gZXJyb3IsIG9ic2VydmVkIHZhbHVlcyBvZiAkWF9pJCBhcmUgY29uc2lkZXJlZCBmYWxsaWJsZS4gVGhlIHRydWUgc2NvcmUsICRUX2kkLCBpcyB0aGUgc2NvcmUgdGhhdCB3b3VsZCBiZSBvYnRhaW5lZCB1bmRlciBpZGVhbCBvciBwZXJmZWN0IGNvbmRpdGlvbnMgb2YgbWVhc3VyZW1lbnQuIFNwZWFybWFu4oCZcyBmb3JtdWxhdGlvbiBoYXMgYmVjb21lIGtub3duIGFzIHRydWUtc2NvcmUgdGhlb3J5IG9yIGNsYXNzaWMgbWVhc3VyZW1lbnQgdGhlb3J5IChDVFQpLiBCZWNhdXNlIGJvdGggJFRfaSQgIGFuZCAkZV9pJCBhcmUgdW5rbm93bnMsIHRoaXMgZm9ybXVsYSBjYW5ub3QgYmUgdXNlZCB0byBlc3RpbWF0ZSB0aGUgbWVhc3VyZW1lbnQgZXJyb3IgaW4gdGhlIG9ic2VydmVkIHNjb3JlcyB3aXRob3V0IGZ1cnRoZXIgYXNzdW1wdGlvbnMuDQogDQp8ICpBc3N1bXB0aW9uIDE6KiBmb3IgYW4gaW5kaXZpZHVhbCwgdGhlIGNvbnN0cnVjdCBiZWluZyBtZWFzdXJlZCBpcyBjb25zdGFudCAob3ZlciBzb21lIHNwZWNpZmllZCB0aW1lIHBlcmlvZCkgYW5kIHRoZSBlcnJvcnMgaW4gbWVhc3VyZW1lbnQgYXJlIHJhbmRvbS4gVGhpcyBzdWdnZXN0cyB0aGF0IGlmIGFuIGluZGl2aWR1YWwgd2VyZSB0byBiZSBtZWFzdXJlZCBhbiBpbmZpbml0ZSBudW1iZXIgb2YgdGltZXMgYSBzZXJpZXMgb2YgKlgqIHZhbHVlcyB3b3VsZCByZXN1bHQsIGVhY2ggY29uc2lzdGluZyBvZiB0aGUgc2FtZSB0cnVlIHNjb3JlIGJ1dCBkaWZmZXJpbmcgZHVlIHRvIGRpZmZlcmVudCBlcnJvciBzY29yZXMuIEJlaW5nIHJhbmRvbSwgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBlcnJvciBzY29yZXMgaXMgemVybywgJEUoZV9pKSA9IDAkLiAqQXNzdW1wdGlvbiAyOiogZ2l2ZW4gYXNzdW1wdGlvbiAxLCB0aGUgdHJ1ZSBzY29yZSBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIG9ic2VydmVkIHNjb3JlcyBvdmVyIGFuIGluZmluaXRlIG51bWJlciBvZiByZXBlYXRlZCBtZWFzdXJlbWVudHMgKG1hZGUgdW5kZXIgc2ltaWxhciBjb25kaXRpb25zKSwgJFRfaSA9IEUoWF9pKSQuICpBc3N1bXB0aW9uIDM6KiBvYnNlcnZlZCBkaWZmZXJlbmNlcyBhbW9uZyBpbmRpdmlkdWFscyBtYXkgYmUgZHVlIHRvIGRpZmZlcmVuY2VzIGluIHRoZWlyIHRydWUgc2NvcmVzIG9yIGR1ZSB0byBkaWZmZXJlbmNlcyBpbiB0aGVpciBlcnJvciBzY29yZXMuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSB2YXJpYW5jZSBvZiBvYnNlcnZlZCBzY29yZXMgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHZhcmlhbmNlIG9mIHRydWUgc2NvcmVzIGFuZCB0aGUgdmFyaWFuY2Ugb2YgZXJyb3Igc2NvcmVzOg0KJCQNClxzaWdtYV4yX1ggPSBcc2lnbWFeMl9UICsgXHNpZ21hXjJfZSBcdGFnezJ9IA0KJCQNCmFuZCBhIGxpdHRsZSBhbGdlYnJhIHNob3dzIHRoYXQNCiQkDQpcZnJhY3tcc2lnbWFeMl9UfXtcc2lnbWFeMl9YfSA9IDEgLSBcZnJhY3tcc2lnbWFeMl9lfXtcc2lnbWFeMl9YfSBcdGFnezN9DQokJA0KDQpUaGlzIGxhc3QgcGllY2UsIHRoZSBleHRlbnQgdG8gd2hpY2ggYSBzZXQgb2YgbWVhc3VyZW1lbnRzIGlzIGZyZWUgZnJvbSByYW5kb20gZXJyb3IgdmFyaWFuY2UgaXMgKipyZWxpYWJpbGl0eSoqLiBBcyBhIHByb3BvcnRpb24sIHJlbGlhYmlsaXR5IGNhbiByYW5nZSBmcm9tIDAgdG8gMTsgaXQgZXF1YWxzIDEgd2hlbiBhbGwgdGhlIG9ic2VydmVkIHZhcmlhbmNlIGluIGEgc2V0IG9mIG1lYXN1cmVtZW50cyBpcyBkdWUgb25seSB0byB0cnVlLXNjb3JlIHZhcmlhbmNlLCB0aGF0IGlzLCB3aGVuIHRoZXJlIGFyZSBubyByYW5kb20gZXJyb3JzIG9mIG1lYXN1cmVtZW50LCBhbmQgaXQgZXF1YWxzIDAgd2hlbiBhbGwgdGhlIG9ic2VydmVkIHZhcmlhbmNlIGlzIGR1ZSB0byByYW5kb20gZXJyb3IgdmFyaWFuY2UuIFRoaXMgZGVmaW5pdGlvbiBpbXBsaWVzIHRoYXQgc29tZSBtZWFzdXJlbWVudCBlcnJvcnMgY2FuIGJlIHJhbmRvbSB3aGlsZSBvdGhlcnMgYXJlIHN5c3RlbWF0aWMuIFdoZW4gbWVhc3VyZW1lbnQgZXJyb3IgaXMgc3lzdGVtYXRpYywgaXQgaXMgcmVmZXJyZWQgdG8gYXMgYmlhcy4gSW4gdGhlIHJlbWFpbmRlciBvZiB0aGlzIGxlY3R1cmUgd2UgZm9jdXMgb24gcmFuZG9tIG1lYXN1cmVtZW50DQplcnJvci4NCg0KDQojIyMgMS4yIENvdmFyaWFuY2UgYW5kIENvcnJlbGF0aW9uDQpWYXJpYW5jZSBpcyBhIHN1bW1hcnkgc3RhdGlzdGljIHRoYXQgaW5kaWNhdGVzIHRoZSB2YXJpYXRpb24gaW4gYSBzZXQgb2Ygc2NvcmVzIGZyb20gdGhlaXIgbWVhbiAoYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdmFyaWFuY2UpLiBDb3ZhcmlhbmNlIGluZGljYXRlcyB0aGUgY292YXJpYXRpb24gb2YgdHdvIHNldHMgb2Ygc2NvcmVzIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBtZWFucy4gQ292YXJpYW5jZSwgYW5kIGNvcnJlbGF0aW9uIGhhdmUgYmVlbiwgYW5kIGNvbnRpbnVlIHRvIGJlIGV4dHJlbWVseSB1c2VmdWwgaW4gbWVhc3VyZW1lbnQgdGhlb3J5LiBUbyBicmllZmx5IGlsbHVzdHJhdGUgY292YXJpYW5jZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIG1lYXN1cmVkIHRocmVlIHBlb3BsZSBvbiB0d28gdmFyaWFibGVzICp4KiBhbmQgKnkqOyB0aGVpciAqeCogc2NvcmVzIGFyZTogMiwgNCwgYW5kIDYsIGFuZCB0aGVpciAqeSogc2NvcmVzIGFyZTogNywgNSwgYW5kIDkuIFRoZSBtZWFucyBhcmUgcmVhZGlseSBjYWxjdWxhdGVkIGFzIDQgZm9yICp4KiBhbmQgNyBmb3IgKnkqLiBJZiB3ZSBleHByZXNzIGVhY2ggcGVyc29u4oCZcyBzY29yZXMgYXMgYSBkZXZpYXRpb24gZnJvbSB0aGUgcmVzcGVjdGl2ZSBtZWFucyB3ZSBnZXQgLTIsIDAsIDIgZm9yICp4KiBhbmQgMCwgLTIsIDIgZm9yICp5KiwgcmVzcGVjdGl2ZWx5LiBJZiB3ZSBtdWx0aXBseSB0aGUgcGFpcnMgb2YgZGV2aWF0aW9uIHNjb3JlcywgdG90YWwgdGhlbSB1cCAoLTIpKDApICsgKDApKC0yKSArICgyKSgyKSA9IDQsIGFuZCBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiBwZW9wbGUgY29udHJpYnV0aW5nIHNjb3JlcywgNC8zLCB3ZSBvYnRhaW4gY292YXJpYW5jZSwgMS4zMy4gQ292YXJpYW5jZSBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCBjYW4gcmFuZ2UgZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZSBpbmZpbml0eSwgYW5kIGl0cyBtYWduaXR1ZGUgaXMgZGVwZW5kZW50IG9uIHRoZSBtZXRyaWMocykgb2YgdGhlIHR3byB2YXJpYWJsZXMgaW52b2x2ZWQuIFRoZXJlZm9yZSBpdCBpcyBkaWZmaWN1bHQgdG8ga25vdyB3aGV0aGVyIDEuMzMgcmVwcmVzZW50cyBhIGxvdCBvciBhIGxpdHRsZSBjb3ZhcmlhdGlvbi4gDQoNCnwgQSBtb3JlIGNvbnZlbmllbnQgbWV0cmljIGZvciBleHByZXNzaW5nIGNvdmFyaWF0aW9uIGlzIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAkciQuIFRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGlzIHN0YW5kYXJkaXplZDsgaXQgaXMgZXF1YWwgdG8gMS4wIHdoZW4gdGhlcmUgaXMgcGVyZmVjdCBwb3NpdGl2ZSBjb3ZhcmlhdGlvbiBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBzY29yZXMsIC0xLjAgd2hlbiB0aGVyZSBpcyBwZXJmZWN0IG5lZ2F0aXZlIGNvdmFyaWF0aW9uIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIHNjb3JlcywgYW5kIGVxdWFsIHRvIDAuMCB3aGVuIHRoZXJlIGlzIG5vIGNvdmFyaWF0aW9uLiBJZiBhIGNvdmFyaWFuY2UgaXMgZGl2aWRlZCBieSB0aGUgcHJvZHVjdCBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgKngqIGFuZCAqeSosIHdlIG9idGFpbiAkcih4LCB5KSQsIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuICp4KiBhbmQgKnkqLiBJbiB0aGUgY3VycmVudCBleGFtcGxlICRyKHgsIHkpID0gMS4zMy8oMS42MykoMS42MykgPSAuNTAkLiBGb3IgdGhpcyByZWFzb24sIHdlIG9mdGVuIHJlZmVyIHRvIGEgY29ycmVsYXRpb24gYXMgYSAqc3RhbmRhcmRpemVkIGNvdmFyaWFuY2UqLiBBbm90aGVyIHVzZWZ1bCBwcm9wZXJ0eSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaXMgdGhhdCBpdHMgc3F1YXJlIHJlcHJlc2VudHMgdGhlIHByb3BvcnRpb24gb2YgdmFyaWFuY2Ugc2hhcmVkIGJldHdlZW4gKngqIGFuZCAqeSouIEluIHRoaXMgZXhhbXBsZSAkcih4LCB5KV4yID0gLjI1JCwgc28gd2UgbWF5IHN0YXRlIHRoYXQgMjUlIG9mIHRoZSB2YXJpYW5jZSBpbiAqeCogaXMgc2hhcmVkIHdpdGggKnkqLCBhbmQgMjUlIG9mIHRoZSB2YXJpYW5jZSBpbiAqeSogaXMgc2hhcmVkIHdpdGggKngqLiANCg0KIyMjIDEuMyBSZWxpYWJpbGl0eSBEZWZpbmVkDQp8IEFjY29yZGluZyB0byBDVFQsIHJlbGlhYmlsaXR5IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGluIGEgc2V0IG9mIG1lYXN1cmVtZW50cyBhc3NvY2lhdGVkIHdpdGggdHJ1ZS1zY29yZSB2YXJpYW5jZS4gSW4gb3RoZXIgd29yZHMgaWYgd2UgY291bGQgY29ycmVsYXRlIHRydWUgc2NvcmVzIHdpdGggb2JzZXJ2ZWQgc2NvcmVzIGFuZCBzcXVhcmUgdGhlIHJlc3VsdCBhcywgJHIoVF9pLCBYX2kpXjIkLCB0aGlzIHdvdWxkIGluZGljYXRlIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGluIHRoZSBvYnNlcnZlZCBzY29yZXMgdGhhdCBpcyBzaGFyZWQgd2l0aCB0aGUgdHJ1ZSBzY29yZXMuIFdlIGNhbiBub3cgd3JpdGUgYSBmb3JtYWwgZGVmaW5pdGlvbjogDQokJA0KcmVsaWFiaWxpdHkgPSByKFRfaSwgWF9pKV4yID0gXGZyYWN7XHNpZ21hXjJfVH17XHNpZ21hXjJfWH0gPSAxIC0gXGZyYWN7XHNpZ21hXjJfZX17XHNpZ21hXjJfWH0gXHRhZ3s0fQ0KJCQNCg0KDQpSZWNhbGwgdGhhdCB0cnVlIHNjb3JlcyBhcmUgbmV2ZXIga25vd24sIGFuZCBzbyB3ZSBtdXN0IGRlcml2ZSBhIG1lYW5zIG9mIGVzdGltYXRpbmcgJHIoVF9pLCBYX2kpXjIkIGZyb20gb2JzZXJ2YWJsZSBzY29yZXMuDQoNCnwgTWVhc3VyZW1lbnQgdGhlb3Jpc3RzIChwc3ljaG9tZXRyaWNpYW5zKSBoYXZlIHN0dWRpZWQgcmFuZG9tIG1lYXN1cmVtZW50IGVycm9yIGZvciBhIGxvbmcgdGltZS4gSW4gdHdvIHNlbWluYWwgcGFwZXJzIHB1Ymxpc2hlZCBpbiB0aGUgc2FtZSBpc3N1ZSBvZiB0aGUgKkJyaXRpc2ggSm91cm5hbCBvZiBQc3ljaG9sb2d5KiBpbiAxOTEwLCBDYXJsIFNwZWFybWFuIGFuZCBXaWxsaWFtIEJyb3duIHNob3dlZCB0aGF0IHdoZW4gbXVsdGlwbGUgbWVhc3VyZW1lbnRzIG9mIGEgY29uc3RydWN0IChlLmcuLCBpbnRlbGxpZ2VuY2UsIGFueGlldHksIGVtb3Rpb25hbCB3ZWxsLWJlaW5nLCBldGMuKSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgc2FtZSBpbmRpdmlkdWFsIGFuZCBjb21iaW5lZCwgdGhlIHJhdGlvIG9mIHRydWUtc2NvcmUgdmFyaWFuY2UgdG8gb2JzZXJ2ZWQtc2NvcmUgdmFyaWFuY2UgaW4gdGhlIGNvbXBvc2l0ZSBzY29yZSBpbmNyZWFzZXMuIEluIG90aGVyIHdvcmRzLCBvbmUgd2F5IHRvIHJlZHVjZSByYW5kb20gbWVhc3VyZW1lbnQgZXJyb3IgaXMgdG8gY3JlYXRlIGluc3RydW1lbnRzIHRoYXQgY29udGFpbiBtdWx0aXBsZSBtZWFzdXJlbWVudHMgYW5kIHRvIGFnZ3JlZ2F0ZSB0aGVzZSBtZWFzdXJlbWVudHMgdG9nZXRoZXIgd2hlbiBkZWZpbmluZyB0aGUgb2JzZXJ2ZWQgc2NvcmUgZm9yIGFuIGluZGl2aWR1YWwuIFNwZWFybWFuIGFuZCBCcm93biBhbHNvIHNob3dlZCB0aGF0IGFzIHRoZSBudW1iZXIgb2Ygc2ltaWxhciBtZWFzdXJlbWVudHMgYmVpbmcgY29tYmluZWQgaW5jcmVhc2VzLCBzbyBkb2VzIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgY29tcG9zaXRlIHNjb3Jlcy4gSW4gZXNzZW5jZSwgdGhpcyBpcyB3aHkgdG9kYXkgbW9zdCBwc3ljaG9sb2dpY2FsIHNjYWxlcyBhcmUgZm9ybWVkIGJ5IGFnZ3JlZ2F0aW5nIHJlc3BvbnNlcyB0byBtdWx0aXBsZSBpdGVtcy4NCg0KDQojIyMgMS40IENyb25iYWNoJ3MgQ29lZmZpY2llbnQgJFxhbHBoYSQNCk9uZSB3YXkgb2YgZXN0aW1hdGluZyByZWxpYWJpbGl0eSBmcm9tIG9ic2VydmVkIHNjb3JlcyBvbiBhIG11bHRpLWl0ZW0gc2NhbGUgaXMgQ3JvbmJhY2gncyAkXGFscGhhJC4gQ3JvbmJhY2ggZGV2ZWxvcGVkIHRoaXMgY29lZmZpY2llbnQgaW4gMTk1MSBiZWZvcmUgQ0ZBIGV4aXN0ZWQuIElmIHdlIGNvbnNpZGVyIGEgY29tcG9zaXRlIHNjb3JlIG1hZGUgdXAgb2YgJGskIGl0ZW1zLCB0aGVuICRcYWxwaGEkIGlzIGRlZmluZWQgYXMgdGhlIHJhdGlvIG9mIGludGVyLWl0ZW0gY292YXJpYW5jZSB0byBjb21wb3NpdGUtc2NvcmUgdmFyaWFuY2Ugd2VpZ2h0ZWQgYnkgJGsvKGsgLSAxKSQuIFRoZSB3ZWlnaHQsICRrLyhrIC0gMSkkLCBjb3JyZWN0cyBmb3IgdGhlIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgaW4gYW55IGl0ZW0gd2hpY2ggaXMgZHVlIHRvIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoZSBjb3ZhcmlhbmNlLiBJbiBvdGhlciB3b3JkcywgJFxhbHBoYSQgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHByb3BvcnRpb24gb2YgdHJ1ZS1zY29yZSB2YXJpYW5jZSBpbiB0aGUgbXVsdGktaXRlbSBzY2FsZSBzY29yZXMuIEFzIGEgcHJvcG9ydGlvbiBpdCBjYW4gcmFuZ2UgZnJvbSAwLjAgdG8gMS4wLCBhbmQgd2lsbCBvbmx5IGJlIGVxdWFsIHRvIDEuMCB3aGVuIGFsbCB0aGUgdmFyaWFuY2UgaW4gb2JzZXJ2ZWQgc2NvcmVzIGlzIHRydWUtc2NvcmUgdmFyaWFuY2UuIENyb25iYWNo4oCZcyAkXGFscGhhJCBpcyBlYXNpbHkgY2FsY3VsYXRlZCBmcm9tIHRoZSBpdGVtIGNvdmFyaWFuY2UgbWF0cml4ICRcbWF0aGJmIEMkLiANCg0KJCRcbWF0aGJmIEMgPQ0KIFxiZWdpbntibWF0cml4fQ0KICBcc2lnbWFeMl97MSwxfSAmIFxzaWdtYV97MSwyfSAmIFxjZG90cyAmIFxzaWdtYV97MSxrfSBcXA0KICBcc2lnbWFfezIsMX0gJiBcc2lnbWFeMl97MiwyfSAmIFxjZG90cyAmIFxzaWdtYV97MixrfSBcXA0KICBcdmRvdHMgICYgXHZkb3RzICAmIFxkZG90cyAmIFx2ZG90cyAgXFwNCiAgXHNpZ21hX3trLDF9ICYgXHNpZ21hX3trLDJ9ICYgXGNkb3RzICYgXHNpZ21hXjJfe2ssa30NCiBcZW5ke2JtYXRyaXh9JCQNCiANCg0KVGhlIGRpYWdvbmFsIGVsZW1lbnRzIGFyZSBpdGVtIHZhcmlhbmNlcyBhbmQgdGhlIG9mZi1kaWFnb25hbCBlbGVtZW50cyBhcmUgY292YXJpYW5jZXMuIFRoZSByYXRpbyBvZiBpbnRlci1pdGVtIGNvdmFyaWFuY2UgdG8gY29tcG9zaXRlLXNjb3JlIHZhcmlhbmNlIGlzIGVxdWFsIHRvIDEgbWludXMgdGhlIHJhdGlvIG9mIHRoZSBzdW0gb2YgdGhlIGl0ZW0gdmFyaWFuY2VzIChkaWFnb25hbCBlbGVtZW50cyBvZiAkXG1hdGhiZiBDJCkgdG8gdGhlIHN1bSBvZiBhbGwgdGhlIGVsZW1lbnRzIGluICRcbWF0aGJmIEMkLiBUaGlzIHJhdGlvIGZpcnN0IGlzIGNhbGN1bGF0ZWQsIHRoZW4gc3VidHJhY3RlZCBmcm9tIDEsIGFuZCBmaW5hbGx5IG11bHRpcGxpZWQgYnkgJGsvKGsgLSAxKSQuIA0KDQoNCiQkDQpcYWxwaGEgPVxmcmFje2t9e2sgLSAxfSBcbGVmdFsxLVxmcmFje1xzdW1fe2k9MX1eayBcc2lnbWFeMl97aWl9fSB7XHN1bV97aT0xfV5rIFxzaWdtYV4yX3tpaX0gKyAyXHN1bV97aTxqfV5rXHNpZ21hX3tpan19IFxyaWdodF0gXHRhZ3s1fQ0KJCQNCkFsdGhvdWdoIENyb25iYWNoJ3MgJFxhbHBoYSQgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbmx5IHJlcG9ydGVkIGNvZWZmaWNpZW50IG9mIHJlbGlhYmlsaXR5LCB0aGVyZSBhcmUgb3RoZXJzLiBPbmUgb2YgdGhlc2UgaXMgJFxvbWVnYSQgd2hpY2ggY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbSBDRkEgcGFyYW1ldGVyIGVzdGltYXRlcy4gTW9yZSBvbiB0aGlzIGJlbG93Lg0KDQoNCiMjIDIuIFRoZSBDRkEgTW9kZWwNCkNGQSBpcyBhIHR5cGUgb2Ygc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbCAoU0VNKSB0aGF0IGZvY3VzZXMgb24gdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIG9ic2VydmVkIHZhcmlhYmxlcyBhbmQgdGhlIGxhdGVudCB2YXJpYWJsZXMgKGkuZS4sIGZhY3RvcnMpIGh5cG90aGVzaXplZCB0byB1bmRlcmxpZSB0aGVtLiBJIHdpbGwgbm90IGdvIGludG8gdGhlIG1hdGggaGVyZS4gQ0ZBIG1vZGVscyBjYW4gYmUgdXNlZCBlc3RpbWF0ZSByZWxpYWJpbGl0eS4gV2hlbiB3b3JraW5nIHdpdGggU0VNIHdlIG9mdGVuIHJlbHkgb24gZGlhZ3JhbXMgZm9yIHByZXNlbnRpbmcgb3VyIGh5cG90aGVzaXplZCBtb2RlbCBhbmQgcmVzdWx0cy4gVGhlc2UgcGF0aCBkaWFncmFtcyByZXByZXNlbnQgb2JzZXJ2ZWQgdmFyaWFibGVzIGFzIHNxdWFyZXMsIGxhdGVudCB2YXJpYWJsZXMgYXMgY2lyY2xlcywgYW5kIGNhdXNhbCBpbmZsdWVuY2Ugd2l0aCBhcnJvd3MuIEZpZ3VyZSAxIGlzIGEgdmVyeSBiYXNpYyBwYXRoIGRpYWdyYW0gaWxsdXN0cmF0aW5nIENUVDsgdGhlIHZhcmlhbmNlIGluIHRoZSBvYnNlcnZlZCB2YXJpYWJsZSAqWCogaXMgdGhlIHN1bSBvZiB1bm9ic2VydmVkIFRydWUtc2NvcmUgdmFyaWFuY2UgYW5kIGVycm9yIHZhcmlhbmNlLg0KYGBge3IsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTIsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0nRmlndXJlIDEuIFNvdXJjZXMgY29udHJpYnV0aW5nIHRvIHRoZSB2YXJpYW5jZSBvZiAqWCouIFQgcmVmZXJzIHRvIHRydWUtc2NvcmVzLCBlIHJlZmVycyB0byBtZWFzdXJlbWVudCBlcnJvci4nfQ0KbHg8LW1hdHJpeCgxLDEsMSkNCnRkPC1kaWFnKDEsbnJvdyhseCkpDQpwaDwtbWF0cml4KDEsMSwxKQ0KbW9kMCA8LSBsaXNyZWxNb2RlbChMWD1seCwgVEQ9dGQsIFBIPXBoKQ0Kc2VtUGF0aHMobW9kMCwgYXMuZXhwcmVzc2lvbj1jKCJub2RlcyIsImVkZ2VzIiksIHNpemVNYW4gPSA4LA0KICAgICAgICAgc2l6ZUxhdCA9IDEwLCBzdHlsZT0ibGlzcmVsIiwgcm90YXRpb24gPSAyLA0KICAgICAgICAgcmVzaWRTY2FsZT0xNSwgZWRnZS5jb2xvcj0iYmxhY2siLCANCiAgICAgICAgIGVkZ2UubGFiZWwuY2V4ID0gMS41LCBsYWJlbC5jZXg9MS41LCBub2RlTGFiZWxzPWMoIlgiLCAiVCIpLCBlZGdlTGFiZWxzPWMoIiIsImUiKSkNCmBgYA0KfCANCnwgQmVmb3JlIHdlIGNvbnNpZGVyIHJlbGlhYmlsaXR5IGFuZCBDRkEgbW9kZWxzLCB3ZSBuZWVkIGEgYml0IG1vcmUgdGhlb3J5IGZvciBkZWFsaW5nIHdpdGggc2V2ZXJhbCBjb3JyZWxhdGlvbnMgYXQgdGhlIHNhbWUgdGltZS4NCg0KIyMjIDIuMSBQYXRoIEFuYWx5c2lzIFRoZW9yeQ0KUGF0aCBBbmFseXNpcyAoUEEpIGlzIGEgbWV0aG9kIGZvciBkZWNvbXBvc2luZyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIHdpdGhpbiBhIHN5c3RlbSBvZiBjYXVzYWxseSByZWxhdGVkIHZhcmlhYmxlcy4gUEEgYXBwbGllcyBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBhbmQgd2FzIGRldmVsb3BlZCBieSB6b29sb2dpc3QgU2V3YWxsIFdyaWdodCBpbiAxOTM0LiAqUGF0aCBjb2VmZmljaWVudHMgYXJlIHN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBvYnRhaW5lZCBmcm9tIGEgc2V0IG9mIGludGVyLXJlbGF0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzKi4gUEEgYWxsb3dzL3JlcXVpcmVzIHRoZSBpbnZlc3RpZ2F0b3IgdG8gdGhlb3JpemUgYWJvdXQgdGhlIGNhdXNhbCByZWxhdGlvbnMgYW1vbmcgYSBzZXQgb2YgdmFyaWFibGVzIGFuZCBhcHBseSBoaXMvaGVyIHRoaW5raW5nIHRvIGRlY29tcG9zZSB0aGUgY29ycmVsYXRpb25zIGFtb25nIHRoZSB2YXJpYWJsZXMuDQoNCg0KfCBUbyBpbGx1c3RyYXRlLCBjb25zaWRlciB0d28gdmFyaWFibGVzICR4JCBhbmQgJHkkIHRoYXQgYXJlIGNvcnJlbGF0ZWQuIFdlIG1heSB0aGVvcml6ZSBhYm91dCAqd2h5KiB0aGV5IGFyZSBjb3JyZWxhdGVkIHVzaW5nIFBBLiBUaGV5IGNvdWxkIGNvcnJlbGF0ZSBiZWNhdXNlICR4JCBjYXVzZXMgJHkkICQoeCBccmlnaHRhcnJvdyB5KSQsIG9yIGJlY2F1c2UgJHkkIGNhdXNlcyAkeCQgJCh5IFxyaWdodGFycm93IHgpJCwgb3IgYmVjYXVzZSAkeCQgYW5kICR5JCBzaGFyZSBhIGNvbW1vbiBjYXVzZSwgJHokLCAkKHggXGxlZnRhcnJvdyB6IFxyaWdodGFycm93IHkpJC4gVGhlIGZpcnN0IHR3byAidGhlb3JpZXMiIGFyZSByZWZlcnJlZCB0byBhcyBkaXJlY3QgZWZmZWN0cywgdGhlIHRoaXJkIG9uZSBpcyBjYWxsZWQgYSAqc3B1cmlvdXMgZWZmZWN0Ki4NCg0KfA0KfCANClBBIG1ha2VzIGNlcnRhaW4gYXNzdW1wdGlvbnM6DQoNCnwgMS4gdGhlIHJlbGF0aW9ucyBhbW9uZyB0aGUgdmFyaWFibGVzIGFyZSBsaW5lYXIsIGFkZGl0aXZlLCBhbmQgY2F1c2FsLg0KDQp8IDIuIFRoZSByZXNpZHVhbCB0ZXJtcyBhcmUgdW5jb3JyZWxhdGVkLiBUaGF0IGlzLCBlYWNoIHJlc2lkdWFsIGlzIG5vdCBjb3JyZWxhdGVkIHdpdGggdGhlIHZhcmlhYmxlcyB0aGF0IHByZWNlZGUgaXQgaW4gdGhlIG1vZGVsLiANCg0KfCAzLiBUaGVyZSBpcyBhIG9uZS13YXkgY2F1c2FsIGZsb3cgaW4gdGhlIHN5c3RlbS4gUmVjaXByb2NhbCBjYXVzYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMgKGkuZS4sIGZlZWRiYWNrIGxvb3BzKSBpcyBydWxlZCBvdXQuDQoNCnwgNC4gVGhlIHZhcmlhYmxlcyBhcmUgbWVhc3VyZWQgb24gYW4gaW50ZXJ2YWwtbGV2ZWwgc2NhbGUuDQoNCnwgNS4gVGhlIHZhcmlhYmxlcyBhcmUgbWVhc3VyZWQgd2l0aG91dCByYW5kb20gZXJyb3IuDQpUaGVzZSBhc3N1bXB0aW9ucyBwcm92aWRlIHBhcnQgb2YgdGhlIGZyYW1ld29yayBmb3IgYXBwbHlpbmcgc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbHMuIFdlIHNob3VsZCBrZWVwIHRoZW0gaW4gbWluZC4NCg0KDQojIyMgMi4yIENUVCAmIENGQQ0KQ0ZBIGVzdGltYXRlcyB0aGUgY29ycmVsYXRpb25zIGFtb25nIG9ic2VydmVkIHZhcmlhYmxlcyBpbiB0ZXJtcyBvZiB1bmRlcmx5aW5nIGxhdGVudCB2YXJpYWJsZXMuIFRoaXMgaXMgY29udmVuaWVudCBiZWNhdXNlIHdlIGNhbiBub3cgcmVwcmVzZW50IG91ciBDVFQtYmFzZWQgbWVhc3VyZW1lbnQgbW9kZWwgaW4gbWF0aGVtYXRpY2FsIHRlcm1zIChhcyBhIENGQSBtb2RlbCkgYW5kIHRlc3QgaXQgb24gZGF0YS4gQ29uc2lkZXIgYSBnZW5lcmljIGNhc2UuIFdlIHdhbnQgdG8gbWVhc3VyZSBpbmRpdmlkdWFsIGRpZmZlcmVuY2VzIGluIHNvbWUgY29uc3RydWN0IChhbnhpZXR5IGZvciBleGFtcGxlKS4gV2Uga25vdyBDVFQgYW5kIHNvIHdlIGNyZWF0ZSBtdWx0aXBsZSAodGhyZWUpIHN0YXRlbWVudHMgKHN1cnZleSBpdGVtcykgdGhhdCBvbiB0aGUgZmFjZSBvZiBpdCBjYXB0dXJlIHRoZSBjb25zdHJ1Y3Qgb2YgaW50ZXJlc3QuIFNldmVyYWwgaW5kaXZpZHVhbHMgdGhlbiByZWFkIHRoZSB0aGUgc3RhdGVtZW50cyBhbmQgaW5kaWNhdGUgaG93IG11Y2ggdGhleSBhZ3JlZSwgb3IgZGlzYWdyZWUgd2l0aCBlYWNoLiBUaGUgZGF0YSBjYW4gYmUgc3VtbWFyaXplZCBpbiBhIDN4MyBjb3ZhcmlhbmNlIG1hdHJpeC4NCg0KfCBDVFQgbGVhZHMgdXMgdG8gaHlwb3RoZXNpemUgdGhhdCB0aGUgdmFyaWFuY2VzIG9mIHRoZSB0aHJlZSBpdGVtcyBhcmUgaW5mbHVlbmNlZCBieSBvbmUgdW5kZXJseWluZyBsYXRlbnQgdmFyaWFibGUgcmVwcmVzZW50aW5nIG91ciBjb25zdHJ1Y3QsIFdlIGNhbiBtYXAgdGhpcyBoeXBvdGhlc2lzIGludG8gYSBDRkEgbW9kZWwgd2hlcmUgdGhlIHRocmVlIGl0ZW1zICR4XzEkLCAkeF8yJCwgYW5kICR4XzMkIGFyZSBpbmRpY2F0b3JzIG9mIG9uZSB1bmRlcmx5aW5nIGxhdGVudCB2YXJpYWJsZSwgJFx4aV8xJC4gT3VyIG1vZGVsIGlzIHNob3duIGFzIGEgcGF0aCBkaWFncmFtIGluIEZpZ3VyZSAyLiANCnwgDQp8IA0KDQpTcGVjaWZ5aW5nIGEgZ2VuZXJpYyBDRkEgdGhlIG1vZGVsIHVzaW5nIExJU1JFTCBub3RhdGlvbi4gDQpgYGB7ciBtb2RlbCwgZWNobz1UfQ0KIyBjcmVhdGluZyAxIGZhY3RvciB3IDMgaW5kaWNhdG9ycw0KIyBMYW1iZGEgbWF0cmljZXM6DQpsYW1iZGF4IDwtIG1hdHJpeCgwLDMsMSkNCmxhbWJkYXhbMTozLDFdIDwtMQ0KIyBQaGkgbWF0cml4Og0KTGF0WCA8LSBtYXRyaXgoMSwxLDEpICNwaGkNCiMgVGhldGEgbWF0cml4Og0KdGhkIDwtIGRpYWcoMSxucm93KGxhbWJkYXgpKQ0KIyBDb21iaW5lIG1hdHJpY2VzIGludG8gYSBtb2RlbDoNCm1vZDEgPC0gbGlzcmVsTW9kZWwoTFg9bGFtYmRheCwgVEQ9dGhkLCBQSD1MYXRYKQ0KYGBgDQoNClBsb3R0aW5nIENGQSBwYXRoIGRpYWdyYW06DQpgYGB7ciBwYXRoZGlhZ3JhbSwgZWNobz1ULCBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iRmlndXJlIDIuIFRoZSBMSVNSRUwgbW9kZWwgZm9yIGEgb25lIGZhY3RvciBtb2RlbCB3aXRoIHRocmVlIGluZGljYXRvcnMuIn0NCiMgUGxvdCBwYXRoIGRpYWdyYW0gdXNpbmcgc2VtUGxvdDo6c2VtUGF0aHMgc2l6ZWxhdD00LCBzaXplbWFuPTMNCiMtLW1ha2luZyBwYXRoIGRpYWdyYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tbWFyKGJvdCxsZnQsdG9wLHJndCkgd2FzIE0gNiBMIDgNCg0Kc2VtUGF0aHMobW9kMSwgYXMuZXhwcmVzc2lvbj1jKCJub2RlcyIsImVkZ2VzIiksIHNpemVNYW4gPSA5LA0KICAgICAgICAgc2l6ZUxhdCA9IDEyLCBzdHlsZT0ibGlzcmVsIiwgcm90YXRpb24gPSAzLA0KICAgICAgICAgcmVzaWRTY2FsZT0xNCwgZWRnZS5jb2xvcj0iYmxhY2siLCANCiAgICAgICAgIGVkZ2UubGFiZWwuY2V4ID0gMS41LCBsYWJlbC5jZXg9MS41KQ0KYGBgDQp8IA0KDQp8IEZpZ3VyZSAyIGlzIHRoZSBncmFwaGljaWNhbCByZXByZXNlbnRhdGlvbiBvZiBvdXIgbWVhc3VyZW1lbnQgbW9kZWwgdXNpbmcgTElTUkVMIG5vdGF0aW9uLiBTcXVhcmVzIGRlbm90ZSBvYnNlcnZlZCB2YXJpYWJsZXMgKGluZGljYXRvcnMpIGFuZCB0aGUgY2lyY2xlIHJlcHJlc2VudHMgdGhlIGxhdGVudCB2YXJpYWJsZSBvciBjb25zdHJ1Y3Qgb2YgaW50ZXJlc3QuIEVhY2ggaW5kaWNhdG9yIGhhcyBhIGNvZWZmaWNpZW50ICRcbGFtYmRhX3tpMX0kIChsYW1iZGEpIGxpbmtpbmcgaXQgdG8gdGhlIGxhdGVudCB2YXJpYWJsZSAkXHhpXzEkIHJlcHJlc2VudGluZyBvdXIgY29uc3RydWN0IGFuZCBhIGNvZWZmaWNpZW50ICRcdGhldGFfe2lpfSQgKHRoZXRhKSBleHByZXNzaW5nIGl0cyBtZWFzdXJlbWVudCBlcnJvciB2YXJpYW5jZS4gUEEgdGVsbHMgdXMgdGhhdCB0d28gdmFyaWFibGVzIG1heSBiZSBjb3JyZWxhdGVkIGJlY2F1c2UgdGhleSBzaGFyZSBhIGNvbW1vbiBjYXVzZS4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgJHhfMSQgYW5kICR4XzIkIHNoYXJlIGEgY29tbW9uIGNhdXNlICRceGlfMSQsIG91ciBtb2RlbCBpbXBsaWVzIHRoYXQgJHIoeF8xIHhfMikgPSBcbGFtYmRhX3sxMX1cbGFtYmRhX3syMX0kLiBUaGUgc2FtZSBjYW4gYmUgc2FpZCBhYm91dCB0aGUgb3RoZXIgdHdvIGNvcnJlbGF0aW9ucywgJHIoeF8xLHhfMykgPSBcbGFtYmRhX3sxMX1cbGFtYmRhX3szMX0kIGFuZCAkcih4XzIseF8zKSA9IFxsYW1iZGFfezIxfVxsYW1iZGFfezMxfSQuIElmIHRoZSBlc3RpbWF0ZWQgY29ycmVsYXRpb25zIGZyb20gb3VyIENGQSBtb2RlbCBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBvYnNlcnZlZCBjb3JyZWxhdGlvbnMsIHRoZXJlIGlzIHN1cHBvcnQgZm9yIHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIHRocmVlIGl0ZW1zIGFyZSBtZWFzdXJpbmcgdGhlIHNhbWUgdW5kZXJseWluZyBjb25zdHJ1Y3QuDQoNCiMjIyAyLjMgUmVsaWFiaWxpdHkgQ29lZmZpY2llbnQgJFxvbWVnYSQNCnwgT25lIHdheSB0byBpbnRlcnByZXQgdGhlICRcbGFtYmRhX3tpan0kIGNvZWZmaWNpZW50cyBpcyB0byB0aGluayBvZiB0aGVtIGFzIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBpbmRpY2F0b3IgdmFyaWFibGVzIGFuZCB0aGUgbGF0ZW50IHZhcmlhYmxlLiBTcXVhcmluZyB0aGVtIHRlbGxzIHVzIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIHNoYXJlZCBiZXR3ZWVuIHRoZSBpdGVtIGFuZCB0aGUgbGF0ZW50IGNvbnN0cnVjdCBpdCBpcyBoeXBvdGhlc2l6ZWQgdG8gbWVhc3VyZS4gSW4gdGhlIENUVCBmcmFtZXdvcmsgdGhpcyBpcyB0aGUgcHJvcG9ydGlvbiBvZiB0cnVlLXNjb3JlIHZhcmlhbmNlIGluIHRoZSBvYnNlcnZlZCB2YXJpYWJsZSwgc28gbGFyZ2VyIHZhbHVlcyAoYXBwcm9hY2hpbmcgMS4wKSBhcmUgaWRlYWwuIFdlIGNhbiB1c2UgdGhlIHBhcmFtZXRlcnMgZnJvbSBvdXIgQ0ZBIG1vZGVsIHRvIGVzdGltYXRlIHRoZSByZWxpYWJpbGl0eSBvZiBvdXIgbXVsdGktaXRlbSBzY2FsZSB1c2luZyBhbm90aGVyIGluZGV4ICRcb21lZ2EkIChvbWVnYSkgd2hpY2ggaXMgZGVmaW5lZCBhczoNCiQkDQpcb21lZ2EgPSBcZnJhY3tcc3VtXmtfe2k9MX1cbGFtYmRhX2leMn0gDQp7XHN1bV5rX3tpPTF9XGxhbWJkYV9pXjIgKyBcc3VtXmtfe2k9MX1cdGhldGFfe2lpfX0gICBcdGFnezZ9DQokJA0KVGhlIG51bWVyYXRvciByZXByZXNlbnRzIHRydWUtc2NvcmUgdmFyaWFuY2UgYW5kIHRoZSBkZW5vbWluYXRvciByZXByZXNlbnRzIG9ic2VydmVkIHZhcmlhbmNlLiBFcXVhdGlvbiA2IGNhbiBiZSBhcHBsaWVkIHRvIHN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMgKGFzIGlzIGRvbmUgaGVyZSkgYW5kIHRvIHVuZHN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMuDQoNCg0KIyMjIDIuNCBDRkEgdXNpbmcgbGF2YWFuDQpTcGVjaWZ5aW5nIG1vZGVscyBpbiBgbGF2YWFuYCBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBUaGVyZSBhcmUgZGlmZmVyZW50IG9wZXJhdG9ycyBmb3Igc3BlY2lmeWluZyB2YXJpb3VzIHJlbGF0aW9ucyBhbW9uZyB2YXJpYWJsZXMuIExhdGVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQgdXNpbmcgdGhlIGA9fmAgb3BlcmF0b3Igd2l0aCB0aGUgbGF0ZW50IHZhcmlhYmxlIG9uIHRoZSBsZWZ0IGFuZCB0aGUgaW5kaWNhdG9yIHZhcmlhYmxlcyBvbiB0aGUgcmlnaHQuIEluIHRoZSBleGFtcGxlIGJlbG93IEkgc2hvdyB0aGUgUiBjb2RlIGZvciB0aGUgaG93IHRvIHNwZWNpZnkgYW5kIHJ1biBhIHZlcnkgc2ltcGxlIENGQSBtb2RlbCBpbiBgbGF2YWFuYC4gT25lIG5pY2UgZmVhdHVyZSBpcyB0aGF0IHdlIGRvbid0IGFsd2F5cyBuZWVkIHRoZSByYXcgZGF0YSBmaWxlOyB3ZSBjYW4gd29yayBmcm9tIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCwgb3IgY29ycmVsYXRpb24gbWF0cml4IHBsdXMgYSB2ZWN0b3Igb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhbmQgdGhlIHNhbXBsZSBzaXplLiANCg0KDQojIyAzLiBBbiBFeGFtcGxlDQpUaGlzIGV4YW1wbGUgaW52b2x2ZXMgdGhyZWUgaXRlbXMgaHlwb3RoZXNpemVkIHRvIG1lYXN1cmUgYW54aWV0eSByZWxhdGVkIHRvIENPVklELTE5Og0KDQp8ICpheDE6KiBJIGFtIGFmcmFpZCBvZiBDT1ZJRC0xOS4NCnwgKmF4MjoqIFRoaW5raW5nIGFib3V0IENPVklELTE5IG1ha2VzIG1lIGZlZWwgdGhyZWF0ZW5lZC4NCnwgKmF4MzoqIEkgYW0gc3RyZXNzZWQgYXJvdW5kIHBlb3BsZSBiZWNhdXNlIEkgd29ycnkgSSdsbCBjYXRjaCBDT1ZJRC0xOS4NCnwgDQp8IFRoZSByZXNwb25zZSBvcHRpb25zIHdlcmU6IDEgJ1N0cm9uZ2x5IERpc2FncmVlJywgMiAnRGlzYWdyZWUnLCAzICdOZWl0aGVyIEFncmVlIG5vciBEaXNhZ3JlZScsICA0ICdBZ3JlZScsIGFuZCA1ICdTdHJvbmdseSBBZ3JlZScuIFRoZXNlIGl0ZW1zIHdlcmUgaW5jbHVkZWQgaW4gYSBzdXJ2ZXkgb2YgZmFjdWx0eSwgc3RhZmYsIGFuZCBzdHVkZW50cyAoKk4qID0gMzgsOTIxKSBhdCBhIG1ham9yIHVuaXZlcnNpdHkgaW4gdGhlIFNvdXRoZWFzdCBVbml0ZWQgU3RhdGVzIGR1cmluZyB0aGUgZmlyc3QgZmV3IHdlZWtzIG9mIHRoZSBwYW5kZW1pYyBpbiAyMDIwLg0KDQp8IA0KfCBSZWFkaW5nIGluIHRoZSBkYXRhOg0KYGBge3IsIGVjaG89VH0NCiMgcmVhZGluZyBpbiBjb3JyIG1hdHJpeA0KY29yciA8LSAnDQoxLjAwMA0KLjcyOCAxLjAwMA0KLjcxNCAuNzEzIDEuMDAwICcNCiMgYWRkIHZhcmlhYmxlIG5hbWVzIGFuZCBjb252ZXJ0IHRvIGZ1bGwgY29ycmVsYXRpb24gbWF0cml4DQpjb3JyZnVsbCA8LSBsYXZhYW46OmdldENvdihjb3JyLCBuYW1lcz1jKCJheDEiLCJheDIiLCJheDMiKSkNCiMgYWRkIFNEcyBhbmQgY29udmVydCB0byBmdWxsIGNvdmFyaWFuY2UgbWF0cml4DQpjb3ZmdWxsIDwtIGxhdmFhbjo6Y29yMmNvdihjb3JyZnVsbCwgc2RzPWMoMS4xNjMsIDEuMTI3LCAxLjE2OSkpDQojIG9ic2VydmVkIGNvdmFyaWFuY2UgbWF0cml4IE49Mzg5MjENCiMgdmVjdG9yIG9mIG1lYW5zIHRoYXQgbWF5IGJlIG5lZWRlZCAoc2NvcmVzIHJhbmdlIGZyb20gMSB0byA1KQ0KTW5zPC0gYygzLjI2LCAyLjc2LCAzLjAwKQ0KYGBgDQoNCiMjIyAzLjEgQ29ycmVsYXRpb24gVGFibGUNClVzaW5nIGBzalBsb3Q6OnRhYl9jb3JyYCB0byBjcmVhdGUgdGhpcyBuaWNlIHRhYmxlLg0KYGBge3J9DQojIFVzZXMgc2pQbG90IHRvIHByaW50IGEgbmljZSBsb29raW5nIGNvcnJlbGF0aW9uIHRhYmxlDQpzalBsb3Q6OnRhYl9jb3JyKGNvcnJmdWxsLCBuYS5kZWxldGlvbiA9ICJsaXN0d2lzZSIsIGRpZ2l0cyA9IDMsIHRyaWFuZ2xlID0gImxvd2VyIiwNCiAgICAgICAgIHRpdGxlID0gIkNvcnJlbGF0aW9ucyBhbW9uZyBvYnNlcnZlZCB2YXJpYWJsZXMgKE4gPTM4LDkyMSkiLA0KICAgICAgICAgc3RyaW5nLmRpYWc9YygnMS4wMDAnLCcxLjAwMCcsJzEuMDAwJykpDQpgYGANCnwgKmF4MToqIEkgYW0gYWZyYWlkIG9mIENPVklELTE5Lg0KfCAqYXgyOiogVGhpbmtpbmcgYWJvdXQgQ09WSUQtMTkgbWFrZXMgbWUgZmVlbCB0aHJlYXRlbmVkLg0KfCAqYXgzOiogSSBhbSBzdHJlc3NlZCBhcm91bmQgcGVvcGxlIGJlY2F1c2UgSSB3b3JyeSBJJ2xsIGNhdGNoIENPVklELTE5Lg0KfA0KfA0KfCBDQ1QgcG9zaXRzIHRoYXQgYmVjYXVzZSB0aGVzZSBpdGVtcyBhcmUgbWVhc3VyZW1lbnRzIG9mIHRoZSBzYW1lIGNvbnN0cnVjdCwgcmVzcG9uc2VzIHRvIHRoZW0gc2hvdWxkIGJlIGNvcnJlbGF0ZWQuIE5vdGljZSB0aGF0IHRoZSBjb3JyZWxhdGlvbnMgcmFuZ2UgZnJvbSAuNzEzIHRvIC43MjguIENvbnNpZGVyIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gaXRlbXMgJHIoYXgxLCBheDIpID0gLjcyOCQuIElmIHdlIHNxdWFyZSB0aGlzIGNvcnJlbGF0aW9uIHdlIGdldCB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZSB0aGF0IHRoZXNlIHR3byBpdGVtcyBzaGFyZSAkcl4yKGF4MSwgYXgyKSA9IC43MjheMiA9IDUzMCQuDQoNCiMjIyAzLjIgQ0ZBIG9mIENPVklEIEFueGlldHkgU2NhbGUNCnwNClNwZWNpZnkgdGhlIG1vZGVsOg0KYGBge3IsIGVjaG89VH0NCiMgc3BlY2lmeSB0aGUgQ0ZBIG1vZGVsDQptb2RlbDEgPC0gJyBDT1ZJRF9BeHR5ID1+IGF4MSArIGF4MiArIGF4MyAnDQpgYGANCg0KUnVubmluZyB0aGUgbW9kZWw6DQpgYGB7ciwgZWNobz1UfQ0KIyBmaXQgdGhlIHBhdGggbW9kZWwNCmZpdCA8LSBsYXZhYW46OmNmYShtb2RlbDEsIHNhbXBsZS5jb3Y9Y292ZnVsbCwgc2FtcGxlLm5vYnM9Mzg5MjEsIHN0ZC5sdj1UKQ0KYGBgDQoNCiMjIyAzLjMgUmVzdWx0cw0KDQpQbG90dGluZyByZXN1bHRzIGFzIHBhdGggZGlhZ3JhbToNCmBgYHtyLCBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTQsIGZpZy5jYXA9IkZpZ3VyZSAzLiBDT1ZJRCBBbnhpZXR5IFNjYWxlIG1lYXN1cmVtZW50IG1vZGVsIiwgZWNobz1ULCBmaWcuYWxpZ249J2NlbnRlcid9DQojIG1ha2luZyBwYXRoIENGQSBkaWFncmFtDQpmaWczIDwtIHNlbVBsb3Q6OnNlbVBhdGhzKGZpdCwgd2hhdExhYmVscyA9ICJzdGQiLCBsYXlvdXQgPSAidHJlZTIiLCANCiAgICAgICAgIHJvdGF0aW9uID0gMSwgc3R5bGUgPSAibGlzcmVsIiwgb3B0aW1pemVMYXRSZXMgPSBUUlVFLCBuRGlnaXRzPTMsDQogICAgICAgICBzdHJ1Y3R1cmFsID0gRkFMU0UsIGxheW91dFNwbGl0ID0gRkFMU0UsDQogICAgICAgICBpbnRlcmNlcHRzID0gRkFMU0UsIHJlc2lkdWFscyA9IFQsIA0KICAgICAgICAgY3VydmUgPSAzLCBjdXJ2YXR1cmUgPSAzLCBuQ2hhck5vZGVzID0gOCwgDQogICAgICAgICBzaXplTGF0ID0gMjQsIHNpemVMYXQyID0gMTIsIHNpemVNYW4gPSA5LA0KICAgICAgICAgZWRnZS5sYWJlbC5jZXggPSAxLjUsIGxhYmVsLmNleD0xLjAsIHJlc2lkU2NhbGU9MTQsIA0KICAgICAgICAgZWRnZS5jb2xvciA9ICJibGFjayIsIGVkZ2UubGFiZWwucG9zaXRpb24gPSAuNDAsIERvTm90UGxvdD1UKQ0KIy0td29ya2luZyB3aXRoIHNlbXB0b29scyB0byBtb2RpZnkgcGF0aCBkaWFncmFtcw0KZmlnM18xIDwtIGZpZzMgIHw+IHNlbXB0b29sczo6bWFya19zaWcoZml0LCBhbHBoYSA9IGMoIihuLnMuKSIgPSAxLjAwLCAiKiIgPSAuMDUpKSAjYWRkaW5nICosIG5zDQpwbG90KGZpZzNfMSkNCmBgYA0KfCAqYXgxOiogSSBhbSBhZnJhaWQgb2YgQ09WSUQtMTkuDQp8ICpheDI6KiBUaGlua2luZyBhYm91dCBDT1ZJRC0xOSBtYWtlcyBtZSBmZWVsIHRocmVhdGVuZWQuDQp8ICpheDM6KiBJIGFtIHN0cmVzc2VkIGFyb3VuZCBwZW9wbGUgYmVjYXVzZSBJIHdvcnJ5IEknbGwgY2F0Y2ggQ09WSUQtMTkuDQp8DQp8DQp8IExldCdzIGV4YW1pbmUgdGhlIHBhcmFtZXRlciBlc3RpbWF0ZXMgZnJvbSBvdXIgbW9kZWwgc2hvd24gaW4gRmlndXJlIDMuIFRoZSAkXGxhbWJkYSQgZm9yICpheDEqIGlzIC44NTQgYW5kIHRoZSAkXGxhbWJkYSQgZm9yICpheDIqIGlzIC44NTMuIFRoZXNlIGFyZSB0aGUgZXN0aW1hdGVkIGNvcnJlbGF0aW9ucyBvZiB0aGVzZSBpdGVtcyB3aXRoIHRoZSB1bmRlcmx5aW5nIGNvbnN0cnVjdCBDT1ZJRCBBbnhpZXR5LiBJZiB3ZSB0aGluayBhYm91dCB0aGUgbm90aW9uIG9mIHNwdXJpb3VzIGVmZmVjdHMgZnJvbSBQQSwgd2UgY2FuIHNheSB0aGF0IHRoZSByZWFzb24gcmVzcG9uc2VzIHRvIHRoZXNlIHR3byBpdGVtcyBhcmUgc28gaGlnaGx5IGNvcnJlbGF0ZWQgaXMgYmVjYXVzZSB0aGV5IGFyZSBib3RoIGJlaW5nIHN0cm9uZ2x5IGluZmx1ZW5jZWQgYnkgdGhlIHNhbWUgdW5kZXJseWluZyBjb25zdHJ1Y3QsIENPVklELUFueGlldHkuIElmIHdlIG11bHRpcGx5IHRoZXNlIHR3byAkXGxhbWJkYSRzIHRvZ2V0aGVyIHdlIGdldCAuNzI4IHdoaWNoIGlzIHRoZSBvYnNlcnZlZCBjb3JyZWxhdGlvbiAkcihheDEsYXgyKSQgc2hvd24gaW4gdGhlIGNvcnJlbGF0aW9uIHRhYmxlIGFib3ZlLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB0byByZXByb2R1Y2UgdGhlIG90aGVyIHR3byBjb3JyZWxhdGlvbnMuIA0KDQp8IA0KfCBUaGUgdGhyZWUgJFx0aGV0YSRzIGF0IHRoZSBib3R0b20gb2YgRmlndXJlIDMgc2hvdyB0aGUgZXN0aW1hdGVkIHByb3BvcnRpb24gb2YgbWVhc3VyZW1lbnQgZXJyb3IgdmFyaWFuY2UgaW4gZWFjaCBpdGVtLiBJZiBjb25zaWRlcmVkIHNlcGFyYXRlbHksIHJhdGhlciB0aGFuIGFzIGEgY29tcG9zaXRlLCByb3VnaGx5IDI4JSBvZiB0aGUgdmFyaWFuY2UgaW4gZWFjaCBpdGVtIGlzIG1lYXN1cmVtZW50IGVycm9yLiBTcXVhcmluZyB0aGUgJFxsYW1iZGEkcyBnaXZlcyB0aGUgcHJvcG9ydGlvbiBvZiB0cnVlLXNjb3JlIHZhcmlhbmNlIGJlaW5nICJjYXB0dXJlZCIgYnkgZWFjaCBpdGVtLiBOb3RlIHRoYXQgYmVjYXVzZSBhbGwgY29lZmZpY2llbnRzIGFyZSBzdGFuZGFyZGl6ZWQgd2UgaGF2ZSAkXGxhbWJkYV4yICsgXHRoZXRhID0gMS4wJCBmb3IgZWFjaCBpdGVtDQoNCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5zY3JvbGwtNTAwIHsNCiAgbWF4LWhlaWdodDogNTAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7DQp9DQpgYGANCnwNCnwNCnwgDQpGdWxsIG91dHB1dDoNCg0KfCBJIHVzZWQgdGhlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uIHRvIHdyaXRlIGBsYXZhYW5gIHJlc3VsdHMgdG8gdGhlIGNvbnNvbGUuIFRoZXJlIGlzIGEgbG90IG9mIG91dHB1dCB0byByZXZpZXcuIFRoZSBmaXJzdCBiaXQgaXMgbW9kZWwgZml0IHN0YXRpc3RpY3MuIEJlY2F1c2UgdGhpcyBtb2RlbCBpcyBqdXN0LWlkZW50aWZpZWQgKHRoZXJlIGFyZSBhcyBtYW55IHBhcmFtZXRlcnMgYXMgdGhlcmUgYXJlIGRhdGEgZWxlbWVudHMgaW4gdGhlIGNvdmFyaWFuY2UgbWF0cml4KSB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIGFyZSAwIGFuZCB0aGUgbW9kZWwgZml0IGlzIHBlcmZlY3QuIE5leHQgd2Ugc2VlICoqUGFyYW1ldGVyIEVzdGltYXRlcyoqIGJlZ2lubmluZyB3aXRoIHRoZSBMYXRlbnQgVmFyaWFibGVzIHNlY3Rpb24gdGhhdCBzaG93cyB0aGUgZmFjdG9yIGxvYWRpbmdzICRcbGFtYmRhX3tpan0kLiBUaGUgY29sdW1uIGxhYmVsZWQgKkVzdGltYXRlKiBnaXZlcyB0aGUgdW5zdGFuZGFyZGl6ZWQgY29lZmZpY2llbnRzLCBhbmQgdGhlIGNvbHVtbiAqU3RkLmFsbCogZ2l2ZXMgdGhlIGNvbXBsZXRlbHkgc3RhbmRhcmRpemVkIGNvZWZmaWNpZW50cyB0aGF0IGFyZSBzaG93biBpbiBGaWd1cmUgMy4gTmV4dCBjb21lIHRoZSBWYXJpYW5jZXMuIFZhcmlhYmxlcyBwcmVmaXhlZCB3aXRoIGEgIi4iIGluZGljYXRlIHJlc2lkdWFsIHRlcm1zIHNvIHRoZXNlIGFyZSB0aGUgJFx0aGV0YV97aWl9JCBlc3RpbWF0ZXMuIEZpbmFsbHksIHdlIHNlZSB0aGUgJFJeMiQgdmFsdWVzIGluZGljYXRpbmcgdGhlIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgdGhhdCBlYWNoIGl0ZW0gc2hhcmVzIHdpdGggdGhlIGxhdGVudCB2YXJpYWJsZS4gDQoNCmBgYHtyLCBjbGFzcy5vdXRwdXQ9InNjcm9sbC01MDAifQ0Kc3VtbWFyeShmaXQsIGZpdC5tZWFzdXJlcz1ULCBzdGFuZGFyZGl6ZWQ9VCwgcnNxdWFyZT1UKQ0KYGBgDQp8DQp8IA0KIyMjIDMuNCBSZWxpYWJpbGl0eSBBbmFseXNpcw0KVGhlIGBzZW1Ub29sc2AgcGFja2FnZSBoYXMgYSBmdW5jdGlvbiBgY29tcFJlbFNFTWAgdGhhdCByZWFkcyB0aGUgYGxhdmFhbmAgb3V0cHV0IGFuZCByZXR1cm5zIHRoZSByZWxpYWJpbGl0eSBlc3RpbWF0ZXMgZm9yIGVhY2ggbGF0ZW50IHZhcmlhYmxlLiBTZXR0aW5nIHRoZSBvcHRpb25zICd0YXUuZXE9VCcgYW5kICdvYnMudmFyPVQnIHByb2R1Y2VzIGVxdWl2YWxlbnQgdG8gQ3JvbmJhY2gncyByZWxpYWJpbGl0eSBjb2VmZmljaWVudCAkXGFscGhhJCAoYWxwaGEpLiBTZXR0aW5nICd0YXUuZXE9RicgcHJvZHVjZXMgdGhlICRcb21lZ2EkIChvbWVnYSkgY29lZmZpY2llbnQgb2YgcmVsaWFiaWxpdHkuIEluIHRoaXMgZXhtYXBsZSB0aGUgdHdvIGFyZSBxdWl0ZSBzaW1pbGFyLg0KYGBge3IsIHJlc3VsdHM9J2hvbGQnfQ0KcmVsYWxwaGE8LXNlbVRvb2xzOjpjb21wUmVsU0VNKGZpdCwgdGF1LmVxPVQsIG9icy52YXI9VCkNCmBgYA0KfCBUaGUgQ3JvbmJhY2gncyAkXGFscGhhJCByZWxpYWJpbGl0eSBmb3IgQ09WSUQtQW54aWV0eSBTY2FsZSAodXNpbmcgZXEuIDUpIGlzIGByIHJlbGFscGhhIFsxXWAuDQoNCmBgYHtyLCByZXN1bHRzPSdob2xkJ30NCnJlbG9tZWdhPC1zZW1Ub29sczo6Y29tcFJlbFNFTShmaXQsIHRhdS5lcT1GLCBvYnMudmFyPVQpDQpgYGANCnwgVGhlICRcb21lZ2EkIHJlbGlhYmlsaXR5IGNvZWZmaWNpZW50IGZvciBDT1ZJRC1BbnhpZXR5IFNjYWxlICh1c2luZyBlcS4gNikgaXMgYHIgcmVsb21lZ2EgWzFdYC4NCg0KIyMgNC4gQ29uY2x1ZGluZyBSZW1hcmtzDQoNClJlbGlhYmlsaXR5IG9mIG1lYXN1cmVtZW50cyBpcyB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoZXkgYXJlIGZyZWUgZnJvbSByYW5kb20gbWVhc3VyZW1lbnQgZXJyb3IuIFRoZSByZWxpYWJpbGl0eSBvZiBhIHNldCBvZiBtZWFzdXJlbWVudHMgbGltaXRzIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhleSBjYW4gY29ycmVsYXRlIHdpdGggbWVhc3VyZW1lbnRzIG9uIG90aGVyIHZhcmlhYmxlcy4NCg0KfA0KDQp8IEluIHRoaXMgbGVjdHVyZSB3ZSBjb3ZlcmVkIHRoZSBiYXNpY3Mgb2YgcHN5Y2hvbWV0cmljIG1lYXN1cmVtZW50IHRoZW9yeSBhbmQgbWFwcGVkIGtleSBjb25jZXB0cyBvbnRvIHRoZSBDRkEgbW9kZWwuIFdlIGV4YW1pbmVkIHRoZSByZWxpYWJpbGl0eSBvZiBkYXRhIG9idGFpbmVkIHVzaW5nIGEgdGhyZWUtaXRlbSBzY2FsZSBpbnRlbmRlZCB0byBtZWFzdXJlIGFueGlldHkgcmVsYXRlZCB0byBDT1ZJRC0xOS4gQ0ZBIHByb3ZpZGVkIHVzIHdpdGggc29tZSBwc3ljaG9tZXRyaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgZGF0YS4gVGhlIGNvcnJlbGF0aW9ucyBhbW9uZyB0aGUgaXRlbXMgYXJlIGNvbnNpc3RlbnQgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGxhdGVudCB2YXJpYWJsZSByZXByZXNlbnRpbmcgb3VyIGNvbnN0cnVjdC4gRWFjaCBpdGVtIGhhZCBhYm91dCAyOCUgbWVhc3VyZW1lbnQgZXJyb3IgdmFyaWFuY2UuIFdoZW4gdHJlYXRlZCBhcyBhIGNvbXBvc2l0ZSBzY2FsZSB0aGUgYW1vdW50IG9mIG1lYXN1cmVtZW50IGVycm9yIHZhcmlhbmNlIGRlY3JlYXNlZCB0byBhYm91dCAxMiUgYmVjYXVzZSB0aGUgdHJ1ZS1zY29yZSB2YXJpYW5jZSB3YXMgZXN0aW1hdGVkIHRvIGJlIDg4JSAoYm90aCAkXGFscGhhJCBhbmQgJFxvbWVnYSQgd2VyZSAkXGFwcHJveCAuODgkKS4NCg0KfA0KfCBSZWxpYWJpbGl0eSBpcyBhIHByb3BlcnR5IG9mIGRhdGEsIG5vdCBvZiB0aGUgaW5zdHJ1bWVudHMgdXNlZCB0byBvYnRhaW4gdGhlbTsgdGhpcyBtZWFucyB0aGF0IGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIGNhbGN1bGF0ZSBhbmQgcmVwb3J0IHRoZSByZWxpYWJpbGl0eSBvZiB5b3VyIG93biBkYXRhLCB0aGFuIGl0IGlzIHRvIGNpdGUgcHJldmlvdXNseSBwdWJsaXNoZWQgdmFsdWVzIG9mIHJlbGlhYmlsaXR5Lg0KDQoNCiMjIDUuIFJlZmVyZW5jZXMNCg0KfCBCZWNrc3RlYWQsIEouVy4gKDIwMTMpLiBPbiBtZWFzdXJlbWVudHMgYW5kIHRoZWlyIHF1YWxpdHk6IFBhcGVyIDEuIFJlbGlhYmlsaXR5IC0gaGlzdG9yeSwgaXNzdWVzIGFuZCBwcm9jZWR1cmVzLiAqSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIE51cnNpbmcgU3R1ZGllcywgNTAqICg3KSwgOTY4LTk3My4NCg0KfCANCnwgQnJvd24sIFcuLCAoMTkxMCkuIFNvbWUgZXhwZXJpbWVudGFsIHJlc3VsdHMgaW4gdGhlIGNvcnJlbGF0aW9uIG9mIG1lbnRhbCBhYmlsaXRpZXMuICpCcml0aXNoIEpvdXJuYWwgb2YgUHN5Y2hvbG9neSAzKiwgMjk24oCTMzIyLg0KDQp8IA0KfCBDcm9uYmFjaCwgTC4gSi4gKDE5NTEpLiBDb2VmZmljaWVudCBhbHBoYSBhbmQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0ZXN0cy4gKlBzeWNob21ldHJpa2EsIDE2KiAoMyksIDI5N+KAkzMzNC4NCg0KfA0KfCBTcGVhcm1hbiwgQy4sICgxOTA0KS4gR2VuZXJhbCBpbnRlbGxpZ2VuY2U6IG9iamVjdGl2ZWx5IGRldGVybWluZWQgYW5kIG1lYXN1cmVkLiAqQW1lcmljYW4gSm91cm5hbCBvZiBQc3ljaG9sb2d5IDE1KiwgMjAx4oCTMjkzLg0KDQp8IA0KfCBTcGVhcm1hbiwgQy4sICgxOTEwKS4gQ29ycmVsYXRpb24gY2FsY3VsYXRlZCB3aXRoIGZhdWx0eSBkYXRhLiAqQnJpdGlzaCBKb3VybmFsIG9mIFBzeWNob2xvZ3kgMyosIDI3MeKAkzI5NS4NCiANCnwNCnwgSSBXcmlnaHQsIFMuICgxOTM0KS4gVGhlIG1ldGhvZCBvZiBwYXRoIGNvZWZmaWNpZW50cy4gKkFubmFscyBvZiBNYXRoZW1hdGljYWwgU3RhdGlzdGljcywgNSosIDE2MS0yMTUuDQo=