last update: October 31 2023

THIS IS A WORK IN PROGRESS

Overview

This essay is about effect size measures and how to obtain and report them using Mplus software. Mplus fits a variety of models, here I will be discussing single group models with categorical or continuous dependent (including latent) and independent variables. I will discuss Mplus output, including unstandardized and standardized (STDYX, STDY, STD) parameter estimates, and their relationships to commonly reported effect sizes in the behavioral sciences, especially as popularized by Jacob Cohen (1969, 1988).

Here is the tl;dr:

Following is a table showing a variety of effect sizes one might choose for different kinds of data situations, and hints as to how to find and report effect sizes from a Mplus output. Mplus produces unstandardized estimates and three flavors of standardized estimates (see Appendix A) and some of these map on to commonly used effect size statistics. Note well: Mplus does not care about the scale of the explanatory variables. Explanatory variables are handled the same way regardless of their scale, and this is as continuous variables. The Mplus framework is regression based, where dependent variables are regressed on independent variables, and unstandardized parameter estimates always indicate the difference in the dependent variable for a 1 unit difference in the explanatory variable. It is up to the user to correctly identify and interpret the meaningful parts of the output.

Explanatory Dependent Variable
Variable 2 Categories 3+ Categories Continuous
2 Categories Cohen’s h, Cohen’s w (\(\phi\) coefficient, STDYX), Odds Ratio, Risk Ratio, unstandardized regression parameter (probit) (note 11) Cohen’s w, odds ratio Cohen’s d, total sample standardized mean difference (STDY), Point-biserial correlation (\(r_{pb}\), STDYX) (note 13)
3+ Categories Cohen’s w, odds ratio Cohen’s w, odds ratio Pearson’s r (STDYX), or standardized mean difference per unit difference in \(x\) (STDY) (note 23)
Continuous Odds ratio, consider standardizing \(x\) to 2 standard deviation units (note 31) Odds ratio, Pearson’s r (STDYX) Pearson’s r (STDYX)

Notes:

note 11. With a categorical dependent variable, in Mplus you are doing (ordered) logistic (and using ML) or (ordered) probit† regression (and using weighted least squares or Bayes). Natural effect size estimates are odds ratios if logistic regression is used (obtained by taking the exponent of the unstandardized regression parameter). A special case when the explanatory variable is binary (\(x \in{0,1}\)) and the dependent variable is binary (\(y \in{0,1}\)): the STDYX estimate of the regression of y ON x is on the scale of a Pearson correlation coefficient, which is the same as a \(\phi\) coefficient. This is one of Cohen’s effect size statistics (w) and interpreted on the r scale (.1/.3/.5 S/M/L).

note 13. Although the Mplus Users Guide indicates the the STDYX-scaled effect should not be used when the explanatory variable is categorical (See Appendix A, below), when the explanatory variable is binary the STDYX effect is a point-biserial correlation coefficient (\(r_{pb}\)) and is an effect size statistic in the r family. Perhaps more usefully, the \(r_{pb}\) and be converted to a proper Cohen’s d, also explained below.

If the explanatory variable is binary (\(x \in{0,1}\)) then either or both of the effects under the STD or STDY standardization provide effect size estimates that are in the d family. Use STD or STDY if the dependent variable is a latent variable, use STDY if the dependent variable is a manifest (i.e., observed) variable. When the explanatory variable is binary the STD and STDY scaled effects are mean differences standardized to the total sample standard deviation. Note that Cohen’s d is the mean difference standardized to the within-group or pooled standard deviation, which is smaller than the total sample standard deviation. The STD and STDY effects can be reported as “standardized mean differences” and in the methods specify “standardized with respect to the total sample standard deviation”. Do not describe as Cohen’s d, but feel free to use the usual Cohen’s d thresholds of .2, .5, and .8 as defining small, medium, and large effects.

note 23. When the explanatory variable has many categories (i.e., more than 2) I would consider reporting either the STDY effect or the STDYX effect. The STDY effect provides the total sample standard deviation difference per 1-unit difference in the explanatory variable. There is no comparable effect size statistic in Cohen’s taxonomy. The STDYX scaled effect is a Pearson-scaled correlation between the latent response variable for the dependent variable and the manifest variable, treating the manifest variable as a continuous variable. This I would interpret as a correlation coefficient (which is in Cohen’s taxonomy with S/M/L thresholds of .1/.3/.5). Here is how you decide between STDY and STDYX: if you would be comfortable interpreting a Pearson correlation between the many-category-explanatory variable and the continuous dependent variable, use STDYX. Otherwise, use something else, such as STDY, or break the many-category explanatory variable into a set of dummies and use Cohen’s d relative to a reference level of the categorical variable (or STDY as a Cohen’s d family [read on] effect size statistic). Still another option would be to “bring the explanatory variable into the model” as a categorical variable and estimate a polyserial correlation with STDYX (see Appendix E).

note 31, 32. With a categorical dependent variable, in Mplus you are doing (ordered) logistic (and using ML) or (ordered) probit regression (and using weighted least squares or Bayes). Natural effect size estimates are odds ratios if logistic regression is used (obtained by taking the exponent of the unstandardized regression parameter). Consider standardizing your explanatory variable to some meaningful units (e.g., age per 10 years) or with one or 2 (following Gelman 2008) standard deviation units. If doing probit regression, the regression parameter estimates describe the difference in normal probability (Z-score) units per 1-unit difference in the explanatory variable.

† I discuss an effect size interpretation of probit regression coefficients using the Educational Testing Services A/B/C differential item functioning categories in this blog post. To save you a click, in that post I argue that when the Mplus estimator is MLR/probit, WLSMV/theta, or Bayes, negligible effects are less than .1 (A DIF), and large effects are greater than .375 (C DIF), and the remainder are slight to moderate effects (B DIF). This interpretation is worked out for binary dependent variables and binary independent variables.

Chapter 1. Effect sizes for differences in means: The d family

A standard set of effect size measures in psychology and other applied fields are those described by Jacob Cohen in his Statistical power analysis for the behavioral sciences (1988, Second edition, LEA, Hillsdale NJ). I will presume the reader has some familiarity with Cohen’s effect size framework, and an absolute bare minimum is familiarity with Cohen’s d effect size. His book can be found online in pdf form, and there have been countless review manuscripts and are innumerable websites summarizing this material. Cohen’s book is a classic and worth obtaining and at least thumbing through for any data analyst.

In a regression framework, differences in means implies we have a continuous dependent variable \(Y\) and a binary independent variable \(X\) (X=0, X=1). We are interested in characterizing the difference in the mean of \(Y\) when \(X=0\) (\(\overline{Y}_{0}\)) and when \(X=0\) (\(\overline{Y}_{1}\)), i.e., \(\overline{Y}_{1}-\overline{Y}_{0}\). This difference in means is captured by the linear regression model of \(Y\) on \(X\)

\(y = a + bx + e\)

where parameter \(b\) captures the difference in \(y\) across levels of – or per 1-unit difference in – variable \(x\).

Statistic Referred to as Estimator Description (and S/M/L thresholds)
\(b\) Unstandardized effect size \(\left(\overline{Y}_1-\overline{Y}_0\right)\) Unstandardized regression coefficient
d Cohen’s d \(\left(\overline{Y}_{1}-\overline{Y}_{0}\right)\frac{1}{s_p}\) Mean difference divided by the pooled standard deviation (.2/.5/.8)
STD, STDY Mean difference standardized to the total sample standard deviation \(\left(\overline{Y}_{1}-\overline{Y}_{0}\right)\frac{1}{s_Y}\) Mean difference divided by the total sample standard deviation (\(s_Y\)).
\(r_{pb}\) Point-biseral correlation \(\left(\overline{Y}_{1}-\overline{Y}_{0}\right)\frac{s_X}{s_{Y}}\) where \(s_{X}= \sqrt{pq}\), \(p\) being the proportion in group 1 and \(q= 1-p\); this is also the STDYX scaled regression coefficient from Mplus output of a continuous outcome on a dummy variable
\(r_b\) Biserial correlation \(\left(\overline{Y}_{1}-\overline{Y}_{0}\right)\frac{pq/a}{s_Y}\) where \(a\) is the height of the standard normal distribution at \(Z(p)\), \(a = e^{{-p^2}/2}/\sqrt{2\pi}\). In Stata, use normalden(<p>,0,1) and in R, use dnorm(<p>,0,1). See Appendix E

Approximations to Cohen’s d

The most commonly used effect size statistic for a continuous dependent variable and binary independent variable for describing mean differences is Cohen’s d.

Direct computation

There is only one circumstance when it is relatively easy or straightforward to get a Cohen’s d from Mplus output. This the bivariable case, where a single \(Y\) is regressed on a single \(X\). In this model, the MODEL RESULTS output regression parameter for y on x is the difference in means , and the square root of the residual variances result for y is a good estimate of the pooled standard deviation. Then, Cohen’s d can be estimated with y_on_x/sqrt(residual_variances_y). However, this situation is not expected to arise in real data analysis, because usually we will have multiple explanatory variables.

A data analyst could compute the pooled variance ahead of doing the analysis and use those in a MODEL CONSTRAINT command in Mplus. I will illustrate using the example data set dropout.dat used for the examples by Muthén, Muthén and Asparouhov in their text Regression and Mediation Analysis Using Mplus (2016). Hereafter I will refer to this book as MMA16. The data are described in Appendix B.

# load data from MMA16, as processed. See Appendix B.
dod <- haven::read_dta(here::here("dropout.dta"))
dod["male"] <- as.numeric(dod["gender"]==2)
# Compute Cohen's d for `math7` on `male` using effsize package
# install.packages("effsize")
effsize_d <- effsize::cohen.d(formula = math7 ~ male , data = dod)
## Warning in cohen.d.formula(formula = math7 ~ male, data = dod): Cohercing rhs
## of formula to factor
effsize_d
## 
## Cohen's d
## 
## d estimate: 0.1315 (negligible)
## 95 percent confidence interval:
##   lower   upper 
## 0.06056 0.20249
# Save some results from observed data to use in Mplus
# the pooled standard deviation
sy <- sd(dod$math7[!is.na(dod$math7)])
s0 <- sd(dod$math7[dod$male==0 & !is.na(dod$math7)])
s1 <- sd(dod$math7[dod$male==1 & !is.na(dod$math7)])
n0 <- length(dod$math7[dod$male==0 & !is.na(dod$math7)])
n1 <- length(dod$math7[dod$male==1 & !is.na(dod$math7)])
sp <-  sqrt(((n0-1)*s0^2 + (n1-1)*s1^2) / (n0 + n1 - 2))

# Define a Mplus model regressing math7 on male 
model1.model <- paste("math7 on male (b); ","\nMODEL CONSTRAINT: new (d); ", "\nd = b/",sp,";")
cat(model1.model)
## math7 on male (b);  
## MODEL CONSTRAINT: new (d);  
## d = b/ 10.1785151926642 ;
model1 <- MplusAutomation::mplusModeler(
   MplusAutomation::mplusObject(
      MODEL =  model1.model ,
      OUTPUT = "STANDARDIZED;" ,
      rdata = dod) ,
   "dod.dat" ,
   run = 1L)

model1_new <- model1$results$parameters$unstandardized[model1$results$parameters$unstandardized$paramHeader == "New.Additional.Parameters",]
model1_d <- model1_new[model1_new$param == "D",c("est","se")]
model1_d
##      est    se
## 4 -0.131 0.036
ci95(model1_d[[1]],model1_d[[2]])
## [1] -0.20156 -0.06044
# cat( readLines( "dod.out" ) , sep = "\n" )

Similar examples of using known constants in the MODEL CONSTRAINT command are illustrated in MMA16 (see Table 1.11, page 38).

Standardize your outcome to the pooled standard deviation prior to analysis and interpret the unstandardized coefficients

dod$zspmath7 <- ( dod$math7 - mean(dod$math7[!is.na(dod$math7)]) ) / sp
sd(dod$zspmath7[!is.na(dod$zspmath7)])
## [1] 1.002
model2 <- MplusAutomation::mplusModeler(
   MplusAutomation::mplusObject(
      MODEL =  "zspmath7 on male ;" ,
      rdata = dod) ,
   "dod.dat" ,
   run = 1L)

