Introduction
Experimental design is a structured approach
used in scientific research to plan,
conduct, and analyze experiments in a
way that ensures valid, reliable, and efficient results. The primary
goal is to establish cause-and-effect relationships by
systematically manipulating variables while controlling for extraneous
influences.
The role and prominence of experimental design may
seem diminished in some fields today due to shifts in
technology, data availability, and the overall landscape of
analytical fields. It reflects a combination of
shifting academic priorities, an overcrowded curriculum, and changes in
the statistical landscape.
Big Data and Observational Analysis: With
massive datasets available, some researchers lean on
sophisticated statistical or machine learning models to infer
relationships without running controlled experiments.
A/B Testing Is Ubiquitous but Simple: In the
business world, many practical applications require using basic
A/B testing (various comparisons among groups), which
doesn’t require deep design knowledge. This leads people to think that
experimental design is not a core technique
anymore.
Simulation and Modeling: In engineering or
systems biology, simulations can sometimes replace physical experiments,
though they’re often based on data originally gathered from
well-designed experiments.
Data-Driven Culture: There’s sometimes a bias
toward exploratory data analysis over hypothesis-driven work, which can
downplay the importance of prior design.
However, fields like agriculture, biology, medicine, marketing, UX
(user experience), and manufacturing still depend on it heavily.
In this short and non-technical note, we will introduce the basics of
the principles of the classic experimental designs.
The Logical Process of
Experimental Design
Experimental design follows a systematic,
step-by-step approach to ensure that research is valid, reliable, and
interpretable. It is like building a roadmap—it ensures you reach valid
conclusions without getting lost in biases or errors. By following this
logical process, researchers can confidently test hypotheses and
contribute meaningful findings to science.
Below is the logical sequence researchers follow when designing an
experiment:
1. Define the Research Problem & Objectives
What is the research question? We start with a clearly
defined research question. For example, does a new fertilizer increase
crop yield compared to the standard one?
What are the hypotheses? The well-formulated research
question needs to be translated into an analytic question in the form of
a statistical hypothesis. For example,
\[
H_0: \text{No difference between fertilizers} \ \ \ \text{vs} \ \ \
H_a: \text{The new fertilizer increases yield}
\]
2. Identify Variables
Independent Variable (IV) - the cause: The factor
variable that is manipulated by the experimenter. For example,
fertilizer type, drug doses in clinical trials, etc.
Dependent Variable (DV) - the effect: The outcome that
is measured. For example, crop yield, recovery rate after receiving the
drug, etc.
Control Variables (Constants): Factors kept
unchanged across groups to ensure that only the IV
affects the DV. For example, soil type, water amount, age group,
environmental condition, etc.
Extraneous Variables (Confounding Factors): Unwanted
variables that could influence the DV if not controlled. For example,
sunlight, pests, diet, stress levels, or measurement errors.
3 Choose the Experimental Design
Select a design that best fits the research question. There are many
different designs. The following is a short list of commonly used
designs. We will discuss some of them with more detail in the next
Section.
Completely Randomized Design (CRD): A Completely
Randomized Design (CRD) assigns treatments to experimental
units purely at random to guarantee that each unit has an equal
probability of receiving any treatment. CRD is excellent for isolating
causal effects when units are homogeneous
Randomized Block Design (RBD): In a
Randomized Block Design, experimental units are grouped
(blocked) to share a known characteristic that is not primarily studied,
but it could affect the outcome. Within each block, all treatments are
randomly assigned. Controlling for known blocking variables improves the
precision of treatment estimates. For example, dividing plants by soil
quality or patients by age/gender.
Factorial Design: A factorial design tests two
or more independent variables (factors) simultaneously, using all
possible combinations of their levels. This allows assessment of both
main effects (individual factor impact) and interaction effects (when
the effect of one factor depends on another): For example, in a
recent Lancet study, older adults were randomized across two vaccine
types (Pfizer‑BioNTech vs. Oxford‑AstraZeneca) and two dosing intervals
(3 weeks vs. 12 weeks), creating four groups. The researchers measured
antibody levels to assess main effects (vaccine type, dose interval) and
whether there was an interaction—i.e., whether the dosing interval
effect differed by vaccine type. They found higher antibodies overall
with Pfizer, and longer intervals boosted response in both vaccine
groups.
Repeated Measures: This design involves
measuring the same participants (or units) multiple
times under different conditions or time points. It controls for
individual differences and boosts statistical power because each
participant acts as their control. Some examples include:
- Cognitive tests at ages 30, 40, and 50 to track decline or
improvement;
- Drug A vs. Drug B - each participant takes both in different
orders;
- Testing three different drugs for smoking cravings - the same
participants receive each drug on different days.
5. Randomization, Blinding & Assignment
These three techniques are critical for minimizing bias, ensuring
validity, and strengthening causal inferences in experiments. Below is a
detailed breakdown of each concept, its importance, and how they are
implemented.
- Randomize participants or units to treatments to avoid
selection bias.
- Simple Randomization - For example, in a drug trial, 100 patients
are randomly assigned to either the new drug or placebo (pill with no
drug ingredient) group using a computer-generated random sequence.
- Block Randomization - Ensures equal group sizes by randomizing
within small blocks.
- Stratified Randomization - Randomizes within subgroups (e.g., by age
or gender) to maintain balance.
- Blind participants and/or researchers when possible, to reduce
expectation effects.
- Single-Blind: to participants only. It prevents
placebo effects.
- Double-Blind: to both participants and researchers.
It eliminates experimenter bias & participant bias.
- Triple-Blind to participants, researchers, and data
analysts. It reduces bias in interpretation.
- Assignment refers to how participants or experimental units are
allocated to different treatment groups. Proper assignment is crucial
for valid comparisons and minimizing bias.
- Between-Subjects (Independent Measures): Different
participants are assigned to each treatment group.
- Within-Subjects (Repeated Measures): The same
participants experience all conditions
- Matched-Pairs Design: Participants are paired based
on key traits (e.g., age, IQ), then split into groups.
6. Plan Sampling & Data Collection
- Sampling refers to how you select experimental
units (e.g., plots, animals, people) from the larger population—ideally
through random sampling to ensure representativeness.

- Record measurements accurately (e.g., crop weight, plant
height).
7. Analyze Data and Interpretation
This will be discussed in detail in separate notes. The key is to
choose appropriate statistical procedures to perform analysis and make a
relevant diagnosis. This is an iterative process. Make sure that all
assumptions are satisfied before interpreting the results.
8. Reporting and Validating
This is the final step. We will also discuss this in the subsequent
note. The key idea is to follow the best practices:
CRD and RBD
This section briefly introduces two most commonly used experimental
designs: the completely randomized design and the randomized block
design, in more detail. We will also organize the resulting data in a
format suitable for data analysis using either a software program or
manually.
Completely Randomized
Design
The Completely Randomized Design (CRD) is one of the
most basic and widely used experimental designs in research. It is
particularly suitable when experimental units are homogeneous, meaning
there are no significant differences among them before applying
treatments. CRD follows the principle of randomization,
where subjects (or experimental units) are randomly assigned to
treatments. That means each subject has an
equal chance of receiving any treatment, and the assignment is done
independently of any grouping.

Depending on the number of replications per treatment
(i.e., the number of experimental units that receive
the same treatment independently), a CRD can be
classified as either balanced or imbalanced. Understanding the
differences between these two variations is crucial for proper
experimental design and statistical analysis.
In the above figure, the number of subjects in each treatment is
equal, \(n_1 = n_2 = n_3\), and the
hypothetical CRD is a balanced design.
This design is commonly used in agricultural experiments, clinical
trials, industrial studies, and laboratory research due to its
simplicity and flexibility.
The key characteristics of CRD include:
Random Assignment: Treatments are allocated
randomly to experimental units to minimize bias.
Homogeneous Experimental Units: All subjects or
plots are assumed to be similar before treatment application.
No Blocking: Unlike Randomized Block Design
(RBD), CRD does not group units into blocks to control
variability.
Flexibility: It can accommodate any number of
treatments and replications.
Simple Analysis: Data from CRD can be easily
analyzed using one-way ANOVA (Analysis of Variance).
A Non-numerical Example
Suppose a pharmaceutical company wants to test three different drug
formulations (A, B, C) on blood pressure. A balanced, completely
randomized design will follow the next few steps.
Step 1: Select 30 similar patients.
Step 2: Randomly assign 10 patients to each drug
group.
Step 3: Administer treatments and measure blood
pressure after a set period.

The next figure illustrates how to read the CRD data table cell.

