1 Introduction

A survey instrument is a structured tool used to collect data from respondents, typically consisting of a set of questions. Several concepts are key to understanding the design of surveys.

  • A questionnaire is a structured research tool consisting of a set of written questions designed to collect data from respondents.

  • A construct is an abstract concept being measured (e.g., satisfaction, trust) through single or multi-item questionnaires.

  • Operationalization is the process of defining how to measure a construct. That is, it bridges construct and questionnaire.

  • Single-item measure uses one question measuring a construct. It is used only for simple, unambiguous constructs.

  • A Multiple-item measure uses several questions measuring one construct. It is good for complex or multidimensional constructs.

  • A scale is a set of items (questions) designed to measure a construct, often using a standardized response system (e.g., Likert scales). It could be either a single (overall rating) or multiple (multi-dimensional information) scale.

  • A subscale is a subset of items within a scale that measures a specific dimension of the construct.

This brief note primarily focuses on the reliability of the survey instrument a survey. Since discussing the reliability of a survey is meaningless if it is invalid. So we will also briefly discuss the validity of a survey instrument.

In other words, for the survey results to be useful, the survey must demonstrate both reliability and validity.

  • Validity – This is the extent to which a survey question measures what it is supposed to measure.

  • Reliability – This is the extent to which repeatedly measuring the same thing produces the same result.

Although validity and reliability are viewed as completely separate ideas, the two are related. We can use the following diagram to illustrate the relationship.

Figure 1: Validity vs reliability of a survey instrument

Figure 1: Validity vs reliability of a survey instrument

Next, we briefly describe the types of validity and primarily focus on the reliability of the survey instrument.

2 Validity

Before we discuss the validity, we first introduce the concept of operationalization. According to Wikipedia,

In research design, especially in psychology, social sciences, life sciences, and physics, operationalization is a process of defining the measurement of a phenomenon that is not directly measurable, though its existence is inferred by other phenomena.

Operationalization is the process by which researchers translate theoretical variables into observable and measurable procedures.

2.1 Types of validity

As mentioned earlier, in survey design, a construct is the abstract idea, the underlying theme, or subject matter that one wishes to measure using survey questions.

There are many different versions of descriptions of different types of validity. The following are modern descriptions of the validity of the survey construct.

  • Content Validity – An operationalization has content validity when it adequately covers the range of meanings included in the construct it is intended to measure. When assessing this, one should also consider the content relevance of each item and its technical quality.

  • Substantive Validity considers the strength of the theoretical rationales for interpreting the survey scores.

  • Structural Validity is assessed by investigating the degree to which the operationalization adequately reflects the dimensionality of the construct to be measured.

  • Generalizability examines the extent to which scores generalize across different population groups, different situations or settings, different periods, and/or other operationalizations representative of the construct domain.


2.2 Improving Validity

The strategy for improving the validity of survey instruments is to reduce (or even avoid) bias. The following are common potential biases in questionnaire design.

  • Deliberate bias - If the objective of a survey study is to support a certain cause, the creators of the survey may deliberately try to influence the results by using questions that are purposefully worded in a biased manner.

  • Unintentional bias - One way that this can occur is when questions are worded in such a way that the meaning is misinterpreted by a large proportion of the respondents. This can often happen inadvertently when words have multiple meanings or when words are interpreted differently than intended.

  • Social desirability bias - In general, respondents tend to respond to questions with answers they think will be viewed favorably by others. This involves both understating behaviors/opinions that are viewed negatively and overstating behaviors/opinions that are viewed positively. Careful wording of questions or utilizing certain randomized response techniques can help reduce this bias. Here are things that may be misreported:

    • Abilities and skills
    • Personality
    • Religion and spirituality
    • Financial earning
    • Unlawful behavior
    • Other very personal things
  • Non-Response Bias - occurs where a survey sample is non-representative of the target population. In these cases, the opinions shared by those respondents are disproportionate to those of the larger population. To reduce the risk of this bias occurring, we can share the survey across a range of platforms and to a diverse group as possible. E.g. social media, website, via email, etc.

  • Uninformed response bias - Sometimes, respondents claim to know something about an issue because they are embarrassed to admit that they don’t. To avoid this type of bias, be sure to keep the survey questions clear of technical jargon, and clearly define any terms that need to be defined.

  • Complex bias - is the tendency to look at something easy to understand, or look at it when we are in a state of confusion, and view it as having many parts that are difficult to understand. Questions should be worded as simply and clearly as possible. If technical jargon must be used, it is best to define the term specifically in the survey. Finally, we should avoid using double-barreled questions in any survey.


3 Reliability

For survey results to be useful, the survey must demonstrate reliability. The best practice for questionnaire design is to help maximize the instrument’s reliability.

Based on the definition given earlier, reliability is a quality measure of the survey instrument. We can use quantitative approaches to analyze the reliability of the survey. There are several different types of reliability measures available in literature and practice. We will introduce some commonly used ones.

3.1 Test-Retest Reliability

We estimate test-retest reliability when we administer the same questionnaire (or test) to the same set of subjects on two different occasions. Note that this approach assumes there is no substantial change in what is being measured between the two occasions. To maximize the chance that what is being measured is not changing, one should not let too much time pass between the test and the retest.

For continuous scale, measures such as Pearson correlation can be used to assess the strength of reliability. For a categorical scale, Kappa-related statistics can be used.

3.2 Parallel Forms Reliability

This involves creating a large set of questions that are believed to measure the same construct and then randomly dividing these questions into two sets (known as parallel forms). Both sets are then administered to the same group of people. The means, standard deviations, and correlations with other measures (when appropriate) should be compared to establish that the two forms are equivalent. The correlation between the two parallel forms can be used as the estimate of reliability (we want the scores on the two forms to be highly correlated).

Having parallel forms is useful for studies involving both a pre-test and post-test in which the researcher does not want to use the same form at both periods (think of why they may want to avoid this). If parallel forms reliability can be established, then the researcher can use both forms in their study.

3.3 Internal Consistency Reliability

In internal consistency reliability estimation, we use our single measurement instrument administered to a group of people on one occasion to estimate reliability. In effect, we judge the reliability of the instrument by estimating how well the items that reflect the same construct yield similar results. We are looking at how consistent the results are for different items for the same construct within the measure.

Different internal consistency measures can be used. The following are commonly used in practice.

3.3.1 Average Inter-item Correlation

The average inter-item correlation uses all of the items on our instrument that are designed to measure the same construct. We first compute the correlation between each pair of items. The average inter-item correlation is simply the average or mean of all these correlations.

For example, we have six items in the gratitude survey. There are 15 different item pairings (i.e., 15 correlations). We take the average of all 15 correlation coefficients as illustrated in the following figure.