model2_unstd <- as.data.frame(model2$results$parameters$unstandardized)
model2_unstd
##          paramHeader    param     est    se  est_se  pval
## 1        ZSPMATH7.ON     MALE  -0.131 0.036  -3.636 0.000
## 2              Means    MATH7  50.395 0.184 273.605 0.000
## 3         Intercepts ZSPMATH7   0.068 0.026   2.620 0.009
## 4          Variances    MATH7 103.981 2.656  39.148 0.000
## 5 Residual.Variances ZSPMATH7   0.999 0.026  39.143 0.000
model2_d <- model2_unstd[model2_unstd$paramHeader == "ZSPMATH7.ON" & model2_unstd$param == "MALE", c("est","se")]
model2_d
##      est    se
## 1 -0.131 0.036
ci95(model2_d[[1]],model2_d[[2]])
## [1] -0.20156 -0.06044
# cat( readLines( "dod.out" ) , sep = "\n" )

The limitation of this approach is the data analyst is probably interested in multiple Cohen’s d-scaled effects due to multiple explanatory variables, but can only standardize the variables with respect to one binary background variable before each analysis.

Convert \(r_{pb}\) to d

This is the most general and extensible approach. Cohen’s d can also be approximated by converting the point-biserial correlation (\(r_{pb}\)) to \(d\). A conversion that works well is

\(d = \frac{r_{pb}}{\sqrt{1-r_{pb}^2}}\left(\frac{1}{s_X}\right)\)

This expression may be encountered in the literature using 2 instead of \(1/s_X\); this is because \(1/s_X\) is 2 when \(p=.5\), and this is a common situation especially in experimental designs. Computation still requires knowing the proportion of the sample with \(X=1\) and total variance of \(Y\) which are not part of the output unless the \(X\) variable is “brought into the model”, and in the example code below I do this by specifying the mean of x is to be estimated and labeled with (p).

model3 <- MplusAutomation::mplusModeler(
   MplusAutomation::mplusObject(
      MODEL =  "math7 on male (b);
                math7 (resvar); 
               [male] (p); 
               model constraint: new (vx vy rpb d); 
               vx = p*(1-p) ; 
               vy = b^2*vx + resvar ; 
               rpb = b*sqrt(vx)/sqrt(vy) ; 
               d = rpb/(sqrt(1-rpb**2)*(sqrt(vx))) ;" ,
      OUTPUT = "STANDARDIZED;" ,
      rdata = dod) ,
   "dod.dat" ,
   run = 1L)
## Warning in i1:i2: numerical expression has 3 elements: only the first used
model3_new <- model3$results$parameters$unstandardized[model3$results$parameters$unstandardized$paramHeader == "New.Additional.Parameters",]
model3_d <- model3_new[model3_new$param == "D",c("est","se")]
model3_d
##       est    se
## 23 -0.131 0.036
ci95(model3_d[[1]],model3_d[[2]])
## [1] -0.20156 -0.06044
#cat( readLines( "dod.out" ) , sep = "\n" )

It is also worth nothing:

  • This model produces nonidentification warnings, but standard errors are produced and this is not an issue for the type of model that is being estimated

  • The “hand calculation” of the total variance of y will be more complicated with more explanatory variables, and with interactions among the explanatory variables. But we have seen from example 1 that we can easily obtain numerical summaries in R and paste them into a Mplus model statement. This could be done for vx and vy to save coding in Mplus.

A data analyst could compute a Cohen’s d-scaled effect size statistic outside of Mplus, and take advantage of the fact that Mplus computes the point-biserial correlation in the STDYX output:

model4 <- MplusAutomation::mplusModeler(
   MplusAutomation::mplusObject(
      MODEL =  "math7 on male ;" ,
      OUTPUT = "STANDARDIZED;" ,
      rdata = dod) , "dod.dat" , run = 1L)
model4_stdyx <- as.data.frame(model4$results$parameters$stdyx.standardized)
model4_rpb <- model4_stdyx[model4_stdyx$paramHeader=="MATH7.ON" & model4_stdyx$param=="MALE",c("est","se")]
p <- mean(dod$male)
model4_stdyx_d <- model4_rpb/sqrt(1-model4_rpb^2)*(1/sqrt(p*(1-p)))
model4_stdyx_d
##       est      se
## 1 -0.1324 0.03604
ci95(model4_stdyx_d[[1]],model4_stdyx_d[[2]])
## [1] -0.20305 -0.06178

Report the STDY effect instead of computing a d

The STDY-scaled regression of a continuous manifest variable on a binary explanatory variable (MATH7 ON MALE, effect \(b/s_Y\)) is a conservative (i.e., under) estimate of the Cohen’s d (\(b/s_P\); where \(b\) is the unstandardized regression parameter capturing the mean difference in \(Y\) (MATH7) across levels of \(X\) (MALE), and \(s_Y\) is the total sample standard deviation and \(s_P\) is the pooled standard deviation) effect size. Reporting the STDY scaled effect and interpreting using thresholds of .2/.5/.8 for small, medium and large will lead to under-estimating the size of the effect relative to what would be interpreted if Cohen’s d had been used. But STDY scaled effects are not wrong, they are just summaries of \(b\) standardized to a different standard deviation than d. It would be wrong to say that the STDY effects are Cohen’s d, but one could say that they are in Cohen’s d family. After all, Cohen described many different standardizations to the mean difference in his 1988 text (notably none of these involved standardizing to the total sample standard deviation), and what we now know as “the” Cohen’s d is only one of those.

model4_stdy  <- as.data.frame(model4$results$parameters$stdy.standardized)
model4_stdy_d <- model4_stdy[model4_stdy$paramHeader=="MATH7.ON" & model4_stdy$param=="MALE",c("est","se")]
model4_stdy_d
##      est    se
## 1 -0.131 0.036
ci95(model4_stdy_d[[1]],model4_stdy_d[[2]])
## [1] -0.20156 -0.06044
effsize_d
## 
## Cohen's d
## 
## d estimate: 0.1315 (negligible)
## 95 percent confidence interval:
##   lower   upper 
## 0.06056 0.20249

The close approximation of the STDY standardization of the MATH7 ON MALE effect (\(b/s_Y\)) and Cohen’s d (\(b/s_P\)) in this case is that \(b\) is small (close to 0) and the sample size is very large, and these are the factors that determine the similarity of \(s_P\) and \(s_Y\). The pooled standard deviation is a kind of average within-group standard deviation:

\(s_p = \sqrt{ \frac{(n_0-1)s_0^2 + (n_1-1)s_1^2}{n_0+n_1-2} } = \sqrt{q's_0^2 + p's_1^2}\)