The formats required for analysis using different software programs
will be discussed in subsequent notes focusing on analyzing different
experimental designs.
The Completely Randomized Design is a fundamental experimental
approach due to its simplicity and ease of application. While it is
highly effective in homogeneous settings, its limitations become
apparent when dealing with variability. Researchers must carefully
assess whether CRD is appropriate or if more advanced designs (e.g.,
Randomized Block Design) are needed. Despite its constraints, CRD
remains a cornerstone of experimental research, providing a solid
foundation for statistical analysis and scientific discovery.
The following YouTube video explains CRD (first 15 Minutes, https://www.youtube.com/watch?v=KJ5G2KjcXcA). The
analysis part will be discussed in the next note on One-way ANOVA.
Randomized Block
Design
The Randomized Block Design (RBD) is a widely used experimental
design that improves precision by controlling known sources of
variability. Unlike the Completely Randomized Design (CRD), which
assumes homogeneous experimental units, RBD groups similar units into
blocks and then randomizes treatments within each block. This approach
reduces experimental error and enhances the accuracy of treatment
comparisons. RBD is commonly applied in agriculture, clinical trials,
industrial experiments, and ecological studies where external factors
(e.g., soil fertility, patient age, machine differences) may influence
results.
Two related (but sometimes confusing) concepts
Extraneous Variable - Any variable other than
the independent variable that might affect the outcome (dependent
variable). It may or may not be a problem. If properly controlled or
randomized, it doesn’t bias the results. For example, in a plant growth
experiment, sunlight and water are extraneous variables if you’re
testing the effect of fertilizer.
Confounding Variable - A type of extraneous
variable that is not controlled and systematically varies with the
treatment. It confounds (i.e., mixes up) the effect of
the treatment, making it hard to know whether the observed effect is due
to the treatment or the confounder.
To summarize, we create the following table to do back-to-back
comparisons.
Extraneous Variable |
Not always |
Not necessarily |
Possibly |
Confounding Variable |
Yes (if uncontrolled) |
Yes |
Yes |
Major Components in
RBD
As mentioned earlier, an RBD is an experimental design where subjects
or experimental units are grouped into
homogeneous groups /blocks based on some similarity
(like age, weight, location) to control for variability that isn’t of
primary interest. Within each block, treatments are
randomly assigned to the units.
Experimental Unit
This is the smallest division of the experimental material to which a
treatment can be assigned. For example, in agricultural experiments, a
plot of land can be an experimental unit where different fertilizers
(treatments) are applied.
Treatment
This refers to the different conditions or interventions whose
effects are being studied. For instance, different dosages of a drug are
used in a medical trial.
Block
A block is a group of experimental units that are similar in some way
that is expected to affect the response to the treatments. The idea is
to make comparisons within blocks to reduce the impact of variability
between blocks.
In CRD, multiple experimental units are assigned to
each treatment. In RBD, introducing a blocking variable makes the design
and data layout more complex than the CRD since we need to consider the
combinations of blocks and treatments when assigning experimental
units.
RBD without
Replicates (Basics RBD)
In this scenario, for each block, there is exactly one experimental
unit assigned to each treatment. If there are \(t\) treatments, then each block will have
\(t\) experimental units, one for each
treatment.
The resulting data table has the following structure.
block 1 |
\(y_{11}\) |
\(y_{21}\) |
\(\cdots\) |
\(y_{t1}\) |
block 2 |
\(y_{12}\) |
\(y_{22}\) |
\(\cdots\) |
\(y_{t2}\) |
\(\cdots\) |
\(\cdots\) |
\(\cdots\) |
\(\cdots\) |
\(\cdots\) |
block b |
\(y_{1b}\) |
\(y_{2b}\) |
\(\cdots\) |
\(y_{tb}\) |

Example: Let’s consider an agricultural example to
make this concrete. Assume that there are three treatments: 3 different
types of fertilizers (F1, F2, F3) and four blocks: 4 different fields
(Block1, Block2, Block3, Block4) which may vary in soil quality,
sunlight, etc. In each block (field), we have 3 plots (experimental
units), each assigned to one of the 3 fertilizers randomly, and then
measure the yields (\(y_{ij}\)).
The assignment table has the following layout:
Block 2 |
F2 |
F1 |
F3 |
Block 3 |
F1 |
F3 |
F1 |
Block 4 |
F3 |
F2 |
F2 |
Here, each treatment appears exactly once in each block, and within
each block, the assignment is random. The corresponding data table
is
Block 2 |
\(y_{11}\) |
\(y_{21}\) |
\(y_{31}\) |
Block 3 |
\(y_{12}\) |
\(y_{22}\) |
\(y_{32}\) |
Block 4 |
\(y_{13}\) |
\(y_{23}\) |
\(y_{33}\) |
This design guarantees that:
Control of Variability: By grouping similar
experimental units into blocks, we control for the variability between
blocks. This increases the precision of the treatment effect
estimates.
Balance: Each treatment appears equally often in
each block, making the design balanced, which simplifies
analysis.
Randomization: Random
assignment within blocks helps in avoiding systematic
bias.
RBD with Replicates
(Replicated RBD)
The basic RBD is simple and easy to understand. Some practical
information is not available in this simple design, for example,
We cannot estimate interaction between treatments and blocks or
have a pure error estimate within blocks since only one experimental
unit is assigned in the combination of treatment and block.
In the modeling phase, we cannot assess the potential interactive
effect. That is, the effect of a treatment depends on the block (or vice
versa). For example, if F1 performs best in
Block 1 but worst in Block 2, there is
likely a treatment × block interaction.
The Randomized Block Design (RBD) requires homogeneity (i.e.,
equal variance) within blocks and treatments in order
to be effective. However, the basic RBD does not provide enough
information to assess this homogeneity because there is only a
single experimental unit for each combination of block
and treatment.
There are different ways to overcome the above limitations. One way
is to modify the basic RBD to allow assigning multiple experimental
units to every combination of blocks and treatments - Replicated
RBD.
A Replicated RBD is an extension of the standard Randomized Block
Design where each treatment is applied to multiple experimental units
within each block. The basic structure of replicated RBD is
characterized in the following.
Treatments (a): Different levels of the factor
being tested (e.g., fertilizers, drugs).
Blocks (b): Groups of homogeneous experimental
units (e.g., fields, patients with similar characteristics).
**Replicates (p)*: Number of times each treatment is repeated per
block.
The general data table of a replicated RBD design is depicted by

The data table cell has three indices to capture information about
blocking, treatments, and measurements of replicated response, as shown
below.

The next YouTube video explains the RBD (with no replicates) using a
nice example. You can skip the analysis part now. The video is at (https://www.youtube.com/watch?v=zqZ9iuk5Ngk&t=193s)
LS0tDQp0aXRsZTogIlByaW5jaXBsZXMgb2YgRXhwZXJpbWVudGFsIERlc2lnbiINCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiU1RBMjAwIFN0YXRpc3RpY3MgSUkgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KIyBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICJDOi9Vc2Vycy83NUNQRU5HL09uZURyaXZlIC0gV2VzdCBDaGVzdGVyIFVuaXZlcnNpdHkgb2YgUEEvRG9jdW1lbnRzIikNCiMga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzpcXFNUQTQ5MFxcdzA1IikNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9ICJ8IikNCmBgYA0KDQoNCg0KXA0KDQoNCiMgSW50cm9kdWN0aW9uDQoNCkV4cGVyaW1lbnRhbCBkZXNpZ24gaXMgYSA8Zm9udCBjb2xvciA9ICJyZWQiPipcY29sb3J7cmVkfXN0cnVjdHVyZWQgYXBwcm9hY2ggdXNlZCBpbiBzY2llbnRpZmljIHJlc2VhcmNoKjwvZm9udD4gdG8gKipwbGFuKiosICoqY29uZHVjdCoqLCBhbmQgKiphbmFseXplKiogZXhwZXJpbWVudHMgaW4gYSB3YXkgdGhhdCBlbnN1cmVzIHZhbGlkLCByZWxpYWJsZSwgYW5kIGVmZmljaWVudCByZXN1bHRzLiBUaGUgcHJpbWFyeSBnb2FsIGlzIHRvIGVzdGFibGlzaCAqKmNhdXNlLWFuZC1lZmZlY3QgcmVsYXRpb25zaGlwcyoqIGJ5IHN5c3RlbWF0aWNhbGx5IG1hbmlwdWxhdGluZyB2YXJpYWJsZXMgd2hpbGUgY29udHJvbGxpbmcgZm9yIGV4dHJhbmVvdXMgaW5mbHVlbmNlcy4NCg0KVGhlIHJvbGUgYW5kIHByb21pbmVuY2Ugb2YgKipleHBlcmltZW50YWwgZGVzaWduKiogbWF5IHNlZW0gKipkaW1pbmlzaGVkKiogaW4gc29tZSBmaWVsZHMgdG9kYXkgZHVlIHRvIHNoaWZ0cyBpbiAqKnRlY2hub2xvZ3ksIGRhdGEgYXZhaWxhYmlsaXR5LCBhbmQgdGhlIG92ZXJhbGwgbGFuZHNjYXBlIG9mIGFuYWx5dGljYWwgZmllbGRzKiouIEl0IHJlZmxlY3RzIGEgKipjb21iaW5hdGlvbiBvZiBzaGlmdGluZyBhY2FkZW1pYyBwcmlvcml0aWVzLCBhbiBvdmVyY3Jvd2RlZCBjdXJyaWN1bHVtLCBhbmQgY2hhbmdlcyBpbiB0aGUgc3RhdGlzdGljYWwgbGFuZHNjYXBlKiouDQoNCiogKipCaWcgRGF0YSBhbmQgT2JzZXJ2YXRpb25hbCBBbmFseXNpcyoqOiBXaXRoICoqbWFzc2l2ZSBkYXRhc2V0cyoqIGF2YWlsYWJsZSwgc29tZSByZXNlYXJjaGVycyBsZWFuIG9uIHNvcGhpc3RpY2F0ZWQgc3RhdGlzdGljYWwgb3IgbWFjaGluZSBsZWFybmluZyBtb2RlbHMgdG8gaW5mZXIgcmVsYXRpb25zaGlwcyB3aXRob3V0IHJ1bm5pbmcgY29udHJvbGxlZCBleHBlcmltZW50cy4NCg0KKiAqKkEvQiBUZXN0aW5nIElzIFViaXF1aXRvdXMgYnV0IFNpbXBsZSoqOiBJbiB0aGUgYnVzaW5lc3Mgd29ybGQsIG1hbnkgcHJhY3RpY2FsIGFwcGxpY2F0aW9ucyByZXF1aXJlIHVzaW5nIGJhc2ljICoqQS9CIHRlc3RpbmcqKiAodmFyaW91cyBjb21wYXJpc29ucyBhbW9uZyBncm91cHMpLCB3aGljaCBkb2Vzbid0IHJlcXVpcmUgZGVlcCBkZXNpZ24ga25vd2xlZGdlLiBUaGlzIGxlYWRzIHBlb3BsZSB0byB0aGluayB0aGF0ICoqZXhwZXJpbWVudGFsIGRlc2lnbioqIGlzIG5vdCBhIGNvcmUgdGVjaG5pcXVlIGFueW1vcmUuDQoNCiogKipTaW11bGF0aW9uIGFuZCBNb2RlbGluZyoqOiBJbiBlbmdpbmVlcmluZyBvciBzeXN0ZW1zIGJpb2xvZ3ksIHNpbXVsYXRpb25zIGNhbiBzb21ldGltZXMgcmVwbGFjZSBwaHlzaWNhbCBleHBlcmltZW50cywgdGhvdWdoIHRoZXnigJlyZSBvZnRlbiBiYXNlZCBvbiBkYXRhIG9yaWdpbmFsbHkgZ2F0aGVyZWQgZnJvbSB3ZWxsLWRlc2lnbmVkIGV4cGVyaW1lbnRzLg0KDQoqICoqRGF0YS1Ecml2ZW4gQ3VsdHVyZSoqOiBUaGVyZeKAmXMgc29tZXRpbWVzIGEgYmlhcyB0b3dhcmQgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBvdmVyIGh5cG90aGVzaXMtZHJpdmVuIHdvcmssIHdoaWNoIGNhbiBkb3ducGxheSB0aGUgaW1wb3J0YW5jZSBvZiBwcmlvciBkZXNpZ24uDQoNCkhvd2V2ZXIsIGZpZWxkcyBsaWtlIGFncmljdWx0dXJlLCBiaW9sb2d5LCBtZWRpY2luZSwgbWFya2V0aW5nLCBVWCAodXNlciBleHBlcmllbmNlKSwgYW5kIG1hbnVmYWN0dXJpbmcgc3RpbGwgZGVwZW5kIG9uIGl0IGhlYXZpbHkuDQoNCg0KSW4gdGhpcyBzaG9ydCBhbmQgbm9uLXRlY2huaWNhbCBub3RlLCB3ZSB3aWxsIGludHJvZHVjZSB0aGUgYmFzaWNzIG9mIHRoZSBwcmluY2lwbGVzIG9mIHRoZSBjbGFzc2ljICoqZXhwZXJpbWVudGFsIGRlc2lnbnMqKi4NCg0KXA0KDQojIFRoZSBMb2dpY2FsIFByb2Nlc3Mgb2YgRXhwZXJpbWVudGFsIERlc2lnbg0KDQoqKkV4cGVyaW1lbnRhbCBkZXNpZ24qKiBmb2xsb3dzIGEgc3lzdGVtYXRpYywgc3RlcC1ieS1zdGVwIGFwcHJvYWNoIHRvIGVuc3VyZSB0aGF0IHJlc2VhcmNoIGlzIHZhbGlkLCByZWxpYWJsZSwgYW5kIGludGVycHJldGFibGUuIEl0IGlzIGxpa2UgYnVpbGRpbmcgYSByb2FkbWFw4oCUaXQgZW5zdXJlcyB5b3UgcmVhY2ggdmFsaWQgY29uY2x1c2lvbnMgd2l0aG91dCBnZXR0aW5nIGxvc3QgaW4gYmlhc2VzIG9yIGVycm9ycy4gQnkgZm9sbG93aW5nIHRoaXMgbG9naWNhbCBwcm9jZXNzLCByZXNlYXJjaGVycyBjYW4gY29uZmlkZW50bHkgdGVzdCBoeXBvdGhlc2VzIGFuZCBjb250cmlidXRlIG1lYW5pbmdmdWwgZmluZGluZ3MgdG8gc2NpZW5jZS4NCg0KQmVsb3cgaXMgdGhlIGxvZ2ljYWwgc2VxdWVuY2UgcmVzZWFyY2hlcnMgZm9sbG93IHdoZW4gZGVzaWduaW5nIGFuIGV4cGVyaW1lbnQ6DQoNClwNCg0KKioxLiBEZWZpbmUgdGhlIFJlc2VhcmNoIFByb2JsZW0gJiBPYmplY3RpdmVzKioNCg0KKiAqV2hhdCBpcyB0aGUgcmVzZWFyY2ggcXVlc3Rpb24/KiAgV2Ugc3RhcnQgd2l0aCBhIGNsZWFybHkgZGVmaW5lZCByZXNlYXJjaCBxdWVzdGlvbi4gRm9yIGV4YW1wbGUsIGRvZXMgYSBuZXcgZmVydGlsaXplciBpbmNyZWFzZSBjcm9wIHlpZWxkIGNvbXBhcmVkIHRvIHRoZSBzdGFuZGFyZCBvbmU/DQoNCiogKldoYXQgYXJlIHRoZSBoeXBvdGhlc2VzPyogVGhlIHdlbGwtZm9ybXVsYXRlZCByZXNlYXJjaCBxdWVzdGlvbiBuZWVkcyB0byBiZSB0cmFuc2xhdGVkIGludG8gYW4gYW5hbHl0aWMgcXVlc3Rpb24gaW4gdGhlIGZvcm0gb2YgYSBzdGF0aXN0aWNhbCBoeXBvdGhlc2lzLiBGb3IgZXhhbXBsZSwgDQoNCiQkDQpIXzA6ICBcdGV4dHtObyAgZGlmZmVyZW5jZSAgYmV0d2VlbiAgZmVydGlsaXplcnN9IFwgXCBcIFx0ZXh0e3ZzfSBcICBcIFwgSF9hOiBcdGV4dHtUaGUgIG5ldyAgZmVydGlsaXplciAgaW5jcmVhc2VzICB5aWVsZH0NCiQkDQoNCioqMi4gSWRlbnRpZnkgVmFyaWFibGVzKioNCg0KKiAqSW5kZXBlbmRlbnQgVmFyaWFibGUgKElWKSogLSB0aGUgY2F1c2U6IFRoZSBmYWN0b3IgdmFyaWFibGUgdGhhdCBpcyBtYW5pcHVsYXRlZCBieSB0aGUgZXhwZXJpbWVudGVyLiBGb3IgZXhhbXBsZSwgZmVydGlsaXplciB0eXBlLCBkcnVnIGRvc2VzIGluIGNsaW5pY2FsIHRyaWFscywgZXRjLg0KDQoqICpEZXBlbmRlbnQgVmFyaWFibGUgKERWKSogLSB0aGUgZWZmZWN0OiBUaGUgb3V0Y29tZSB0aGF0IGlzIG1lYXN1cmVkLiBGb3IgZXhhbXBsZSwgY3JvcCB5aWVsZCwgcmVjb3ZlcnkgcmF0ZSBhZnRlciByZWNlaXZpbmcgdGhlIGRydWcsIGV0Yy4NCg0KKiAqQ29udHJvbCBWYXJpYWJsZXMgIChDb25zdGFudHMpKjogRmFjdG9ycyBrZXB0ICoqdW5jaGFuZ2VkKiogYWNyb3NzIGdyb3VwcyB0byBlbnN1cmUgdGhhdCBvbmx5IHRoZSBJViBhZmZlY3RzIHRoZSBEVi4gRm9yIGV4YW1wbGUsIHNvaWwgdHlwZSwgd2F0ZXIgYW1vdW50LCBhZ2UgZ3JvdXAsIGVudmlyb25tZW50YWwgY29uZGl0aW9uLCBldGMuDQoNCiogKkV4dHJhbmVvdXMgVmFyaWFibGVzIChDb25mb3VuZGluZyBGYWN0b3JzKSo6IFVud2FudGVkIHZhcmlhYmxlcyB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGUgRFYgaWYgbm90IGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCBzdW5saWdodCwgcGVzdHMsIGRpZXQsIHN0cmVzcyBsZXZlbHMsIG9yIG1lYXN1cmVtZW50IGVycm9ycy4NCg0KDQoNCioqMyBDaG9vc2UgdGhlIEV4cGVyaW1lbnRhbCBEZXNpZ24qKg0KDQpTZWxlY3QgYSBkZXNpZ24gdGhhdCBiZXN0IGZpdHMgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLiBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgZGVzaWducy4gVGhlIGZvbGxvd2luZyBpcyBhIHNob3J0IGxpc3Qgb2YgY29tbW9ubHkgdXNlZCBkZXNpZ25zLiBXZSB3aWxsIGRpc2N1c3Mgc29tZSBvZiB0aGVtIHdpdGggbW9yZSBkZXRhaWwgaW4gdGhlIG5leHQgU2VjdGlvbi4NCg0KKiAqQ29tcGxldGVseSBSYW5kb21pemVkIERlc2lnbiAoQ1JEKSo6IEEgKipDb21wbGV0ZWx5IFJhbmRvbWl6ZWQgRGVzaWduIChDUkQpKiogYXNzaWducyB0cmVhdG1lbnRzIHRvIGV4cGVyaW1lbnRhbCB1bml0cyBwdXJlbHkgYXQgcmFuZG9tIHRvIGd1YXJhbnRlZSB0aGF0IGVhY2ggdW5pdCBoYXMgYW4gZXF1YWwgcHJvYmFiaWxpdHkgb2YgcmVjZWl2aW5nIGFueSB0cmVhdG1lbnQuIENSRCBpcyBleGNlbGxlbnQgZm9yIGlzb2xhdGluZyBjYXVzYWwgZWZmZWN0cyB3aGVuIHVuaXRzIGFyZSBob21vZ2VuZW91cyANCg0KKiAqKlJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduIChSQkQpKio6IEluIGEgKipSYW5kb21pemVkIEJsb2NrIERlc2lnbioqLCAgZXhwZXJpbWVudGFsIHVuaXRzIGFyZSBncm91cGVkIChibG9ja2VkKSB0byBzaGFyZSBhIGtub3duIGNoYXJhY3RlcmlzdGljIHRoYXQgaXMgbm90IHByaW1hcmlseSBzdHVkaWVkLCBidXQgaXQgY291bGQgYWZmZWN0IHRoZSBvdXRjb21lLiBXaXRoaW4gZWFjaCBibG9jaywgYWxsIHRyZWF0bWVudHMgYXJlIHJhbmRvbWx5IGFzc2lnbmVkLiBDb250cm9sbGluZyBmb3Iga25vd24gYmxvY2tpbmcgdmFyaWFibGVzIGltcHJvdmVzIHRoZSBwcmVjaXNpb24gb2YgdHJlYXRtZW50IGVzdGltYXRlcy4gRm9yIGV4YW1wbGUsIGRpdmlkaW5nIHBsYW50cyBieSBzb2lsIHF1YWxpdHkgb3IgcGF0aWVudHMgYnkgYWdlL2dlbmRlci4gDQoNCg0KKiAqKkZhY3RvcmlhbCBEZXNpZ24qKjogQSBmYWN0b3JpYWwgZGVzaWduIHRlc3RzIHR3byBvciBtb3JlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoZmFjdG9ycykgc2ltdWx0YW5lb3VzbHksIHVzaW5nIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlaXIgbGV2ZWxzLiBUaGlzIGFsbG93cyBhc3Nlc3NtZW50IG9mIGJvdGggbWFpbiBlZmZlY3RzIChpbmRpdmlkdWFsIGZhY3RvciBpbXBhY3QpIGFuZCBpbnRlcmFjdGlvbiBlZmZlY3RzICh3aGVuIHRoZSBlZmZlY3Qgb2Ygb25lIGZhY3RvciBkZXBlbmRzIG9uIGFub3RoZXIpOiBGb3IgZXhhbXBsZSwgKmluIGEgcmVjZW50IExhbmNldCBzdHVkeSwgb2xkZXIgYWR1bHRzIHdlcmUgcmFuZG9taXplZCBhY3Jvc3MgdHdvIHZhY2NpbmUgdHlwZXMgKFBmaXplcuKAkUJpb05UZWNoIHZzLiBPeGZvcmTigJFBc3RyYVplbmVjYSkgYW5kIHR3byBkb3NpbmcgaW50ZXJ2YWxzICgzIHdlZWtzIHZzLiAxMiB3ZWVrcyksIGNyZWF0aW5nIGZvdXIgZ3JvdXBzLiBUaGUgcmVzZWFyY2hlcnMgbWVhc3VyZWQgYW50aWJvZHkgbGV2ZWxzIHRvIGFzc2VzcyBtYWluIGVmZmVjdHMgKHZhY2NpbmUgdHlwZSwgZG9zZSBpbnRlcnZhbCkgYW5kIHdoZXRoZXIgdGhlcmUgd2FzIGFuIGludGVyYWN0aW9u4oCUaS5lLiwgd2hldGhlciB0aGUgZG9zaW5nIGludGVydmFsIGVmZmVjdCBkaWZmZXJlZCBieSB2YWNjaW5lIHR5cGUuIFRoZXkgZm91bmQgaGlnaGVyIGFudGlib2RpZXMgb3ZlcmFsbCB3aXRoIFBmaXplciwgYW5kIGxvbmdlciBpbnRlcnZhbHMgYm9vc3RlZCByZXNwb25zZSBpbiBib3RoIHZhY2NpbmUgZ3JvdXBzLiogDQoNCg0KKiAqKlJlcGVhdGVkIE1lYXN1cmVzKio6IFRoaXMgZGVzaWduIGludm9sdmVzIG1lYXN1cmluZyB0aGUgKipzYW1lIHBhcnRpY2lwYW50cyAob3IgdW5pdHMpKiogbXVsdGlwbGUgdGltZXMgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMgb3IgdGltZSBwb2ludHMuIEl0IGNvbnRyb2xzIGZvciBpbmRpdmlkdWFsIGRpZmZlcmVuY2VzIGFuZCBib29zdHMgc3RhdGlzdGljYWwgcG93ZXIgYmVjYXVzZSBlYWNoIHBhcnRpY2lwYW50IGFjdHMgYXMgdGhlaXIgY29udHJvbC4gU29tZSBleGFtcGxlcyBpbmNsdWRlOg0KICArICBDb2duaXRpdmUgdGVzdHMgYXQgYWdlcyAzMCwgNDAsIGFuZCA1MCB0byB0cmFjayBkZWNsaW5lIG9yIGltcHJvdmVtZW50Ow0KICArICBEcnVnIEEgdnMuIERydWcgQiAtIGVhY2ggcGFydGljaXBhbnQgdGFrZXMgYm90aCBpbiBkaWZmZXJlbnQgb3JkZXJzOw0KICArICBUZXN0aW5nIHRocmVlIGRpZmZlcmVudCBkcnVncyBmb3Igc21va2luZyBjcmF2aW5ncyAtIHRoZSBzYW1lIHBhcnRpY2lwYW50cyByZWNlaXZlIGVhY2ggZHJ1ZyBvbiBkaWZmZXJlbnQgZGF5cy4NCg0KDQoqKjUuIFJhbmRvbWl6YXRpb24sIEJsaW5kaW5nICYgQXNzaWdubWVudCoqDQoNClRoZXNlIHRocmVlIHRlY2huaXF1ZXMgYXJlIGNyaXRpY2FsIGZvciBtaW5pbWl6aW5nIGJpYXMsIGVuc3VyaW5nIHZhbGlkaXR5LCBhbmQgc3RyZW5ndGhlbmluZyBjYXVzYWwgaW5mZXJlbmNlcyBpbiBleHBlcmltZW50cy4gQmVsb3cgaXMgYSBkZXRhaWxlZCBicmVha2Rvd24gb2YgZWFjaCBjb25jZXB0LCBpdHMgaW1wb3J0YW5jZSwgYW5kIGhvdyB0aGV5IGFyZSBpbXBsZW1lbnRlZC4NCg0KKiBSYW5kb21pemUgcGFydGljaXBhbnRzIG9yIHVuaXRzIHRvIHRyZWF0bWVudHMgdG8gYXZvaWQgKipzZWxlY3Rpb24gYmlhcyoqLg0KICArIFNpbXBsZSBSYW5kb21pemF0aW9uIC0gRm9yIGV4YW1wbGUsIGluIGEgZHJ1ZyB0cmlhbCwgMTAwIHBhdGllbnRzIGFyZSByYW5kb21seSBhc3NpZ25lZCB0byBlaXRoZXIgdGhlIG5ldyBkcnVnIG9yIHBsYWNlYm8gKHBpbGwgd2l0aCBubyBkcnVnIGluZ3JlZGllbnQpIGdyb3VwIHVzaW5nIGEgY29tcHV0ZXItZ2VuZXJhdGVkIHJhbmRvbSBzZXF1ZW5jZS4NCiAgKyBCbG9jayBSYW5kb21pemF0aW9uIC0gRW5zdXJlcyBlcXVhbCBncm91cCBzaXplcyBieSByYW5kb21pemluZyB3aXRoaW4gc21hbGwgYmxvY2tzLg0KICArIFN0cmF0aWZpZWQgUmFuZG9taXphdGlvbiAtIFJhbmRvbWl6ZXMgd2l0aGluIHN1Ymdyb3VwcyAoZS5nLiwgYnkgYWdlIG9yIGdlbmRlcikgdG8gbWFpbnRhaW4gYmFsYW5jZS4NCiAgDQoqIEJsaW5kIHBhcnRpY2lwYW50cyBhbmQvb3IgcmVzZWFyY2hlcnMgd2hlbiBwb3NzaWJsZSwgdG8gcmVkdWNlIGV4cGVjdGF0aW9uIGVmZmVjdHMuDQogICsgKipTaW5nbGUtQmxpbmQqKjoJdG8gcGFydGljaXBhbnRzIG9ubHkuIEl0IHByZXZlbnRzIHBsYWNlYm8gZWZmZWN0cy4NCiAgKyAqKkRvdWJsZS1CbGluZCoqOgl0byBib3RoIHBhcnRpY2lwYW50cyBhbmQgcmVzZWFyY2hlcnMuIEl0IGVsaW1pbmF0ZXMgZXhwZXJpbWVudGVyIGJpYXMgJiBwYXJ0aWNpcGFudCBiaWFzLg0KICArICoqVHJpcGxlLUJsaW5kKioJdG8gcGFydGljaXBhbnRzLCByZXNlYXJjaGVycywgYW5kIGRhdGEgYW5hbHlzdHMuIEl0IHJlZHVjZXMgYmlhcyBpbiBpbnRlcnByZXRhdGlvbi4NCg0KDQoqIEFzc2lnbm1lbnQgcmVmZXJzIHRvIGhvdyBwYXJ0aWNpcGFudHMgb3IgZXhwZXJpbWVudGFsIHVuaXRzIGFyZSBhbGxvY2F0ZWQgdG8gZGlmZmVyZW50IHRyZWF0bWVudCBncm91cHMuIFByb3BlciBhc3NpZ25tZW50IGlzIGNydWNpYWwgZm9yIHZhbGlkIGNvbXBhcmlzb25zIGFuZCBtaW5pbWl6aW5nIGJpYXMuIA0KICArICoqQmV0d2Vlbi1TdWJqZWN0cyoqIChJbmRlcGVuZGVudCBNZWFzdXJlcyk6IERpZmZlcmVudCBwYXJ0aWNpcGFudHMgYXJlIGFzc2lnbmVkIHRvIGVhY2ggdHJlYXRtZW50IGdyb3VwLg0KICArICoqV2l0aGluLVN1YmplY3RzKiogKFJlcGVhdGVkIE1lYXN1cmVzKTogVGhlIHNhbWUgcGFydGljaXBhbnRzIGV4cGVyaWVuY2UgYWxsIGNvbmRpdGlvbnMNCiAgKyAqKk1hdGNoZWQtUGFpcnMgRGVzaWduKio6IFBhcnRpY2lwYW50cyBhcmUgcGFpcmVkIGJhc2VkIG9uIGtleSB0cmFpdHMgKGUuZy4sIGFnZSwgSVEpLCB0aGVuIHNwbGl0IGludG8gZ3JvdXBzLg0KDQoNCg0KKio2LiBQbGFuIFNhbXBsaW5nICYgRGF0YSBDb2xsZWN0aW9uKioNCg0KKiAqKlNhbXBsaW5nKiogcmVmZXJzIHRvIGhvdyB5b3Ugc2VsZWN0IGV4cGVyaW1lbnRhbCB1bml0cyAoZS5nLiwgcGxvdHMsIGFuaW1hbHMsIHBlb3BsZSkgZnJvbSB0aGUgbGFyZ2VyIHBvcHVsYXRpb27igJRpZGVhbGx5IHRocm91Z2ggcmFuZG9tIHNhbXBsaW5nIHRvIGVuc3VyZSByZXByZXNlbnRhdGl2ZW5lc3MuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjkwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJ3ZWVrMDQvU2FtcGxpbmdQbGFucy5wbmciKQ0KYGBgDQoNCiogUmVjb3JkIG1lYXN1cmVtZW50cyBhY2N1cmF0ZWx5IChlLmcuLCBjcm9wIHdlaWdodCwgcGxhbnQgaGVpZ2h0KS4NCg0KDQoqKjcuIEFuYWx5emUgRGF0YSBhbmQgSW50ZXJwcmV0YXRpb24qKg0KDQpUaGlzIHdpbGwgYmUgZGlzY3Vzc2VkIGluIGRldGFpbCBpbiBzZXBhcmF0ZSBub3Rlcy4gVGhlIGtleSBpcyB0byBjaG9vc2UgYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgcHJvY2VkdXJlcyB0byBwZXJmb3JtIGFuYWx5c2lzIGFuZCBtYWtlIGEgcmVsZXZhbnQgZGlhZ25vc2lzLiBUaGlzIGlzIGFuIGl0ZXJhdGl2ZSBwcm9jZXNzLiBNYWtlIHN1cmUgdGhhdCBhbGwgYXNzdW1wdGlvbnMgYXJlIHNhdGlzZmllZCBiZWZvcmUgaW50ZXJwcmV0aW5nIHRoZSByZXN1bHRzLg0KDQoqKjguIFJlcG9ydGluZyBhbmQgVmFsaWRhdGluZyoqDQoNClRoaXMgaXMgdGhlIGZpbmFsIHN0ZXAuIFdlIHdpbGwgYWxzbyBkaXNjdXNzIHRoaXMgaW4gdGhlIHN1YnNlcXVlbnQgbm90ZS4gVGhlIGtleSBpZGVhIGlzIHRvIGZvbGxvdyB0aGUgYmVzdCBwcmFjdGljZXM6IA0KDQoNCiMgQ1JEIGFuZCBSQkQNCg0KVGhpcyBzZWN0aW9uIGJyaWVmbHkgaW50cm9kdWNlcyB0d28gbW9zdCBjb21tb25seSB1c2VkIGV4cGVyaW1lbnRhbCBkZXNpZ25zOiB0aGUgY29tcGxldGVseSByYW5kb21pemVkIGRlc2lnbiBhbmQgdGhlIHJhbmRvbWl6ZWQgYmxvY2sgZGVzaWduLCBpbiBtb3JlIGRldGFpbC4gV2Ugd2lsbCBhbHNvIG9yZ2FuaXplIHRoZSByZXN1bHRpbmcgZGF0YSBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YSBhbmFseXNpcyB1c2luZyBlaXRoZXIgYSBzb2Z0d2FyZSBwcm9ncmFtIG9yIG1hbnVhbGx5Lg0KDQoNCiMjIENvbXBsZXRlbHkgUmFuZG9taXplZCBEZXNpZ24NCg0KVGhlICoqQ29tcGxldGVseSBSYW5kb21pemVkIERlc2lnbiAoQ1JEKSoqIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBhbmQgd2lkZWx5IHVzZWQgZXhwZXJpbWVudGFsIGRlc2lnbnMgaW4gcmVzZWFyY2guIEl0IGlzIHBhcnRpY3VsYXJseSBzdWl0YWJsZSB3aGVuIGV4cGVyaW1lbnRhbCB1bml0cyBhcmUgaG9tb2dlbmVvdXMsIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGFtb25nIHRoZW0gYmVmb3JlIGFwcGx5aW5nIHRyZWF0bWVudHMuIENSRCBmb2xsb3dzIHRoZSAqKnByaW5jaXBsZSBvZiByYW5kb21pemF0aW9uKiosIHdoZXJlIHN1YmplY3RzIChvciBleHBlcmltZW50YWwgdW5pdHMpIGFyZSByYW5kb21seSBhc3NpZ25lZCB0byB0cmVhdG1lbnRzLiBUaGF0IG1lYW5zIDxmb250IGNvbG9yID0gInJlZCI+KipcY29sb3J7cmVkfWVhY2ggc3ViamVjdCBoYXMgYW4gZXF1YWwgY2hhbmNlIG9mIHJlY2VpdmluZyBhbnkgdHJlYXRtZW50LCBhbmQgdGhlIGFzc2lnbm1lbnQgaXMgZG9uZSBpbmRlcGVuZGVudGx5IG9mIGFueSBncm91cGluZyoqPC9mb250Pi4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0iNzAlIn0NCmluY2x1ZGVfZ3JhcGhpY3MoIndlZWswNC9DUkQucG5nIikNCmBgYA0KDQpEZXBlbmRpbmcgb24gKnRoZSBudW1iZXIgb2YgcmVwbGljYXRpb25zIHBlciB0cmVhdG1lbnQqICg8Zm9udCBjb2xvciA9ICJyZWQiPmkuZS4sIHRoZSBudW1iZXIgb2YgZXhwZXJpbWVudGFsIHVuaXRzIHRoYXQgcmVjZWl2ZSB0aGUgc2FtZSB0cmVhdG1lbnQgaW5kZXBlbmRlbnRseTwvZm9udD4pLCAqKmEgQ1JEIGNhbiBiZSBjbGFzc2lmaWVkIGFzIGVpdGhlciBiYWxhbmNlZCBvciBpbWJhbGFuY2VkKiouIFVuZGVyc3RhbmRpbmcgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhdGlvbnMgaXMgY3J1Y2lhbCBmb3IgcHJvcGVyIGV4cGVyaW1lbnRhbCBkZXNpZ24gYW5kIHN0YXRpc3RpY2FsIGFuYWx5c2lzLg0KDQpJbiB0aGUgYWJvdmUgZmlndXJlLCB0aGUgbnVtYmVyIG9mIHN1YmplY3RzIGluIGVhY2ggdHJlYXRtZW50IGlzIGVxdWFsLCAkbl8xID0gbl8yID0gbl8zJCwgYW5kIHRoZSBoeXBvdGhldGljYWwgQ1JEIGlzIGEgYmFsYW5jZWQgZGVzaWduLg0KDQoNClRoaXMgZGVzaWduIGlzIGNvbW1vbmx5IHVzZWQgaW4gYWdyaWN1bHR1cmFsIGV4cGVyaW1lbnRzLCBjbGluaWNhbCB0cmlhbHMsIGluZHVzdHJpYWwgc3R1ZGllcywgYW5kIGxhYm9yYXRvcnkgcmVzZWFyY2ggZHVlIHRvIGl0cyBzaW1wbGljaXR5IGFuZCBmbGV4aWJpbGl0eS4NCg0KDQoNCioqVGhlIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgQ1JEIGluY2x1ZGUqKjoNCg0KKiAqKlJhbmRvbSBBc3NpZ25tZW50Kio6IFRyZWF0bWVudHMgYXJlIGFsbG9jYXRlZCByYW5kb21seSB0byBleHBlcmltZW50YWwgdW5pdHMgdG8gbWluaW1pemUgYmlhcy4NCg0KKiAqKkhvbW9nZW5lb3VzIEV4cGVyaW1lbnRhbCBVbml0cyoqOiBBbGwgc3ViamVjdHMgb3IgcGxvdHMgYXJlIGFzc3VtZWQgdG8gYmUgc2ltaWxhciBiZWZvcmUgdHJlYXRtZW50IGFwcGxpY2F0aW9uLg0KDQoqICoqTm8gQmxvY2tpbmcqKjogVW5saWtlIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduIChSQkQpLCBDUkQgZG9lcyBub3QgZ3JvdXAgdW5pdHMgaW50byBibG9ja3MgdG8gY29udHJvbCB2YXJpYWJpbGl0eS4NCg0KKiAqKkZsZXhpYmlsaXR5Kio6IEl0IGNhbiBhY2NvbW1vZGF0ZSBhbnkgbnVtYmVyIG9mIHRyZWF0bWVudHMgYW5kIHJlcGxpY2F0aW9ucy4NCg0KKiAqKlNpbXBsZSBBbmFseXNpcyoqOiBEYXRhIGZyb20gQ1JEIGNhbiBiZSBlYXNpbHkgYW5hbHl6ZWQgdXNpbmcgb25lLXdheSBBTk9WQSAoQW5hbHlzaXMgb2YgVmFyaWFuY2UpLg0KDQoNCioqQSBOb24tbnVtZXJpY2FsIEV4YW1wbGUqKg0KDQpTdXBwb3NlIGEgcGhhcm1hY2V1dGljYWwgY29tcGFueSB3YW50cyB0byB0ZXN0IHRocmVlIGRpZmZlcmVudCBkcnVnIGZvcm11bGF0aW9ucyAoQSwgQiwgQykgb24gYmxvb2QgcHJlc3N1cmUuIEEgYmFsYW5jZWQsIGNvbXBsZXRlbHkgcmFuZG9taXplZCBkZXNpZ24gd2lsbCBmb2xsb3cgdGhlIG5leHQgZmV3IHN0ZXBzLg0KDQoqKlN0ZXAgMSoqOiBTZWxlY3QgMzAgc2ltaWxhciBwYXRpZW50cy4NCg0KKipTdGVwIDIqKjogUmFuZG9tbHkgYXNzaWduIDEwIHBhdGllbnRzIHRvIGVhY2ggZHJ1ZyBncm91cC4NCg0KKipTdGVwIDMqKjogQWRtaW5pc3RlciB0cmVhdG1lbnRzIGFuZCBtZWFzdXJlIGJsb29kIHByZXNzdXJlIGFmdGVyIGEgc2V0IHBlcmlvZC4NCg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoPSI3MCUifQ0KaW5jbHVkZV9ncmFwaGljcygid2VlazA0L0NSRC1FeGFtcGxlLnBuZyIpDQpgYGANCg0KDQpUaGUgbmV4dCBmaWd1cmUgaWxsdXN0cmF0ZXMgaG93IHRvIHJlYWQgdGhlIENSRCBkYXRhIHRhYmxlIGNlbGwuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjUwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJ3ZWVrMDQvQ1JELWNlbGwucG5nIikNCmBgYA0KDQpUaGUgZm9ybWF0cyByZXF1aXJlZCBmb3IgYW5hbHlzaXMgdXNpbmcgZGlmZmVyZW50IHNvZnR3YXJlIHByb2dyYW1zIHdpbGwgYmUgZGlzY3Vzc2VkIGluIHN1YnNlcXVlbnQgbm90ZXMgZm9jdXNpbmcgb24gYW5hbHl6aW5nIGRpZmZlcmVudCBleHBlcmltZW50YWwgZGVzaWducy4gDQoNCg0KXA0KDQpUaGUgQ29tcGxldGVseSBSYW5kb21pemVkIERlc2lnbiBpcyBhIGZ1bmRhbWVudGFsIGV4cGVyaW1lbnRhbCBhcHByb2FjaCBkdWUgdG8gaXRzIHNpbXBsaWNpdHkgYW5kIGVhc2Ugb2YgYXBwbGljYXRpb24uIFdoaWxlIGl0IGlzIGhpZ2hseSBlZmZlY3RpdmUgaW4gaG9tb2dlbmVvdXMgc2V0dGluZ3MsIGl0cyBsaW1pdGF0aW9ucyBiZWNvbWUgYXBwYXJlbnQgd2hlbiBkZWFsaW5nIHdpdGggdmFyaWFiaWxpdHkuIFJlc2VhcmNoZXJzIG11c3QgY2FyZWZ1bGx5IGFzc2VzcyB3aGV0aGVyIENSRCBpcyBhcHByb3ByaWF0ZSBvciBpZiBtb3JlIGFkdmFuY2VkIGRlc2lnbnMgKGUuZy4sIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduKSBhcmUgbmVlZGVkLiBEZXNwaXRlIGl0cyBjb25zdHJhaW50cywgQ1JEIHJlbWFpbnMgYSBjb3JuZXJzdG9uZSBvZiBleHBlcmltZW50YWwgcmVzZWFyY2gsIHByb3ZpZGluZyBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGFuZCBzY2llbnRpZmljIGRpc2NvdmVyeS4NCg0KVGhlIGZvbGxvd2luZyBZb3VUdWJlIHZpZGVvIGV4cGxhaW5zIENSRCAoZmlyc3QgMTUgTWludXRlcywgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9S0o1RzJLamNYY0E+KS4gVGhlIGFuYWx5c2lzIHBhcnQgd2lsbCBiZSBkaXNjdXNzZWQgaW4gdGhlIG5leHQgbm90ZSBvbiBPbmUtd2F5IEFOT1ZBLiANCg0KXA0KDQo8Y2VudGVyPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9S0o1RzJLamNYY0EiIHRhcmdldD0icG9wdXAiIA0KICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUtKNUcyS2pjWGNBJywNCiAgICAgICAgICAgICAgICAgICAgICAnbmFtZScsJ3dpZHRoPTg1MCxoZWlnaHQ9NTAwJykiPjxpbWcgc3JjID0gImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL01BVDEyMVc1L2ltZy9WaWRlb0ljb24ucG5nIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjEyMCI+PC9hPg0KPC9jZW50ZXI+DQoNClwNCg0KDQoNCiMjIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduDQoNClRoZSBSYW5kb21pemVkIEJsb2NrIERlc2lnbiAoUkJEKSBpcyBhIHdpZGVseSB1c2VkIGV4cGVyaW1lbnRhbCBkZXNpZ24gdGhhdCBpbXByb3ZlcyBwcmVjaXNpb24gYnkgY29udHJvbGxpbmcga25vd24gc291cmNlcyBvZiB2YXJpYWJpbGl0eS4gVW5saWtlIHRoZSBDb21wbGV0ZWx5IFJhbmRvbWl6ZWQgRGVzaWduIChDUkQpLCB3aGljaCBhc3N1bWVzIGhvbW9nZW5lb3VzIGV4cGVyaW1lbnRhbCB1bml0cywgUkJEIGdyb3VwcyBzaW1pbGFyIHVuaXRzIGludG8gYmxvY2tzIGFuZCB0aGVuIHJhbmRvbWl6ZXMgdHJlYXRtZW50cyB3aXRoaW4gZWFjaCBibG9jay4gVGhpcyBhcHByb2FjaCByZWR1Y2VzIGV4cGVyaW1lbnRhbCBlcnJvciBhbmQgZW5oYW5jZXMgdGhlIGFjY3VyYWN5IG9mIHRyZWF0bWVudCBjb21wYXJpc29ucy4gUkJEIGlzIGNvbW1vbmx5IGFwcGxpZWQgaW4gYWdyaWN1bHR1cmUsIGNsaW5pY2FsIHRyaWFscywgaW5kdXN0cmlhbCBleHBlcmltZW50cywgYW5kIGVjb2xvZ2ljYWwgc3R1ZGllcyB3aGVyZSBleHRlcm5hbCBmYWN0b3JzIChlLmcuLCBzb2lsIGZlcnRpbGl0eSwgcGF0aWVudCBhZ2UsIG1hY2hpbmUgZGlmZmVyZW5jZXMpIG1heSBpbmZsdWVuY2UgcmVzdWx0cy4NCg0KDQoqKlR3byByZWxhdGVkIChidXQgc29tZXRpbWVzIGNvbmZ1c2luZykgY29uY2VwdHMqKg0KDQoqICoqRXh0cmFuZW91cyBWYXJpYWJsZSoqIC0gQW55IHZhcmlhYmxlIG90aGVyIHRoYW4gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlIHRoYXQgbWlnaHQgYWZmZWN0IHRoZSBvdXRjb21lIChkZXBlbmRlbnQgdmFyaWFibGUpLiBJdCBtYXkgb3IgbWF5IG5vdCBiZSBhIHByb2JsZW0uIElmIHByb3Blcmx5IGNvbnRyb2xsZWQgb3IgcmFuZG9taXplZCwgaXQgZG9lc27igJl0IGJpYXMgdGhlIHJlc3VsdHMuIEZvciBleGFtcGxlLCBpbiBhIHBsYW50IGdyb3d0aCBleHBlcmltZW50LCBzdW5saWdodCBhbmQgd2F0ZXIgYXJlIGV4dHJhbmVvdXMgdmFyaWFibGVzIGlmIHlvdSdyZSB0ZXN0aW5nIHRoZSBlZmZlY3Qgb2YgZmVydGlsaXplci4NCg0KKiAqKkNvbmZvdW5kaW5nIFZhcmlhYmxlKiogLSBBIHR5cGUgb2YgZXh0cmFuZW91cyB2YXJpYWJsZSB0aGF0IGlzIG5vdCBjb250cm9sbGVkIGFuZCBzeXN0ZW1hdGljYWxseSB2YXJpZXMgd2l0aCB0aGUgdHJlYXRtZW50LiBJdCAqKmNvbmZvdW5kcyAoaS5lLiwgbWl4ZXMgdXApKiogdGhlIGVmZmVjdCBvZiB0aGUgdHJlYXRtZW50LCBtYWtpbmcgaXQgaGFyZCB0byBrbm93IHdoZXRoZXIgdGhlIG9ic2VydmVkIGVmZmVjdCBpcyBkdWUgdG8gdGhlIHRyZWF0bWVudCBvciB0aGUgY29uZm91bmRlci4NCg0KVG8gc3VtbWFyaXplLCB3ZSBjcmVhdGUgdGhlIGZvbGxvd2luZyB0YWJsZSB0byBkbyBiYWNrLXRvLWJhY2sgY29tcGFyaXNvbnMuDQoNCnwgVGVybQkgIHwgIElzIGl0IGEgcHJvYmxlbT8JfCAgIFN5c3RlbWF0aWNhbGx5IHJlbGF0ZWQgdG8gdHJlYXRtZW50PyB8CUFmZmVjdHMgb3V0Y29tZT8gfA0KfDotLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tfA0KfEV4dHJhbmVvdXMgVmFyaWFibGV8CU5vdCBhbHdheXN8CU5vdCBuZWNlc3NhcmlseQl8UG9zc2libHl8DQp8Q29uZm91bmRpbmcgVmFyaWFibGV8CVllcyAoaWYgdW5jb250cm9sbGVkKQl8WWVzfAlZZXN8DQoNClwNCg0KIyMjIE1ham9yIENvbXBvbmVudHMgaW4gUkJEDQoNCkFzIG1lbnRpb25lZCBlYXJsaWVyLCBhbiBSQkQgaXMgYW4gZXhwZXJpbWVudGFsIGRlc2lnbiB3aGVyZSBzdWJqZWN0cyBvciAqKmV4cGVyaW1lbnRhbCB1bml0cyoqIGFyZSBncm91cGVkIGludG8gKipob21vZ2VuZW91cyBncm91cHMgL2Jsb2NrcyoqIGJhc2VkIG9uIHNvbWUgc2ltaWxhcml0eSAobGlrZSBhZ2UsIHdlaWdodCwgbG9jYXRpb24pIHRvIGNvbnRyb2wgZm9yIHZhcmlhYmlsaXR5IHRoYXQgaXNuJ3Qgb2YgcHJpbWFyeSBpbnRlcmVzdC4gV2l0aGluIGVhY2ggYmxvY2ssICoqdHJlYXRtZW50cyoqIGFyZSAqKnJhbmRvbWx5IGFzc2lnbmVkKiogdG8gdGhlIHVuaXRzLg0KDQoNCioqRXhwZXJpbWVudGFsIFVuaXQqKg0KDQpUaGlzIGlzIHRoZSBzbWFsbGVzdCBkaXZpc2lvbiBvZiB0aGUgZXhwZXJpbWVudGFsIG1hdGVyaWFsIHRvIHdoaWNoIGEgdHJlYXRtZW50IGNhbiBiZSBhc3NpZ25lZC4gRm9yIGV4YW1wbGUsIGluIGFncmljdWx0dXJhbCBleHBlcmltZW50cywgYSBwbG90IG9mIGxhbmQgY2FuIGJlIGFuIGV4cGVyaW1lbnRhbCB1bml0IHdoZXJlIGRpZmZlcmVudCBmZXJ0aWxpemVycyAodHJlYXRtZW50cykgYXJlIGFwcGxpZWQuDQoNCioqVHJlYXRtZW50KioNCg0KVGhpcyByZWZlcnMgdG8gdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIG9yIGludGVydmVudGlvbnMgd2hvc2UgZWZmZWN0cyBhcmUgYmVpbmcgc3R1ZGllZC4gRm9yIGluc3RhbmNlLCBkaWZmZXJlbnQgZG9zYWdlcyBvZiBhIGRydWcgYXJlIHVzZWQgaW4gYSBtZWRpY2FsIHRyaWFsLg0KDQoqKkJsb2NrKioNCg0KQSBibG9jayBpcyBhIGdyb3VwIG9mIGV4cGVyaW1lbnRhbCB1bml0cyB0aGF0IGFyZSBzaW1pbGFyIGluIHNvbWUgd2F5IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYWZmZWN0IHRoZSByZXNwb25zZSB0byB0aGUgdHJlYXRtZW50cy4gVGhlIGlkZWEgaXMgdG8gbWFrZSBjb21wYXJpc29ucyB3aXRoaW4gYmxvY2tzIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mIHZhcmlhYmlsaXR5IGJldHdlZW4gYmxvY2tzLg0KDQoNCkluIENSRCwgKiptdWx0aXBsZSBleHBlcmltZW50YWwqKiB1bml0cyBhcmUgYXNzaWduZWQgdG8gZWFjaCB0cmVhdG1lbnQuIEluIFJCRCwgaW50cm9kdWNpbmcgYSBibG9ja2luZyB2YXJpYWJsZSBtYWtlcyB0aGUgZGVzaWduIGFuZCBkYXRhIGxheW91dCBtb3JlIGNvbXBsZXggdGhhbiB0aGUgQ1JEIHNpbmNlIHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGNvbWJpbmF0aW9ucyBvZiBibG9ja3MgYW5kIHRyZWF0bWVudHMgd2hlbiBhc3NpZ25pbmcgZXhwZXJpbWVudGFsIHVuaXRzLg0KDQoNClwNCg0KIyMjIFJCRCB3aXRob3V0IFJlcGxpY2F0ZXMgKEJhc2ljcyBSQkQpDQoNCkluIHRoaXMgc2NlbmFyaW8sIGZvciBlYWNoIGJsb2NrLCB0aGVyZSBpcyBleGFjdGx5IG9uZSBleHBlcmltZW50YWwgdW5pdCBhc3NpZ25lZCB0byBlYWNoIHRyZWF0bWVudC4gSWYgdGhlcmUgYXJlICR0JCB0cmVhdG1lbnRzLCB0aGVuIGVhY2ggYmxvY2sgd2lsbCBoYXZlICR0JCBleHBlcmltZW50YWwgdW5pdHMsIG9uZSBmb3IgZWFjaCB0cmVhdG1lbnQuDQoNClRoZSByZXN1bHRpbmcgZGF0YSB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuDQoNCnwgICAgIHwgKip0cmVhdCAxKiogIHwgICoqdHJlYXQgMioqICB8ICAgJFxjZG90cyQgIHwgKip0cmVhdCB0KiogfA0KfDotLS0tLS0tLS0tfDotLS0tLS0tLS0tfDotLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tfA0KfCAqKmJsb2NrIDEqKiB8ICR5X3sxMX0kIHwgICR5X3syMX0kICB8ICAkXGNkb3RzJCAgfCAkeV97dDF9JCB8DQp8ICoqYmxvY2sgMioqIHwgJHlfezEyfSQgfCAgJHlfezIyfSQgIHwgICRcY2RvdHMkICB8ICR5X3t0Mn0kIHwNCnwgICRcY2RvdHMkICAgfCAkXGNkb3RzJCB8ICAkXGNkb3RzJCAgfCAgJFxjZG90cyQgIHwgJFxjZG90cyQgfA0KfCAqKmJsb2NrIGIqKiB8ICR5X3sxYn0kIHwgICR5X3syYn0kICB8ICAkXGNkb3RzJCAgfCAkeV97dGJ9JCB8DQoNCg0KYGBge3IgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0iNTAlIn0NCmluY2x1ZGVfZ3JhcGhpY3MoIndlZWswNC9SQkQtTm9SZXAtY2VsbC5wbmciKQ0KYGBgDQoNCioqRXhhbXBsZSoqOiBMZXQncyBjb25zaWRlciBhbiBhZ3JpY3VsdHVyYWwgZXhhbXBsZSB0byBtYWtlIHRoaXMgY29uY3JldGUuIEFzc3VtZSB0aGF0IHRoZXJlIGFyZSB0aHJlZSB0cmVhdG1lbnRzOiAzIGRpZmZlcmVudCB0eXBlcyBvZiBmZXJ0aWxpemVycyAoRjEsIEYyLCBGMykgYW5kIGZvdXIgYmxvY2tzOiA0IGRpZmZlcmVudCBmaWVsZHMgKEJsb2NrMSwgQmxvY2syLCBCbG9jazMsIEJsb2NrNCkgd2hpY2ggbWF5IHZhcnkgaW4gc29pbCBxdWFsaXR5LCBzdW5saWdodCwgZXRjLiBJbiBlYWNoIGJsb2NrIChmaWVsZCksIHdlIGhhdmUgMyBwbG90cyAoZXhwZXJpbWVudGFsIHVuaXRzKSwgZWFjaCBhc3NpZ25lZCB0byBvbmUgb2YgdGhlIDMgZmVydGlsaXplcnMgcmFuZG9tbHksIGFuZCB0aGVuIG1lYXN1cmUgdGhlIHlpZWxkcyAoJHlfe2lqfSQpLg0KDQpUaGUgYXNzaWdubWVudCB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQ6DQoNCnwgICAgICB8ICAgKipQbG90IDEqKiB8ICoqUGxvdCAyKiogfCAqKlBsb3QgMyoqIHwNCnw6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS18DQp8KipCbG9jayAyKiogfCBGMiAgfCBGMSB8ICBGMyB8DQp8KipCbG9jayAzKiogfCBGMSAgfCBGMyB8ICBGMSB8DQp8KipCbG9jayA0KiogfCBGMyAgfCBGMiB8ICBGMiB8DQoNCkhlcmUsIGVhY2ggdHJlYXRtZW50IGFwcGVhcnMgZXhhY3RseSBvbmNlIGluIGVhY2ggYmxvY2ssIGFuZCB3aXRoaW4gZWFjaCBibG9jaywgdGhlIGFzc2lnbm1lbnQgaXMgcmFuZG9tLiBUaGUgY29ycmVzcG9uZGluZyBkYXRhIHRhYmxlIGlzDQoNCnwgICAgICB8ICAgKipQbG90IDEqKiB8ICoqUGxvdCAyKiogfCAqKlBsb3QgMyoqIHwNCnw6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS18DQp8KipCbG9jayAyKiogfCAkeV97MTF9JCAgfCAkeV97MjF9JCB8ICAkeV97MzF9JCB8DQp8KipCbG9jayAzKiogfCAkeV97MTJ9JCAgfCAkeV97MjJ9JCB8ICAkeV97MzJ9JCB8DQp8KipCbG9jayA0KiogfCAkeV97MTN9JCAgfCAkeV97MjN9JCB8ICAkeV97MzN9JCB8DQoNCg0KVGhpcyBkZXNpZ24gZ3VhcmFudGVlcyB0aGF0Og0KDQoqICoqQ29udHJvbCBvZiBWYXJpYWJpbGl0eSoqOiBCeSBncm91cGluZyBzaW1pbGFyIGV4cGVyaW1lbnRhbCB1bml0cyBpbnRvIGJsb2Nrcywgd2UgY29udHJvbCBmb3IgdGhlIHZhcmlhYmlsaXR5IGJldHdlZW4gYmxvY2tzLiBUaGlzIGluY3JlYXNlcyB0aGUgcHJlY2lzaW9uIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcy4NCg0KKiAqKkJhbGFuY2UqKjogRWFjaCB0cmVhdG1lbnQgYXBwZWFycyBlcXVhbGx5IG9mdGVuIGluIGVhY2ggYmxvY2ssIG1ha2luZyB0aGUgZGVzaWduIGJhbGFuY2VkLCB3aGljaCBzaW1wbGlmaWVzIGFuYWx5c2lzLg0KDQoqICoqUmFuZG9taXphdGlvbioqOiAqKlJhbmRvbSBhc3NpZ25tZW50Kiogd2l0aGluIGJsb2NrcyBoZWxwcyBpbiBhdm9pZGluZyBzeXN0ZW1hdGljIGJpYXMuDQoNCg0KIyMjIFJCRCB3aXRoIFJlcGxpY2F0ZXMgKFJlcGxpY2F0ZWQgUkJEKQ0KDQpUaGUgYmFzaWMgUkJEIGlzIHNpbXBsZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLiBTb21lIHByYWN0aWNhbCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgc2ltcGxlIGRlc2lnbiwgZm9yIGV4YW1wbGUsDQoNCiogV2UgY2Fubm90IGVzdGltYXRlIGludGVyYWN0aW9uIGJldHdlZW4gdHJlYXRtZW50cyBhbmQgYmxvY2tzIG9yIGhhdmUgYSBwdXJlIGVycm9yIGVzdGltYXRlIHdpdGhpbiBibG9ja3Mgc2luY2Ugb25seSBvbmUgZXhwZXJpbWVudGFsIHVuaXQgaXMgYXNzaWduZWQgaW4gdGhlIGNvbWJpbmF0aW9uIG9mIHRyZWF0bWVudCBhbmQgYmxvY2suDQoNCiogSW4gdGhlIG1vZGVsaW5nIHBoYXNlLCB3ZSBjYW5ub3QgYXNzZXNzIHRoZSBwb3RlbnRpYWwgaW50ZXJhY3RpdmUgZWZmZWN0LiBUaGF0IGlzLCB0aGUgZWZmZWN0IG9mIGEgdHJlYXRtZW50IGRlcGVuZHMgb24gdGhlIGJsb2NrIChvciB2aWNlIHZlcnNhKS4gIEZvciBleGFtcGxlLCBpZiAqKkYxKiogcGVyZm9ybXMgYmVzdCBpbiAqKkJsb2NrIDEqKiBidXQgd29yc3QgaW4gKipCbG9jayAyKiosIHRoZXJlIGlzIGxpa2VseSBhICoqdHJlYXRtZW50IMOXIGJsb2NrKiogaW50ZXJhY3Rpb24uDQoNCiogVGhlIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduIChSQkQpIHJlcXVpcmVzIGhvbW9nZW5laXR5IChpLmUuLCBlcXVhbCB2YXJpYW5jZSkgKip3aXRoaW4gYmxvY2tzIGFuZCB0cmVhdG1lbnRzKiogaW4gb3JkZXIgdG8gYmUgZWZmZWN0aXZlLiBIb3dldmVyLCB0aGUgYmFzaWMgUkJEIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFzc2VzcyB0aGlzIGhvbW9nZW5laXR5IGJlY2F1c2UgdGhlcmUgaXMgb25seSBhICoqc2luZ2xlIGV4cGVyaW1lbnRhbCB1bml0KiogZm9yIGVhY2ggY29tYmluYXRpb24gb2YgYmxvY2sgYW5kIHRyZWF0bWVudC4NCg0KDQpUaGVyZSBhcmUgZGlmZmVyZW50IHdheXMgdG8gb3ZlcmNvbWUgdGhlIGFib3ZlIGxpbWl0YXRpb25zLiBPbmUgd2F5IGlzIHRvIG1vZGlmeSB0aGUgYmFzaWMgUkJEIHRvIGFsbG93IGFzc2lnbmluZyBtdWx0aXBsZSBleHBlcmltZW50YWwgdW5pdHMgdG8gZXZlcnkgY29tYmluYXRpb24gb2YgYmxvY2tzIGFuZCB0cmVhdG1lbnRzIC0gKipSZXBsaWNhdGVkIFJCRCoqLg0KDQoNCkEgUmVwbGljYXRlZCBSQkQgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBzdGFuZGFyZCBSYW5kb21pemVkIEJsb2NrIERlc2lnbiB3aGVyZSBlYWNoIHRyZWF0bWVudCBpcyBhcHBsaWVkIHRvIG11bHRpcGxlIGV4cGVyaW1lbnRhbCB1bml0cyB3aXRoaW4gZWFjaCBibG9jay4gVGhlIGJhc2ljIHN0cnVjdHVyZSBvZiByZXBsaWNhdGVkIFJCRCBpcyBjaGFyYWN0ZXJpemVkIGluIHRoZSBmb2xsb3dpbmcuDQoNCiogKipUcmVhdG1lbnRzIChhKSoqOiBEaWZmZXJlbnQgbGV2ZWxzIG9mIHRoZSBmYWN0b3IgYmVpbmcgdGVzdGVkIChlLmcuLCBmZXJ0aWxpemVycywgZHJ1Z3MpLg0KDQoqICoqQmxvY2tzIChiKSoqOiBHcm91cHMgb2YgaG9tb2dlbmVvdXMgZXhwZXJpbWVudGFsIHVuaXRzIChlLmcuLCBmaWVsZHMsIHBhdGllbnRzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MpLg0KDQoqICoqUmVwbGljYXRlcyAocCkqOiBOdW1iZXIgb2YgdGltZXMgZWFjaCB0cmVhdG1lbnQgaXMgcmVwZWF0ZWQgcGVyIGJsb2NrLg0KDQpUaGUgZ2VuZXJhbCBkYXRhIHRhYmxlIG9mIGEgcmVwbGljYXRlZCBSQkQgZGVzaWduIGlzIGRlcGljdGVkIGJ5DQoNCg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoPSI5MCUifQ0KaW5jbHVkZV9ncmFwaGljcygid2VlazA0L1JCRC1EYXRhTGF5b3V0LnBuZyIpDQpgYGANCg0KVGhlIGRhdGEgdGFibGUgY2VsbCBoYXMgdGhyZWUgaW5kaWNlcyB0byBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0IGJsb2NraW5nLCB0cmVhdG1lbnRzLCBhbmQgbWVhc3VyZW1lbnRzIG9mIHJlcGxpY2F0ZWQgcmVzcG9uc2UsIGFzIHNob3duIGJlbG93Lg0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjkwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJ3ZWVrMDQvUmVwbGljYXRlZFJCRC1jZWxsLnBuZyIpDQpgYGANCg0KDQpUaGUgbmV4dCBZb3VUdWJlIHZpZGVvIGV4cGxhaW5zIHRoZSBSQkQgKHdpdGggbm8gcmVwbGljYXRlcykgdXNpbmcgYSBuaWNlIGV4YW1wbGUuIFlvdSBjYW4gc2tpcCB0aGUgYW5hbHlzaXMgcGFydCBub3cuIFRoZSB2aWRlbyBpcyBhdCAoPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9enFaOWl1azVOZ2smdD0xOTNzPikNCg0KDQpcDQoNCjxjZW50ZXI+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj16cVo5aXVrNU5nayZ0PTE5M3MiIHRhcmdldD0icG9wdXAiIA0KICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXpxWjlpdWs1TmdrJnQ9MTkzcycsDQogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCd3aWR0aD04NTAsaGVpZ2h0PTUwMCcpIj48aW1nIHNyYyA9ICJodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9NQVQxMjFXNS9pbWcvVmlkZW9JY29uLnBuZyIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMjAiPjwvYT4NCjwvY2VudGVyPg0KDQpcDQoNCg0KDQojIyMgQ29uY2x1ZGluZyBSZW1hcmtzIG9uIFJCRA0KDQpUaGUgUmFuZG9taXplZCBCbG9jayBEZXNpZ24gKFJCRCkgaXMgYSBmdW5kYW1lbnRhbCBleHBlcmltZW50YWwgYXBwcm9hY2ggdGhhdCBlbmhhbmNlcyBwcmVjaXNpb24gYnkgZ3JvdXBpbmcgc2ltaWxhciBleHBlcmltZW50YWwgdW5pdHMgaW50byBibG9ja3MgdG8gY29udHJvbCBmb3Iga25vd24gc291cmNlcyBvZiB2YXJpYWJpbGl0eS4gVGhlIGNob2ljZSBiZXR3ZWVuIFJCRCB3aXRob3V0IHJlcGxpY2F0aW9uIChvbmUgZXhwZXJpbWVudGFsIHVuaXQgcGVyIHRyZWF0bWVudCBwZXIgYmxvY2spIGFuZCBSQkQgd2l0aCByZXBsaWNhdGlvbiAobXVsdGlwbGUgdW5pdHMgcGVyIHRyZWF0bWVudCBwZXIgYmxvY2spIGRlcGVuZHMgb24gdGhlIHJlc2VhcmNoIG9iamVjdGl2ZXMsIHJlc291cmNlIGF2YWlsYWJpbGl0eSwgYW5kIHVuZGVybHlpbmcgYXNzdW1wdGlvbnMgYWJvdXQgdHJlYXRtZW50LWJsb2NrIGludGVyYWN0aW9ucy4NCg0KUkJEIHdpdGhvdXQgcmVwbGljYXRpb24gaXMgYSBzaW1wbGUgeWV0IHBvd2VyZnVsIGRlc2lnbiB3aGVuIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRyZWF0bWVudHMgYW5kIGJsb2NrcyBhcmUgbmVnbGlnaWJsZS4gSXQgZWZmaWNpZW50bHkgcmVkdWNlcyBlcnJvciB2YXJpYW5jZSBieSBhY2NvdW50aW5nIGZvciBibG9jayBlZmZlY3RzIHdoaWxlIHJlcXVpcmluZyBmZXdlciBleHBlcmltZW50YWwgdW5pdHMuIEhvd2V2ZXIsIGl0cyBpbmFiaWxpdHkgdG8gdGVzdCBmb3IgaW50ZXJhY3Rpb25zIG1lYW5zIHRoYXQgYW55IGhpZGRlbiB0cmVhdG1lbnQtYmxvY2sgZGVwZW5kZW5jaWVzIG1heSBpbmZsYXRlIHRoZSBlcnJvciB0ZXJtLCBwb3RlbnRpYWxseSBtYXNraW5nIHRydWUgdHJlYXRtZW50IGVmZmVjdHMuIFRoaXMgZGVzaWduIGlzIGlkZWFsIGlmIHdlIGhhdmUgcHJpb3Iga25vd2xlZGdlIHN1Z2dlc3RpbmcgY29uc2lzdGVudCB0cmVhdG1lbnQgZWZmZWN0cyBhY3Jvc3MgYmxvY2tzLg0KDQpJbiBjb250cmFzdCwgUkJEIHdpdGggcmVwbGljYXRpb24gb2ZmZXJzIGdyZWF0ZXIgZmxleGliaWxpdHkgYW5kIHByZWNpc2lvbiBieSBhbGxvd2luZyByZXNlYXJjaGVycyB0byBkZXRlY3QgYW5kIHF1YW50aWZ5IHRyZWF0bWVudC1ibG9jayBpbnRlcmFjdGlvbnMuIFRoaXMgZGVzaWduIGFsc28gaGFzIGxpbWl0YXRpb25zLiBGb3IgZXhhbXBsZSwgdGhpcyBkZXNpZ24gY2Fubm90IGhhbmRsZSB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgZmVydGlsaXplciBwZXJmb3JtcyBkaWZmZXJlbnRseSBpbiBkaXN0aW5jdCBzb2lsIHR5cGVzLiBUaGUgYW5hbHlzaXMgb2YgcmVwbGljYXRlZCBSQkQgaXMgYWxzbyBtb3JlIGNvbXBsZXggdGhhbiB0aGUgYmFzaWMgUkJELg0KDQpVbHRpbWF0ZWx5LCB0aGUgZGVjaXNpb24gYmV0d2VlbiB0aGVzZSB0d28gYXBwcm9hY2hlcyBoaW5nZXMgb24gYmFsYW5jaW5nIHByYWN0aWNhbCBjb25zdHJhaW50cyB3aXRoIHNjaWVudGlmaWMgcmlnb3IuIFJCRCB3aXRob3V0IHJlcGxpY2F0aW9uIHByb3ZpZGVzIGFuIGVmZmljaWVudCBzb2x1dGlvbiBmb3Igc3RyYWlnaHRmb3J3YXJkIGNvbXBhcmlzb25zLCB3aGlsZSBSQkQgd2l0aCByZXBsaWNhdGlvbiBkZWxpdmVycyBkZWVwZXIgaW5zaWdodHMgd2hlbiBpbnRlcmFjdGlvbnMgYXJlIHBsYXVzaWJsZSBvciBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlcXVpcmVkLg0KDQoNCg0KDQoNCg==