Figure 2: Inter-item correlation

Figure 2: Inter-item correlation

Caution: To get truthful information from respondents, researchers often intentionally reverse the scale. In this case, we need to calculate the mean absolute correlation.

3.3.2 Cronbach’s Alpha (\(\alpha\))

Cronbach’s Alpha is the most commonly used measure of reliability in practice. The mathematical formula of the Cronbach Alpha is given by

\[ \alpha = \frac{N\times \bar{c}}{\bar{\nu} + (N-1)\times \bar{c}} \]

where

  • N = the number of items.
  • \(\bar{c}\) = average covariance between item-pairs.
  • \(\bar{\nu}\) = average variance.

Note: As the sample size \(N\) increase, \(\alpha\) goes to 1.

The use of the Cronbach Alpha is summarized in the following table.

Figure 3. Cronbach Alpha Table

Figure 3. Cronbach Alpha Table

3.3.3 R function for Calculating Cronbach Alpha

You can write a simple R function based on the above formula to calculate Cronbach’s Alpha. Several R libraries have functions to calculate Cronbach’s alpha and corresponding confidence intervals. For example alpha() in library {psych}.

The following code demonstrates how to calculate Cronbach’s Alpha using the R function in library {psych}. The data set to be used in the following example can be found at https://raw.githubusercontent.com/pengdsci/STA490/main/w11-CronbachAlpha-dataset.csv

3.3.4 Data Structure For Calculating Cronbach Alpha

From the definition of Cronbach’s Alpha, we can see that only items within the same scale can be used. If a survey instrument has several scales, we should group items according to their corresponding scales (even sub-scales) and then calculate Cronbach’s Alpha separately.

In the above data, variables 2-4 are at the same scale. So we define a data frame that contains only the three items (variables) at the sample scale to calculate Cronbach’s Alpha of the scale.

