Weighting effect sizes
After calculating effect sizes from your primary studies, weights can be calculated for those effects to determine how much they should each contribute to the overall effect size estimate. Weighting can be used to take into account the relative precision of the effect sizes calculated from primary studies, rather than assuming that they should all contribute equally to the final estimate of the overall effect size. Although weighting is not a mandatory step in meta-analysis, it is generally a recommended one, as studies can vary in the quality and precision of the information that they provide, whether that is due to their sample size or due to variation caused by measurement error, variation in experimental methodology, or environmental variation. Weighting allows studies with higher precision (i.e., a lower variance) to contribute more to the overall effect size estimate, helping to improve its accuracy and precision. However, weighting is not always necessary, so in future sub-sections we will discuss circumstances when unweighted analyses may be preferable or necessary.
Weighting can be executed in a variety of ways, and the best weighting scheme depends on characteristics of the effect size data, and on the type of statistical model that you plan to implement to assess your effect sizes. Weights come in parametric or nonparametric varieties.
Parametric weights
- Based on variance
- fixed effect model weights: 1 / (within-study variance)
- random effects model weights: 1 / (within-study + between-study variance)
Nonparametric weights
- Based on sample size, study “quality”, or other criteria defined by meta-analyst
- most commonly implemented in fixed effect models,
- implemented by occassionally in random effects models, however this approach has not been evaluated
- limitation: you can’t conduct heterogeneity tests with nonparametric weights, because you can’t partion the variance components
Parametric weights are the most commonly used and the most informative weights, so let’s look at how they are calculated for different types of statistical models.
Parametric weights
Parametric weights are based on estimates of variance.
In fixed effect models, the weight ((w)) for study (i) is the reciprocal of the within-study variance of the observed effect size ((V(e_i))). Thus, [w_{i} = frac{1}{V(e_{i})}]
In random effects models, parametric weights incorporate both within- and among-study variance. [w^*_{i}= frac{1}{V(e_i ) + T^2}]
- (e_i) = effect size of (ith) study
- (V(e_i)) = estimate of the within-study variance of (e) for the (ith) study
- (T^2) = estimate of among-study variance
Within-study variance calculations
Within-study variances of effects sizes can sometimes be taken directly from a primary study, but in most cases it must be calculated by the meta-analyst. It’s important to note that the formula for estimating the within-study variance of an effect size is unique to each effect size metric. The equations for calculating within-study variance for common effect size metrics can be looked up in the literature, and include:
Within-study variance of the log-response ratio (lnRR): [V(lnRR_{i}) = V(ln(bar{X_{i}}/bar{C_{i}})) approx frac{V(bar{X_{i}})}{bar{X_{i}^2}} + frac{V(bar{C_{i}})}{bar{C_{i}^2}}]
- (bar{X_{i}}) is the mean response in group (X) in study (i)
- (bar{C_{i}}) is the mean response in group (C) in study (i)
Within-study variance of Hedges’ (d): [ V(d_{i}) approx frac{n_{C,i} + n_{X,i}}{n_{C,i}~n_{X,i}} + frac{d^2_{i}}{2(n_{C,i} + n_{X,i})} ]
- (n_{X,i}) is the sample size of the treatment group in study (i)
- (n_{C,i}) is the sample size of the control group in study (i)
- (d_i) is the Hedges’ d effect size in study (i)
Within-study variance of the response difference ((D = bar{X_E} – bar{X_C})):
When we assume the populations that the two groups represent have the same standard deviations: [V_D = frac{n_E + n_C}{n_E n_C}s_{pooled}^2] Where (s_{pooled}) is [s_{pooled} = sqrt{frac{(n_E – 1)s_E^2 + (n_C -1)s_C^2}{n_E + n_C -2}}]
and when we assume the populations have different standard deviations: [V_D = frac{s_E^2}{n_E} + frac{s_C^2}{n_C}]
Within-study variance of a slope or other parameter-based effect size
For an effect size based on a parameter estimate like a regression slope, you can obtain the within-study variance directly from the model output.
Calculating within-study variance for a new effect size metric
However, if you constructed a new effect size metric ((e = f(X_{1}, X_{2}))), you will have to derive an estimator for the within-study effect size variance. You can do this through application of the Delta Method.
The Delta Method (one variable)
Starting at the most basic level, a one variable system, the Delta Method is used to estimate how variation in (x) translates into variation in (f(x)) (i.e. in (y)). The mathematics of the Delta Method are built from a Taylor series expansion, which allows you to estimate the (y) that results from adding a small change (Delta) to (x).
[y = f(x + Delta) = f(x) + f'(x)(Delta) + f''(x)Delta^2 /~ 2! ~…]
The estimated y is the y calculated by the function (f(x)) at the original (x) value, plus the effect of the small increment given the slope of the function at (x) (i.e., the first derivative of (f(x))), plus the effect of the acceleration of the function (the second derivative), plus additional terms representing higher derivatives of the function. The higher order terms, meaning the terms with the second derivative and every derivative above that, are generally so small that you can discard them without much loss of information. Because of that, we’re going to drop the second order term and higher. Thus, we have an approximation for the new (y: f(x+Delta) approx f(x)+f'(x)(Delta)) from the forumla. (f'(x)) gives the slope at point (x), so that multiplied by the small increment (Delta), added to the starting point, (f(x)), approximates where (f(x + Delta)) will be located. Error in the estimates arises from non-linearity in (f) (i.e., due to the higher order terms that we dropped).
Now let’s consider variation around (x) (e.g., increasing (x) by (Delta) and decreasing it by (Delta)). (Delta) essentially represents variation in (x). What we are trying to figure out is how this variation in (x) produces variation in (f(x)), i.e., how (x) produces variation in (y).
This can be visualized in Fig. 1:
Fig. 1) Visualization of how a Taylor series exapansion allows the estimation of how variation in (x) (i.e., as measured by (Delta)) produces variation variation in (f(x)).
(f'(x)) gives the slope at point (x), so that multiplied by the small increment (Delta), added to the starting point, (f(x)), approximates where (f(x + Delta)). (Delta) essentially represents variation in (x). What we are trying to figure out is how this variation in (x) produces variation in (f(x)), i.e., how (x) produces variation in (y).
Recall that the equation for variance ((V)) of (y) is: [V(y) = V(f(x)) = frac{sum_{i=1}^{n}(y_{i} – bar{y})^2}{n-1}]
We know (bar{y}) and we can use the Delta Method to estimate (y_i) [y_i approx bar{y} + f'(x)(x_i – bar{x})] If we then substitute the equation for (y_i) into the variance equation for (y), we obtain: [V(y) = frac{sum_{i=1}^{n} ~[bar{y} + f'(x)(x_i -bar{x}) – bar{y}]^2}{n-1}] Now, canceling out the (bar{y}), and pulling out the slope, which is a constant, we can rearrange the equation to: [V(y) = f'(x)^2 frac{sum_{i=1}^{n} ~(x_i -bar{x})^2}{n-1}] The fraction in the last half of the equation is the same as the variance in (x) (i.e., (V(x))), thus [V(y) approx f'(x)^2 V(x)] and now you’ve used the Delta Method to calculate variance in (y).
Delta Method (2 variables)
In meta-analysis, you typically have an effect size that is based on at least two or more variables (e.g., the mean for the control group and the mean for the treatment group). Thus, we need to apply the Delta Method for a two-variable system. This is slightly more complicated than the example provided above, but is still do-able. Let’s think of the effect size, (e), as a function of two variables, (x) and (y). We now have to consider how variation in both the (x) and (y) directions alter the effect size.
The Taylor series expansion for this two-variable system is: [y = f(x,y)~ + f’x(x,y)(Delta_x) + f’y(x,y)(Delta_y)~ + ~ …]
- Note that in this case the derivatives are partial derivatives.
Now, apply the Delta Method to obtain an estimate for the variance effect size, (V(f(x,y))): [V[f(x,y)] = V(e) approx left( frac{partial f}{partial x} right)^2 ~V(x) + left( frac{partial f}{partial y}right)^2 ~V(y)]
- (V(x)) and (V(y)) are estimated from the data (e.g., the (s^2/n) for each treatment group), while the derivates are defined based upon the functional form of the effect size metric (and thus will depend on how the effect size has been defined: e.g., lnRR vs. Hedges’ d).
[Future: add example calculations of simple effect size metrics]
Non-parametric weights
Non-parametric weights, or weights based on anything besides the inverse of the variance, such as sample size, study “quality”, etc. are also used in meta-analysis, especially in the social sciences. These types of weights are used when variance-based weights can’t be calculated, or are problematic for analyses. For example, sometimes the within-study variance can’t be calculated for a study due to zeroes that lead to undefined terms in the variance formula, or because the study didn’t report variances or sample sizes for both groups.
Implementation in fixed effect models
Typically, non-parametric weights are used in fixed effect models. In this case, their implementation is straightforward–weights should be designed to let studies of higher quality, or estimated with higher precision contribute more to the estimation of the overall mean effect size. Thus, for example the weight of study (i) could be calulated as proportional to the sample sizes in two groups, e.g., [w_i = frac{n_E n_C}{n_E + n_C}] In other words, a study with larger sample sizes would be given more weight than a study with smaller sample sizes.
Implementation in random effects models
In random effects models, which incorporate among-study variance into the weighting term, the usage of non-parametric weights is more complicated, and less understood. Let’s assume that we have an index, (I_i), that represents the quality of study (i). Let’s further assume that this index is assumed proportional to the within-study variance, although we don’t know exactly how. If this proportionality holds across all studies that we are summarizing, then: [w_i = frac{1}{alpha I_i + T^2}] Of course, we do not know the proportionality, (alpha). We can consider two extreme cases. 1) If the among-study variance ((T^2)) is reasonably small relative to the within-study variance, then the weights for each study will be based primarily on the within-study variance. As a result, we can conduct a fixed effects analysis (because the (T^2) term is unimportant). 2) On the other hand, if (T^2) is extremeley large relative to the within-study variance term, then the weights will be similar across all studies, and it would be appropriate to conduct an unweighted analysis.
[Future: provide illustration of why.]
The solution for intermediate cases is unclear, and approaches that have been used the literature need to be evaluated before any recommendations can be made.
[Future: recommendations for determining when non-parametric weights are appropriate]
Unweighted analyses
The overall mean effect size ((bar{E})) of an unweighted analysis is just the simple mean of the effect sizes ((e)) of all the studies in the meta-analysis (studies (1) to (k)) [bar{E} = frac{sum_{i=1}^k e_i}{k}]
An unweighted analysis gives unbiased estimates of the mean effect size. However, unweighted analyses generally result in less precise estimates, (e.g., estimates with larger confidence intervals), as well as reduced power to detect a significant effects of moderator variables. Therefore, unweighted analyses are usually not recommended if it is possible and appropriate to conduct a weighted analysis.
Summary
Weighting is an optional, but recommended, step in meta-analysis, which allows the meta-analyst to systematically assign greater importance to studies where the effect size was estimated with higher precision, and allows these studies to factor more heavily into the estimation of the overall mean effect size. Parametric weights based on the inverse of the variance are the most common and statistically efficient weights for meta-analysis. These weights differ in how they are implemented for fixed vs. random effects models. When variance-based weights are not feasible to implement, non-parametric weights can be used instead; however their appropriateness has not been examined in detail. In many cases, unweighted analyses provide a reasonable, but often less precise, alternative for conducting a meta-analysis.
Next steps
The above discussion focuses on the use of weights to obtain mean effect sizes over a collection of studies. Note that with random effects models, these weights require estimates of (T^2), which we discuss in the module on statistical models. Once we’ve obtained effect sizes and their weights, and used these estimates to obtain mean effect sizes, the next step is to determine the variance of this estimate, explore if there is heterogeneity in the effect sizes estimated in different studies (i.e., evaluate if (T^2) is demonstrably different from 0), and evaluate if moderating variables can explain any observed heterogeneity. We’ll discuss how to do this in the section on Exploring heterogeneity.
Last updated: 2019, January 22
References
LS0tCnRpdGxlOiAiV2VpZ2h0aW5nIGVmZmVjdCBzaXplcyIKaGVhZGVyLWluY2x1ZGVzOiB8CiAgXHVzZXBhY2thZ2V7ZmFuY3loZHJ9CiAgXHBhZ2VzdHlsZXtmYW5jeX0Kb3V0cHV0OgogIAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApiaWJsaW9ncmFwaHk6IG1ldGEtYW5hbHlzaXMgdHV0b3JpYWwuYmliCi0tLQoKYGBge3IsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9CiMgbG9hZCBsaWJyYXJpZXMgZm9yIGRvY3VtZW50IGNyZWF0aW9uCmxpYnJhcnkoUmVmTWFuYWdlUikgIyByZWZlcmVuY2UgbWFuYWdlcgpsaWJyYXJ5KG1ldGFmb3IpCmBgYAoKCkFmdGVyIGNhbGN1bGF0aW5nIGVmZmVjdCBzaXplcyBmcm9tIHlvdXIgcHJpbWFyeSBzdHVkaWVzLCB3ZWlnaHRzIGNhbiBiZSBjYWxjdWxhdGVkIGZvciB0aG9zZSBlZmZlY3RzIHRvIGRldGVybWluZSBob3cgbXVjaCB0aGV5IHNob3VsZCBlYWNoIGNvbnRyaWJ1dGUgdG8gdGhlIG92ZXJhbGwgZWZmZWN0IHNpemUgZXN0aW1hdGUuICBXZWlnaHRpbmcgY2FuIGJlIHVzZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHJlbGF0aXZlIHByZWNpc2lvbiBvZiB0aGUgZWZmZWN0IHNpemVzIGNhbGN1bGF0ZWQgZnJvbSBwcmltYXJ5IHN0dWRpZXMsIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgdGhleSBzaG91bGQgYWxsIGNvbnRyaWJ1dGUgZXF1YWxseSB0byB0aGUgZmluYWwgZXN0aW1hdGUgb2YgdGhlIG92ZXJhbGwgZWZmZWN0IHNpemUuICBBbHRob3VnaCAqd2VpZ2h0aW5nIGlzIG5vdCBhIG1hbmRhdG9yeSBzdGVwIGluIG1ldGEtYW5hbHlzaXMqLCBpdCBpcyBnZW5lcmFsbHkgYSByZWNvbW1lbmRlZCBvbmUsIGFzIHN0dWRpZXMgY2FuIHZhcnkgaW4gdGhlIHF1YWxpdHkgYW5kIHByZWNpc2lvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGV5IHByb3ZpZGUsIHdoZXRoZXIgdGhhdCBpcyBkdWUgdG8gdGhlaXIgc2FtcGxlIHNpemUgb3IgZHVlIHRvIHZhcmlhdGlvbiBjYXVzZWQgYnkgbWVhc3VyZW1lbnQgZXJyb3IsIHZhcmlhdGlvbiBpbiBleHBlcmltZW50YWwgbWV0aG9kb2xvZ3ksIG9yIGVudmlyb25tZW50YWwgdmFyaWF0aW9uLiAgV2VpZ2h0aW5nIGFsbG93cyBzdHVkaWVzIHdpdGggaGlnaGVyIHByZWNpc2lvbiAoaS5lLiwgYSBsb3dlciB2YXJpYW5jZSkgdG8gY29udHJpYnV0ZSBtb3JlIHRvIHRoZSBvdmVyYWxsIGVmZmVjdCBzaXplIGVzdGltYXRlLCBoZWxwaW5nIHRvIGltcHJvdmUgaXRzIGFjY3VyYWN5IGFuZCBwcmVjaXNpb24uICBIb3dldmVyLCB3ZWlnaHRpbmcgaXMgbm90IGFsd2F5cyBuZWNlc3NhcnksIHNvIGluIGZ1dHVyZSBzdWItc2VjdGlvbnMgd2Ugd2lsbCBkaXNjdXNzIGNpcmN1bXN0YW5jZXMgd2hlbiB1bndlaWdodGVkIGFuYWx5c2VzIG1heSBiZSBwcmVmZXJhYmxlIG9yIG5lY2Vzc2FyeS4KCldlaWdodGluZyBjYW4gYmUgZXhlY3V0ZWQgaW4gYSB2YXJpZXR5IG9mIHdheXMsIGFuZCB0aGUgYmVzdCB3ZWlnaHRpbmcgc2NoZW1lIGRlcGVuZHMgb24gY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBlZmZlY3Qgc2l6ZSBkYXRhLCBhbmQgb24gdGhlIHR5cGUgb2Ygc3RhdGlzdGljYWwgbW9kZWwgdGhhdCB5b3UgcGxhbiB0byBpbXBsZW1lbnQgdG8gYXNzZXNzIHlvdXIgZWZmZWN0IHNpemVzLiAgV2VpZ2h0cyBjb21lIGluIHBhcmFtZXRyaWMgb3Igbm9ucGFyYW1ldHJpYyB2YXJpZXRpZXMuCgoqKlBhcmFtZXRyaWMgd2VpZ2h0cyoqCgoqCUJhc2VkIG9uIHZhcmlhbmNlIAogICAgICsgZml4ZWQgZWZmZWN0IG1vZGVsIHdlaWdodHM6IDEgLyAod2l0aGluLXN0dWR5IHZhcmlhbmNlKSAKICAgICArIHJhbmRvbSBlZmZlY3RzIG1vZGVsIHdlaWdodHM6IDEgLyAod2l0aGluLXN0dWR5ICsgYmV0d2Vlbi1zdHVkeSB2YXJpYW5jZSkgCiAgICAgCioqTm9ucGFyYW1ldHJpYyB3ZWlnaHRzKiogCgoqCUJhc2VkIG9uIHNhbXBsZSBzaXplLCBzdHVkeSDigJxxdWFsaXR54oCdLCBvciBvdGhlciBjcml0ZXJpYSBkZWZpbmVkIGJ5IG1ldGEtYW5hbHlzdAogICAgICsgbW9zdCBjb21tb25seSBpbXBsZW1lbnRlZCBpbiBmaXhlZCBlZmZlY3QgbW9kZWxzLCAKICAgICArIGltcGxlbWVudGVkIGJ5IG9jY2Fzc2lvbmFsbHkgaW4gcmFuZG9tIGVmZmVjdHMgbW9kZWxzLCBob3dldmVyIHRoaXMgYXBwcm9hY2ggaGFzIG5vdCBiZWVuIGV2YWx1YXRlZCAKICAgICArICpsaW1pdGF0aW9uKjogeW91IGNhbuKAmXQgY29uZHVjdCBoZXRlcm9nZW5laXR5IHRlc3RzIHdpdGggbm9ucGFyYW1ldHJpYyB3ZWlnaHRzLCBiZWNhdXNlIHlvdSBjYW4ndCBwYXJ0aW9uIHRoZSB2YXJpYW5jZSBjb21wb25lbnRzCiAgICAgCgpQYXJhbWV0cmljIHdlaWdodHMgYXJlIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgYW5kIHRoZSBtb3N0IGluZm9ybWF0aXZlIHdlaWdodHMsIHNvIGxldCdzIGxvb2sgYXQgaG93IHRoZXkgYXJlIGNhbGN1bGF0ZWQgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBzdGF0aXN0aWNhbCBtb2RlbHMuCgombmJzcDsKCiMjIFBhcmFtZXRyaWMgd2VpZ2h0cwoKUGFyYW1ldHJpYyB3ZWlnaHRzIGFyZSBiYXNlZCBvbiBlc3RpbWF0ZXMgb2YgdmFyaWFuY2UuIAoKSW4gKipmaXhlZCBlZmZlY3QgbW9kZWxzLCoqIHRoZSB3ZWlnaHQgKCR3JCkgZm9yIHN0dWR5ICRpJCBpcyB0aGUgcmVjaXByb2NhbCBvZiB0aGUgd2l0aGluLXN0dWR5IHZhcmlhbmNlIG9mIHRoZSBvYnNlcnZlZCBlZmZlY3Qgc2l6ZSAoJFYoZV9pKSQpLiAgVGh1cywgCiQkd197aX0gPSBcZnJhY3sxfXtWKGVfe2l9KX0kJAombmJzcDsKCkluICoqcmFuZG9tIGVmZmVjdHMgbW9kZWxzKiosIHBhcmFtZXRyaWMgd2VpZ2h0cyBpbmNvcnBvcmF0ZSBib3RoIHdpdGhpbi0gYW5kIGFtb25nLXN0dWR5IHZhcmlhbmNlLiAKJCR3Xipfe2l9PSAgXGZyYWN7MX17VihlX2kgKSArIFReMn0kJAoKKiAkZV9pJCA9IGVmZmVjdCBzaXplIG9mICRpdGgkIHN0dWR5CiogJFYoZV9pKSQgPSBlc3RpbWF0ZSBvZiB0aGUgd2l0aGluLXN0dWR5IHZhcmlhbmNlIG9mICRlJCBmb3IgdGhlICRpdGgkIHN0dWR5CiogJFReMiQgPSAqZXN0aW1hdGUqIG9mIGFtb25nLXN0dWR5IHZhcmlhbmNlCgombmJzcDsKCiMjIyBXaXRoaW4tc3R1ZHkgdmFyaWFuY2UgY2FsY3VsYXRpb25zCgpXaXRoaW4tc3R1ZHkgdmFyaWFuY2VzIG9mIGVmZmVjdHMgc2l6ZXMgY2FuIHNvbWV0aW1lcyBiZSB0YWtlbiBkaXJlY3RseSBmcm9tIGEgcHJpbWFyeSBzdHVkeSwgYnV0IGluIG1vc3QgY2FzZXMgaXQgbXVzdCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBtZXRhLWFuYWx5c3QuICBJdOKAmXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCAqKnRoZSBmb3JtdWxhIGZvciBlc3RpbWF0aW5nIHRoZSB3aXRoaW4tc3R1ZHkgdmFyaWFuY2Ugb2YgYW4gZWZmZWN0IHNpemUgaXMgdW5pcXVlIHRvIGVhY2ggZWZmZWN0IHNpemUgbWV0cmljLioqICBUaGUgZXF1YXRpb25zIGZvciBjYWxjdWxhdGluZyB3aXRoaW4tc3R1ZHkgdmFyaWFuY2UgZm9yIGNvbW1vbiBlZmZlY3Qgc2l6ZSBtZXRyaWNzIGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIGxpdGVyYXR1cmUsIGFuZCBpbmNsdWRlOgoKKipXaXRoaW4tc3R1ZHkgdmFyaWFuY2Ugb2YgdGhlIGxvZy1yZXNwb25zZSByYXRpbyAobG5SUikqKjoKJCRWKGxuUlJfe2l9KSA9IFYobG4oXGJhcntYX3tpfX0vXGJhcntDX3tpfX0pKSBcYXBwcm94IFxmcmFje1YoXGJhcntYX3tpfX0pfXtcYmFye1hfe2l9XjJ9fSArIFxmcmFje1YoXGJhcntDX3tpfX0pfXtcYmFye0Nfe2l9XjJ9fSQkCgoqICRcYmFye1hfe2l9fSQgaXMgdGhlIG1lYW4gcmVzcG9uc2UgaW4gZ3JvdXAgJFgkIGluIHN0dWR5ICRpJAoqICRcYmFye0Nfe2l9fSQgaXMgdGhlIG1lYW4gcmVzcG9uc2UgaW4gZ3JvdXAgJEMkIGluIHN0dWR5ICRpJAoKJm5ic3A7CgoqKldpdGhpbi1zdHVkeSB2YXJpYW5jZSBvZiBIZWRnZXMnICRkJCoqOgokJCBWKGRfe2l9KSBcYXBwcm94IFxmcmFje25fe0MsaX0gKyBuX3tYLGl9fXtuX3tDLGl9fm5fe1gsaX19ICsgXGZyYWN7ZF4yX3tpfX17MihuX3tDLGl9ICsgbl97WCxpfSl9ICQkCgoqICRuX3tYLGl9JCBpcyB0aGUgc2FtcGxlIHNpemUgb2YgdGhlIHRyZWF0bWVudCBncm91cCBpbiBzdHVkeSAkaSQgCiogJG5fe0MsaX0kIGlzIHRoZSBzYW1wbGUgc2l6ZSBvZiB0aGUgY29udHJvbCBncm91cCBpbiBzdHVkeSAkaSQKKiAkZF9pJCBpcyB0aGUgSGVkZ2VzJyBkIGVmZmVjdCBzaXplIGluIHN0dWR5ICRpJCAgIAoKJm5ic3A7CgoqKldpdGhpbi1zdHVkeSB2YXJpYW5jZSBvZiB0aGUgcmVzcG9uc2UgZGlmZmVyZW5jZSAoJEQgPSBcYmFye1hfRX0gLSBcYmFye1hfQ30kKSoqOgoKV2hlbiB3ZSBhc3N1bWUgdGhlIHBvcHVsYXRpb25zIHRoYXQgdGhlIHR3byBncm91cHMgcmVwcmVzZW50IGhhdmUgdGhlICpzYW1lKiBzdGFuZGFyZCBkZXZpYXRpb25zOgokJFZfRCA9IFxmcmFje25fRSArIG5fQ317bl9FIG5fQ31zX3twb29sZWR9XjIkJApXaGVyZSAkc197cG9vbGVkfSQgaXMKJCRzX3twb29sZWR9ID0gXHNxcnR7XGZyYWN7KG5fRSAtIDEpc19FXjIgKyAobl9DIC0xKXNfQ14yfXtuX0UgKyBuX0MgLTJ9fSQkCgphbmQgd2hlbiB3ZSBhc3N1bWUgdGhlIHBvcHVsYXRpb25zIGhhdmUgKmRpZmZlcmVudCogc3RhbmRhcmQgZGV2aWF0aW9uczoKJCRWX0QgPSBcZnJhY3tzX0VeMn17bl9FfSArIFxmcmFje3NfQ14yfXtuX0N9JCQKCiZuYnNwOwoKKipXaXRoaW4tc3R1ZHkgdmFyaWFuY2Ugb2YgYSBzbG9wZSBvciBvdGhlciBwYXJhbWV0ZXItYmFzZWQgZWZmZWN0IHNpemUqKgoKRm9yIGFuIGVmZmVjdCBzaXplIGJhc2VkIG9uIGEgcGFyYW1ldGVyIGVzdGltYXRlIGxpa2UgYSByZWdyZXNzaW9uIHNsb3BlLCB5b3UgY2FuIG9idGFpbiB0aGUgd2l0aGluLXN0dWR5IHZhcmlhbmNlIGRpcmVjdGx5IGZyb20gdGhlIG1vZGVsIG91dHB1dC4gIAoKJm5ic3A7CgojIyMjIENhbGN1bGF0aW5nIHdpdGhpbi1zdHVkeSB2YXJpYW5jZSBmb3IgYSBuZXcgZWZmZWN0IHNpemUgbWV0cmljCgpIb3dldmVyLCBpZiB5b3UgY29uc3RydWN0ZWQgYSBuZXcgZWZmZWN0IHNpemUgbWV0cmljICgkZSA9IGYoWF97MX0sIFhfezJ9KSQpLCB5b3Ugd2lsbCBoYXZlIHRvIGRlcml2ZSBhbiBlc3RpbWF0b3IgZm9yIHRoZSB3aXRoaW4tc3R1ZHkgZWZmZWN0IHNpemUgdmFyaWFuY2UuICBZb3UgY2FuIGRvIHRoaXMgdGhyb3VnaCBhcHBsaWNhdGlvbiBvZiB0aGUgKipEZWx0YSBNZXRob2QqKi4KCiZuYnNwOwoKIyMjIyMgVGhlIERlbHRhIE1ldGhvZCAob25lIHZhcmlhYmxlKQoKU3RhcnRpbmcgYXQgdGhlIG1vc3QgYmFzaWMgbGV2ZWwsIGEgKm9uZSB2YXJpYWJsZSogc3lzdGVtLCB0aGUgRGVsdGEgTWV0aG9kIGlzIHVzZWQgdG8gZXN0aW1hdGUgaG93IHZhcmlhdGlvbiBpbiAkeCQgdHJhbnNsYXRlcyBpbnRvIHZhcmlhdGlvbiBpbiAkZih4KSQgKGkuZS4gaW4gJHkkKS4gIFRoZSBtYXRoZW1hdGljcyBvZiB0aGUgRGVsdGEgTWV0aG9kIGFyZSBidWlsdCBmcm9tIGEgKipUYXlsb3Igc2VyaWVzIGV4cGFuc2lvbioqLCB3aGljaCBhbGxvd3MgeW91IHRvIGVzdGltYXRlIHRoZSAkeSQgdGhhdCByZXN1bHRzIGZyb20gYWRkaW5nIGEgc21hbGwgY2hhbmdlICRcRGVsdGEkIHRvICR4JC4gCgokJHkgPSBmKHggKyBcRGVsdGEpID0gZih4KSArIGYnKHgpKFxEZWx0YSkgKyBmJycoeClcRGVsdGFeMiAvfiAyISB+Li4uJCQKClRoZSBlc3RpbWF0ZWQgeSBpcyB0aGUgeSBjYWxjdWxhdGVkIGJ5IHRoZSBmdW5jdGlvbiAkZih4KSQgYXQgdGhlIG9yaWdpbmFsICR4JCB2YWx1ZSwgcGx1cyB0aGUgZWZmZWN0IG9mIHRoZSBzbWFsbCBpbmNyZW1lbnQgZ2l2ZW4gdGhlIHNsb3BlIG9mIHRoZSBmdW5jdGlvbiBhdCAkeCQgKGkuZS4sIHRoZSBmaXJzdCBkZXJpdmF0aXZlIG9mICRmKHgpJCksIHBsdXMgdGhlIGVmZmVjdCBvZiB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBmdW5jdGlvbiAodGhlIHNlY29uZCBkZXJpdmF0aXZlKSwgcGx1cyBhZGRpdGlvbmFsIHRlcm1zIHJlcHJlc2VudGluZyBoaWdoZXIgZGVyaXZhdGl2ZXMgb2YgdGhlIGZ1bmN0aW9uLiAgVGhlIGhpZ2hlciBvcmRlciB0ZXJtcywgbWVhbmluZyB0aGUgdGVybXMgd2l0aCB0aGUgc2Vjb25kIGRlcml2YXRpdmUgYW5kIGV2ZXJ5IGRlcml2YXRpdmUgYWJvdmUgdGhhdCwgYXJlIGdlbmVyYWxseSBzbyBzbWFsbCB0aGF0IHlvdSBjYW4gZGlzY2FyZCB0aGVtIHdpdGhvdXQgbXVjaCBsb3NzIG9mIGluZm9ybWF0aW9uLiAgQmVjYXVzZSBvZiB0aGF0LCB3ZSdyZSBnb2luZyB0byBkcm9wIHRoZSBzZWNvbmQgb3JkZXIgdGVybSBhbmQgaGlnaGVyLiAgVGh1cywgd2UgaGF2ZSBhbiBhcHByb3hpbWF0aW9uIGZvciB0aGUgbmV3ICR5OiBmKHgrXERlbHRhKSBcYXBwcm94IGYoeCkrZicoeCkoXERlbHRhKSQgZnJvbSB0aGUgZm9ydW1sYS4gICRmJyh4KSQgZ2l2ZXMgdGhlIHNsb3BlIGF0IHBvaW50ICR4JCwgc28gdGhhdCBtdWx0aXBsaWVkIGJ5IHRoZSBzbWFsbCBpbmNyZW1lbnQgJFxEZWx0YSQsIGFkZGVkIHRvIHRoZSBzdGFydGluZyBwb2ludCwgJGYoeCkkLCBhcHByb3hpbWF0ZXMgd2hlcmUgJGYoeCArIFxEZWx0YSkkIHdpbGwgYmUgbG9jYXRlZC4gIEVycm9yIGluIHRoZSBlc3RpbWF0ZXMgYXJpc2VzIGZyb20gbm9uLWxpbmVhcml0eSBpbiAkZiQgKGkuZS4sIGR1ZSB0byB0aGUgaGlnaGVyIG9yZGVyIHRlcm1zIHRoYXQgd2UgZHJvcHBlZCkuCgpOb3cgbGV04oCZcyBjb25zaWRlciB2YXJpYXRpb24gYXJvdW5kICR4JCAoZS5nLiwgaW5jcmVhc2luZyAkeCQgYnkgJFxEZWx0YSQgYW5kIGRlY3JlYXNpbmcgaXQgYnkgJFxEZWx0YSQpLiAgJFxEZWx0YSQgZXNzZW50aWFsbHkgcmVwcmVzZW50cyB2YXJpYXRpb24gaW4gJHgkLiBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gZmlndXJlIG91dCBpcyBob3cgdGhpcyB2YXJpYXRpb24gaW4gJHgkIHByb2R1Y2VzIHZhcmlhdGlvbiBpbiAkZih4KSQsIGkuZS4sIGhvdyAkeCQgcHJvZHVjZXMgdmFyaWF0aW9uIGluICR5JC4KClRoaXMgY2FuIGJlIHZpc3VhbGl6ZWQgaW4gRmlnLiAxOgoKPGNlbnRlcj4KCiFbRmlnLiAxKSBWaXN1YWxpemF0aW9uIG9mIGhvdyBhIFRheWxvciBzZXJpZXMgZXhhcGFuc2lvbiBhbGxvd3MgdGhlIGVzdGltYXRpb24gb2YgaG93IHZhcmlhdGlvbiBpbiAkeCQgKGkuZS4sIGFzIG1lYXN1cmVkIGJ5ICRcRGVsdGEkKSBwcm9kdWNlcyB2YXJpYXRpb24gdmFyaWF0aW9uIGluICRmKHgpJC5dKC9Vc2Vycy9hbXkuYnJpZ2dzL0Ryb3Bib3gvMV9VR0EvUkEgd29yay9tZXRhLWFuYWx5c2lzL29ubGluZSBjb3Vyc2UgZGV2ZWxvcG1lbnQvTUFfb25saW5lIGNvdXJzZSBkZXZlbG9wbWVudC9maWd1cmVzL0RlbHRhLnBuZykKCjwvY2VudGVyPgoKCiRmJyh4KSQgZ2l2ZXMgdGhlIHNsb3BlIGF0IHBvaW50ICR4JCwgc28gdGhhdCBtdWx0aXBsaWVkIGJ5IHRoZSBzbWFsbCBpbmNyZW1lbnQgJFxEZWx0YSQsIGFkZGVkIHRvIHRoZSBzdGFydGluZyBwb2ludCwgJGYoeCkkLCBhcHByb3hpbWF0ZXMgd2hlcmUgJGYoeCArIFxEZWx0YSkkLiAgJFxEZWx0YSQgZXNzZW50aWFsbHkgcmVwcmVzZW50cyB2YXJpYXRpb24gaW4gJHgkLiAqKldoYXQgd2UgYXJlIHRyeWluZyB0byBmaWd1cmUgb3V0IGlzIGhvdyB0aGlzIHZhcmlhdGlvbiBpbiAkeCQgcHJvZHVjZXMgdmFyaWF0aW9uIGluICRmKHgpJCwgaS5lLiwgaG93ICR4JCBwcm9kdWNlcyB2YXJpYXRpb24gaW4gJHkkLioqICAKClJlY2FsbCB0aGF0IHRoZSBlcXVhdGlvbiBmb3IgdmFyaWFuY2UgKCRWJCkgb2YgJHkkIGlzOgokJFYoeSkgPSBWKGYoeCkpID0gXGZyYWN7XHN1bV97aT0xfV57bn0oeV97aX0gLSBcYmFye3l9KV4yfXtuLTF9JCQKCldlIGtub3cgJFxiYXJ7eX0kIGFuZCB3ZSBjYW4gdXNlIHRoZSBEZWx0YSBNZXRob2QgdG8gZXN0aW1hdGUgJHlfaSQKJCR5X2kgXGFwcHJveCBcYmFye3l9ICsgZicoeCkoeF9pIC0gXGJhcnt4fSkkJApJZiB3ZSB0aGVuIHN1YnN0aXR1dGUgdGhlIGVxdWF0aW9uIGZvciAkeV9pJCBpbnRvIHRoZSB2YXJpYW5jZSBlcXVhdGlvbiBmb3IgJHkkLCB3ZSBvYnRhaW46CiQkVih5KSA9IFxmcmFje1xzdW1fe2k9MX1ee259IH5bXGJhcnt5fSArIGYnKHgpKHhfaSAtXGJhcnt4fSkgLSBcYmFye3l9XV4yfXtuLTF9JCQKTm93LCBjYW5jZWxpbmcgb3V0IHRoZSAkXGJhcnt5fSQsIGFuZCBwdWxsaW5nIG91dCB0aGUgc2xvcGUsIHdoaWNoIGlzIGEgY29uc3RhbnQsIHdlIGNhbiByZWFycmFuZ2UgdGhlIGVxdWF0aW9uIHRvOgokJFYoeSkgPSBmJyh4KV4yICBcZnJhY3tcc3VtX3tpPTF9XntufSB+KHhfaSAtXGJhcnt4fSleMn17bi0xfSQkClRoZSBmcmFjdGlvbiBpbiB0aGUgbGFzdCBoYWxmIG9mIHRoZSBlcXVhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgdmFyaWFuY2UgaW4gJHgkIChpLmUuLCAkVih4KSQpLCB0aHVzCiQkVih5KSBcYXBwcm94IGYnKHgpXjIgVih4KSQkCmFuZCBub3cgeW91J3ZlIHVzZWQgdGhlIERlbHRhIE1ldGhvZCB0byBjYWxjdWxhdGUgdmFyaWFuY2UgaW4gJHkkLgoKJm5ic3A7CgojIyMjIyBEZWx0YSBNZXRob2QgKDIgdmFyaWFibGVzKQoKKipJbiBtZXRhLWFuYWx5c2lzLCB5b3UgdHlwaWNhbGx5IGhhdmUgYW4gZWZmZWN0IHNpemUgdGhhdCBpcyBiYXNlZCBvbiBhdCBsZWFzdCB0d28gb3IgbW9yZSB2YXJpYWJsZXMqKiAoZS5nLiwgdGhlIG1lYW4gZm9yIHRoZSBjb250cm9sIGdyb3VwIGFuZCB0aGUgbWVhbiBmb3IgdGhlIHRyZWF0bWVudCBncm91cCkuICoqVGh1cywgd2UgbmVlZCB0byBhcHBseSB0aGUgRGVsdGEgTWV0aG9kIGZvciBhICp0d28tdmFyaWFibGUqIHN5c3RlbSoqLiBUaGlzIGlzIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGUgZXhhbXBsZSBwcm92aWRlZCBhYm92ZSwgYnV0IGlzIHN0aWxsIGRvLWFibGUuIExldOKAmXMgdGhpbmsgb2YgdGhlIGVmZmVjdCBzaXplLCAkZSQsIGFzIGEgZnVuY3Rpb24gb2YgdHdvIHZhcmlhYmxlcywgJHgkIGFuZCAkeSQuICBXZSBub3cgaGF2ZSB0byBjb25zaWRlciBob3cgdmFyaWF0aW9uIGluIGJvdGggdGhlICR4JCBhbmQgJHkkIGRpcmVjdGlvbnMgYWx0ZXIgdGhlIGVmZmVjdCBzaXplLgoKVGhlIFRheWxvciBzZXJpZXMgZXhwYW5zaW9uIGZvciB0aGlzIHR3by12YXJpYWJsZSBzeXN0ZW0gaXM6IAokJHkgPSBmKHgseSl+ICsgZuKAmXgoeCx5KShcRGVsdGFfeCkgKyBm4oCZeSh4LHkpKFxEZWx0YV95KX4gKyB+IOKApiQkCgoqIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIGRlcml2YXRpdmVzIGFyZSBwYXJ0aWFsIGRlcml2YXRpdmVzLgoKCk5vdywgYXBwbHkgdGhlIERlbHRhIE1ldGhvZCB0byBvYnRhaW4gYW4gZXN0aW1hdGUgZm9yIHRoZSB2YXJpYW5jZSBlZmZlY3Qgc2l6ZSwgJFYoZih4LHkpKSQ6CiQkVltmKHgseSldID0gVihlKSBcYXBwcm94IFxsZWZ0KCBcZnJhY3tccGFydGlhbCBmfXtccGFydGlhbCB4fSBccmlnaHQpXjIgflYoeCkgKyBcbGVmdCggXGZyYWN7XHBhcnRpYWwgZn17XHBhcnRpYWwgeX1ccmlnaHQpXjIgflYoeSkkJAoKKiAkVih4KSQgYW5kICRWKHkpJCBhcmUgZXN0aW1hdGVkIGZyb20gdGhlIGRhdGEgKGUuZy4sIHRoZSAkc14yL24kIGZvciBlYWNoIHRyZWF0bWVudCBncm91cCksIHdoaWxlIHRoZSBkZXJpdmF0ZXMgYXJlIGRlZmluZWQgYmFzZWQgdXBvbiB0aGUgZnVuY3Rpb25hbCBmb3JtIG9mIHRoZSBlZmZlY3Qgc2l6ZSBtZXRyaWMgKGFuZCB0aHVzIHdpbGwgZGVwZW5kIG9uIGhvdyB0aGUgZWZmZWN0IHNpemUgaGFzIGJlZW4gZGVmaW5lZDogZS5nLiwgbG5SUiB2cy4gSGVkZ2Vz4oCZIGQpLiAKCgombmJzcDsKClsqRnV0dXJlOiBhZGQgZXhhbXBsZSBjYWxjdWxhdGlvbnMgb2Ygc2ltcGxlIGVmZmVjdCBzaXplIG1ldHJpY3MqXQoKJm5ic3A7CgojIyBOb24tcGFyYW1ldHJpYyB3ZWlnaHRzCgpOb24tcGFyYW1ldHJpYyB3ZWlnaHRzLCBvciB3ZWlnaHRzIGJhc2VkIG9uIGFueXRoaW5nIGJlc2lkZXMgdGhlIGludmVyc2Ugb2YgdGhlIHZhcmlhbmNlLCBzdWNoIGFzIHNhbXBsZSBzaXplLCBzdHVkeSAicXVhbGl0eSIsIGV0Yy4gYXJlIGFsc28gdXNlZCBpbiBtZXRhLWFuYWx5c2lzLCBlc3BlY2lhbGx5IGluIHRoZSBzb2NpYWwgc2NpZW5jZXMuICBUaGVzZSB0eXBlcyBvZiB3ZWlnaHRzIGFyZSB1c2VkIHdoZW4gdmFyaWFuY2UtYmFzZWQgd2VpZ2h0cyBjYW4ndCBiZSBjYWxjdWxhdGVkLCBvciBhcmUgcHJvYmxlbWF0aWMgZm9yIGFuYWx5c2VzLiAgRm9yIGV4YW1wbGUsIHNvbWV0aW1lcyB0aGUgd2l0aGluLXN0dWR5IHZhcmlhbmNlIGNhbid0IGJlIGNhbGN1bGF0ZWQgZm9yIGEgc3R1ZHkgZHVlIHRvIHplcm9lcyB0aGF0IGxlYWQgdG8gdW5kZWZpbmVkIHRlcm1zIGluIHRoZSB2YXJpYW5jZSBmb3JtdWxhLCBvciBiZWNhdXNlIHRoZSBzdHVkeSBkaWRuJ3QgcmVwb3J0IHZhcmlhbmNlcyBvciBzYW1wbGUgc2l6ZXMgZm9yIGJvdGggZ3JvdXBzLiAgCgombmJzcDsKCiMjIyBJbXBsZW1lbnRhdGlvbiBpbiBmaXhlZCBlZmZlY3QgbW9kZWxzCgpUeXBpY2FsbHksIG5vbi1wYXJhbWV0cmljIHdlaWdodHMgYXJlIHVzZWQgaW4gZml4ZWQgZWZmZWN0IG1vZGVscy4gIEluIHRoaXMgY2FzZSwgdGhlaXIgaW1wbGVtZW50YXRpb24gaXMgc3RyYWlnaHRmb3J3YXJkLS13ZWlnaHRzIHNob3VsZCBiZSBkZXNpZ25lZCB0byBsZXQgc3R1ZGllcyBvZiBoaWdoZXIgcXVhbGl0eSwgb3IgZXN0aW1hdGVkIHdpdGggaGlnaGVyIHByZWNpc2lvbiBjb250cmlidXRlIG1vcmUgdG8gdGhlIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgbWVhbiBlZmZlY3Qgc2l6ZS4gIFRodXMsIGZvciBleGFtcGxlIHRoZSB3ZWlnaHQgb2Ygc3R1ZHkgJGkkIGNvdWxkIGJlIGNhbHVsYXRlZCBhcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNhbXBsZSBzaXplcyBpbiB0d28gZ3JvdXBzLCBlLmcuLAokJHdfaSA9IFxmcmFje25fRSBuX0N9e25fRSArIG5fQ30kJApJbiBvdGhlciB3b3JkcywgYSBzdHVkeSB3aXRoIGxhcmdlciBzYW1wbGUgc2l6ZXMgd291bGQgYmUgZ2l2ZW4gbW9yZSB3ZWlnaHQgdGhhbiBhIHN0dWR5IHdpdGggc21hbGxlciBzYW1wbGUgc2l6ZXMuIAoKJm5ic3A7CgojIyMgSW1wbGVtZW50YXRpb24gaW4gcmFuZG9tIGVmZmVjdHMgbW9kZWxzCgpJbiByYW5kb20gZWZmZWN0cyBtb2RlbHMsIHdoaWNoIGluY29ycG9yYXRlIGFtb25nLXN0dWR5IHZhcmlhbmNlIGludG8gdGhlIHdlaWdodGluZyB0ZXJtLCB0aGUgdXNhZ2Ugb2Ygbm9uLXBhcmFtZXRyaWMgd2VpZ2h0cyBpcyBtb3JlIGNvbXBsaWNhdGVkLCBhbmQgbGVzcyB1bmRlcnN0b29kLiAgTGV0J3MgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbiBpbmRleCwgJElfaSQsIHRoYXQgcmVwcmVzZW50cyB0aGUgcXVhbGl0eSBvZiBzdHVkeSAkaSQuICBMZXQncyBmdXJ0aGVyIGFzc3VtZSB0aGF0IHRoaXMgaW5kZXggaXMgYXNzdW1lZCBwcm9wb3J0aW9uYWwgdG8gdGhlIHdpdGhpbi1zdHVkeSB2YXJpYW5jZSwgYWx0aG91Z2ggd2UgZG9uJ3Qga25vdyBleGFjdGx5IGhvdy4gIElmIHRoaXMgcHJvcG9ydGlvbmFsaXR5IGhvbGRzIGFjcm9zcyBhbGwgc3R1ZGllcyB0aGF0IHdlIGFyZSBzdW1tYXJpemluZywgdGhlbjoKJCR3X2kgPSBcZnJhY3sxfXtcYWxwaGEgSV9pICsgVF4yfSQkCk9mIGNvdXJzZSwgd2UgZG8gbm90IGtub3cgdGhlIHByb3BvcnRpb25hbGl0eSwgJFxhbHBoYSQuICBXZSBjYW4gY29uc2lkZXIgdHdvIGV4dHJlbWUgY2FzZXMuICAxKSBJZiB0aGUgYW1vbmctc3R1ZHkgdmFyaWFuY2UgKCRUXjIkKSBpcyByZWFzb25hYmx5IHNtYWxsIHJlbGF0aXZlIHRvIHRoZSB3aXRoaW4tc3R1ZHkgdmFyaWFuY2UsIHRoZW4gdGhlIHdlaWdodHMgZm9yIGVhY2ggc3R1ZHkgd2lsbCBiZSBiYXNlZCBwcmltYXJpbHkgb24gdGhlIHdpdGhpbi1zdHVkeSB2YXJpYW5jZS4gIEFzIGEgcmVzdWx0LCB3ZSBjYW4gY29uZHVjdCBhIGZpeGVkIGVmZmVjdHMgYW5hbHlzaXMgKGJlY2F1c2UgdGhlICRUXjIkIHRlcm0gaXMgdW5pbXBvcnRhbnQpLiAgMikgT24gdGhlIG90aGVyIGhhbmQsIGlmICRUXjIkIGlzIGV4dHJlbWVsZXkgbGFyZ2UgcmVsYXRpdmUgdG8gdGhlIHdpdGhpbi1zdHVkeSB2YXJpYW5jZSB0ZXJtLCB0aGVuIHRoZSB3ZWlnaHRzIHdpbGwgYmUgc2ltaWxhciBhY3Jvc3MgYWxsIHN0dWRpZXMsIGFuZCBpdCB3b3VsZCBiZSBhcHByb3ByaWF0ZSB0byBjb25kdWN0IGFuIHVud2VpZ2h0ZWQgYW5hbHlzaXMuCgpbKkZ1dHVyZTogcHJvdmlkZSBpbGx1c3RyYXRpb24gb2Ygd2h5LipdICAKClRoZSBzb2x1dGlvbiBmb3IgaW50ZXJtZWRpYXRlIGNhc2VzIGlzIHVuY2xlYXIsIGFuZCBhcHByb2FjaGVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgdGhlIGxpdGVyYXR1cmUgbmVlZCB0byBiZSBldmFsdWF0ZWQgYmVmb3JlIGFueSByZWNvbW1lbmRhdGlvbnMgY2FuIGJlIG1hZGUuCgpbKkZ1dHVyZTogcmVjb21tZW5kYXRpb25zIGZvciBkZXRlcm1pbmluZyB3aGVuIG5vbi1wYXJhbWV0cmljIHdlaWdodHMgYXJlIGFwcHJvcHJpYXRlKl0KCiZuYnNwOwoKIyMgVW53ZWlnaHRlZCBhbmFseXNlcwoKVGhlIG92ZXJhbGwgKiptZWFuIGVmZmVjdCBzaXplICgkXGJhcntFfSQpIG9mIGFuIHVud2VpZ2h0ZWQgYW5hbHlzaXMqKiBpcyBqdXN0IHRoZSBzaW1wbGUgbWVhbiBvZiB0aGUgZWZmZWN0IHNpemVzICgkZSQpIG9mIGFsbCB0aGUgc3R1ZGllcyBpbiB0aGUgbWV0YS1hbmFseXNpcyAoc3R1ZGllcyAkMSQgdG8gJGskKQokJFxiYXJ7RX0gPSBcZnJhY3tcc3VtX3tpPTF9XmsgZV9pfXtrfSQkCgpBbiB1bndlaWdodGVkIGFuYWx5c2lzIGdpdmVzIHVuYmlhc2VkIGVzdGltYXRlcyBvZiB0aGUgbWVhbiBlZmZlY3Qgc2l6ZS4gIEhvd2V2ZXIsIHVud2VpZ2h0ZWQgYW5hbHlzZXMgZ2VuZXJhbGx5IHJlc3VsdCBpbiBsZXNzIHByZWNpc2UgZXN0aW1hdGVzLCAoZS5nLiwgZXN0aW1hdGVzIHdpdGggbGFyZ2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzKSwgYXMgd2VsbCBhcyByZWR1Y2VkIHBvd2VyIHRvIGRldGVjdCBhIHNpZ25pZmljYW50IGVmZmVjdHMgb2YgbW9kZXJhdG9yIHZhcmlhYmxlcy4gIFRoZXJlZm9yZSwgdW53ZWlnaHRlZCBhbmFseXNlcyBhcmUgdXN1YWxseSBub3QgcmVjb21tZW5kZWQgaWYgaXQgaXMgcG9zc2libGUgYW5kIGFwcHJvcHJpYXRlIHRvIGNvbmR1Y3QgYSB3ZWlnaHRlZCBhbmFseXNpcy4KCiZuYnNwOwoKIyMgU3VtbWFyeSAKCldlaWdodGluZyBpcyBhbiBvcHRpb25hbCwgYnV0IHJlY29tbWVuZGVkLCBzdGVwIGluIG1ldGEtYW5hbHlzaXMsIHdoaWNoIGFsbG93cyB0aGUgbWV0YS1hbmFseXN0IHRvIHN5c3RlbWF0aWNhbGx5IGFzc2lnbiBncmVhdGVyIGltcG9ydGFuY2UgdG8gc3R1ZGllcyB3aGVyZSB0aGUgZWZmZWN0IHNpemUgd2FzIGVzdGltYXRlZCB3aXRoIGhpZ2hlciBwcmVjaXNpb24sIGFuZCBhbGxvd3MgdGhlc2Ugc3R1ZGllcyB0byBmYWN0b3IgbW9yZSBoZWF2aWx5IGludG8gdGhlIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgbWVhbiBlZmZlY3Qgc2l6ZS4gIFBhcmFtZXRyaWMgd2VpZ2h0cyBiYXNlZCBvbiB0aGUgaW52ZXJzZSBvZiB0aGUgdmFyaWFuY2UgYXJlIHRoZSBtb3N0IGNvbW1vbiBhbmQgc3RhdGlzdGljYWxseSBlZmZpY2llbnQgd2VpZ2h0cyBmb3IgbWV0YS1hbmFseXNpcy4gVGhlc2Ugd2VpZ2h0cyBkaWZmZXIgaW4gaG93IHRoZXkgYXJlIGltcGxlbWVudGVkIGZvciBmaXhlZCB2cy4gcmFuZG9tIGVmZmVjdHMgbW9kZWxzLiAgV2hlbiB2YXJpYW5jZS1iYXNlZCB3ZWlnaHRzIGFyZSBub3QgZmVhc2libGUgdG8gaW1wbGVtZW50LCBub24tcGFyYW1ldHJpYyB3ZWlnaHRzIGNhbiBiZSB1c2VkIGluc3RlYWQ7IGhvd2V2ZXIgdGhlaXIgYXBwcm9wcmlhdGVuZXNzIGhhcyBub3QgYmVlbiBleGFtaW5lZCBpbiBkZXRhaWwuICBJbiBtYW55IGNhc2VzLCB1bndlaWdodGVkIGFuYWx5c2VzIHByb3ZpZGUgYSByZWFzb25hYmxlLCBidXQgb2Z0ZW4gbGVzcyBwcmVjaXNlLCBhbHRlcm5hdGl2ZSBmb3IgY29uZHVjdGluZyBhIG1ldGEtYW5hbHlzaXMuCgombmJzcDsKCiMjIE5leHQgc3RlcHMKClRoZSBhYm92ZSBkaXNjdXNzaW9uIGZvY3VzZXMgb24gdGhlIHVzZSBvZiB3ZWlnaHRzIHRvIG9idGFpbiBtZWFuIGVmZmVjdCBzaXplcyBvdmVyIGEgY29sbGVjdGlvbiBvZiBzdHVkaWVzLiAgTm90ZSB0aGF0IHdpdGggcmFuZG9tIGVmZmVjdHMgbW9kZWxzLCB0aGVzZSB3ZWlnaHRzIHJlcXVpcmUgZXN0aW1hdGVzIG9mICRUXjIkLCB3aGljaCB3ZSBkaXNjdXNzIGluIHRoZSBtb2R1bGUgb24gc3RhdGlzdGljYWwgbW9kZWxzLiAgT25jZSB3ZeKAmXZlIG9idGFpbmVkIGVmZmVjdCBzaXplcyBhbmQgdGhlaXIgd2VpZ2h0cywgYW5kIHVzZWQgdGhlc2UgZXN0aW1hdGVzIHRvIG9idGFpbiBtZWFuIGVmZmVjdCBzaXplcywgdGhlIG5leHQgc3RlcCBpcyB0byBkZXRlcm1pbmUgdGhlIHZhcmlhbmNlIG9mIHRoaXMgZXN0aW1hdGUsIGV4cGxvcmUgaWYgdGhlcmUgaXMgaGV0ZXJvZ2VuZWl0eSBpbiB0aGUgZWZmZWN0IHNpemVzIGVzdGltYXRlZCBpbiBkaWZmZXJlbnQgc3R1ZGllcyAoaS5lLiwgZXZhbHVhdGUgaWYgJFReMiQgaXMgZGVtb25zdHJhYmx5IGRpZmZlcmVudCBmcm9tIDApLCBhbmQgZXZhbHVhdGUgaWYgbW9kZXJhdGluZyB2YXJpYWJsZXMgY2FuIGV4cGxhaW4gYW55IG9ic2VydmVkIGhldGVyb2dlbmVpdHkuIFdl4oCZbGwgZGlzY3VzcyBob3cgdG8gZG8gdGhpcyBpbiB0aGUgc2VjdGlvbiBvbiBFeHBsb3JpbmcgaGV0ZXJvZ2VuZWl0eS4KCiZuYnNwOwoKKioqCgoqTGFzdCB1cGRhdGVkOiAgYHIgZm9ybWF0KFN5cy50aW1lKCksICclWSwgJUIgJWQnKWAqCgoKIyBSZWZlcmVuY2VzCg==