where \(p' = (n_1-1)/(n_0+n_1-2)\) and \(q' = (n_0-1)/(n_0+n_1-2)\); when the sample size is large \(p'\) approaches \(p\). Those within group standard deviations (\(s_0, s_1\)) are average deviations for members groups defined by \(x\) relative to the mean of their own group. The total sample standard deviation is based on the deviation from the total sample mean. It is based on total variablity, and includes both within-group variability and between group variability:

\(s_y = \sqrt{qs_0^2 + ps_1^2 + pqb^2}\)

The point is, the main difference between the pooled variance (\(s^2_p\)) and the total variance (\(s^2_Y\)) is the mean difference squared times the variance in \(x\): the between group variance component represented by \(pqb^2\). This is why the STDY effect will always be smaller than Cohen’s d, unless \(b=0\) in which case they will be equal but also equally uninteresting.

# compare sp and sY
# need parameter estimate for "b", extract b from last model
model4_unstd <- model4$results$parameters$unstandardized
model4_unstd
##          paramHeader param     est    se  est_se pval
## 1           MATH7.ON  MALE  -1.339 0.368  -3.639    0
## 2         Intercepts MATH7  51.091 0.265 192.640    0
## 3 Residual.Variances MATH7 103.538 2.645  39.146    0
b <- model4_unstd[model4_unstd$paramHeader=="MATH7.ON" & model4_unstd$param=="MALE","est"]
# compute sY as function of within and between components
sy2 <- sqrt((1-p)*s0^2 + p*s1^2 + p*(1-p)*b^2)
# compare to what was obtained earlier
# reported to 4 significant digits because b only has
# 4 significant digits
options(digits=3)
c(s0, s1, sp, sy, sy2)
## [1]  9.64 10.65 10.18 10.20 10.20

Chapter 2. Effect sizes based on differences in proportions

Come back later for more. I’ll add discussion of odds ratios and probit regression coefficients.

Statistic Use Formula Description (and S/M/L thresholds)
h Difference in proportions \(h = 2 \text{asin}(p_1^.5) - 2 \text{asin}(p_2^.5)\) The difference in arcsin transformed proportions. Useful for binary outcomes compared across two groups (.2/.5/.8)
w Association of two categorical variables \(w = \sqrt{\chi^2/N}\) The same as the \(\phi\) (phi) coefficient for 2×2 tables, but also used for cross-tabulations of higher dimensions. The \(\phi\) coefficient is what you would get if you calculated a Pearson correlation coefficient on two binary variables, treating them as continuous variables (.1/.3/.5)

Chapter 3. Effect sizes based on the correlation coefficient

Come back later for more. This is

Statistic Use Formula Description (and S/M/L thresholds)
r Association of two continuous variables The Pearson’s correlation coefficient (.1/.3/.5)
q Difference in two correlation coefficients \(q = \text{atanh}(r_1)-\text{atanh}(r_2)\) Computed as difference in two Fisher’s z-transformed correlation coefficients (.1/.3/.5)

References

Cohen, J. (1969). Statistical power analysis for the behavioral sciences. Academic Press.

Cohen, J. (1988). Statistical power analysis for the behavioral sciences. Second Edition. Lawrence Erlbaum Associates.

Gelman, A. (2008). Scaling regression inputs by dividing by two standard deviations. Statistics in Medicine, 27(15), 2865.

Muthén, L., & Muthén, B. (1998-2017). Mplus Users Guide (Eighth ed.). Muthén & Muthén.

Muthén, B. O., Muthén, L. K., & Asparouhov, T. (2017). Regression and mediation analysis using Mplus. Muthén & Muthén Los Angeles, CA.

Appendix A - Mplus Standardization

Flavor Standardized with respect to the …
STDYX variances of the continuous latent variables, and the variances of the background (or explanatory) variables and the dependent variables.
STDY variances of the continuous latent variables as well as the variances of the outcome variables for standardization.
STD variances of the continuous latent variables

This is exerpted from the Mplus Users’ Guide, Chapter 18, which describes OUTPUT command options:

The STANDARDIZED option is used to request standardized parameter estimates and their standard errors and R-square…Three types of standardizations are provided as the default.

The first type of standardization is shown under the heading StdYX in the output. StdYX uses the variances of the continuous latent variables as well as the variances of the background and outcome variables for standardization. The StdYX standardization is the one used in the linear regression of y on x,

bStdYX = b × SD(x)/SD(y),

where b is the unstandardized linear regression coefficient, SD(x) is the sample standard deviation of x, and SD(y) is the model estimated standard deviation of y. The standardized coefficient bStdYX is interpreted as the change in y in y standard deviation units for a standard deviation change in x.

The second type of standardization is shown under the heading StdY in the output. StdY uses the variances of the continuous latent variables as well as the variances of the outcome variables for standardization. The StdY standardization for the linear regression of y on x is

bStdY = b/SD(y).

StdY should be used for binary covariates because a standard deviation change of a binary variable is not meaningful. The standardized coefficient bStdY is interpreted as the change in y in y standard deviation units when x changes from zero to one.

Appendix B - Example data set

The example data set comes from the online examples and data code on Statmodel.com and used by Muthén, Muthén and Asparouhov in their text Regression and Mediation Analysis Using Mplus (2016). The data set dropout.dat is used in was downloaded from https://statmodel.com/mplusbook/chapter1.shtml and munged in Excel and Stata to produce dropout.dta. Get a copy of my version at https://quantsci.s3.amazonaws.com/BlogPosts/dropout.dta.

Stata data munging code:

insheet using dropout.csv 
replace mothed=. if mothed==8
replace fathed=. if fathed==8
replace fathsei=. if fathsei==996
replace fathsei=. if fathsei==998
replace ethnic=. if ethnic==8
replace homeres=.  if homeres==98
foreach x of varlist math7-math12 {
    replace `x'=. if inlist(`x',996,998)
 }
saveold dropout.dta , version(13)

Appendix C - Miscellaneous equations

Pooled standard deviation

\(s_p = \sqrt{ \frac{(n_0-1) \cdot s_0^2 + (n_1-1) \cdot s_1^2}{n_0+n_1-2} }\)

Appendix D - Other effect size statistics

Statistic Use Formula Description (and S/M/L thresholds)
\(\Delta\) Differences in means \(\Delta = \left(\overline{Y}_{1}-\overline{Y}_{0}\right)\frac{1}{s_c}\) Mean difference divided by the control group standard deviation; Glass’ delta

Add Hedge’s g

Appendix E - The biserial correlation, and the polyserial correlation

Show an example of computing the biserial correlation (by hand) and the polyserial correlation (bringing the explanatory variable into the model).

LS0tCnRpdGxlOiAiT2J0YWluaW5nIGFuZCByZXBvcnRpbmcgZWZmZWN0IHNpemVzIHVzaW5nIE1wbHVzIgphdXRob3I6ICJSaWNoIEpvbmVzIgpkYXRlOiAiMTAvMzEvMjAyMyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICBjc3M6IG1hcmtzdGF0LmNzcwogICAgc2VsZl9jb250YWluZWQ6IHllcwogICAgdG9jOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCm9wdGlvbnMoZGlnaXRzPTQpICMgZm91ciBzaWduaWZpY2FudCBkaWdpdHMgaW4gZGlzcGxheWluZyBvdXRwdXQKY2k5NSA8LSBmdW5jdGlvbih4LHkpIHsKICAgbGwgPC0geCAtIHFub3JtKC45NzUpKnkKICAgdWwgPC0geCArIHFub3JtKC45NzUpKnkKICAgY2kgPC0gYyhsbCx1bCkKICAgY2kKfQpgYGAKCmxhc3QgdXBkYXRlOiBgciBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlQiAlZCAlWSIpYAoKKipUSElTIElTIEEgV09SSyBJTiBQUk9HUkVTUyoqCgojIE92ZXJ2aWV3ClRoaXMgZXNzYXkgaXMgYWJvdXQgZWZmZWN0IHNpemUgbWVhc3VyZXMgYW5kIGhvdyB0byBvYnRhaW4gYW5kIHJlcG9ydCB0aGVtIHVzaW5nIE1wbHVzIHNvZnR3YXJlLiBNcGx1cyBmaXRzIGEgdmFyaWV0eSBvZiBtb2RlbHMsIGhlcmUgSSB3aWxsIGJlIGRpc2N1c3Npbmcgc2luZ2xlIGdyb3VwIG1vZGVscyB3aXRoIGNhdGVnb3JpY2FsIG9yIGNvbnRpbnVvdXMgZGVwZW5kZW50IChpbmNsdWRpbmcgbGF0ZW50KSBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGVzLiBJIHdpbGwgZGlzY3VzcyBNcGx1cyBvdXRwdXQsIGluY2x1ZGluZyB1bnN0YW5kYXJkaXplZCBhbmQgc3RhbmRhcmRpemVkIChgU1REWVhgLCBgU1REWWAsIGBTVERgKSBwYXJhbWV0ZXIgZXN0aW1hdGVzLCBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyB0byBjb21tb25seSByZXBvcnRlZCBlZmZlY3Qgc2l6ZXMgaW4gdGhlIGJlaGF2aW9yYWwgc2NpZW5jZXMsIGVzcGVjaWFsbHkgYXMgcG9wdWxhcml6ZWQgYnkgSmFjb2IgQ29oZW4gKDE5NjksIDE5ODgpLgoKKipIZXJlIGlzIHRoZSB0bDtkcjoqKgoKRm9sbG93aW5nIGlzIGEgdGFibGUgc2hvd2luZyBhIHZhcmlldHkgb2YgZWZmZWN0IHNpemVzIG9uZSBtaWdodCBjaG9vc2UgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBkYXRhIHNpdHVhdGlvbnMsIGFuZCBoaW50cyBhcyB0byBob3cgdG8gZmluZCBhbmQgcmVwb3J0IGVmZmVjdCBzaXplcyBmcm9tIGEgTXBsdXMgb3V0cHV0LiBNcGx1cyBwcm9kdWNlcyB1bnN0YW5kYXJkaXplZCBlc3RpbWF0ZXMgYW5kIHRocmVlIGZsYXZvcnMgb2Ygc3RhbmRhcmRpemVkIGVzdGltYXRlcyAoc2VlIEFwcGVuZGl4IEEpIGFuZCBzb21lIG9mIHRoZXNlIG1hcCBvbiB0byBjb21tb25seSB1c2VkIGVmZmVjdCBzaXplIHN0YXRpc3RpY3MuIE5vdGUgd2VsbDogTXBsdXMgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgc2NhbGUgb2YgdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcy4gRXhwbGFuYXRvcnkgdmFyaWFibGVzIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheSByZWdhcmRsZXNzIG9mIHRoZWlyIHNjYWxlLCBhbmQgdGhpcyBpcyBhcyBjb250aW51b3VzIHZhcmlhYmxlcy4gVGhlIE1wbHVzIGZyYW1ld29yayBpcyByZWdyZXNzaW9uIGJhc2VkLCB3aGVyZSBkZXBlbmRlbnQgdmFyaWFibGVzIGFyZSByZWdyZXNzZWQgb24gaW5kZXBlbmRlbnQgdmFyaWFibGVzLCBhbmQgdW5zdGFuZGFyZGl6ZWQgcGFyYW1ldGVyIGVzdGltYXRlcyBhbHdheXMgaW5kaWNhdGUgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBmb3IgYSAxIHVuaXQgZGlmZmVyZW5jZSBpbiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUuIEl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGNvcnJlY3RseSBpZGVudGlmeSBhbmQgaW50ZXJwcmV0IHRoZSBtZWFuaW5nZnVsIHBhcnRzIG9mIHRoZSBvdXRwdXQuIAoKYGBge3IgY2VsbC1lbnRyaWVzLCBlY2hvPUZBTFNFfQpjZWxsMTEgPC0gIkNvaGVuJ3MgKmgqLCBDb2hlbidzICp3KiAoJFxccGhpJCBjb2VmZmljaWVudCwgYFNURFlYYCksIE9kZHMgUmF0aW8sIFJpc2sgUmF0aW8sIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gcGFyYW1ldGVyIChwcm9iaXQpIChub3RlIDExKSIKY2VsbDEyIDwtICJDb2hlbidzICp3Kiwgb2RkcyByYXRpbyIKY2VsbDEzIDwtICJDb2hlbidzICpkKiwgdG90YWwgc2FtcGxlIHN0YW5kYXJkaXplZCBtZWFuIGRpZmZlcmVuY2UgKGBTVERZYCksIFBvaW50LWJpc2VyaWFsIGNvcnJlbGF0aW9uICgkcl97cGJ9JCwgYFNURFlYYCkgKG5vdGUgMTMpIgpjZWxsMjEgPC0gIkNvaGVuJ3MgKncqLCBvZGRzIHJhdGlvIgpjZWxsMjIgPC0gIkNvaGVuJ3MgKncqLCBvZGRzIHJhdGlvIgpjZWxsMjMgPC0gIlBlYXJzb24ncyAqciogKGBTVERZWGApLCBvciBzdGFuZGFyZGl6ZWQgbWVhbiBkaWZmZXJlbmNlIHBlciB1bml0IGRpZmZlcmVuY2UgaW4gJHgkIChgU1REWWApIChub3RlIDIzKSIKY2VsbDMxIDwtICJPZGRzIHJhdGlvLCBjb25zaWRlciBzdGFuZGFyZGl6aW5nICR4JCB0byAyIHN0YW5kYXJkIGRldmlhdGlvbiB1bml0cyAobm90ZSAzMSkiCmNlbGwzMiA8LSAiT2RkcyByYXRpbywgUGVhcnNvbidzICpyKiAoYFNURFlYYCkiCmNlbGwzMyA8LSAiUGVhcnNvbidzICpyKiAoYFNURFlYYCkiCmBgYAoKfCoqRXhwbGFuYXRvcnkqKnwqKkRlcGVuZGVudCoqfCoqVmFyaWFibGUqKnx8Cnw6LS18Oi0tOnw6LS06fDotLTp8CnwqKlZhcmlhYmxlKip8KipfMiBDYXRlZ29yaWVzXyoqfCoqXzMrIENhdGVnb3JpZXNfKip8KipfQ29udGludW91c18qKnwKfCoqXzIgQ2F0ZWdvcmllc18qKiB8YHIgY2VsbDExYHxgciBjZWxsMTJgfGByIGNlbGwxM2B8CnwqKl8zKyBDYXRlZ29yaWVzXyoqfGByIGNlbGwyMWB8YHIgY2VsbDIyYHxgciBjZWxsMjNgfAp8KipfQ29udGludW91c18qKiAgIHxgciBjZWxsMzFgfGByIGNlbGwzMmB8YHIgY2VsbDMzYHwKCgoqKk5vdGVzOioqCgoqKm5vdGUgMTEqKi4gV2l0aCBhIGNhdGVnb3JpY2FsIGRlcGVuZGVudCB2YXJpYWJsZSwgaW4gTXBsdXMgeW91IGFyZSBkb2luZyAob3JkZXJlZCkgbG9naXN0aWMgKGFuZCB1c2luZyBNTCkgb3IgKG9yZGVyZWQpIHByb2JpdOKAoCByZWdyZXNzaW9uIChhbmQgdXNpbmcgd2VpZ2h0ZWQgbGVhc3Qgc3F1YXJlcyBvciBCYXllcykuIE5hdHVyYWwgZWZmZWN0IHNpemUgZXN0aW1hdGVzIGFyZSBvZGRzIHJhdGlvcyBpZiBsb2dpc3RpYyByZWdyZXNzaW9uIGlzIHVzZWQgKG9idGFpbmVkIGJ5IHRha2luZyB0aGUgZXhwb25lbnQgb2YgdGhlIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gcGFyYW1ldGVyKS4gQSBzcGVjaWFsIGNhc2Ugd2hlbiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgaXMgYmluYXJ5ICgkeCBcaW57MCwxfSQpIGFuZCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGlzIGJpbmFyeSAoJHkgXGluezAsMX0kKTogdGhlIGBTVERZWGAgZXN0aW1hdGUgb2YgdGhlIHJlZ3Jlc3Npb24gb2YgYHkgT04geGAgIGlzIG9uIHRoZSBzY2FsZSBvZiBhIFBlYXJzb24gY29ycmVsYXRpb24gY29lZmZpY2llbnQsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGEgJFxwaGkkIGNvZWZmaWNpZW50LiBUaGlzIGlzIG9uZSBvZiBDb2hlbidzIGVmZmVjdCBzaXplIHN0YXRpc3RpY3MgKCp3KikgYW5kIGludGVycHJldGVkIG9uIHRoZSAqciogc2NhbGUgKC4xLy4zLy41IFMvTS9MKS4KCioqbm90ZSAxMyoqLiBBbHRob3VnaCB0aGUgW01wbHVzIFVzZXJzIEd1aWRlXShodHRwczovL3d3dy5zdGF0bW9kZWwuY29tL0hUTUxfVUcvY2hhcHRlcjE4VjguaHRtKSBpbmRpY2F0ZXMgdGhlIHRoZSBgU1REWVhgLXNjYWxlZCBlZmZlY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlIGlzIGNhdGVnb3JpY2FsIChTZWUgQXBwZW5kaXggQSwgYmVsb3cpLCB3aGVuIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZSBpcyBiaW5hcnkgdGhlIGBTVERZWGAgZWZmZWN0IGlzIGEgcG9pbnQtYmlzZXJpYWwgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKCRyX3twYn0kKSBhbmQgaXMgYW4gZWZmZWN0IHNpemUgc3RhdGlzdGljIGluIHRoZSAqciogZmFtaWx5LiBQZXJoYXBzIG1vcmUgdXNlZnVsbHksIHRoZSAkcl97cGJ9JCBhbmQgYmUgY29udmVydGVkIHRvIGEgcHJvcGVyIENvaGVuJ3MgKmQqLCBhbHNvIGV4cGxhaW5lZCBiZWxvdy4gCgpJZiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgaXMgYmluYXJ5ICgkeCBcaW57MCwxfSQpIHRoZW4gZWl0aGVyIG9yIGJvdGggb2YgdGhlIGVmZmVjdHMgdW5kZXIgdGhlIGBTVERgIG9yIGBTVERZYCBzdGFuZGFyZGl6YXRpb24gcHJvdmlkZSBlZmZlY3Qgc2l6ZSBlc3RpbWF0ZXMgdGhhdCBhcmUgaW4gdGhlICpkKiBmYW1pbHkuIFVzZSBgU1REYCBvciBgU1REWWAgaWYgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBpcyBhIGxhdGVudCB2YXJpYWJsZSwgdXNlIGBTVERZYCBpZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGlzIGEgbWFuaWZlc3QgKGkuZS4sIG9ic2VydmVkKSB2YXJpYWJsZS4gV2hlbiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgaXMgYmluYXJ5IHRoZSBgU1REYCBhbmQgYFNURFlgIHNjYWxlZCBlZmZlY3RzIGFyZSBtZWFuIGRpZmZlcmVuY2VzIHN0YW5kYXJkaXplZCB0byB0aGUgKnRvdGFsIHNhbXBsZSogc3RhbmRhcmQgZGV2aWF0aW9uLiBOb3RlIHRoYXQgQ29oZW4ncyAqZCogaXMgdGhlIG1lYW4gZGlmZmVyZW5jZSBzdGFuZGFyZGl6ZWQgdG8gdGhlIHdpdGhpbi1ncm91cCBvciAqcG9vbGVkKiBzdGFuZGFyZCBkZXZpYXRpb24sIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbi4gVGhlIGBTVERgIGFuZCBgU1REWWAgZWZmZWN0cyBjYW4gYmUgcmVwb3J0ZWQgYXMgInN0YW5kYXJkaXplZCBtZWFuIGRpZmZlcmVuY2VzIiBhbmQgaW4gdGhlIG1ldGhvZHMgc3BlY2lmeSAic3RhbmRhcmRpemVkIHdpdGggcmVzcGVjdCB0byB0aGUgdG90YWwgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiIuIERvIG5vdCBkZXNjcmliZSBhcyBDb2hlbidzICpkKiwgYnV0IGZlZWwgZnJlZSB0byB1c2UgdGhlIHVzdWFsIENvaGVuJ3MgKmQqIHRocmVzaG9sZHMgb2YgLjIsIC41LCBhbmQgLjggYXMgZGVmaW5pbmcgc21hbGwsIG1lZGl1bSwgYW5kIGxhcmdlIGVmZmVjdHMuIAoKKipub3RlIDIzKiouIFdoZW4gdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlIGhhcyBtYW55IGNhdGVnb3JpZXMgKGkuZS4sIG1vcmUgdGhhbiAyKSBJIHdvdWxkIGNvbnNpZGVyIHJlcG9ydGluZyBlaXRoZXIgdGhlIGBTVERZYCBlZmZlY3Qgb3IgdGhlIGBTVERZWGAgZWZmZWN0LiBUaGUgYFNURFlgIGVmZmVjdCBwcm92aWRlcyB0aGUgdG90YWwgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBkaWZmZXJlbmNlIHBlciAxLXVuaXQgZGlmZmVyZW5jZSBpbiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUuIFRoZXJlIGlzIG5vIGNvbXBhcmFibGUgZWZmZWN0IHNpemUgc3RhdGlzdGljIGluIENvaGVuJ3MgdGF4b25vbXkuIFRoZSBgU1REWVhgIHNjYWxlZCBlZmZlY3QgaXMgYSBQZWFyc29uLXNjYWxlZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBsYXRlbnQgcmVzcG9uc2UgdmFyaWFibGUgZm9yIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgYW5kIHRoZSBtYW5pZmVzdCB2YXJpYWJsZSwgdHJlYXRpbmcgdGhlIG1hbmlmZXN0IHZhcmlhYmxlIGFzIGEgY29udGludW91cyB2YXJpYWJsZS4gVGhpcyBJIHdvdWxkIGludGVycHJldCBhcyBhIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50ICh3aGljaCBpcyBpbiBDb2hlbidzIHRheG9ub215IHdpdGggUy9NL0wgdGhyZXNob2xkcyBvZiAuMS8uMy8uNSkuIEhlcmUgaXMgaG93IHlvdSBkZWNpZGUgYmV0d2VlbiBgU1REWWAgYW5kIGBTVERZWGA6IGlmIHlvdSB3b3VsZCBiZSBjb21mb3J0YWJsZSBpbnRlcnByZXRpbmcgYSBQZWFyc29uIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIG1hbnktY2F0ZWdvcnktZXhwbGFuYXRvcnkgdmFyaWFibGUgYW5kIHRoZSBjb250aW51b3VzIGRlcGVuZGVudCB2YXJpYWJsZSwgdXNlIGBTVERZWGAuIE90aGVyd2lzZSwgdXNlIHNvbWV0aGluZyBlbHNlLCBzdWNoIGFzIGBTVERZYCwgb3IgYnJlYWsgdGhlIG1hbnktY2F0ZWdvcnkgZXhwbGFuYXRvcnkgdmFyaWFibGUgaW50byBhIHNldCBvZiBkdW1taWVzIGFuZCB1c2UgQ29oZW4ncyAqZCogcmVsYXRpdmUgdG8gYSByZWZlcmVuY2UgbGV2ZWwgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIChvciBgU1REWWAgYXMgYSBDb2hlbidzICpkKiBmYW1pbHkgW3JlYWQgb25dIGVmZmVjdCBzaXplIHN0YXRpc3RpYykuIFN0aWxsIGFub3RoZXIgb3B0aW9uIHdvdWxkIGJlIHRvICJicmluZyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgaW50byB0aGUgbW9kZWwiIGFzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgYW5kIGVzdGltYXRlIGEgcG9seXNlcmlhbCBjb3JyZWxhdGlvbiB3aXRoIGBTVERZWGAgKHNlZSBBcHBlbmRpeCBFKS4KCioqbm90ZSAzMSwgMzIqKi4gV2l0aCBhIGNhdGVnb3JpY2FsIGRlcGVuZGVudCB2YXJpYWJsZSwgaW4gTXBsdXMgeW91IGFyZSBkb2luZyAob3JkZXJlZCkgbG9naXN0aWMgKGFuZCB1c2luZyBNTCkgb3IgKG9yZGVyZWQpIHByb2JpdCByZWdyZXNzaW9uIChhbmQgdXNpbmcgd2VpZ2h0ZWQgbGVhc3Qgc3F1YXJlcyBvciBCYXllcykuIE5hdHVyYWwgZWZmZWN0IHNpemUgZXN0aW1hdGVzIGFyZSBvZGRzIHJhdGlvcyBpZiBsb2dpc3RpYyByZWdyZXNzaW9uIGlzIHVzZWQgKG9idGFpbmVkIGJ5IHRha2luZyB0aGUgZXhwb25lbnQgb2YgdGhlIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gcGFyYW1ldGVyKS4gQ29uc2lkZXIgc3RhbmRhcmRpemluZyB5b3VyIGV4cGxhbmF0b3J5IHZhcmlhYmxlIHRvIHNvbWUgbWVhbmluZ2Z1bCB1bml0cyAoZS5nLiwgYWdlIHBlciAxMCB5ZWFycykgb3Igd2l0aCBvbmUgb3IgMiAoZm9sbG93aW5nIFtHZWxtYW4gMjAwOF0oaHR0cHM6Ly9vbmxpbmVsaWJyYXJ5LndpbGV5LmNvbS9kb2kvcGRmLzEwLjEwMDIvc2ltLjMxMDcpKSBzdGFuZGFyZCBkZXZpYXRpb24gdW5pdHMuIElmIGRvaW5nIHByb2JpdCByZWdyZXNzaW9uLCB0aGUgcmVncmVzc2lvbiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGRlc2NyaWJlIHRoZSBkaWZmZXJlbmNlIGluIG5vcm1hbCBwcm9iYWJpbGl0eSAoWi1zY29yZSkgdW5pdHMgcGVyIDEtdW5pdCBkaWZmZXJlbmNlIGluIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZS4KCuKAoCBJIGRpc2N1c3MgYW4gZWZmZWN0IHNpemUgaW50ZXJwcmV0YXRpb24gb2YgcHJvYml0IHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIHVzaW5nIHRoZSBFZHVjYXRpb25hbCBUZXN0aW5nIFNlcnZpY2VzIEEvQi9DIGRpZmZlcmVudGlhbCBpdGVtIGZ1bmN0aW9uaW5nIGNhdGVnb3JpZXMgW2luIHRoaXMgYmxvZyBwb3N0XShodHRwczovL3F1YW50c2NpLnMzLmFtYXpvbmF3cy5jb20vQmxvZ1Bvc3RzL0RJRl9NYWduaXR1ZGUuaHRtbCkuIFRvIHNhdmUgeW91IGEgY2xpY2ssIGluIHRoYXQgcG9zdCBJIGFyZ3VlIHRoYXQgd2hlbiB0aGUgTXBsdXMgZXN0aW1hdG9yIGlzIE1MUi9wcm9iaXQsIFdMU01WL3RoZXRhLCBvciBCYXllcywgbmVnbGlnaWJsZSBlZmZlY3RzIGFyZSBsZXNzIHRoYW4gLjEgKEEgRElGKSwgYW5kIGxhcmdlIGVmZmVjdHMgYXJlIGdyZWF0ZXIgdGhhbiAuMzc1IChDIERJRiksIGFuZCB0aGUgcmVtYWluZGVyIGFyZSBzbGlnaHQgdG8gbW9kZXJhdGUgZWZmZWN0cyAoQiBESUYpLiBUaGlzIGludGVycHJldGF0aW9uIGlzIHdvcmtlZCBvdXQgZm9yIGJpbmFyeSBkZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBiaW5hcnkgaW5kZXBlbmRlbnQgdmFyaWFibGVzLgoKCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgojIENoYXB0ZXIgMS4gRWZmZWN0IHNpemVzIGZvciBkaWZmZXJlbmNlcyBpbiBtZWFuczogVGhlICpkKiBmYW1pbHkKCkEgc3RhbmRhcmQgc2V0IG9mIGVmZmVjdCBzaXplIG1lYXN1cmVzIGluIHBzeWNob2xvZ3kgYW5kIG90aGVyIGFwcGxpZWQgZmllbGRzIGFyZSB0aG9zZSBkZXNjcmliZWQgYnkgSmFjb2IgQ29oZW4gaW4gaGlzIFsqU3RhdGlzdGljYWwgcG93ZXIgYW5hbHlzaXMgZm9yIHRoZSBiZWhhdmlvcmFsIHNjaWVuY2VzKiAoMTk4OCwgU2Vjb25kIGVkaXRpb24sIExFQSwgSGlsbHNkYWxlIE5KKV0oaHR0cHM6Ly93d3cuYWxpYnJpcy5jb20vU3RhdGlzdGljYWwtUG93ZXItQW5hbHlzaXMtZm9yLXRoZS1CZWhhdmlvcmFsLVNjaWVuY2VzLUphY29iLUNvaGVuL2Jvb2svNjMyNTgzNikuICBJIHdpbGwgcHJlc3VtZSB0aGUgcmVhZGVyIGhhcyBzb21lIGZhbWlsaWFyaXR5IHdpdGggQ29oZW4ncyBlZmZlY3Qgc2l6ZSBmcmFtZXdvcmssIGFuZCBhbiBhYnNvbHV0ZSBiYXJlIG1pbmltdW0gaXMgZmFtaWxpYXJpdHkgd2l0aCBDb2hlbidzICpkKiBlZmZlY3Qgc2l6ZS4gSGlzIGJvb2sgY2FuIGJlIGZvdW5kIG9ubGluZSBpbiBwZGYgZm9ybSwgYW5kIHRoZXJlIGhhdmUgYmVlbiBjb3VudGxlc3MgcmV2aWV3IG1hbnVzY3JpcHRzIGFuZCBhcmUgaW5udW1lcmFibGUgd2Vic2l0ZXMgc3VtbWFyaXppbmcgdGhpcyBtYXRlcmlhbC4gQ29oZW4ncyBib29rIGlzIGEgY2xhc3NpYyBhbmQgd29ydGggb2J0YWluaW5nIGFuZCBhdCBsZWFzdCB0aHVtYmluZyB0aHJvdWdoIGZvciBhbnkgZGF0YSBhbmFseXN0LgoKSW4gYSByZWdyZXNzaW9uIGZyYW1ld29yaywgZGlmZmVyZW5jZXMgaW4gbWVhbnMgaW1wbGllcyB3ZSBoYXZlIGEgY29udGludW91cyBkZXBlbmRlbnQgdmFyaWFibGUgJFkkIGFuZCBhIGJpbmFyeSBpbmRlcGVuZGVudCB2YXJpYWJsZSAkWCQgKFg9MCwgWD0xKS4gV2UgYXJlIGludGVyZXN0ZWQgaW4gY2hhcmFjdGVyaXppbmcgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIG1lYW4gb2YgJFkkIHdoZW4gJFg9MCQgKCRcb3ZlcmxpbmV7WX1fezB9JCkgYW5kIHdoZW4gJFg9MCQgKCRcb3ZlcmxpbmV7WX1fezF9JCksIGkuZS4sICRcb3ZlcmxpbmV7WX1fezF9LVxvdmVybGluZXtZfV97MH0kLiBUaGlzIGRpZmZlcmVuY2UgaW4gbWVhbnMgaXMgY2FwdHVyZWQgYnkgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9mICRZJCBvbiAkWCQKCiR5ID0gYSArIGJ4ICsgZSQKCndoZXJlIHBhcmFtZXRlciAkYiQgY2FwdHVyZXMgdGhlIGRpZmZlcmVuY2UgaW4gJHkkIGFjcm9zcyBsZXZlbHMgb2YgLS0gb3IgcGVyIDEtdW5pdCBkaWZmZXJlbmNlIGluIC0tIHZhcmlhYmxlICR4JC4KCgp8U3RhdGlzdGljfFJlZmVycmVkIHRvIGFzfEVzdGltYXRvcnxEZXNjcmlwdGlvbiAoYW5kIFMvTS9MIHRocmVzaG9sZHMpfAp8Oi0tfDotLXw6LS18Oi0tfAp8JGIkfFVuc3RhbmRhcmRpemVkIGVmZmVjdCBzaXplfCRcbGVmdChcb3ZlcmxpbmV7WX1fMS1cb3ZlcmxpbmV7WX1fMFxyaWdodCkkfFVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnR8CnwqZCp8Q29oZW4ncyAqZCp8JFxsZWZ0KFxvdmVybGluZXtZfV97MX0tXG92ZXJsaW5le1l9X3swfVxyaWdodClcZnJhY3sxfXtzX3B9JHxNZWFuIGRpZmZlcmVuY2UgZGl2aWRlZCBieSB0aGUgKnBvb2xlZCogc3RhbmRhcmQgZGV2aWF0aW9uICguMi8uNS8uOCl8CnxTVEQsIFNURFl8Kk1lYW4gZGlmZmVyZW5jZSBzdGFuZGFyZGl6ZWQgdG8gdGhlIHRvdGFsIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24qfCRcbGVmdChcb3ZlcmxpbmV7WX1fezF9LVxvdmVybGluZXtZfV97MH1ccmlnaHQpXGZyYWN7MX17c19ZfSR8TWVhbiBkaWZmZXJlbmNlIGRpdmlkZWQgYnkgdGhlICp0b3RhbCBzYW1wbGUqIHN0YW5kYXJkIGRldmlhdGlvbiAoJHNfWSQpLnwKfCRyX3twYn0kfFBvaW50LWJpc2VyYWwgY29ycmVsYXRpb258JFxsZWZ0KFxvdmVybGluZXtZfV97MX0tXG92ZXJsaW5le1l9X3swfVxyaWdodClcZnJhY3tzX1h9e3Nfe1l9fSR8d2hlcmUgJHNfe1h9PSBcc3FydHtwcX0kLCAkcCQgYmVpbmcgdGhlIHByb3BvcnRpb24gaW4gZ3JvdXAgMSBhbmQgJHE9IDEtcCQ7IHRoaXMgaXMgYWxzbyB0aGUgU1REWVggc2NhbGVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZnJvbSBNcGx1cyBvdXRwdXQgb2YgYSBjb250aW51b3VzIG91dGNvbWUgb24gYSBkdW1teSB2YXJpYWJsZXwKfCRyX2IkfEJpc2VyaWFsIGNvcnJlbGF0aW9ufCRcbGVmdChcb3ZlcmxpbmV7WX1fezF9LVxvdmVybGluZXtZfV97MH1ccmlnaHQpXGZyYWN7cHEvYX17c19ZfSR8d2hlcmUgJGEkIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24gYXQgXChaKHApXCksICRhID0gZV57ey1wXjJ9LzJ9L1xzcXJ0ezJccGl9JC4gSW4gU3RhdGEsIHVzZSBgbm9ybWFsZGVuKDxwPiwwLDEpYCBhbmQgaW4gUiwgdXNlIGBkbm9ybSg8cD4sMCwxKWAuIFNlZSBBcHBlbmRpeCBFfAoKCgo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CiMjIEFwcHJveGltYXRpb25zIHRvIENvaGVuJ3MgKmQqClRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZWZmZWN0IHNpemUgc3RhdGlzdGljIGZvciBhIGNvbnRpbnVvdXMgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCBiaW5hcnkgaW5kZXBlbmRlbnQgdmFyaWFibGUgZm9yIGRlc2NyaWJpbmcgbWVhbiBkaWZmZXJlbmNlcyBpcyBDb2hlbidzICpkKi4gCgojIyMgRGlyZWN0IGNvbXB1dGF0aW9uCgpUaGVyZSBpcyBvbmx5IG9uZSBjaXJjdW1zdGFuY2Ugd2hlbiBpdCBpcyByZWxhdGl2ZWx5IGVhc3kgb3Igc3RyYWlnaHRmb3J3YXJkIHRvIGdldCBhIENvaGVuJ3MgKmQqIGZyb20gTXBsdXMgb3V0cHV0LiBUaGlzIHRoZSBiaXZhcmlhYmxlIGNhc2UsIHdoZXJlIGEgc2luZ2xlICRZJCBpcyByZWdyZXNzZWQgb24gYSBzaW5nbGUgJFgkLiBJbiB0aGlzIG1vZGVsLCB0aGUgYE1PREVMIFJFU1VMVFNgIG91dHB1dCByZWdyZXNzaW9uIHBhcmFtZXRlciBmb3IgYHkgb24geGAgaXMgdGhlIGRpZmZlcmVuY2UgaW4gbWVhbnMgLCBhbmQgdGhlIHNxdWFyZSByb290IG9mIHRoZSBgcmVzaWR1YWwgdmFyaWFuY2VzYCByZXN1bHQgZm9yIGB5YCBpcyBhIGdvb2QgZXN0aW1hdGUgb2YgdGhlIHBvb2xlZCBzdGFuZGFyZCBkZXZpYXRpb24uIFRoZW4sIENvaGVuJ3MgKmQqIGNhbiBiZSBlc3RpbWF0ZWQgd2l0aCBgeV9vbl94L3NxcnQocmVzaWR1YWxfdmFyaWFuY2VzX3kpYC4gICoqSG93ZXZlcioqLCB0aGlzIHNpdHVhdGlvbiBpcyBub3QgZXhwZWN0ZWQgdG8gYXJpc2UgaW4gcmVhbCBkYXRhIGFuYWx5c2lzLCBiZWNhdXNlIHVzdWFsbHkgd2Ugd2lsbCBoYXZlIG11bHRpcGxlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcy4KCkEgZGF0YSBhbmFseXN0IGNvdWxkIGNvbXB1dGUgdGhlIHBvb2xlZCB2YXJpYW5jZSBhaGVhZCBvZiBkb2luZyB0aGUgYW5hbHlzaXMgYW5kIHVzZSB0aG9zZSBpbiBhIGBNT0RFTCBDT05TVFJBSU5UYCBjb21tYW5kIGluIE1wbHVzLiBJIHdpbGwgaWxsdXN0cmF0ZSB1c2luZyB0aGUgZXhhbXBsZSBkYXRhIHNldCBgZHJvcG91dC5kYXRgIHVzZWQgZm9yIHRoZSBleGFtcGxlcyBieSBNdXRow6luLCBNdXRow6luIGFuZCBBc3Bhcm91aG92IGluIHRoZWlyIHRleHQgWypSZWdyZXNzaW9uIGFuZCBNZWRpYXRpb24gQW5hbHlzaXMgVXNpbmcgTXBsdXMqICgyMDE2KV0oaHR0cHM6Ly93d3cuc3RhdG1vZGVsLmNvbS9NcGx1c19Cb29rLnNodG1sKS4gSGVyZWFmdGVyIEkgd2lsbCByZWZlciB0byB0aGlzIGJvb2sgYXMgTU1BMTYuIFRoZSBkYXRhIGFyZSBkZXNjcmliZWQgaW4gQXBwZW5kaXggQi4gCgoKCmBgYHtSfQojIGxvYWQgZGF0YSBmcm9tIE1NQTE2LCBhcyBwcm9jZXNzZWQuIFNlZSBBcHBlbmRpeCBCLgpkb2QgPC0gaGF2ZW46OnJlYWRfZHRhKGhlcmU6OmhlcmUoImRyb3BvdXQuZHRhIikpCmRvZFsibWFsZSJdIDwtIGFzLm51bWVyaWMoZG9kWyJnZW5kZXIiXT09MikKIyBDb21wdXRlIENvaGVuJ3MgZCBmb3IgYG1hdGg3YCBvbiBgbWFsZWAgdXNpbmcgZWZmc2l6ZSBwYWNrYWdlCiMgaW5zdGFsbC5wYWNrYWdlcygiZWZmc2l6ZSIpCmVmZnNpemVfZCA8LSBlZmZzaXplOjpjb2hlbi5kKGZvcm11bGEgPSBtYXRoNyB+IG1hbGUgLCBkYXRhID0gZG9kKQplZmZzaXplX2QKIyBTYXZlIHNvbWUgcmVzdWx0cyBmcm9tIG9ic2VydmVkIGRhdGEgdG8gdXNlIGluIE1wbHVzCiMgdGhlIHBvb2xlZCBzdGFuZGFyZCBkZXZpYXRpb24Kc3kgPC0gc2QoZG9kJG1hdGg3WyFpcy5uYShkb2QkbWF0aDcpXSkKczAgPC0gc2QoZG9kJG1hdGg3W2RvZCRtYWxlPT0wICYgIWlzLm5hKGRvZCRtYXRoNyldKQpzMSA8LSBzZChkb2QkbWF0aDdbZG9kJG1hbGU9PTEgJiAhaXMubmEoZG9kJG1hdGg3KV0pCm4wIDwtIGxlbmd0aChkb2QkbWF0aDdbZG9kJG1hbGU9PTAgJiAhaXMubmEoZG9kJG1hdGg3KV0pCm4xIDwtIGxlbmd0aChkb2QkbWF0aDdbZG9kJG1hbGU9PTEgJiAhaXMubmEoZG9kJG1hdGg3KV0pCnNwIDwtICBzcXJ0KCgobjAtMSkqczBeMiArIChuMS0xKSpzMV4yKSAvIChuMCArIG4xIC0gMikpCgojIERlZmluZSBhIE1wbHVzIG1vZGVsIHJlZ3Jlc3NpbmcgbWF0aDcgb24gbWFsZSAKbW9kZWwxLm1vZGVsIDwtIHBhc3RlKCJtYXRoNyBvbiBtYWxlIChiKTsgIiwiXG5NT0RFTCBDT05TVFJBSU5UOiBuZXcgKGQpOyAiLCAiXG5kID0gYi8iLHNwLCI7IikKY2F0KG1vZGVsMS5tb2RlbCkKCm1vZGVsMSA8LSBNcGx1c0F1dG9tYXRpb246Om1wbHVzTW9kZWxlcigKICAgTXBsdXNBdXRvbWF0aW9uOjptcGx1c09iamVjdCgKICAgICAgTU9ERUwgPSAgbW9kZWwxLm1vZGVsICwKICAgICAgT1VUUFVUID0gIlNUQU5EQVJESVpFRDsiICwKICAgICAgcmRhdGEgPSBkb2QpICwKICAgImRvZC5kYXQiICwKICAgcnVuID0gMUwpCgptb2RlbDFfbmV3IDwtIG1vZGVsMSRyZXN1bHRzJHBhcmFtZXRlcnMkdW5zdGFuZGFyZGl6ZWRbbW9kZWwxJHJlc3VsdHMkcGFyYW1ldGVycyR1bnN0YW5kYXJkaXplZCRwYXJhbUhlYWRlciA9PSAiTmV3LkFkZGl0aW9uYWwuUGFyYW1ldGVycyIsXQptb2RlbDFfZCA8LSBtb2RlbDFfbmV3W21vZGVsMV9uZXckcGFyYW0gPT0gIkQiLGMoImVzdCIsInNlIildCm1vZGVsMV9kCmNpOTUobW9kZWwxX2RbWzFdXSxtb2RlbDFfZFtbMl1dKQojIGNhdCggcmVhZExpbmVzKCAiZG9kLm91dCIgKSAsIHNlcCA9ICJcbiIgKQpgYGAKClNpbWlsYXIgZXhhbXBsZXMgb2YgdXNpbmcga25vd24gY29uc3RhbnRzIGluIHRoZSBgTU9ERUwgQ09OU1RSQUlOVGAgY29tbWFuZCBhcmUgaWxsdXN0cmF0ZWQgaW4gTU1BMTYgKHNlZSBUYWJsZSAxLjExLCBwYWdlIDM4KS4gCgo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CiMjIyBTdGFuZGFyZGl6ZSB5b3VyIG91dGNvbWUgdG8gdGhlIHBvb2xlZCBzdGFuZGFyZCBkZXZpYXRpb24gcHJpb3IgdG8gYW5hbHlzaXMgYW5kIGludGVycHJldCB0aGUgdW5zdGFuZGFyZGl6ZWQgY29lZmZpY2llbnRzCgpgYGB7Un0KZG9kJHpzcG1hdGg3IDwtICggZG9kJG1hdGg3IC0gbWVhbihkb2QkbWF0aDdbIWlzLm5hKGRvZCRtYXRoNyldKSApIC8gc3AKc2QoZG9kJHpzcG1hdGg3WyFpcy5uYShkb2QkenNwbWF0aDcpXSkKCm1vZGVsMiA8LSBNcGx1c0F1dG9tYXRpb246Om1wbHVzTW9kZWxlcigKICAgTXBsdXNBdXRvbWF0aW9uOjptcGx1c09iamVjdCgKICAgICAgTU9ERUwgPSAgInpzcG1hdGg3IG9uIG1hbGUgOyIgLAogICAgICByZGF0YSA9IGRvZCkgLAogICAiZG9kLmRhdCIgLAogICBydW4gPSAxTCkKCm1vZGVsMl91bnN0ZCA8LSBhcy5kYXRhLmZyYW1lKG1vZGVsMiRyZXN1bHRzJHBhcmFtZXRlcnMkdW5zdGFuZGFyZGl6ZWQpCm1vZGVsMl91bnN0ZAptb2RlbDJfZCA8LSBtb2RlbDJfdW5zdGRbbW9kZWwyX3Vuc3RkJHBhcmFtSGVhZGVyID09ICJaU1BNQVRINy5PTiIgJiBtb2RlbDJfdW5zdGQkcGFyYW0gPT0gIk1BTEUiLCBjKCJlc3QiLCJzZSIpXQptb2RlbDJfZApjaTk1KG1vZGVsMl9kW1sxXV0sbW9kZWwyX2RbWzJdXSkKCiMgY2F0KCByZWFkTGluZXMoICJkb2Qub3V0IiApICwgc2VwID0gIlxuIiApCgpgYGAKClRoZSBsaW1pdGF0aW9uIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhlIGRhdGEgYW5hbHlzdCBpcyBwcm9iYWJseSBpbnRlcmVzdGVkIGluIG11bHRpcGxlIENvaGVuJ3MgZC1zY2FsZWQgZWZmZWN0cyBkdWUgdG8gbXVsdGlwbGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzLCBidXQgY2FuIG9ubHkgc3RhbmRhcmRpemUgdGhlIHZhcmlhYmxlcyB3aXRoIHJlc3BlY3QgdG8gb25lIGJpbmFyeSBiYWNrZ3JvdW5kIHZhcmlhYmxlIGJlZm9yZSBlYWNoIGFuYWx5c2lzLgoKPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgojIyMgQ29udmVydCAkcl97cGJ9JCB0byAqZCoKClRoaXMgaXMgdGhlIG1vc3QgZ2VuZXJhbCBhbmQgZXh0ZW5zaWJsZSBhcHByb2FjaC4gQ29oZW4ncyAqZCogY2FuIGFsc28gYmUgYXBwcm94aW1hdGVkIGJ5IGNvbnZlcnRpbmcgdGhlIHBvaW50LWJpc2VyaWFsIGNvcnJlbGF0aW9uICgkcl97cGJ9JCkgdG8gJGQkLiBBIGNvbnZlcnNpb24gdGhhdCB3b3JrcyB3ZWxsIGlzIAoKJGQgPSBcZnJhY3tyX3twYn19e1xzcXJ0ezEtcl97cGJ9XjJ9fVxsZWZ0KFxmcmFjezF9e3NfWH1ccmlnaHQpJAoKVGhpcyBleHByZXNzaW9uIG1heSBiZSBlbmNvdW50ZXJlZCBpbiB0aGUgbGl0ZXJhdHVyZSB1c2luZyAyIGluc3RlYWQgb2YgJDEvc19YJDsgdGhpcyBpcyBiZWNhdXNlICQxL3NfWCQgaXMgMiB3aGVuICRwPS41JCwgYW5kIHRoaXMgaXMgYSBjb21tb24gc2l0dWF0aW9uIGVzcGVjaWFsbHkgaW4gZXhwZXJpbWVudGFsIGRlc2lnbnMuIENvbXB1dGF0aW9uIHN0aWxsIHJlcXVpcmVzIGtub3dpbmcgdGhlIHByb3BvcnRpb24gb2YgdGhlIHNhbXBsZSB3aXRoICRYPTEkIGFuZCB0b3RhbCB2YXJpYW5jZSBvZiAkWSQgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSBvdXRwdXQgKnVubGVzcyogdGhlICRYJCB2YXJpYWJsZSBpcyAiYnJvdWdodCBpbnRvIHRoZSBtb2RlbCIsIGFuZCBpbiB0aGUgZXhhbXBsZSBjb2RlIGJlbG93IEkgZG8gdGhpcyBieSBzcGVjaWZ5aW5nIHRoZSBtZWFuIG9mIGB4YCBpcyB0byBiZSBlc3RpbWF0ZWQgYW5kIGxhYmVsZWQgd2l0aCBgKHApYC4gCgoKYGBge1J9Cm1vZGVsMyA8LSBNcGx1c0F1dG9tYXRpb246Om1wbHVzTW9kZWxlcigKICAgTXBsdXNBdXRvbWF0aW9uOjptcGx1c09iamVjdCgKICAgICAgTU9ERUwgPSAgIm1hdGg3IG9uIG1hbGUgKGIpOwogICAgICAgICAgICAgICAgbWF0aDcgKHJlc3Zhcik7IAogICAgICAgICAgICAgICBbbWFsZV0gKHApOyAKICAgICAgICAgICAgICAgbW9kZWwgY29uc3RyYWludDogbmV3ICh2eCB2eSBycGIgZCk7IAogICAgICAgICAgICAgICB2eCA9IHAqKDEtcCkgOyAKICAgICAgICAgICAgICAgdnkgPSBiXjIqdnggKyByZXN2YXIgOyAKICAgICAgICAgICAgICAgcnBiID0gYipzcXJ0KHZ4KS9zcXJ0KHZ5KSA7IAogICAgICAgICAgICAgICBkID0gcnBiLyhzcXJ0KDEtcnBiKioyKSooc3FydCh2eCkpKSA7IiAsCiAgICAgIE9VVFBVVCA9ICJTVEFOREFSRElaRUQ7IiAsCiAgICAgIHJkYXRhID0gZG9kKSAsCiAgICJkb2QuZGF0IiAsCiAgIHJ1biA9IDFMKQoKCm1vZGVsM19uZXcgPC0gbW9kZWwzJHJlc3VsdHMkcGFyYW1ldGVycyR1bnN0YW5kYXJkaXplZFttb2RlbDMkcmVzdWx0cyRwYXJhbWV0ZXJzJHVuc3RhbmRhcmRpemVkJHBhcmFtSGVhZGVyID09ICJOZXcuQWRkaXRpb25hbC5QYXJhbWV0ZXJzIixdCm1vZGVsM19kIDwtIG1vZGVsM19uZXdbbW9kZWwzX25ldyRwYXJhbSA9PSAiRCIsYygiZXN0Iiwic2UiKV0KbW9kZWwzX2QKY2k5NShtb2RlbDNfZFtbMV1dLG1vZGVsM19kW1syXV0pCgojY2F0KCByZWFkTGluZXMoICJkb2Qub3V0IiApICwgc2VwID0gIlxuIiApCgpgYGAKCkl0IGlzIGFsc28gd29ydGggbm90aGluZzogCgoqIFRoaXMgbW9kZWwgcHJvZHVjZXMgbm9uaWRlbnRpZmljYXRpb24gd2FybmluZ3MsIGJ1dCBzdGFuZGFyZCBlcnJvcnMgYXJlIHByb2R1Y2VkIGFuZCB0aGlzIGlzIG5vdCBhbiBpc3N1ZSBmb3IgdGhlIHR5cGUgb2YgbW9kZWwgdGhhdCBpcyBiZWluZyBlc3RpbWF0ZWQKCiogVGhlICJoYW5kIGNhbGN1bGF0aW9uIiBvZiB0aGUgdG90YWwgdmFyaWFuY2Ugb2YgeSB3aWxsIGJlIG1vcmUgY29tcGxpY2F0ZWQgd2l0aCBtb3JlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcywgYW5kIHdpdGggaW50ZXJhY3Rpb25zIGFtb25nIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMuIEJ1dCB3ZSBoYXZlIHNlZW4gZnJvbSBleGFtcGxlIDEgdGhhdCB3ZSBjYW4gZWFzaWx5IG9idGFpbiBudW1lcmljYWwgc3VtbWFyaWVzIGluIFIgYW5kIHBhc3RlIHRoZW0gaW50byBhIE1wbHVzIG1vZGVsIHN0YXRlbWVudC4gVGhpcyBjb3VsZCBiZSBkb25lIGZvciBgdnhgIGFuZCBgdnlgIHRvIHNhdmUgY29kaW5nIGluIE1wbHVzLgoKQSBkYXRhIGFuYWx5c3QgY291bGQgY29tcHV0ZSBhIENvaGVuJ3MgZC1zY2FsZWQgZWZmZWN0IHNpemUgc3RhdGlzdGljIG91dHNpZGUgb2YgTXBsdXMsIGFuZCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IE1wbHVzIGNvbXB1dGVzIHRoZSBwb2ludC1iaXNlcmlhbCBjb3JyZWxhdGlvbiBpbiB0aGUgYFNURFlYYCBvdXRwdXQ6CgpgYGB7Un0KbW9kZWw0IDwtIE1wbHVzQXV0b21hdGlvbjo6bXBsdXNNb2RlbGVyKAogICBNcGx1c0F1dG9tYXRpb246Om1wbHVzT2JqZWN0KAogICAgICBNT0RFTCA9ICAibWF0aDcgb24gbWFsZSA7IiAsCiAgICAgIE9VVFBVVCA9ICJTVEFOREFSRElaRUQ7IiAsCiAgICAgIHJkYXRhID0gZG9kKSAsICJkb2QuZGF0IiAsIHJ1biA9IDFMKQptb2RlbDRfc3RkeXggPC0gYXMuZGF0YS5mcmFtZShtb2RlbDQkcmVzdWx0cyRwYXJhbWV0ZXJzJHN0ZHl4LnN0YW5kYXJkaXplZCkKbW9kZWw0X3JwYiA8LSBtb2RlbDRfc3RkeXhbbW9kZWw0X3N0ZHl4JHBhcmFtSGVhZGVyPT0iTUFUSDcuT04iICYgbW9kZWw0X3N0ZHl4JHBhcmFtPT0iTUFMRSIsYygiZXN0Iiwic2UiKV0KcCA8LSBtZWFuKGRvZCRtYWxlKQptb2RlbDRfc3RkeXhfZCA8LSBtb2RlbDRfcnBiL3NxcnQoMS1tb2RlbDRfcnBiXjIpKigxL3NxcnQocCooMS1wKSkpCm1vZGVsNF9zdGR5eF9kCmNpOTUobW9kZWw0X3N0ZHl4X2RbWzFdXSxtb2RlbDRfc3RkeXhfZFtbMl1dKQpgYGAKCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KIyMjIFJlcG9ydCB0aGUgYFNURFlgIGVmZmVjdCBpbnN0ZWFkIG9mIGNvbXB1dGluZyBhICpkKgoKVGhlIGBTVERZYC1zY2FsZWQgcmVncmVzc2lvbiBvZiBhIGNvbnRpbnVvdXMgbWFuaWZlc3QgdmFyaWFibGUgb24gYSBiaW5hcnkgZXhwbGFuYXRvcnkgdmFyaWFibGUgKGBNQVRINyBPTiBNQUxFYCwgZWZmZWN0ICRiL3NfWSQpIGlzIGEgY29uc2VydmF0aXZlIChpLmUuLCB1bmRlcikgZXN0aW1hdGUgb2YgdGhlIENvaGVuJ3MgKmQqICgkYi9zX1AkOyB3aGVyZSAkYiQgaXMgdGhlIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gcGFyYW1ldGVyIGNhcHR1cmluZyB0aGUgbWVhbiBkaWZmZXJlbmNlIGluICRZJCAoYE1BVEg3YCkgYWNyb3NzIGxldmVscyBvZiAkWCQgKGBNQUxFYCksIGFuZCAkc19ZJCBpcyB0aGUgdG90YWwgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgJHNfUCQgaXMgdGhlIHBvb2xlZCBzdGFuZGFyZCBkZXZpYXRpb24pIGVmZmVjdCBzaXplLiBSZXBvcnRpbmcgdGhlIGBTVERZYCBzY2FsZWQgZWZmZWN0IGFuZCBpbnRlcnByZXRpbmcgdXNpbmcgdGhyZXNob2xkcyBvZiAuMi8uNS8uOCBmb3Igc21hbGwsIG1lZGl1bSBhbmQgbGFyZ2Ugd2lsbCBsZWFkIHRvIHVuZGVyLWVzdGltYXRpbmcgdGhlIHNpemUgb2YgdGhlIGVmZmVjdCByZWxhdGl2ZSB0byB3aGF0IHdvdWxkIGJlIGludGVycHJldGVkIGlmIENvaGVuJ3MgKmQqIGhhZCBiZWVuIHVzZWQuIEJ1dCBgU1REWWAgc2NhbGVkIGVmZmVjdHMgYXJlIG5vdCAqd3JvbmcqLCB0aGV5IGFyZSBqdXN0IHN1bW1hcmllcyBvZiAkYiQgc3RhbmRhcmRpemVkIHRvIGEgZGlmZmVyZW50IHN0YW5kYXJkIGRldmlhdGlvbiB0aGFuICpkKi4gSXQgd291bGQgYmUgd3JvbmcgdG8gc2F5IHRoYXQgdGhlIGBTVERZYCBlZmZlY3RzIGFyZSBDb2hlbidzICpkKiwgYnV0IG9uZSBjb3VsZCBzYXkgdGhhdCB0aGV5IGFyZSBpbiBDb2hlbidzICpkKiBmYW1pbHkuIEFmdGVyIGFsbCwgQ29oZW4gZGVzY3JpYmVkIG1hbnkgZGlmZmVyZW50IHN0YW5kYXJkaXphdGlvbnMgdG8gdGhlIG1lYW4gZGlmZmVyZW5jZSBpbiBoaXMgMTk4OCB0ZXh0IChub3RhYmx5IG5vbmUgb2YgdGhlc2UgaW52b2x2ZWQgc3RhbmRhcmRpemluZyB0byB0aGUgdG90YWwgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiksIGFuZCB3aGF0IHdlIG5vdyBrbm93IGFzICJ0aGUiIENvaGVuJ3MgKmQqIGlzIG9ubHkgb25lIG9mIHRob3NlLgoKYGBge1J9Cm1vZGVsNF9zdGR5ICA8LSBhcy5kYXRhLmZyYW1lKG1vZGVsNCRyZXN1bHRzJHBhcmFtZXRlcnMkc3RkeS5zdGFuZGFyZGl6ZWQpCm1vZGVsNF9zdGR5X2QgPC0gbW9kZWw0X3N0ZHlbbW9kZWw0X3N0ZHkkcGFyYW1IZWFkZXI9PSJNQVRINy5PTiIgJiBtb2RlbDRfc3RkeSRwYXJhbT09Ik1BTEUiLGMoImVzdCIsInNlIildCm1vZGVsNF9zdGR5X2QKY2k5NShtb2RlbDRfc3RkeV9kW1sxXV0sbW9kZWw0X3N0ZHlfZFtbMl1dKQplZmZzaXplX2QKYGBgCgpUaGUgY2xvc2UgYXBwcm94aW1hdGlvbiBvZiB0aGUgYFNURFlgIHN0YW5kYXJkaXphdGlvbiBvZiB0aGUgYE1BVEg3IE9OIE1BTEVgIGVmZmVjdCAoJGIvc19ZJCkgYW5kIENvaGVuJ3MgKmQqICgkYi9zX1AkKSBpbiB0aGlzIGNhc2UgaXMgdGhhdCAkYiQgaXMgc21hbGwgKGNsb3NlIHRvIDApIGFuZCB0aGUgc2FtcGxlIHNpemUgaXMgdmVyeSBsYXJnZSwgYW5kIHRoZXNlIGFyZSB0aGUgZmFjdG9ycyB0aGF0IGRldGVybWluZSB0aGUgc2ltaWxhcml0eSBvZiAkc19QJCBhbmQgJHNfWSQuIFRoZSAqKnBvb2xlZCBzdGFuZGFyZCBkZXZpYXRpb24qKiBpcyBhIGtpbmQgb2YgYXZlcmFnZSB3aXRoaW4tZ3JvdXAgc3RhbmRhcmQgZGV2aWF0aW9uOgoKJHNfcCA9IFxzcXJ0eyBcZnJhY3sobl8wLTEpc18wXjIgKyAobl8xLTEpc18xXjJ9e25fMCtuXzEtMn0gfSA9IFxzcXJ0e3Enc18wXjIgKyBwJ3NfMV4yfSQKCndoZXJlICRwJyA9IChuXzEtMSkvKG5fMCtuXzEtMikkIGFuZCAkcScgPSAobl8wLTEpLyhuXzArbl8xLTIpJDsgd2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgbGFyZ2UgJHAnJCBhcHByb2FjaGVzICRwJC4gVGhvc2Ugd2l0aGluIGdyb3VwIHN0YW5kYXJkIGRldmlhdGlvbnMgKCRzXzAsIHNfMSQpIGFyZSBhdmVyYWdlIGRldmlhdGlvbnMgZm9yIG1lbWJlcnMgZ3JvdXBzIGRlZmluZWQgYnkgJHgkIHJlbGF0aXZlIHRvIHRoZSBtZWFuIG9mIHRoZWlyIG93biBncm91cC4gVGhlIHRvdGFsIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgYmFzZWQgb24gdGhlIGRldmlhdGlvbiBmcm9tIHRoZSB0b3RhbCBzYW1wbGUgbWVhbi4gSXQgaXMgYmFzZWQgb24gdG90YWwgdmFyaWFibGl0eSwgYW5kIGluY2x1ZGVzIGJvdGggd2l0aGluLWdyb3VwIHZhcmlhYmlsaXR5IGFuZCBiZXR3ZWVuIGdyb3VwIHZhcmlhYmlsaXR5OgoKJHNfeSA9IFxzcXJ0e3FzXzBeMiArIHBzXzFeMiArIHBxYl4yfSQKClRoZSBwb2ludCBpcywgdGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb29sZWQgdmFyaWFuY2UgKCRzXjJfcCQpIGFuZCB0aGUgdG90YWwgdmFyaWFuY2UgKCRzXjJfWSQpIGlzIHRoZSBtZWFuIGRpZmZlcmVuY2Ugc3F1YXJlZCB0aW1lcyB0aGUgdmFyaWFuY2UgaW4gJHgkOiB0aGUgYmV0d2VlbiBncm91cCB2YXJpYW5jZSBjb21wb25lbnQgcmVwcmVzZW50ZWQgYnkgJHBxYl4yJC4gVGhpcyBpcyB3aHkgdGhlIGBTVERZYCBlZmZlY3Qgd2lsbCBhbHdheXMgYmUgc21hbGxlciB0aGFuIENvaGVuJ3MgKmQqLCB1bmxlc3MgJGI9MCQgaW4gd2hpY2ggY2FzZSB0aGV5IHdpbGwgYmUgZXF1YWwgYnV0IGFsc28gZXF1YWxseSB1bmludGVyZXN0aW5nLgoKCmBgYHtSfQojIGNvbXBhcmUgc3AgYW5kIHNZCiMgbmVlZCBwYXJhbWV0ZXIgZXN0aW1hdGUgZm9yICJiIiwgZXh0cmFjdCBiIGZyb20gbGFzdCBtb2RlbAptb2RlbDRfdW5zdGQgPC0gbW9kZWw0JHJlc3VsdHMkcGFyYW1ldGVycyR1bnN0YW5kYXJkaXplZAptb2RlbDRfdW5zdGQKYiA8LSBtb2RlbDRfdW5zdGRbbW9kZWw0X3Vuc3RkJHBhcmFtSGVhZGVyPT0iTUFUSDcuT04iICYgbW9kZWw0X3Vuc3RkJHBhcmFtPT0iTUFMRSIsImVzdCJdCiMgY29tcHV0ZSBzWSBhcyBmdW5jdGlvbiBvZiB3aXRoaW4gYW5kIGJldHdlZW4gY29tcG9uZW50cwpzeTIgPC0gc3FydCgoMS1wKSpzMF4yICsgcCpzMV4yICsgcCooMS1wKSpiXjIpCiMgY29tcGFyZSB0byB3aGF0IHdhcyBvYnRhaW5lZCBlYXJsaWVyCiMgcmVwb3J0ZWQgdG8gNCBzaWduaWZpY2FudCBkaWdpdHMgYmVjYXVzZSBiIG9ubHkgaGFzCiMgNCBzaWduaWZpY2FudCBkaWdpdHMKb3B0aW9ucyhkaWdpdHM9MykKYyhzMCwgczEsIHNwLCBzeSwgc3kyKQpgYGAKCgoKPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CiMgQ2hhcHRlciAyLiBFZmZlY3Qgc2l6ZXMgYmFzZWQgb24gZGlmZmVyZW5jZXMgaW4gcHJvcG9ydGlvbnMKCkNvbWUgYmFjayBsYXRlciBmb3IgbW9yZS4gSSdsbCBhZGQgZGlzY3Vzc2lvbiBvZiBvZGRzIHJhdGlvcyBhbmQgcHJvYml0IHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLgoKfFN0YXRpc3RpY3xVc2V8Rm9ybXVsYXxEZXNjcmlwdGlvbiAoYW5kIFMvTS9MIHRocmVzaG9sZHMpfAp8Oi0tfDotLXw6LS18Oi0tfAp8KmgqfERpZmZlcmVuY2UgaW4gcHJvcG9ydGlvbnN8JGggPSAyIFx0ZXh0e2FzaW59KHBfMV4uNSkgLSAyIFx0ZXh0e2FzaW59KHBfMl4uNSkkfFRoZSBkaWZmZXJlbmNlIGluIGFyY3NpbiB0cmFuc2Zvcm1lZCBwcm9wb3J0aW9ucy4gVXNlZnVsIGZvciBiaW5hcnkgb3V0Y29tZXMgY29tcGFyZWQgYWNyb3NzIHR3byBncm91cHMgKC4yLy41Ly44KQp8d3xBc3NvY2lhdGlvbiBvZiB0d28gY2F0ZWdvcmljYWwgdmFyaWFibGVzfCR3ID0gXHNxcnR7XGNoaV4yL059JHxUaGUgc2FtZSBhcyB0aGUgJFxwaGkkIChwaGkpIGNvZWZmaWNpZW50IGZvciAyw5cyIHRhYmxlcywgYnV0IGFsc28gdXNlZCBmb3IgY3Jvc3MtdGFidWxhdGlvbnMgb2YgaGlnaGVyIGRpbWVuc2lvbnMuIFRoZSAkXHBoaSQgY29lZmZpY2llbnQgaXMgd2hhdCB5b3Ugd291bGQgZ2V0IGlmIHlvdSBjYWxjdWxhdGVkIGEgUGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBvbiB0d28gYmluYXJ5IHZhcmlhYmxlcywgdHJlYXRpbmcgdGhlbSBhcyBjb250aW51b3VzIHZhcmlhYmxlcyAoLjEvLjMvLjUpfAoKIyBDaGFwdGVyIDMuIEVmZmVjdCBzaXplcyBiYXNlZCBvbiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQKCkNvbWUgYmFjayBsYXRlciBmb3IgbW9yZS4gVGhpcyBpcyAKCnxTdGF0aXN0aWN8VXNlfEZvcm11bGF8RGVzY3JpcHRpb24gKGFuZCBTL00vTCB0aHJlc2hvbGRzKXwKfDotLXw6LS18Oi0tfDotLXwKfCpyKnxBc3NvY2lhdGlvbiBvZiB0d28gY29udGludW91cyB2YXJpYWJsZXN8fFRoZSBQZWFyc29uJ3MgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKC4xLy4zLy41KXwKfCpxKnxEaWZmZXJlbmNlIGluIHR3byBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHN8JHEgPSBcdGV4dHthdGFuaH0ocl8xKS1cdGV4dHthdGFuaH0ocl8yKSQgfENvbXB1dGVkIGFzIGRpZmZlcmVuY2UgaW4gdHdvIEZpc2hlcidzICp6Ki10cmFuc2Zvcm1lZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgKC4xLy4zLy41KXwKCgojIFJlZmVyZW5jZXMKCgpDb2hlbiwgSi4gKDE5NjkpLiBTdGF0aXN0aWNhbCBwb3dlciBhbmFseXNpcyBmb3IgdGhlIGJlaGF2aW9yYWwgc2NpZW5jZXMuIEFjYWRlbWljIFByZXNzLiAKCkNvaGVuLCBKLiAoMTk4OCkuIFN0YXRpc3RpY2FsIHBvd2VyIGFuYWx5c2lzIGZvciB0aGUgYmVoYXZpb3JhbCBzY2llbmNlcy4gU2Vjb25kIEVkaXRpb24uIExhd3JlbmNlIEVybGJhdW0gQXNzb2NpYXRlcy4gCgpHZWxtYW4sIEEuICgyMDA4KS4gU2NhbGluZyByZWdyZXNzaW9uIGlucHV0cyBieSBkaXZpZGluZyBieSB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucy4gU3RhdGlzdGljcyBpbiBNZWRpY2luZSwgMjcoMTUpLCAyODY1LiAKCk11dGjDqW4sIEwuLCAmIE11dGjDqW4sIEIuICgxOTk4LTIwMTcpLiBNcGx1cyBVc2VycyBHdWlkZSAoRWlnaHRoIGVkLikuIE11dGjDqW4gJiBNdXRow6luLiAKCk11dGjDqW4sIEIuIE8uLCBNdXRow6luLCBMLiBLLiwgJiBBc3Bhcm91aG92LCBULiAoMjAxNykuIFJlZ3Jlc3Npb24gYW5kIG1lZGlhdGlvbiBhbmFseXNpcyB1c2luZyBNcGx1cy4gTXV0aMOpbiAmIE11dGjDqW4gTG9zIEFuZ2VsZXMsIENBLiAKCgoKIyBBcHBlbmRpeCBBIC0gTXBsdXMgU3RhbmRhcmRpemF0aW9uCgp8Rmxhdm9yfFN0YW5kYXJkaXplZCB3aXRoIHJlc3BlY3QgdG8gdGhlIC4uLnwKfDotLXw6LS18CnxTVERZWHx2YXJpYW5jZXMgb2YgdGhlIGNvbnRpbnVvdXMgbGF0ZW50IHZhcmlhYmxlcywgYW5kIHRoZSB2YXJpYW5jZXMgb2YgdGhlIGJhY2tncm91bmQgKG9yIGV4cGxhbmF0b3J5KSB2YXJpYWJsZXMgYW5kIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzLnwKfFNURFl8dmFyaWFuY2VzIG9mIHRoZSBjb250aW51b3VzIGxhdGVudCB2YXJpYWJsZXMgYXMgd2VsbCBhcyB0aGUgdmFyaWFuY2VzIG9mIHRoZSBvdXRjb21lIHZhcmlhYmxlcyBmb3Igc3RhbmRhcmRpemF0aW9uLnwKfFNURHx2YXJpYW5jZXMgb2YgdGhlIGNvbnRpbnVvdXMgbGF0ZW50IHZhcmlhYmxlc3wKClRoaXMgaXMgZXhlcnB0ZWQgZnJvbSB0aGUgW01wbHVzIFVzZXJzJyBHdWlkZSwgQ2hhcHRlciAxOF0oaHR0cHM6Ly93d3cuc3RhdG1vZGVsLmNvbS9IVE1MX1VHL2NoYXB0ZXIxOFY4Lmh0bSksIHdoaWNoIGRlc2NyaWJlcyBPVVRQVVQgY29tbWFuZCBvcHRpb25zOgoKPlRoZSBTVEFOREFSRElaRUQgb3B0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCBzdGFuZGFyZGl6ZWQgcGFyYW1ldGVyIGVzdGltYXRlcyBhbmQgdGhlaXIgc3RhbmRhcmQgZXJyb3JzIGFuZCBSLXNxdWFyZS4uLlRocmVlIHR5cGVzIG9mIHN0YW5kYXJkaXphdGlvbnMgYXJlIHByb3ZpZGVkIGFzIHRoZSBkZWZhdWx0LiAKPgo+IFRoZSBmaXJzdCB0eXBlIG9mIHN0YW5kYXJkaXphdGlvbiBpcyBzaG93biB1bmRlciB0aGUgaGVhZGluZyBTdGRZWCBpbiB0aGUgb3V0cHV0LiBTdGRZWCB1c2VzIHRoZSB2YXJpYW5jZXMgb2YgdGhlIGNvbnRpbnVvdXMgbGF0ZW50IHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHRoZSB2YXJpYW5jZXMgb2YgdGhlIGJhY2tncm91bmQgYW5kIG91dGNvbWUgdmFyaWFibGVzIGZvciBzdGFuZGFyZGl6YXRpb24uIFRoZSBTdGRZWCBzdGFuZGFyZGl6YXRpb24gaXMgdGhlIG9uZSB1c2VkIGluIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBvZiB5IG9uIHgsCj4gCj4gYlN0ZFlYID0gYiDDlyBTRCh4KS9TRCh5KSwKPiAKPiB3aGVyZSBiIGlzIHRoZSB1bnN0YW5kYXJkaXplZCBsaW5lYXIgcmVncmVzc2lvbiBjb2VmZmljaWVudCwgU0QoeCkgaXMgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgeCwgYW5kIFNEKHkpIGlzIHRoZSBtb2RlbCBlc3RpbWF0ZWQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHkuIFRoZSBzdGFuZGFyZGl6ZWQgY29lZmZpY2llbnQgYlN0ZFlYIGlzIGludGVycHJldGVkIGFzIHRoZSBjaGFuZ2UgaW4geSBpbiB5IHN0YW5kYXJkIGRldmlhdGlvbiB1bml0cyBmb3IgYSBzdGFuZGFyZCBkZXZpYXRpb24gY2hhbmdlIGluIHguCj4gCj4gVGhlIHNlY29uZCB0eXBlIG9mIHN0YW5kYXJkaXphdGlvbiBpcyBzaG93biB1bmRlciB0aGUgaGVhZGluZyBTdGRZIGluIHRoZSBvdXRwdXQuIFN0ZFkgdXNlcyB0aGUgdmFyaWFuY2VzIG9mIHRoZSBjb250aW51b3VzIGxhdGVudCB2YXJpYWJsZXMgYXMgd2VsbCBhcyB0aGUgdmFyaWFuY2VzIG9mIHRoZSBvdXRjb21lIHZhcmlhYmxlcyBmb3Igc3RhbmRhcmRpemF0aW9uLiBUaGUgU3RkWSBzdGFuZGFyZGl6YXRpb24gZm9yIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBvZiB5IG9uIHggaXMKPiAgCj4gYlN0ZFkgPSBiL1NEKHkpLgo+IAo+IFN0ZFkgc2hvdWxkIGJlIHVzZWQgZm9yIGJpbmFyeSBjb3ZhcmlhdGVzIGJlY2F1c2UgYSBzdGFuZGFyZCBkZXZpYXRpb24gY2hhbmdlIG9mIGEgYmluYXJ5IHZhcmlhYmxlIGlzIG5vdCBtZWFuaW5nZnVsLiBUaGUgc3RhbmRhcmRpemVkIGNvZWZmaWNpZW50IGJTdGRZIGlzIGludGVycHJldGVkIGFzIHRoZSBjaGFuZ2UgaW4geSBpbiB5IHN0YW5kYXJkIGRldmlhdGlvbiB1bml0cyB3aGVuIHggY2hhbmdlcyBmcm9tIHplcm8gdG8gb25lLgoKCiMgQXBwZW5kaXggQiAtIEV4YW1wbGUgZGF0YSBzZXQKClRoZSBleGFtcGxlIGRhdGEgc2V0IGNvbWVzIGZyb20gdGhlIG9ubGluZSBleGFtcGxlcyBhbmQgZGF0YSBjb2RlIG9uIFN0YXRtb2RlbC5jb20gYW5kIHVzZWQgYnkgTXV0aMOpbiwgTXV0aMOpbiBhbmQgQXNwYXJvdWhvdiBpbiB0aGVpciB0ZXh0IFsqUmVncmVzc2lvbiBhbmQgTWVkaWF0aW9uIEFuYWx5c2lzIFVzaW5nIE1wbHVzKiAoMjAxNildKGh0dHBzOi8vd3d3LnN0YXRtb2RlbC5jb20vTXBsdXNfQm9vay5zaHRtbCkuIApUaGUgZGF0YSBzZXQgYGRyb3BvdXQuZGF0YCBpcyB1c2VkIGluIHdhcyBkb3dubG9hZGVkIGZyb20gW2h0dHBzOi8vc3RhdG1vZGVsLmNvbS9tcGx1c2Jvb2svY2hhcHRlcjEuc2h0bWxdKGh0dHBzOi8vc3RhdG1vZGVsLmNvbS9tcGx1c2Jvb2svY2hhcHRlcjEuc2h0bWwpIGFuZCBtdW5nZWQgaW4gRXhjZWwgYW5kIFN0YXRhIHRvIHByb2R1Y2UgZHJvcG91dC5kdGEuIEdldCBhIGNvcHkgb2YgbXkgdmVyc2lvbiBhdCBbaHR0cHM6Ly9xdWFudHNjaS5zMy5hbWF6b25hd3MuY29tL0Jsb2dQb3N0cy9kcm9wb3V0LmR0YV0oaHR0cHM6Ly9xdWFudHNjaS5zMy5hbWF6b25hd3MuY29tL0Jsb2dQb3N0cy9kcm9wb3V0LmR0YSkuCgpTdGF0YSBkYXRhIG11bmdpbmcgY29kZToKYGBgCmluc2hlZXQgdXNpbmcgZHJvcG91dC5jc3YgCnJlcGxhY2UgbW90aGVkPS4gaWYgbW90aGVkPT04CnJlcGxhY2UgZmF0aGVkPS4gaWYgZmF0aGVkPT04CnJlcGxhY2UgZmF0aHNlaT0uIGlmIGZhdGhzZWk9PTk5NgpyZXBsYWNlIGZhdGhzZWk9LiBpZiBmYXRoc2VpPT05OTgKcmVwbGFjZSBldGhuaWM9LiBpZiBldGhuaWM9PTgKcmVwbGFjZSBob21lcmVzPS4gIGlmIGhvbWVyZXM9PTk4CmZvcmVhY2ggeCBvZiB2YXJsaXN0IG1hdGg3LW1hdGgxMiB7CiAgICByZXBsYWNlIGB4Jz0uIGlmIGlubGlzdChgeCcsOTk2LDk5OCkKIH0Kc2F2ZW9sZCBkcm9wb3V0LmR0YSAsIHZlcnNpb24oMTMpCmBgYAoKCiMgQXBwZW5kaXggQyAtIE1pc2NlbGxhbmVvdXMgZXF1YXRpb25zCgojIyBQb29sZWQgc3RhbmRhcmQgZGV2aWF0aW9uCgokc19wID0gXHNxcnR7IFxmcmFjeyhuXzAtMSkgXGNkb3Qgc18wXjIgKyAobl8xLTEpIFxjZG90IHNfMV4yfXtuXzArbl8xLTJ9IH0kCgojIEFwcGVuZGl4IEQgLSBPdGhlciBlZmZlY3Qgc2l6ZSBzdGF0aXN0aWNzCgp8U3RhdGlzdGljfFVzZXxGb3JtdWxhfERlc2NyaXB0aW9uIChhbmQgUy9NL0wgdGhyZXNob2xkcyl8Cnw6LS18Oi0tfDotLXw6LS18CnwkXERlbHRhJHxEaWZmZXJlbmNlcyBpbiBtZWFuc3wkXERlbHRhID0gXGxlZnQoXG92ZXJsaW5le1l9X3sxfS1cb3ZlcmxpbmV7WX1fezB9XHJpZ2h0KVxmcmFjezF9e3NfY30kfE1lYW4gZGlmZmVyZW5jZSBkaXZpZGVkIGJ5IHRoZSAqY29udHJvbCBncm91cCogc3RhbmRhcmQgZGV2aWF0aW9uOyBHbGFzcycgZGVsdGF8CgpBZGQgSGVkZ2UncyBnCgoKCiMgQXBwZW5kaXggRSAtIFRoZSBiaXNlcmlhbCBjb3JyZWxhdGlvbiwgYW5kIHRoZSBwb2x5c2VyaWFsIGNvcnJlbGF0aW9uCgpTaG93IGFuIGV4YW1wbGUgb2YgY29tcHV0aW5nIHRoZSBiaXNlcmlhbCBjb3JyZWxhdGlvbiAoYnkgaGFuZCkgYW5kIHRoZSBwb2x5c2VyaWFsIGNvcnJlbGF0aW9uIChicmluZ2luZyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgaW50byB0aGUgbW9kZWwpLgoKCgo=