# need to load package {psych} first.
example.data = read.csv("https://pengdsci.github.io/STA490/w11/w11-CronbachAlpha-dataset.csv")
my.scale = example.data[, 2:4]
cronbach.a = as.numeric(alpha(my.scale)$total[1])
CI.sc = cronbach.alpha.CI(alpha=cronbach.a, n=104, items=6, conf.level = 0.95)
CI.comp = cbind(LCI = CI.sc[1], alpha = cronbach.a, UCI =CI.sc[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confodence Interval of Cranbach Alpha")
Confodence Interval of Cranbach Alpha
LCI alpha UCI
0.4294 0.571 0.6872

3.3.5 Interpretation of Cronbach’s Alpha

Cronbach’s \(\alpha\) is also called the coefficient of reliability that ranges from 0 to 1. It provides the overall assessment of a measure’s reliability of the underlying scale.

  • If all of the scale items are entirely independent of one another (i.e., are not correlated or share no covariance), then \(\alpha\) = 0;

  • if all of the items have high covariances, then \(\alpha\) will approach 1 as the number of items in the scale approaches infinity.

In other words, the higher the \(\alpha\) coefficient, the more the items have shared covariance and probably measure the same underlying concept.

4 Methods of Survey Administration

There are three major ways of administering a survey. Which one is used is dependent on the scope of the study and factors such as project budget, characteristics of the study population, the sampling frame, desired response rate, and the characteristics of the survey, etc.

  • Face-to-face interviews. This involves the oral presentation of survey questions by a well-trained interviewer. Computer-Assisted Personal Interviewing (CAPI) software is often used, which reduces some types of interviewer error.

  • Telephone interviews. This also involves the oral presentation of survey questions by a well-trained interviewer, but it is conducted over the phone instead of in person. Computer-Assisted Telephone Interviewing (CATI) is often used.

  • Self-administered questionnaires. This requires respondents to complete a written questionnaire without any guidance from an interviewer. Sometimes, such questionnaires are printed on paper and mailed out with instructions. Other times, such surveys are conducted via a Computer-Assisted Self-Interview (CASI).

LS0tDQp0aXRsZTogIlN1cnZleSBEZXNnaW46IFZhbGlkaXR5IGFuZCBSZWxpYWJpbGl0eSINCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiA1DQogICAgZmlnX2hlaWdodDogNA0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCjwvc3R5bGU+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQppZiAoIXJlcXVpcmUoInBzeWNoIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiAgIGxpYnJhcnkocHN5Y2gpDQp9DQppZiAoIXJlcXVpcmUoImNvY3JvbiIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb2Nyb24iKQ0KICAgbGlicmFyeShjb2Nyb24pDQp9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQojIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ249J2NlbnRlcicsIA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5wb3MgPSAnaHQnKQ0KYGBgDQoNCg0KDQpcDQoNCiMgSW50cm9kdWN0aW9uDQoNCkEgKipzdXJ2ZXkgaW5zdHJ1bWVudCoqIGlzIGEgKnN0cnVjdHVyZWQgdG9vbCogdXNlZCB0byBjb2xsZWN0IGRhdGEgZnJvbSByZXNwb25kZW50cywgdHlwaWNhbGx5IGNvbnNpc3Rpbmcgb2YgYSBzZXQgb2YgcXVlc3Rpb25zLiBTZXZlcmFsIGNvbmNlcHRzIGFyZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZGVzaWduIG9mIHN1cnZleXMuICANCg0KKiBBICoqcXVlc3Rpb25uYWlyZSoqIGlzIGEgc3RydWN0dXJlZCByZXNlYXJjaCB0b29sIGNvbnNpc3Rpbmcgb2YgYSBzZXQgb2Ygd3JpdHRlbiBxdWVzdGlvbnMgZGVzaWduZWQgdG8gY29sbGVjdCBkYXRhIGZyb20gcmVzcG9uZGVudHMuIA0KDQoqIEEgKipjb25zdHJ1Y3QqKiBpcyBhbiBhYnN0cmFjdCBjb25jZXB0IGJlaW5nIG1lYXN1cmVkIChlLmcuLCBzYXRpc2ZhY3Rpb24sIHRydXN0KSB0aHJvdWdoIHNpbmdsZSBvciBtdWx0aS1pdGVtIHF1ZXN0aW9ubmFpcmVzLg0KDQoqICoqT3BlcmF0aW9uYWxpemF0aW9uKiogaXMgdGhlIHByb2Nlc3Mgb2YgZGVmaW5pbmcgaG93IHRvIG1lYXN1cmUgYSBjb25zdHJ1Y3QuIFRoYXQgaXMsIGl0IGJyaWRnZXMgY29uc3RydWN0IGFuZCBxdWVzdGlvbm5haXJlLg0KDQoqICoqU2luZ2xlLWl0ZW0gbWVhc3VyZSoqIHVzZXMgb25lIHF1ZXN0aW9uIG1lYXN1cmluZyBhIGNvbnN0cnVjdC4gSXQgaXMgdXNlZCBvbmx5IGZvciBzaW1wbGUsIHVuYW1iaWd1b3VzIGNvbnN0cnVjdHMuDQoNCiogQSAqKk11bHRpcGxlLWl0ZW0gbWVhc3VyZSoqIHVzZXMgc2V2ZXJhbCBxdWVzdGlvbnMgbWVhc3VyaW5nIG9uZSBjb25zdHJ1Y3QuIEl0IGlzIGdvb2QgZm9yIGNvbXBsZXggb3IgbXVsdGlkaW1lbnNpb25hbCBjb25zdHJ1Y3RzLg0KDQoqIEEgKipzY2FsZSoqIGlzIGEgc2V0IG9mIGl0ZW1zIChxdWVzdGlvbnMpIGRlc2lnbmVkIHRvIG1lYXN1cmUgYSBjb25zdHJ1Y3QsIG9mdGVuIHVzaW5nIGEgc3RhbmRhcmRpemVkIHJlc3BvbnNlIHN5c3RlbSAoZS5nLiwgTGlrZXJ0IHNjYWxlcykuIEl0IGNvdWxkIGJlIGVpdGhlciBhIHNpbmdsZSAob3ZlcmFsbCByYXRpbmcpIG9yIG11bHRpcGxlIChtdWx0aS1kaW1lbnNpb25hbCBpbmZvcm1hdGlvbikgc2NhbGUuDQoNCiogQSAqKnN1YnNjYWxlKiogaXMgYSBzdWJzZXQgb2YgaXRlbXMgd2l0aGluIGEgc2NhbGUgdGhhdCBtZWFzdXJlcyBhIHNwZWNpZmljIGRpbWVuc2lvbiBvZiB0aGUgY29uc3RydWN0Lg0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI3MCUifQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL1N1cnZleUNvbmNlcHRzLnBuZyIpDQpgYGANCg0KVGhpcyBicmllZiBub3RlIHByaW1hcmlseSBmb2N1c2VzIG9uIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgc3VydmV5IGluc3RydW1lbnQgYSBzdXJ2ZXkuIFNpbmNlIGRpc2N1c3NpbmcgdGhlIHJlbGlhYmlsaXR5IG9mIGEgc3VydmV5IGlzIG1lYW5pbmdsZXNzIGlmIGl0IGlzIGludmFsaWQuIFNvIHdlIHdpbGwgYWxzbyBicmllZmx5IGRpc2N1c3MgdGhlIHZhbGlkaXR5IG9mIGEgc3VydmV5IGluc3RydW1lbnQuDQoNCkluIG90aGVyIHdvcmRzLCBmb3IgdGhlIHN1cnZleSByZXN1bHRzIHRvIGJlIHVzZWZ1bCwgdGhlIHN1cnZleSBtdXN0IGRlbW9uc3RyYXRlIGJvdGggcmVsaWFiaWxpdHkgYW5kIHZhbGlkaXR5Lg0KDQoqICoqVmFsaWRpdHkqKiDigJMgVGhpcyBpcyB0aGUgZXh0ZW50IHRvIHdoaWNoIGEgc3VydmV5IHF1ZXN0aW9uIG1lYXN1cmVzIDxmb250IGNvbG9yID0gInJlZCI+PGI+d2hhdCBpdCBpcyBzdXBwb3NlZCB0byBtZWFzdXJlPC9iPjwvZm9udD4uDQoNCiogKipSZWxpYWJpbGl0eSoqIOKAkyBUaGlzIGlzIHRoZSBleHRlbnQgdG8gd2hpY2ggPGZvbnQgY29sb3IgPSAicmVkIj48Yj4gcmVwZWF0ZWRseSA8L2I+PC9mb250Pm1lYXN1cmluZyB0aGUgPGZvbnQgY29sb3IgPSAicmVkIj48Yj4gc2FtZSA8L2I+PC9mb250PiB0aGluZyBwcm9kdWNlcyB0aGUgPGZvbnQgY29sb3IgPSAicmVkIj48Yj4gc2FtZSA8L2I+PC9mb250PiByZXN1bHQuDQoNCkFsdGhvdWdoIHZhbGlkaXR5IGFuZCByZWxpYWJpbGl0eSBhcmUgdmlld2VkIGFzIGNvbXBsZXRlbHkgc2VwYXJhdGUgaWRlYXMsIHRoZSB0d28gYXJlIHJlbGF0ZWQuIFdlIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBkaWFncmFtIHRvIGlsbHVzdHJhdGUgdGhlIHJlbGF0aW9uc2hpcC4gDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwPSJGaWd1cmUgMTogVmFsaWRpdHkgdnMgcmVsaWFiaWxpdHkgb2YgYSBzdXJ2ZXkgaW5zdHJ1bWVudCIsIG91dC53aWR0aCA9ICc0MCUnfQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL3cxMS12YWxpZGl0eS1yZWxpYWJpbGl0eS5qcGciKQ0KYGBgDQoNCg0KTmV4dCwgd2UgYnJpZWZseSBkZXNjcmliZSB0aGUgdHlwZXMgb2YgdmFsaWRpdHkgYW5kIHByaW1hcmlseSBmb2N1cyBvbiB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIHN1cnZleSBpbnN0cnVtZW50LiANCg0KDQoNCiMgVmFsaWRpdHkNCg0KQmVmb3JlIHdlIGRpc2N1c3MgdGhlIHZhbGlkaXR5LCB3ZSBmaXJzdCBpbnRyb2R1Y2UgdGhlIGNvbmNlcHQgb2Ygb3BlcmF0aW9uYWxpemF0aW9uLiBBY2NvcmRpbmcgdG8gV2lraXBlZGlhLA0KDQo+SW4gcmVzZWFyY2ggZGVzaWduLCBlc3BlY2lhbGx5IGluIHBzeWNob2xvZ3ksIHNvY2lhbCBzY2llbmNlcywgbGlmZSBzY2llbmNlcywgYW5kIHBoeXNpY3MsIG9wZXJhdGlvbmFsaXphdGlvbiBpcyBhIHByb2Nlc3Mgb2YgZGVmaW5pbmcgdGhlIG1lYXN1cmVtZW50IG9mIGEgcGhlbm9tZW5vbiB0aGF0IGlzIG5vdCBkaXJlY3RseSBtZWFzdXJhYmxlLCB0aG91Z2ggaXRzIGV4aXN0ZW5jZSBpcyBpbmZlcnJlZCBieSBvdGhlciBwaGVub21lbmEuDQoNCg0KT3BlcmF0aW9uYWxpemF0aW9uIGlzIHRoZSBwcm9jZXNzIGJ5IHdoaWNoIHJlc2VhcmNoZXJzIHRyYW5zbGF0ZSB0aGVvcmV0aWNhbCB2YXJpYWJsZXMgaW50byBvYnNlcnZhYmxlIGFuZCBtZWFzdXJhYmxlIHByb2NlZHVyZXMuDQoNCg0KIyMgVHlwZXMgb2YgdmFsaWRpdHkNCg0KQXMgbWVudGlvbmVkIGVhcmxpZXIsIGluIHN1cnZleSBkZXNpZ24sIGEgPGZvbnQgY29sb3IgPSAicmVkIj4qKmNvbnN0cnVjdCoqPC9mb250PiBpcyB0aGUgYWJzdHJhY3QgaWRlYSwgdGhlIHVuZGVybHlpbmcgdGhlbWUsIG9yIHN1YmplY3QgbWF0dGVyIHRoYXQgb25lIHdpc2hlcyB0byBtZWFzdXJlIHVzaW5nIHN1cnZleSBxdWVzdGlvbnMuIA0KDQpUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZGVzY3JpcHRpb25zIG9mIGRpZmZlcmVudCB0eXBlcyBvZiB2YWxpZGl0eS4gVGhlIGZvbGxvd2luZyBhcmUgbW9kZXJuIGRlc2NyaXB0aW9ucyBvZiB0aGUgdmFsaWRpdHkgb2YgdGhlIHN1cnZleSBjb25zdHJ1Y3QuDQoNCg0KKiAqKkNvbnRlbnQgVmFsaWRpdHkqKiDigJMgQW4gb3BlcmF0aW9uYWxpemF0aW9uIGhhcyAqKmNvbnRlbnQgdmFsaWRpdHkqKiB3aGVuIGl0IGFkZXF1YXRlbHkgY292ZXJzIHRoZSByYW5nZSBvZiBtZWFuaW5ncyBpbmNsdWRlZCBpbiB0aGUgY29uc3RydWN0IGl0IGlzIGludGVuZGVkIHRvIG1lYXN1cmUuIFdoZW4gYXNzZXNzaW5nIHRoaXMsIG9uZSBzaG91bGQgYWxzbyBjb25zaWRlciB0aGUgY29udGVudCByZWxldmFuY2Ugb2YgZWFjaCBpdGVtIGFuZCBpdHMgdGVjaG5pY2FsIHF1YWxpdHkuDQoNCg0KKiAqKlN1YnN0YW50aXZlIFZhbGlkaXR5KiogY29uc2lkZXJzIHRoZSBzdHJlbmd0aCBvZiB0aGUgdGhlb3JldGljYWwgcmF0aW9uYWxlcyBmb3IgaW50ZXJwcmV0aW5nIHRoZSBzdXJ2ZXkgc2NvcmVzLg0KDQoNCiogKipTdHJ1Y3R1cmFsIFZhbGlkaXR5KiogaXMgYXNzZXNzZWQgYnkgaW52ZXN0aWdhdGluZyB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZSBvcGVyYXRpb25hbGl6YXRpb24gYWRlcXVhdGVseSByZWZsZWN0cyB0aGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIGNvbnN0cnVjdCB0byBiZSBtZWFzdXJlZC4NCg0KDQoqICoqR2VuZXJhbGl6YWJpbGl0eSoqIGV4YW1pbmVzIHRoZSBleHRlbnQgdG8gd2hpY2ggc2NvcmVzIGdlbmVyYWxpemUgYWNyb3NzIGRpZmZlcmVudCBwb3B1bGF0aW9uIGdyb3VwcywgZGlmZmVyZW50IHNpdHVhdGlvbnMgb3Igc2V0dGluZ3MsIGRpZmZlcmVudCBwZXJpb2RzLCBhbmQvb3Igb3RoZXIgb3BlcmF0aW9uYWxpemF0aW9ucyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgY29uc3RydWN0IGRvbWFpbi4NCg0KDQpcDQoNCiMjIEltcHJvdmluZyBWYWxpZGl0eQ0KDQpUaGUgc3RyYXRlZ3kgZm9yIGltcHJvdmluZyB0aGUgdmFsaWRpdHkgb2Ygc3VydmV5IGluc3RydW1lbnRzIGlzIHRvICoqcmVkdWNlIChvciBldmVuIGF2b2lkKSBiaWFzKiouIFRoZSBmb2xsb3dpbmcgYXJlICoqY29tbW9uIHBvdGVudGlhbCBiaWFzZXMqKiBpbiBxdWVzdGlvbm5haXJlIGRlc2lnbi4gDQoNCg0KKiAqKkRlbGliZXJhdGUgYmlhcyoqIC0gSWYgdGhlIG9iamVjdGl2ZSBvZiBhIHN1cnZleSBzdHVkeSBpcyB0byBzdXBwb3J0IGEgY2VydGFpbiBjYXVzZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBzdXJ2ZXkgbWF5IGRlbGliZXJhdGVseSB0cnkgdG8gaW5mbHVlbmNlIHRoZSByZXN1bHRzIGJ5IHVzaW5nIHF1ZXN0aW9ucyB0aGF0IGFyZSBwdXJwb3NlZnVsbHkgd29yZGVkIGluIGEgYmlhc2VkIG1hbm5lci4NCg0KDQoqICoqVW5pbnRlbnRpb25hbCBiaWFzKiogLSBPbmUgd2F5IHRoYXQgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiBxdWVzdGlvbnMgYXJlIHdvcmRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIG1lYW5pbmcgaXMgbWlzaW50ZXJwcmV0ZWQgYnkgYSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSByZXNwb25kZW50cy4gVGhpcyBjYW4gb2Z0ZW4gaGFwcGVuIGluYWR2ZXJ0ZW50bHkgd2hlbiB3b3JkcyBoYXZlIG11bHRpcGxlIG1lYW5pbmdzIG9yIHdoZW4gd29yZHMgYXJlIGludGVycHJldGVkIGRpZmZlcmVudGx5IHRoYW4gaW50ZW5kZWQuDQoNCg0KKiAqKlNvY2lhbCBkZXNpcmFiaWxpdHkgYmlhcyoqIC0gSW4gZ2VuZXJhbCwgcmVzcG9uZGVudHMgdGVuZCB0byByZXNwb25kIHRvIHF1ZXN0aW9ucyB3aXRoIGFuc3dlcnMgdGhleSB0aGluayB3aWxsIGJlIHZpZXdlZCBmYXZvcmFibHkgYnkgb3RoZXJzLiBUaGlzIGludm9sdmVzIGJvdGggdW5kZXJzdGF0aW5nIGJlaGF2aW9ycy9vcGluaW9ucyB0aGF0IGFyZSB2aWV3ZWQgbmVnYXRpdmVseSBhbmQgb3ZlcnN0YXRpbmcgYmVoYXZpb3JzL29waW5pb25zIHRoYXQgYXJlIHZpZXdlZCBwb3NpdGl2ZWx5LiBDYXJlZnVsIHdvcmRpbmcgb2YgcXVlc3Rpb25zIG9yIHV0aWxpemluZyBjZXJ0YWluIHJhbmRvbWl6ZWQgcmVzcG9uc2UgdGVjaG5pcXVlcyBjYW4gaGVscCByZWR1Y2UgdGhpcyBiaWFzLiBIZXJlIGFyZSB0aGluZ3MgdGhhdCBtYXkgYmUgbWlzcmVwb3J0ZWQ6DQogIC0gQWJpbGl0aWVzIGFuZCBza2lsbHMNCiAgLSBQZXJzb25hbGl0eQ0KICAtIFJlbGlnaW9uIGFuZCBzcGlyaXR1YWxpdHkNCiAgLSBGaW5hbmNpYWwgZWFybmluZw0KICAtIFVubGF3ZnVsIGJlaGF2aW9yDQogIC0gT3RoZXIgdmVyeSBwZXJzb25hbCB0aGluZ3MNCg0KDQoqICoqTm9uLVJlc3BvbnNlIEJpYXMqKiAtIG9jY3VycyB3aGVyZSBhIHN1cnZleSBzYW1wbGUgaXMgbm9uLXJlcHJlc2VudGF0aXZlIG9mIHRoZSB0YXJnZXQgcG9wdWxhdGlvbi4gSW4gdGhlc2UgY2FzZXMsIHRoZSBvcGluaW9ucyBzaGFyZWQgYnkgdGhvc2UgcmVzcG9uZGVudHMgYXJlIGRpc3Byb3BvcnRpb25hdGUgdG8gdGhvc2Ugb2YgdGhlIGxhcmdlciBwb3B1bGF0aW9uLiBUbyByZWR1Y2UgdGhlIHJpc2sgb2YgdGhpcyBiaWFzIG9jY3VycmluZywgd2UgY2FuIHNoYXJlIHRoZSBzdXJ2ZXkgYWNyb3NzIGEgcmFuZ2Ugb2YgcGxhdGZvcm1zIGFuZCB0byBhIGRpdmVyc2UgZ3JvdXAgYXMgcG9zc2libGUuIEUuZy4gc29jaWFsIG1lZGlhLCB3ZWJzaXRlLCB2aWEgZW1haWwsIGV0Yy4NCg0KDQoqICoqVW5pbmZvcm1lZCByZXNwb25zZSBiaWFzKiogLSBTb21ldGltZXMsIHJlc3BvbmRlbnRzIGNsYWltIHRvIGtub3cgc29tZXRoaW5nIGFib3V0IGFuIGlzc3VlIGJlY2F1c2UgdGhleSBhcmUgZW1iYXJyYXNzZWQgdG8gYWRtaXQgdGhhdCB0aGV5IGRvbuKAmXQuIFRvIGF2b2lkIHRoaXMgdHlwZSBvZiBiaWFzLCBiZSBzdXJlIHRvIGtlZXAgdGhlIHN1cnZleSBxdWVzdGlvbnMgY2xlYXIgb2YgdGVjaG5pY2FsIGphcmdvbiwgYW5kIGNsZWFybHkgZGVmaW5lIGFueSB0ZXJtcyB0aGF0IG5lZWQgdG8gYmUgZGVmaW5lZC4NCg0KDQoqICoqQ29tcGxleCBiaWFzKiogLSBpcyB0aGUgdGVuZGVuY3kgdG8gbG9vayBhdCBzb21ldGhpbmcgZWFzeSB0byB1bmRlcnN0YW5kLCBvciBsb29rIGF0IGl0IHdoZW4gd2UgYXJlIGluIGEgc3RhdGUgb2YgY29uZnVzaW9uLCBhbmQgdmlldyBpdCBhcyBoYXZpbmcgbWFueSBwYXJ0cyB0aGF0IGFyZSBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZC4gUXVlc3Rpb25zIHNob3VsZCBiZSB3b3JkZWQgYXMgc2ltcGx5IGFuZCBjbGVhcmx5IGFzIHBvc3NpYmxlLiBJZiB0ZWNobmljYWwgamFyZ29uIG11c3QgYmUgdXNlZCwgaXQgaXMgYmVzdCB0byBkZWZpbmUgdGhlIHRlcm0gc3BlY2lmaWNhbGx5IGluIHRoZSBzdXJ2ZXkuIEZpbmFsbHksIHdlIHNob3VsZCAqKmF2b2lkKiogdXNpbmcgZG91YmxlLWJhcnJlbGVkIHF1ZXN0aW9ucyBpbiBhbnkgc3VydmV5Lg0KDQpcDQoNCiMgUmVsaWFiaWxpdHkNCg0KRm9yIHN1cnZleSByZXN1bHRzIHRvIGJlIHVzZWZ1bCwgdGhlIHN1cnZleSBtdXN0IGRlbW9uc3RyYXRlIHJlbGlhYmlsaXR5LiBUaGUgYmVzdCBwcmFjdGljZSBmb3IgcXVlc3Rpb25uYWlyZSBkZXNpZ24gaXMgdG8gaGVscCBtYXhpbWl6ZSB0aGUgaW5zdHJ1bWVudOKAmXMgcmVsaWFiaWxpdHkuDQoNCkJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIGdpdmVuIGVhcmxpZXIsIHJlbGlhYmlsaXR5IGlzIGEgcXVhbGl0eSBtZWFzdXJlIG9mIHRoZSBzdXJ2ZXkgaW5zdHJ1bWVudC4gV2UgY2FuIHVzZSBxdWFudGl0YXRpdmUgYXBwcm9hY2hlcyB0byBhbmFseXplIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgc3VydmV5LiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMgb2YgcmVsaWFiaWxpdHkgbWVhc3VyZXMgYXZhaWxhYmxlIGluIGxpdGVyYXR1cmUgYW5kIHByYWN0aWNlLiBXZSB3aWxsIGludHJvZHVjZSBzb21lIGNvbW1vbmx5IHVzZWQgb25lcy4NCg0KDQojIyBUZXN0LVJldGVzdCBSZWxpYWJpbGl0eQ0KDQpXZSBlc3RpbWF0ZSB0ZXN0LXJldGVzdCByZWxpYWJpbGl0eSB3aGVuIHdlIGFkbWluaXN0ZXIgdGhlIHNhbWUgcXVlc3Rpb25uYWlyZSAob3IgdGVzdCkgdG8gdGhlIDxmb250IGNvbG9yID0gInJlZCI+KipzYW1lIHNldCBvZiBzdWJqZWN0cyoqPC9mb250PiBvbiB0d28gZGlmZmVyZW50IG9jY2FzaW9ucy4gTm90ZSB0aGF0IHRoaXMgYXBwcm9hY2ggYXNzdW1lcyB0aGVyZSBpcyBubyBzdWJzdGFudGlhbCBjaGFuZ2UgaW4gd2hhdCBpcyBiZWluZyBtZWFzdXJlZCBiZXR3ZWVuIHRoZSB0d28gb2NjYXNpb25zLiBUbyBtYXhpbWl6ZSB0aGUgY2hhbmNlIHRoYXQgd2hhdCBpcyBiZWluZyBtZWFzdXJlZCBpcyBub3QgY2hhbmdpbmcsIG9uZSBzaG91bGQgbm90IGxldCB0b28gbXVjaCB0aW1lIHBhc3MgYmV0d2VlbiB0aGUgdGVzdCBhbmQgdGhlIHJldGVzdC4gDQoNCkZvciBjb250aW51b3VzIHNjYWxlLCBtZWFzdXJlcyBzdWNoIGFzIFBlYXJzb24gY29ycmVsYXRpb24gY2FuIGJlIHVzZWQgdG8gYXNzZXNzIHRoZSBzdHJlbmd0aCBvZiByZWxpYWJpbGl0eS4gRm9yIGEgY2F0ZWdvcmljYWwgc2NhbGUsIEthcHBhLXJlbGF0ZWQgc3RhdGlzdGljcyBjYW4gYmUgdXNlZC4NCg0KDQojIyBQYXJhbGxlbCBGb3JtcyBSZWxpYWJpbGl0eQ0KDQpUaGlzIGludm9sdmVzIGNyZWF0aW5nIGEgbGFyZ2Ugc2V0IG9mIHF1ZXN0aW9ucyB0aGF0IGFyZSBiZWxpZXZlZCB0byBtZWFzdXJlIHRoZSBzYW1lIGNvbnN0cnVjdCBhbmQgdGhlbiByYW5kb21seSBkaXZpZGluZyB0aGVzZSBxdWVzdGlvbnMgaW50byB0d28gc2V0cyAoa25vd24gYXMgcGFyYWxsZWwgZm9ybXMpLiBCb3RoIHNldHMgYXJlIHRoZW4gYWRtaW5pc3RlcmVkIHRvIHRoZSA8Zm9udCBjb2xvciA9ICJyZWQiPioqc2FtZSBncm91cCBvZiBwZW9wbGUqKjwvZm9udD4uIFRoZSBtZWFucywgc3RhbmRhcmQgZGV2aWF0aW9ucywgYW5kIGNvcnJlbGF0aW9ucyB3aXRoIG90aGVyIG1lYXN1cmVzICh3aGVuIGFwcHJvcHJpYXRlKSBzaG91bGQgYmUgY29tcGFyZWQgdG8gZXN0YWJsaXNoIHRoYXQgdGhlIHR3byBmb3JtcyBhcmUgZXF1aXZhbGVudC4gVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHR3byBwYXJhbGxlbCBmb3JtcyBjYW4gYmUgdXNlZCBhcyB0aGUgZXN0aW1hdGUgb2YgcmVsaWFiaWxpdHkgKHdlIHdhbnQgdGhlIHNjb3JlcyBvbiB0aGUgdHdvIGZvcm1zIHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkKS4NCg0KDQpIYXZpbmcgcGFyYWxsZWwgZm9ybXMgaXMgdXNlZnVsIGZvciBzdHVkaWVzIGludm9sdmluZyBib3RoIGEgcHJlLXRlc3QgYW5kIHBvc3QtdGVzdCBpbiB3aGljaCB0aGUgcmVzZWFyY2hlciBkb2VzIG5vdCB3YW50IHRvIHVzZSB0aGUgc2FtZSBmb3JtIGF0IGJvdGggcGVyaW9kcyAodGhpbmsgb2Ygd2h5IHRoZXkgbWF5IHdhbnQgdG8gYXZvaWQgdGhpcykuIElmIHBhcmFsbGVsIGZvcm1zIHJlbGlhYmlsaXR5IGNhbiBiZSBlc3RhYmxpc2hlZCwgdGhlbiB0aGUgcmVzZWFyY2hlciBjYW4gdXNlIGJvdGggZm9ybXMgaW4gdGhlaXIgc3R1ZHkuDQoNCg0KIyMgSW50ZXJuYWwgQ29uc2lzdGVuY3kgUmVsaWFiaWxpdHkNCg0KSW4gaW50ZXJuYWwgY29uc2lzdGVuY3kgcmVsaWFiaWxpdHkgZXN0aW1hdGlvbiwgd2UgdXNlIG91ciBzaW5nbGUgbWVhc3VyZW1lbnQgaW5zdHJ1bWVudCBhZG1pbmlzdGVyZWQgdG8gYSBncm91cCBvZiBwZW9wbGUgb24gb25lIG9jY2FzaW9uIHRvIGVzdGltYXRlIHJlbGlhYmlsaXR5LiBJbiBlZmZlY3QsIHdlIGp1ZGdlIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgaW5zdHJ1bWVudCBieSBlc3RpbWF0aW5nIGhvdyB3ZWxsIHRoZSBpdGVtcyB0aGF0IHJlZmxlY3QgdGhlIHNhbWUgY29uc3RydWN0IHlpZWxkIHNpbWlsYXIgcmVzdWx0cy4gV2UgYXJlIGxvb2tpbmcgYXQgaG93IGNvbnNpc3RlbnQgdGhlIHJlc3VsdHMgYXJlIGZvciBkaWZmZXJlbnQgaXRlbXMgZm9yIHRoZSBzYW1lIGNvbnN0cnVjdCB3aXRoaW4gdGhlIG1lYXN1cmUuIA0KDQpEaWZmZXJlbnQgaW50ZXJuYWwgY29uc2lzdGVuY3kgbWVhc3VyZXMgY2FuIGJlIHVzZWQuIFRoZSBmb2xsb3dpbmcgYXJlIGNvbW1vbmx5IHVzZWQgaW4gcHJhY3RpY2UuDQoNCg0KIyMjIEF2ZXJhZ2UgSW50ZXItaXRlbSBDb3JyZWxhdGlvbg0KDQpUaGUgYXZlcmFnZSBpbnRlci1pdGVtIGNvcnJlbGF0aW9uIHVzZXMgYWxsIG9mIHRoZSBpdGVtcyBvbiBvdXIgaW5zdHJ1bWVudCB0aGF0IGFyZSBkZXNpZ25lZCB0byBtZWFzdXJlIHRoZSBzYW1lIGNvbnN0cnVjdC4gV2UgZmlyc3QgY29tcHV0ZSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBlYWNoIHBhaXIgb2YgaXRlbXMuIFRoZSBhdmVyYWdlIGludGVyLWl0ZW0gY29ycmVsYXRpb24gaXMgc2ltcGx5IHRoZSBhdmVyYWdlIG9yIG1lYW4gb2YgYWxsIHRoZXNlIGNvcnJlbGF0aW9ucy4gDQoNCkZvciBleGFtcGxlLCAgd2UgaGF2ZSBzaXggaXRlbXMgaW4gdGhlIGdyYXRpdHVkZSBzdXJ2ZXkuIFRoZXJlIGFyZSAxNSBkaWZmZXJlbnQgaXRlbSBwYWlyaW5ncyAoaS5lLiwgMTUgY29ycmVsYXRpb25zKS4gV2UgdGFrZSB0aGUgYXZlcmFnZSBvZiBhbGwgMTUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGFzIGlsbHVzdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgZmlndXJlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9IkZpZ3VyZSAyOiBJbnRlci1pdGVtIGNvcnJlbGF0aW9uIiwgb3V0LndpZHRoID0gJzQwJSd9DQppbmNsdWRlX2dyYXBoaWNzKCJpbWcvdzExLUludGVyLWNvcnJlbGF0aW9uLWdyYXRpdHVkZS5qcGciKQ0KYGBgDQoNCioqQ2F1dGlvbioqOiBUbyBnZXQgdHJ1dGhmdWwgaW5mb3JtYXRpb24gZnJvbSByZXNwb25kZW50cywgcmVzZWFyY2hlcnMgb2Z0ZW4gaW50ZW50aW9uYWxseSByZXZlcnNlIHRoZSBzY2FsZS4gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWVhbiBhYnNvbHV0ZSBjb3JyZWxhdGlvbi4gDQoNCg0KIyMjIENyb25iYWNo4oCZcyBBbHBoYSAoJFxhbHBoYSQpDQoNCkNyb25iYWNo4oCZcyBBbHBoYSBpcyB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1lYXN1cmUgb2YgcmVsaWFiaWxpdHkgaW4gcHJhY3RpY2UuIFRoZSBtYXRoZW1hdGljYWwgZm9ybXVsYSBvZiB0aGUgQ3JvbmJhY2ggQWxwaGEgaXMgZ2l2ZW4gYnkNCg0KJCQNClxhbHBoYSA9IFxmcmFje05cdGltZXMgXGJhcntjfX17XGJhcntcbnV9ICsgKE4tMSlcdGltZXMgXGJhcntjfX0NCiQkDQoNCndoZXJlDQoNCiogTiA9IHRoZSBudW1iZXIgb2YgaXRlbXMuDQoqICRcYmFye2N9JCA9IGF2ZXJhZ2UgY292YXJpYW5jZSBiZXR3ZWVuIGl0ZW0tcGFpcnMuDQoqICRcYmFye1xudX0kID0gYXZlcmFnZSB2YXJpYW5jZS4NCg0KKipOb3RlKio6IEFzIHRoZSBzYW1wbGUgc2l6ZSAkTiQgaW5jcmVhc2UsICRcYWxwaGEkIGdvZXMgdG8gMS4NCg0KVGhlIHVzZSBvZiB0aGUgQ3JvbmJhY2ggQWxwaGEgaXMgc3VtbWFyaXplZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9IkZpZ3VyZSAzLiBDcm9uYmFjaCBBbHBoYSBUYWJsZSIsIG91dC53aWR0aCA9ICc0MCUnfQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL3cxMS1Dcm9uYmFjaC1BbHBoYS5qcGciKQ0KYGBgDQoNCiMjIyBSIGZ1bmN0aW9uIGZvciBDYWxjdWxhdGluZyBDcm9uYmFjaCBBbHBoYQ0KDQpZb3UgY2FuIHdyaXRlIGEgc2ltcGxlIFIgZnVuY3Rpb24gYmFzZWQgb24gdGhlIGFib3ZlIGZvcm11bGEgdG8gY2FsY3VsYXRlIENyb25iYWNoJ3MgQWxwaGEuIFNldmVyYWwgUiBsaWJyYXJpZXMgaGF2ZSBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIENyb25iYWNoJ3MgYWxwaGEgYW5kIGNvcnJlc3BvbmRpbmcgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEZvciBleGFtcGxlICoqYWxwaGEoKSoqIGluIGxpYnJhcnkgKip7cHN5Y2h9KiouDQoNClRoZSBmb2xsb3dpbmcgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNhbGN1bGF0ZSBDcm9uYmFjaCdzIEFscGhhIHVzaW5nIHRoZSBSIGZ1bmN0aW9uIGluIGxpYnJhcnkgKip7cHN5Y2h9KiouIFRoZSBkYXRhIHNldCB0byBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjYW4gYmUgZm91bmQgYXQgPGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wZW5nZHNjaS9TVEE0OTAvbWFpbi93MTEtQ3JvbmJhY2hBbHBoYS1kYXRhc2V0LmNzdj4NCg0KDQojIyMgRGF0YSBTdHJ1Y3R1cmUgRm9yIENhbGN1bGF0aW5nIENyb25iYWNoIEFscGhhDQoNCkZyb20gdGhlIGRlZmluaXRpb24gb2YgQ3JvbmJhY2gncyBBbHBoYSwgd2UgY2FuIHNlZSB0aGF0IG9ubHkgaXRlbXMgd2l0aGluIHRoZSBzYW1lIHNjYWxlIGNhbiBiZSB1c2VkLiBJZiBhIHN1cnZleSBpbnN0cnVtZW50IGhhcyBzZXZlcmFsIHNjYWxlcywgd2Ugc2hvdWxkIGdyb3VwIGl0ZW1zIGFjY29yZGluZyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHNjYWxlcyAoZXZlbiBzdWItc2NhbGVzKSBhbmQgdGhlbiBjYWxjdWxhdGUgQ3JvbmJhY2gncyBBbHBoYSBzZXBhcmF0ZWx5Lg0KDQpJbiB0aGUgYWJvdmUgZGF0YSwgdmFyaWFibGVzIDItNCBhcmUgYXQgdGhlIHNhbWUgc2NhbGUuIFNvIHdlIGRlZmluZSBhIGRhdGEgZnJhbWUgdGhhdCBjb250YWlucyBvbmx5IHRoZSB0aHJlZSBpdGVtcyAodmFyaWFibGVzKSBhdCB0aGUgc2FtcGxlIHNjYWxlIHRvIGNhbGN1bGF0ZSBDcm9uYmFjaCdzIEFscGhhIG9mIHRoZSBzY2FsZS4NCg0KDQpgYGB7cn0NCiMgbmVlZCB0byBsb2FkIHBhY2thZ2Uge3BzeWNofSBmaXJzdC4NCmV4YW1wbGUuZGF0YSA9IHJlYWQuY3N2KCJodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9TVEE0OTAvdzExL3cxMS1Dcm9uYmFjaEFscGhhLWRhdGFzZXQuY3N2IikNCm15LnNjYWxlID0gZXhhbXBsZS5kYXRhWywgMjo0XQ0KY3JvbmJhY2guYSA9IGFzLm51bWVyaWMoYWxwaGEobXkuc2NhbGUpJHRvdGFsWzFdKQ0KQ0kuc2MgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYT1jcm9uYmFjaC5hLCBuPTEwNCwgaXRlbXM9NiwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuc2NbMV0sIGFscGhhID0gY3JvbmJhY2guYSwgVUNJID1DSS5zY1syXSkNCnJvdy5uYW1lcyhDSS5jb21wKSA9ICIiDQpwYW5kZXIoQ0kuY29tcCwgY2FwdGlvbj0iQ29uZm9kZW5jZSBJbnRlcnZhbCBvZiBDcmFuYmFjaCBBbHBoYSIpDQpgYGANCg0KDQojIyMgSW50ZXJwcmV0YXRpb24gb2YgQ3JvbmJhY2jigJlzIEFscGhhDQoNCkNyb25iYWNoJ3MgJFxhbHBoYSQgaXMgYWxzbyBjYWxsZWQgdGhlIGNvZWZmaWNpZW50IG9mIHJlbGlhYmlsaXR5IHRoYXQgcmFuZ2VzIGZyb20gMCB0byAxLiBJdCBwcm92aWRlcyB0aGUgb3ZlcmFsbCBhc3Nlc3NtZW50IG9mIGEgbWVhc3VyZeKAmXMgcmVsaWFiaWxpdHkgb2YgdGhlIHVuZGVybHlpbmcgc2NhbGUuIA0KDQoqIElmIGFsbCBvZiB0aGUgc2NhbGUgaXRlbXMgYXJlIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyIChpLmUuLCBhcmUgbm90IGNvcnJlbGF0ZWQgb3Igc2hhcmUgbm8gY292YXJpYW5jZSksIHRoZW4gICRcYWxwaGEkICA9IDA7IA0KDQoqIGlmIGFsbCBvZiB0aGUgaXRlbXMgaGF2ZSBoaWdoIGNvdmFyaWFuY2VzLCB0aGVuICAkXGFscGhhJCAgd2lsbCBhcHByb2FjaCAxIGFzIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHNjYWxlIGFwcHJvYWNoZXMgaW5maW5pdHkuIA0KDQpJbiBvdGhlciB3b3JkcywgdGhlIGhpZ2hlciB0aGUgICRcYWxwaGEkICBjb2VmZmljaWVudCwgdGhlIG1vcmUgdGhlIGl0ZW1zIGhhdmUgc2hhcmVkIGNvdmFyaWFuY2UgYW5kIHByb2JhYmx5IG1lYXN1cmUgdGhlIHNhbWUgdW5kZXJseWluZyBjb25jZXB0Lg0KDQoNCg0KIyBNZXRob2RzIG9mIFN1cnZleSBBZG1pbmlzdHJhdGlvbg0KDQpUaGVyZSBhcmUgdGhyZWUgbWFqb3Igd2F5cyBvZiBhZG1pbmlzdGVyaW5nIGEgc3VydmV5LiBXaGljaCBvbmUgaXMgdXNlZCBpcyBkZXBlbmRlbnQgb24gdGhlIHNjb3BlIG9mIHRoZSBzdHVkeSBhbmQgZmFjdG9ycyBzdWNoIGFzIHByb2plY3QgYnVkZ2V0LCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHN0dWR5IHBvcHVsYXRpb24sIHRoZSBzYW1wbGluZyBmcmFtZSwgZGVzaXJlZCByZXNwb25zZSByYXRlLCBhbmQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc3VydmV5LCBldGMuDQoNCg0KKiAqKkZhY2UtdG8tZmFjZSBpbnRlcnZpZXdzLioqICBUaGlzIGludm9sdmVzIHRoZSBvcmFsIHByZXNlbnRhdGlvbiBvZiBzdXJ2ZXkgcXVlc3Rpb25zIGJ5IGEgd2VsbC10cmFpbmVkIGludGVydmlld2VyLiBDb21wdXRlci1Bc3Npc3RlZCBQZXJzb25hbCBJbnRlcnZpZXdpbmcgKENBUEkpIHNvZnR3YXJlIGlzIG9mdGVuIHVzZWQsIHdoaWNoIHJlZHVjZXMgc29tZSB0eXBlcyBvZiBpbnRlcnZpZXdlciBlcnJvci4NCg0KDQoqICoqVGVsZXBob25lIGludGVydmlld3MuKiogIFRoaXMgYWxzbyBpbnZvbHZlcyB0aGUgb3JhbCBwcmVzZW50YXRpb24gb2Ygc3VydmV5IHF1ZXN0aW9ucyBieSBhIHdlbGwtdHJhaW5lZCBpbnRlcnZpZXdlciwgYnV0IGl0IGlzIGNvbmR1Y3RlZCBvdmVyIHRoZSBwaG9uZSBpbnN0ZWFkIG9mIGluIHBlcnNvbi4gQ29tcHV0ZXItQXNzaXN0ZWQgVGVsZXBob25lIEludGVydmlld2luZyAoQ0FUSSkgaXMgb2Z0ZW4gdXNlZC4NCg0KDQoqICoqU2VsZi1hZG1pbmlzdGVyZWQgcXVlc3Rpb25uYWlyZXMuKiogVGhpcyByZXF1aXJlcyByZXNwb25kZW50cyB0byBjb21wbGV0ZSBhIHdyaXR0ZW4gcXVlc3Rpb25uYWlyZSB3aXRob3V0IGFueSBndWlkYW5jZSBmcm9tIGFuIGludGVydmlld2VyLiBTb21ldGltZXMsIHN1Y2ggcXVlc3Rpb25uYWlyZXMgYXJlIHByaW50ZWQgb24gcGFwZXIgYW5kIG1haWxlZCBvdXQgd2l0aCBpbnN0cnVjdGlvbnMuIE90aGVyIHRpbWVzLCBzdWNoIHN1cnZleXMgYXJlIGNvbmR1Y3RlZCB2aWEgYSBDb21wdXRlci1Bc3Npc3RlZCBTZWxmLUludGVydmlldyAoQ0FTSSkuDQoNCg==