Study Guide: Data Mining and Data Types
1. Introduction to Data Mining
- Data Mining: The process of extracting implicit,
previously unknown, or useful information from large data sets.
- Origins:
- John Tukey: A key figure in data mining, famous for
coining the term “bit” and co-inventing the Fast Fourier Transform. His
work laid the foundation for modern data mining, particularly in data
exploration and visualization.
- Gregory Piatetsky-Shapiro: Started the Knowledge
Discovery in Databases workshop in the 1990s, which became foundational
for modern data mining.
- Data Science: Evolved from the need for companies
to hire research scientists without the “research” baggage, focusing on
analyzing data rather than academic research.
2. Data Mining Process
- Pipeline:
- Data Selection: Identifying the relevant data.
- Data Preprocessing: Cleaning and organizing the
data.
- Data Transformation: Converting data into a
suitable format for mining.
- Application of Algorithms: Implementing data mining
techniques.
- Interpretation and Evaluation: Analyzing and
evaluating the results, differentiating data mining from machine
learning by making data interpretable by humans.
3. Data Mining Tasks
- Categories:
- Prediction Tasks: Predicting unknown or future
values (e.g., classification, regression, outlier detection).
- Descriptive Tasks: Making data human-interpretable
(e.g., clustering, association rule discovery, sequential pattern
discovery).
a. Classification
- Definition: Predicting the class of unseen records
based on known attributes.
- Example: Predicting whether a consumer will buy a
product based on demographic information.
- Applications: Marketing, astronomy (e.g.,
classifying galaxies).
b. Regression
- Definition: Predicting a continuous value rather
than a class.
- Example: Predicting deep adipose tissue based on
height and weight.
c. Clustering
- Definition: Grouping similar data points into
clusters, separating distinct clusters.
- Example: Document clustering, such as categorizing
news articles by topic.
d. Association Rule Discovery
- Definition: Discovering rules that show
relationships between items in a dataset.
- Example: Identifying that customers who buy diapers
and milk are also likely to buy beer.
4. Understanding Data and Attributes
- Data Structure:
- Object: A collection of data (rows in a
table).
- Attributes: Properties of the data (columns in a
table).
- Attribute Terminology:
- Attributes: Also known as variables, fields,
characteristics, or features.
- Objects: Also referred to as records, points,
samples, instances, cases, or entities.
5. Types of Attributes
- Categories:
- Discrete Attributes: Nominal and ordinal.
- Nominal: Distinct categories with no order (e.g.,
eye color).
- Ordinal: Ordered categories (e.g., movie
ratings).
- Continuous Attributes: Interval and ratio.
- Interval: Ordered with equal intervals but no true
zero (e.g., temperature in Celsius).
- Ratio: Ordered with a true zero (e.g., temperature
in Kelvin).
- Transformations:
- Nominal: Any permutation is valid.
- Ordinal: Monotonic transformations are valid.
- Interval: Linear transformations are valid (e.g.,
Celsius to Fahrenheit).
- Ratio: Only multiplication by a constant is
valid.
6. Types of Data Sets
- Record Data: Data represented in a table format
(e.g., relational databases).
- Transaction Data: A subset of record data where not
every column needs a value, resembling document-style databases.
- Graph Data: Represents data points and their
relationships (e.g., hyperlinks on the web).
- Ordered Data: Preserves the temporal or sequential
nature of data (e.g., sensor data with timestamps).
Self-Test Questions
- Who is considered the founder of modern data mining?
- What distinguishes data mining from machine learning?
- Describe the difference between classification and regression
tasks.
- What is the significance of clustering in data mining?
- Give an example of an association rule that might be discovered in a
grocery store data set.
- Define what constitutes an object and an attribute in a data
set.
- Differentiate between nominal and ordinal attributes.
- Explain the difference between interval and ratio attributes.
- What is transaction data and how does it differ from record
data?
- Why is ordered data important in the context of sensor data?
Self - Test Answers:
Founder of Modern Data Mining: Gregory
Piatetsky-Shapiro He is a well-known data scientist and the founder of
KDnuggets, a popular website and newsletter on data science and machine
learning. Conduscted first workshops in 1980’s and 90’s.
Piatetsky-Shapiro has made significant contributions to the field
of data mining, including:
Co-founding the KDD (Knowledge Discovery and Data Mining)
conference series: This conference series is one of the most
prestigious and influential in the field of data mining and knowledge
discovery.
Developing the concept of knowledge discovery in
databases (KDD): Piatetsky-Shapiro’s work on KDD helped
establish data mining as a distinct field of research and
practice.
Publishing numerous papers and books on data
mining: His publications have helped shape the field of data
mining and have been widely cited and influential.
What distinguishes data mining from machine
learning?
- Data Mining: Focuses on discovering patterns,
relationships, and insights from large datasets, often using automated
methods. Data mining aims to extract valuable information or knowledge
from data, usually without a specific prediction or decision-making goal
in mind; It’s the process of discovering patterns and knowledge from
large amounts of data. The data sources can include databases, data
warehouses, the internet, etc
- Machine Learning: Focuses on developing algorithms
and models that enable computers to learn from data and make predictions
or decisions. Machine learning is a key aspect of data mining, as it
provides the tools and techniques for analyzing and interpreting data.
Machine learning is a subset of artificial intelligence that involves
the development of algorithms that allow computers to learn from and
make predictions or decisions based on data.
- While data mining is concerned with extracting patterns &
insights from data, machine learning is concerned with using those
insights to make predictions and/or decisions
Classification vs. Regression Tasks:
- Classification: Involves predicting a categorical
label or class that an instance belongs to, based on its features.
Classification tasks typically involve a fixed set of classes, and the
goal is to assign each instance to one of those classes. Examples
include spam vs. non-spam emails, cancer diagnosis (malignant
vs. benign), and product recommendation (e.g., recommending a product
based on user behavior).
- Regression: Involves predicting a continuous value
or numerical outcome based on the input features. Regression tasks aim
to predict a specific value, such as a house price, stock price, or
energy consumption.
To illustrate the difference:
- Classification: “Is this email spam or not?” ( categorical
label)
- Regression: “What is the predicted house price based on its
features?” (continuous value)
3. What is the significance of clustering in data
mining?
Clustering is a type of unsupervised learning technique in data
mining that involves grouping similar instances or data points into
clusters, based on their features. The significance of clustering lies
in its ability to:
- Identify patterns and structures: Clustering helps
reveal hidden patterns and relationships in the data, which can be
useful for understanding the underlying structure of the data.
- Segment data: Clustering enables the segmentation
of data into distinct groups, which can be useful for targeted
marketing, customer profiling, or identifying outliers.
- Anomaly detection: Clustering can help identify
unusual or anomalous data points that do not fit into any cluster, which
can be useful for detecting errors, fraud, or unusual behavior.
- Data reduction: Clustering can reduce the
dimensionality of the data by representing each cluster with a single
point or centroid, making it easier to analyze and visualize the
data.
Overall, clustering is a powerful technique in data mining that can
help uncover insights, identify patterns, and support
decision-making.
Significance of Clustering in Data Mining:
Clustering is significant because it helps in identifying natural
groupings within data. It is used to discover structure in data without
having prior labels. This can be useful in market segmentation, social
network analysis, organization of computing clusters, etc.
Example of an Association Rule: In a grocery
store dataset, an example of an association rule might be: “If a
customer buys bread, they are 70% likely to also buy butter.” This rule
helps in understanding customer buying patterns.
Object and Attribute in a Data Set:
- Object: An object is an entity that contains data.
In a dataset, each row typically represents an object. For example, in a
dataset of students, each student is an object.
- Attribute: An attribute is a property, feature or
characteristic of an object. In the student dataset, attributes might
include name, age, grade, etc.
Nominal vs. Ordinal Attributes:
- Nominal Attributes: These are categorical
attributes without any order. For example, colors like red, blue,
green.
- Ordinal Attributes: These are categorical
attributes with a meaningful order but no fixed interval between them.
For example, rankings like first, second, third.
Interval vs. Ratio Attributes:
- Interval Attributes: These have meaningful
intervals between values but no true zero point. For example,
temperature in Celsius.
- Ratio Attributes: These have both meaningful
intervals and a true zero point, allowing for the calculation of ratios.
For example, weight or height.
Transaction Data vs. Record Data:
- Transaction Data: This refers to data that captures
transactions, typically involving a time component and multiple items.
For example, a sales transaction in a store.
- Record Data: This is structured data where each
record is a fixed set of fields. For example, a database table where
each row is a record.
Importance of Ordered Data in Sensor Data:
Ordered data is crucial in sensor data because it often involves
time-series data where the sequence of data points is important. This
order can reveal trends, patterns, and anomalies over time, which are
essential for monitoring and analysis in applications like weather
forecasting, health monitoring, and industrial automation.
Version 2
Study Guide: Understanding Data Mining and Data
Concepts
1. Introduction to Data Mining
- Definition: Data mining is the non-trivial
extraction of implicit, previously unknown, or useful information from
large data sets.
- Historical Background:
- Foundations: Data mining is built upon three
disciplines: Statistics, Artificial Intelligence (AI), and Machine
Learning (ML).
- Key Figure: John Tukey, considered a founder of
modern data mining, contributed to data exploration, visualization, and
pre-processing techniques.
- Evolution: The term “data mining” emerged in the
1990s, and the field has grown with the rise of “data science,” a term
coined to differentiate between research-focused roles and practical
data analysis roles in companies.
2. Data Mining Processes and Tasks
- Pipeline:
- Data Selection: Choosing relevant data for
analysis.
- Pre-processing: Cleaning and preparing the
data.
- Transformation: Converting data into a suitable
format.
- Data Mining: Applying algorithms to extract
patterns.
- Interpretation & Evaluation: Making the results
understandable and actionable for humans.
- Key Distinctions:
- Data Mining vs. Machine Learning: Data mining
focuses on making patterns interpretable by humans, while ML is more
about automated analysis.
- Categories of Data Mining Tasks:
- Prediction Tasks: Involves predicting unknown or
future values (e.g., classification, regression).
- Descriptive Tasks: Focuses on making data
human-interpretable (e.g., clustering, association rule discovery).
3. Examples of Data Mining Techniques
- Classification:
- Purpose: Predicting the class of previously unseen
records.
- Example: Predicting consumer behavior based on
demographics or classifying galaxies by their formation stage.
- Regression:
- Purpose: Predicting a continuous value rather than
a class.
- Example: Estimating deep adipose tissue based on
height and weight.
- Clustering:
- Purpose: Grouping similar data points into
clusters.
- Example: Document clustering for categorizing news
articles into genres.
- Association Rule Discovery:
- Purpose: Finding rules that associate different
attributes in a data set.
- Example: Market basket analysis, like discovering
that buying diapers is often associated with buying beer.
4. Understanding Data
- Data Structure:
- Objects and Attributes:
- An object is a collection of attributes (e.g., a
row in a table).
- Attributes (also known as variables, fields,
features) represent the properties of the data (e.g., columns in a
table).
- Terminology:
- Object Synonyms: Records, points, samples,
instances, cases, entities.
- Attribute Synonyms: Variables, fields,
characteristics, features.
5. Types of Attributes
- Discrete Attributes:
- Nominal: Distinct categories without order (e.g.,
eye color).
- Ordinal: Categories with a specific order (e.g.,
movie ratings).
- Continuous Attributes:
- Interval: Ordered with equal intervals, no true
zero (e.g., temperature in Celsius).
- Ratio: Ordered with a true zero, supports
multiplication (e.g., height).
6. Types of Data Sets
- Record Data:
- Structure: Data organized in rows and columns,
similar to relational databases.
- Transaction Data: A subset where not every column
needs a value, akin to document-style databases.
- Graph Data:
- Structure: Data represented as nodes and edges,
often used for relationships (e.g., hyperlinks on the web).
- Sequential Data:
- Structure: Data with a preserved order, often
including timestamps (e.g., sensor data).
7. Self-Test Questions
- Reflect on the differences between data mining tasks (e.g.,
classification vs. clustering) and the types of attributes (e.g.,
nominal vs. interval).
- Consider examples of different data set types and how they are
structured.
Self-Test Answers:
Reflecting on the differences between data mining tasks and
types of attributes involves understanding how each task
utilizes data attributes and how datasets are structured to facilitate
these tasks.
Data Mining Tasks
- Classification:
- Purpose: Assigns items to predefined categories or
classes.
- Attributes: Often involves nominal or ordinal
attributes as the target variable (e.g., class labels like ‘spam’ or
‘not spam’).
- Example: Email classification where the dataset
includes attributes like email content, sender, and time, with the
target attribute being the class label (spam/not spam).
- Clustering:
- Purpose: Groups similar items together without
predefined labels.
- Attributes: Can involve any type of attribute, but
often uses numerical (interval or ratio) attributes for calculating
distances or similarities.
- Example: Customer segmentation where the dataset
includes attributes like purchase history, age, and location, and the
goal is to group customers into segments based on similarity.
Types of Attributes
- Nominal Attributes:
- Characteristics: Categorical with no inherent
order.
- Example: Colors (red, blue, green) or product
categories (electronics, clothing, groceries).
- Ordinal Attributes:
- Characteristics: Categorical with a meaningful
order but no fixed interval.
- Example: Customer satisfaction ratings (poor, fair,
good, excellent).
- Interval Attributes:
- Characteristics: Numerical with meaningful
intervals but no true zero.
- Example: Temperature in Celsius or Fahrenheit.
- Ratio Attributes:
- Characteristics: Numerical with meaningful
intervals and a true zero.
- Example: Height, weight, or age.
Examples of Different Data Set Types
- Transactional Data Set:
- Structure: Each record represents a transaction,
often with a timestamp and multiple items.
- Example: A retail sales dataset where each row
includes transaction ID, date, items purchased, and total amount.
- Time-Series Data Set:
- Structure: Ordered data points indexed by
time.
- Example: Stock prices dataset where each row
includes date, opening price, closing price, and volume.
- Spatial Data Set:
- Structure: Data with spatial attributes, often
including coordinates.
- Example: Geographic information system (GIS) data
where each record includes location coordinates and attributes like
elevation or land use type.
- Textual Data Set:
- Structure: Unstructured or semi-structured data,
often requiring preprocessing.
- Example: A collection of documents or social media
posts where each entry includes text content and metadata like author
and timestamp.
Questions from Module 1 Asynch:
- If predicting from other customers, dividing up customers by
potential profitability is:
- Classification and regression (Correct)
- Dividing up customers by potential profitability is
Classification because it involves categorizing
customers into groups based on their potential profitability and
predicting categorical (classification) or continuous (regression)
outcomes.
- Extracting frequency of sound is:
- Not data mining (Correct)
- Extracting frequency of sound is Not data mining
because it is a signal processing task, not a data mining task.
- Finding someone’s adipose tissue measure from waist
circumference is:
- Regression (Correct)
- Finding someone’s adipose tissue measure from waist circumference is
Regression because it involves predicting a continuous
value (adipose tissue measure) based on a single input (another
variable) variable (waist circumference).
- Deciding if a person has diabetes based upon his or her
history and diet is:
- Classification (Correct)
- Classification Task because it involves
categorizing a person as either having diabetes or not. (presence or
absence of).
- Depending on the methods used, deciding if someone will like
a movie on Netflix given ratings of other users is:
Answers A through D (Correct)
Deciding if someone will like a movie on Netflix given ratings of
other users is Answers A through D because it can be
approached using various methods, including Association (e.g.,
collaborative filtering), Classification (e.g., predicting a user’s
rating), Clustering (e.g., grouping similar users), or Regression (e.g.,
predicting a user’s rating).
- Depending on the methods used, finding the genre of an
online article based on the words in it is:
- Classification or clustering (Correct)
- Finding the genre of an online article based on the words in it is
Classification or Clustering because it can be
approached using either Classification (e.g., predicting a specific
genre) or Clustering (e.g., grouping similar articles).
- Depending on the methods used, finding which Google searches
are likely to follow one another is:
- Classification or clustering (Correct)
- It could involve classification (predicting the next search) or
clustering (grouping similar searches).
- Is the brightness from a light meter interval or
ratio?
- Ratio (Correct)
- Brightness from a light meter is Ratio because it
has a true zero point (i.e., complete darkness) and can be measured in a
continuous range.
- Is an angle measured from 0–360 degrees interval or
ratio?
- Could be either interval or ratio (Correct)
- Depending on context, angles could be treated as interval (if
there’s no meaningful zero) or ratio (if 0 degrees is absolute).
- It can be treated as either an interval scale (e.g., when measuring
angles between 0 and 360 degrees) or a ratio scale (e.g., when measuring
angles in radians).
- Is the height above sea level interval or ratio?
- Ratio (Correct)
- Height above sea level has an absolute zero (sea level), and can be
measured in a continuous range, making it a Ratio
Measurement.
- Is military ranking ordinal, nominal, or binary?
- Ordinal (Correct)
- Military ranking is Ordinal because it represents a
ranked /specific order (e.g., private, sergeant, lieutenant), but the
differences between ranks are not necessarily equal.
- Is a coat check number ordinal, nominal, or binary?
- Nominal (Correct)
- A coat check number is a label with no inherent order or numerical
value, making it nominal.
- Is time as a.m. or p.m. ordinal, nominal, or
binary?
- Binary (Correct)
- Time as a.m. or p.m. is Binary because it
represents a simple dichotomy (2 categories, i.e., morning or
afternoon).
- Is the brightness, as given by a human, ordinal, nominal, or
binary?
- Ordinal (Correct)
- Human-perceived brightness is Ordinal because it
represents a subjective ranking (e.g., dim, medium, bright), but the
differences between ranks are not necessarily equal.
- What best describes a database of movies and actors who
played in them?
- Either transaction or graph (Correct)
- A database of movies and actors who played in them is Either
transaction or graph because it can be represented as either a
set of transactions (e.g., actor X played in movie Y) or a graph (e.g.,
actors connected to movies).
- What best describes a database of someone’s Amazon purchase
history?
- Either transaction or graph (Correct)
- A database of someone’s Amazon purchase history is Either
transaction or sequential because it can be represented as
either a set of transactions (e.g., purchase X on date Y) or a sequence
of purchases over time.
- What best describes a data set of people’s attributes with
diabetes?
- Record (Correct)
- A data set of people’s attributes with diabetes is
Record because it represents a collection of individual
records or cases, each with various attributes (e.g., age, blood
pressure, etc.).
- What best describes a database of your movements while
sleeping, recorded each minute?
- Sequential (Correct)
- The data has a temporal sequence, making it sequential.
- Sequential because it represents a sequence of
measurements over time.
Think I’m good here. Set alert for weekly review and homework check
every Wednesday at noon.
LS0tDQp0aXRsZTogIm1sIDczMzEgRmFsbCAyMDI0IFNNVTogTW9kdWxlIDEiDQphdXRob3I6ICJKZXNzaSBNY1BoYXVsOyA4LTI4LTI0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIFN0dWR5IEd1aWRlOiBEYXRhIE1pbmluZyBhbmQgRGF0YSBUeXBlcw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjICoqMS4gSW50cm9kdWN0aW9uIHRvIERhdGEgTWluaW5nKioNCg0KLSAgICoqRGF0YSBNaW5pbmcqKjogVGhlIHByb2Nlc3Mgb2YgZXh0cmFjdGluZyBpbXBsaWNpdCwgcHJldmlvdXNseSB1bmtub3duLCBvciB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBsYXJnZSBkYXRhIHNldHMuDQotICAgKipPcmlnaW5zKio6DQogICAgLSAgICoqSm9obiBUdWtleSoqOiBBIGtleSBmaWd1cmUgaW4gZGF0YSBtaW5pbmcsIGZhbW91cyBmb3IgY29pbmluZyB0aGUgdGVybSAiYml0IiBhbmQgY28taW52ZW50aW5nIHRoZSBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtLiBIaXMgd29yayBsYWlkIHRoZSBmb3VuZGF0aW9uIGZvciBtb2Rlcm4gZGF0YSBtaW5pbmcsIHBhcnRpY3VsYXJseSBpbiBkYXRhIGV4cGxvcmF0aW9uIGFuZCB2aXN1YWxpemF0aW9uLg0KICAgIC0gICAqKkdyZWdvcnkgUGlhdGV0c2t5LVNoYXBpcm8qKjogU3RhcnRlZCB0aGUgS25vd2xlZGdlIERpc2NvdmVyeSBpbiBEYXRhYmFzZXMgd29ya3Nob3AgaW4gdGhlIDE5OTBzLCB3aGljaCBiZWNhbWUgZm91bmRhdGlvbmFsIGZvciBtb2Rlcm4gZGF0YSBtaW5pbmcuDQogICAgLSAgICoqRGF0YSBTY2llbmNlKio6IEV2b2x2ZWQgZnJvbSB0aGUgbmVlZCBmb3IgY29tcGFuaWVzIHRvIGhpcmUgcmVzZWFyY2ggc2NpZW50aXN0cyB3aXRob3V0IHRoZSAicmVzZWFyY2giIGJhZ2dhZ2UsIGZvY3VzaW5nIG9uIGFuYWx5emluZyBkYXRhIHJhdGhlciB0aGFuIGFjYWRlbWljIHJlc2VhcmNoLg0KDQojIyMgKioyLiBEYXRhIE1pbmluZyBQcm9jZXNzKioNCg0KLSAgICoqUGlwZWxpbmUqKjoNCiAgICAxLiAgKipEYXRhIFNlbGVjdGlvbioqOiBJZGVudGlmeWluZyB0aGUgcmVsZXZhbnQgZGF0YS4NCiAgICAyLiAgKipEYXRhIFByZXByb2Nlc3NpbmcqKjogQ2xlYW5pbmcgYW5kIG9yZ2FuaXppbmcgdGhlIGRhdGEuDQogICAgMy4gICoqRGF0YSBUcmFuc2Zvcm1hdGlvbioqOiBDb252ZXJ0aW5nIGRhdGEgaW50byBhIHN1aXRhYmxlIGZvcm1hdCBmb3IgbWluaW5nLg0KICAgIDQuICAqKkFwcGxpY2F0aW9uIG9mIEFsZ29yaXRobXMqKjogSW1wbGVtZW50aW5nIGRhdGEgbWluaW5nIHRlY2huaXF1ZXMuDQogICAgNS4gICoqSW50ZXJwcmV0YXRpb24gYW5kIEV2YWx1YXRpb24qKjogQW5hbHl6aW5nIGFuZCBldmFsdWF0aW5nIHRoZSByZXN1bHRzLCBkaWZmZXJlbnRpYXRpbmcgZGF0YSBtaW5pbmcgZnJvbSBtYWNoaW5lIGxlYXJuaW5nIGJ5IG1ha2luZyBkYXRhIGludGVycHJldGFibGUgYnkgaHVtYW5zLg0KDQojIyMgKiozLiBEYXRhIE1pbmluZyBUYXNrcyoqDQoNCi0gICAqKkNhdGVnb3JpZXMqKjoNCiAgICAtICAgKipQcmVkaWN0aW9uIFRhc2tzKio6IFByZWRpY3RpbmcgdW5rbm93biBvciBmdXR1cmUgdmFsdWVzIChlLmcuLCBjbGFzc2lmaWNhdGlvbiwgcmVncmVzc2lvbiwgb3V0bGllciBkZXRlY3Rpb24pLg0KICAgIC0gICAqKkRlc2NyaXB0aXZlIFRhc2tzKio6IE1ha2luZyBkYXRhIGh1bWFuLWludGVycHJldGFibGUgKGUuZy4sIGNsdXN0ZXJpbmcsIGFzc29jaWF0aW9uIHJ1bGUgZGlzY292ZXJ5LCBzZXF1ZW50aWFsIHBhdHRlcm4gZGlzY292ZXJ5KS4NCg0KIyMjIyAqKmEuIENsYXNzaWZpY2F0aW9uKioNCg0KLSAgICoqRGVmaW5pdGlvbioqOiBQcmVkaWN0aW5nIHRoZSBjbGFzcyBvZiB1bnNlZW4gcmVjb3JkcyBiYXNlZCBvbiBrbm93biBhdHRyaWJ1dGVzLg0KLSAgICoqRXhhbXBsZSoqOiBQcmVkaWN0aW5nIHdoZXRoZXIgYSBjb25zdW1lciB3aWxsIGJ1eSBhIHByb2R1Y3QgYmFzZWQgb24gZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24uDQotICAgKipBcHBsaWNhdGlvbnMqKjogTWFya2V0aW5nLCBhc3Ryb25vbXkgKGUuZy4sIGNsYXNzaWZ5aW5nIGdhbGF4aWVzKS4NCg0KIyMjIyAqKmIuIFJlZ3Jlc3Npb24qKg0KDQotICAgKipEZWZpbml0aW9uKio6IFByZWRpY3RpbmcgYSBjb250aW51b3VzIHZhbHVlIHJhdGhlciB0aGFuIGEgY2xhc3MuDQotICAgKipFeGFtcGxlKio6IFByZWRpY3RpbmcgZGVlcCBhZGlwb3NlIHRpc3N1ZSBiYXNlZCBvbiBoZWlnaHQgYW5kIHdlaWdodC4NCg0KIyMjIyAqKmMuIENsdXN0ZXJpbmcqKg0KDQotICAgKipEZWZpbml0aW9uKio6IEdyb3VwaW5nIHNpbWlsYXIgZGF0YSBwb2ludHMgaW50byBjbHVzdGVycywgc2VwYXJhdGluZyBkaXN0aW5jdCBjbHVzdGVycy4NCi0gICAqKkV4YW1wbGUqKjogRG9jdW1lbnQgY2x1c3RlcmluZywgc3VjaCBhcyBjYXRlZ29yaXppbmcgbmV3cyBhcnRpY2xlcyBieSB0b3BpYy4NCg0KIyMjIyAqKmQuIEFzc29jaWF0aW9uIFJ1bGUgRGlzY292ZXJ5KioNCg0KLSAgICoqRGVmaW5pdGlvbioqOiBEaXNjb3ZlcmluZyBydWxlcyB0aGF0IHNob3cgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGl0ZW1zIGluIGEgZGF0YXNldC4NCi0gICAqKkV4YW1wbGUqKjogSWRlbnRpZnlpbmcgdGhhdCBjdXN0b21lcnMgd2hvIGJ1eSBkaWFwZXJzIGFuZCBtaWxrIGFyZSBhbHNvIGxpa2VseSB0byBidXkgYmVlci4NCg0KIyMjICoqNC4gVW5kZXJzdGFuZGluZyBEYXRhIGFuZCBBdHRyaWJ1dGVzKioNCg0KLSAgICoqRGF0YSBTdHJ1Y3R1cmUqKjoNCiAgICAtICAgKipPYmplY3QqKjogQSBjb2xsZWN0aW9uIG9mIGRhdGEgKHJvd3MgaW4gYSB0YWJsZSkuDQogICAgLSAgICoqQXR0cmlidXRlcyoqOiBQcm9wZXJ0aWVzIG9mIHRoZSBkYXRhIChjb2x1bW5zIGluIGEgdGFibGUpLg0KLSAgICoqQXR0cmlidXRlIFRlcm1pbm9sb2d5Kio6DQogICAgLSAgICoqQXR0cmlidXRlcyoqOiBBbHNvIGtub3duIGFzIHZhcmlhYmxlcywgZmllbGRzLCBjaGFyYWN0ZXJpc3RpY3MsIG9yIGZlYXR1cmVzLg0KICAgIC0gICAqKk9iamVjdHMqKjogQWxzbyByZWZlcnJlZCB0byBhcyByZWNvcmRzLCBwb2ludHMsIHNhbXBsZXMsIGluc3RhbmNlcywgY2FzZXMsIG9yIGVudGl0aWVzLg0KDQojIyMgKio1LiBUeXBlcyBvZiBBdHRyaWJ1dGVzKioNCg0KLSAgICoqQ2F0ZWdvcmllcyoqOg0KICAgIC0gICAqKkRpc2NyZXRlIEF0dHJpYnV0ZXMqKjogTm9taW5hbCBhbmQgb3JkaW5hbC4NCiAgICAgICAgLSAgICoqTm9taW5hbCoqOiBEaXN0aW5jdCBjYXRlZ29yaWVzIHdpdGggbm8gb3JkZXIgKGUuZy4sIGV5ZSBjb2xvcikuDQogICAgICAgIC0gICAqKk9yZGluYWwqKjogT3JkZXJlZCBjYXRlZ29yaWVzIChlLmcuLCBtb3ZpZSByYXRpbmdzKS4NCiAgICAtICAgKipDb250aW51b3VzIEF0dHJpYnV0ZXMqKjogSW50ZXJ2YWwgYW5kIHJhdGlvLg0KICAgICAgICAtICAgKipJbnRlcnZhbCoqOiBPcmRlcmVkIHdpdGggZXF1YWwgaW50ZXJ2YWxzIGJ1dCBubyB0cnVlIHplcm8gKGUuZy4sIHRlbXBlcmF0dXJlIGluIENlbHNpdXMpLg0KICAgICAgICAtICAgKipSYXRpbyoqOiBPcmRlcmVkIHdpdGggYSB0cnVlIHplcm8gKGUuZy4sIHRlbXBlcmF0dXJlIGluIEtlbHZpbikuDQotICAgKipUcmFuc2Zvcm1hdGlvbnMqKjoNCiAgICAtICAgKipOb21pbmFsKio6IEFueSBwZXJtdXRhdGlvbiBpcyB2YWxpZC4NCiAgICAtICAgKipPcmRpbmFsKio6IE1vbm90b25pYyB0cmFuc2Zvcm1hdGlvbnMgYXJlIHZhbGlkLg0KICAgIC0gICAqKkludGVydmFsKio6IExpbmVhciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHZhbGlkIChlLmcuLCBDZWxzaXVzIHRvIEZhaHJlbmhlaXQpLg0KICAgIC0gICAqKlJhdGlvKio6IE9ubHkgbXVsdGlwbGljYXRpb24gYnkgYSBjb25zdGFudCBpcyB2YWxpZC4NCg0KIyMjICoqNi4gVHlwZXMgb2YgRGF0YSBTZXRzKioNCg0KLSAgICoqUmVjb3JkIERhdGEqKjogRGF0YSByZXByZXNlbnRlZCBpbiBhIHRhYmxlIGZvcm1hdCAoZS5nLiwgcmVsYXRpb25hbCBkYXRhYmFzZXMpLg0KLSAgICoqVHJhbnNhY3Rpb24gRGF0YSoqOiBBIHN1YnNldCBvZiByZWNvcmQgZGF0YSB3aGVyZSBub3QgZXZlcnkgY29sdW1uIG5lZWRzIGEgdmFsdWUsIHJlc2VtYmxpbmcgZG9jdW1lbnQtc3R5bGUgZGF0YWJhc2VzLg0KLSAgICoqR3JhcGggRGF0YSoqOiBSZXByZXNlbnRzIGRhdGEgcG9pbnRzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIChlLmcuLCBoeXBlcmxpbmtzIG9uIHRoZSB3ZWIpLg0KLSAgICoqT3JkZXJlZCBEYXRhKio6IFByZXNlcnZlcyB0aGUgdGVtcG9yYWwgb3Igc2VxdWVudGlhbCBuYXR1cmUgb2YgZGF0YSAoZS5nLiwgc2Vuc29yIGRhdGEgd2l0aCB0aW1lc3RhbXBzKS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAqKlNlbGYtVGVzdCBRdWVzdGlvbnMqKg0KDQoxLiAgV2hvIGlzIGNvbnNpZGVyZWQgdGhlIGZvdW5kZXIgb2YgbW9kZXJuIGRhdGEgbWluaW5nPw0KMi4gIFdoYXQgZGlzdGluZ3Vpc2hlcyBkYXRhIG1pbmluZyBmcm9tIG1hY2hpbmUgbGVhcm5pbmc/DQozLiAgRGVzY3JpYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjbGFzc2lmaWNhdGlvbiBhbmQgcmVncmVzc2lvbiB0YXNrcy4NCjQuICBXaGF0IGlzIHRoZSBzaWduaWZpY2FuY2Ugb2YgY2x1c3RlcmluZyBpbiBkYXRhIG1pbmluZz8NCjUuICBHaXZlIGFuIGV4YW1wbGUgb2YgYW4gYXNzb2NpYXRpb24gcnVsZSB0aGF0IG1pZ2h0IGJlIGRpc2NvdmVyZWQgaW4gYSBncm9jZXJ5IHN0b3JlIGRhdGEgc2V0Lg0KNi4gIERlZmluZSB3aGF0IGNvbnN0aXR1dGVzIGFuIG9iamVjdCBhbmQgYW4gYXR0cmlidXRlIGluIGEgZGF0YSBzZXQuDQo3LiAgRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5vbWluYWwgYW5kIG9yZGluYWwgYXR0cmlidXRlcy4NCjguICBFeHBsYWluIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaW50ZXJ2YWwgYW5kIHJhdGlvIGF0dHJpYnV0ZXMuDQo5LiAgV2hhdCBpcyB0cmFuc2FjdGlvbiBkYXRhIGFuZCBob3cgZG9lcyBpdCBkaWZmZXIgZnJvbSByZWNvcmQgZGF0YT8NCjEwLiBXaHkgaXMgb3JkZXJlZCBkYXRhIGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBzZW5zb3IgZGF0YT8NCg0KIyMgU2VsZiAtIFRlc3QgQW5zd2VyczoNCg0KMS4gICoqRm91bmRlciBvZiBNb2Rlcm4gRGF0YSBNaW5pbmcqKjogR3JlZ29yeSBQaWF0ZXRza3ktU2hhcGlybyBIZSBpcyBhIHdlbGwta25vd24gZGF0YSBzY2llbnRpc3QgYW5kIHRoZSBmb3VuZGVyIG9mIEtEbnVnZ2V0cywgYSBwb3B1bGFyIHdlYnNpdGUgYW5kIG5ld3NsZXR0ZXIgb24gZGF0YSBzY2llbmNlIGFuZCBtYWNoaW5lIGxlYXJuaW5nLiBDb25kdXNjdGVkIGZpcnN0IHdvcmtzaG9wcyBpbiAxOTgwJ3MgYW5kIDkwJ3MuDQoNCiAgICAxLiAgUGlhdGV0c2t5LVNoYXBpcm8gaGFzIG1hZGUgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9ucyB0byB0aGUgZmllbGQgb2YgZGF0YSBtaW5pbmcsIGluY2x1ZGluZzoNCg0KICAgICAgICAxLiAgKipDby1mb3VuZGluZyB0aGUgS0REIChLbm93bGVkZ2UgRGlzY292ZXJ5IGFuZCBEYXRhIE1pbmluZykgY29uZmVyZW5jZSBzZXJpZXMqKjogVGhpcyBjb25mZXJlbmNlIHNlcmllcyBpcyBvbmUgb2YgdGhlIG1vc3QgcHJlc3RpZ2lvdXMgYW5kIGluZmx1ZW50aWFsIGluIHRoZSBmaWVsZCBvZiBkYXRhIG1pbmluZyBhbmQga25vd2xlZGdlIGRpc2NvdmVyeS4NCg0KICAgICAgICAyLiAgKipEZXZlbG9waW5nIHRoZSBjb25jZXB0IG9mIGtub3dsZWRnZSBkaXNjb3ZlcnkgaW4gZGF0YWJhc2VzIChLREQpKio6IFBpYXRldHNreS1TaGFwaXJvJ3Mgd29yayBvbiBLREQgaGVscGVkIGVzdGFibGlzaCBkYXRhIG1pbmluZyBhcyBhIGRpc3RpbmN0IGZpZWxkIG9mIHJlc2VhcmNoIGFuZCBwcmFjdGljZS4NCg0KICAgICAgICAzLiAgKipQdWJsaXNoaW5nIG51bWVyb3VzIHBhcGVycyBhbmQgYm9va3Mgb24gZGF0YSBtaW5pbmcqKjogSGlzIHB1YmxpY2F0aW9ucyBoYXZlIGhlbHBlZCBzaGFwZSB0aGUgZmllbGQgb2YgZGF0YSBtaW5pbmcgYW5kIGhhdmUgYmVlbiB3aWRlbHkgY2l0ZWQgYW5kIGluZmx1ZW50aWFsLg0KDQoyLiAgKipXaGF0IGRpc3Rpbmd1aXNoZXMgZGF0YSBtaW5pbmcgZnJvbSBtYWNoaW5lIGxlYXJuaW5nPyoqDQoNCiAgICAtICAgKipEYXRhIE1pbmluZyoqOiBGb2N1c2VzIG9uIGRpc2NvdmVyaW5nIHBhdHRlcm5zLCByZWxhdGlvbnNoaXBzLCBhbmQgaW5zaWdodHMgZnJvbSBsYXJnZSBkYXRhc2V0cywgb2Z0ZW4gdXNpbmcgYXV0b21hdGVkIG1ldGhvZHMuIERhdGEgbWluaW5nIGFpbXMgdG8gZXh0cmFjdCB2YWx1YWJsZSBpbmZvcm1hdGlvbiBvciBrbm93bGVkZ2UgZnJvbSBkYXRhLCB1c3VhbGx5IHdpdGhvdXQgYSBzcGVjaWZpYyBwcmVkaWN0aW9uIG9yIGRlY2lzaW9uLW1ha2luZyBnb2FsIGluIG1pbmQ7IEl0J3MgdGhlIHByb2Nlc3Mgb2YgZGlzY292ZXJpbmcgcGF0dGVybnMgYW5kIGtub3dsZWRnZSBmcm9tIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4gVGhlIGRhdGEgc291cmNlcyBjYW4gaW5jbHVkZSBkYXRhYmFzZXMsIGRhdGEgd2FyZWhvdXNlcywgdGhlIGludGVybmV0LCBldGMNCiAgICAtICAgKipNYWNoaW5lIExlYXJuaW5nKio6IEZvY3VzZXMgb24gZGV2ZWxvcGluZyBhbGdvcml0aG1zIGFuZCBtb2RlbHMgdGhhdCBlbmFibGUgY29tcHV0ZXJzIHRvIGxlYXJuIGZyb20gZGF0YSBhbmQgbWFrZSBwcmVkaWN0aW9ucyBvciBkZWNpc2lvbnMuIE1hY2hpbmUgbGVhcm5pbmcgaXMgYSBrZXkgYXNwZWN0IG9mIGRhdGEgbWluaW5nLCBhcyBpdCBwcm92aWRlcyB0aGUgdG9vbHMgYW5kIHRlY2huaXF1ZXMgZm9yIGFuYWx5emluZyBhbmQgaW50ZXJwcmV0aW5nIGRhdGEuIE1hY2hpbmUgbGVhcm5pbmcgaXMgYSBzdWJzZXQgb2YgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgdGhhdCBpbnZvbHZlcyB0aGUgZGV2ZWxvcG1lbnQgb2YgYWxnb3JpdGhtcyB0aGF0IGFsbG93IGNvbXB1dGVycyB0byBsZWFybiBmcm9tIGFuZCBtYWtlIHByZWRpY3Rpb25zIG9yIGRlY2lzaW9ucyBiYXNlZCBvbiBkYXRhLg0KICAgIC0gICBXaGlsZSBkYXRhIG1pbmluZyBpcyBjb25jZXJuZWQgd2l0aCBleHRyYWN0aW5nIHBhdHRlcm5zICYgaW5zaWdodHMgZnJvbSBkYXRhLCBtYWNoaW5lIGxlYXJuaW5nIGlzIGNvbmNlcm5lZCB3aXRoIHVzaW5nIHRob3NlIGluc2lnaHRzIHRvIG1ha2UgcHJlZGljdGlvbnMgYW5kL29yIGRlY2lzaW9ucw0KDQozLiAgKipDbGFzc2lmaWNhdGlvbiB2cy4gUmVncmVzc2lvbiBUYXNrcyoqOg0KDQogICAgLSAgICoqQ2xhc3NpZmljYXRpb24qKjogSW52b2x2ZXMgcHJlZGljdGluZyBhIGNhdGVnb3JpY2FsIGxhYmVsIG9yIGNsYXNzIHRoYXQgYW4gaW5zdGFuY2UgYmVsb25ncyB0bywgYmFzZWQgb24gaXRzIGZlYXR1cmVzLiBDbGFzc2lmaWNhdGlvbiB0YXNrcyB0eXBpY2FsbHkgaW52b2x2ZSBhIGZpeGVkIHNldCBvZiBjbGFzc2VzLCBhbmQgdGhlIGdvYWwgaXMgdG8gYXNzaWduIGVhY2ggaW5zdGFuY2UgdG8gb25lIG9mIHRob3NlIGNsYXNzZXMuIEV4YW1wbGVzIGluY2x1ZGUgc3BhbSB2cy4gbm9uLXNwYW0gZW1haWxzLCBjYW5jZXIgZGlhZ25vc2lzIChtYWxpZ25hbnQgdnMuIGJlbmlnbiksIGFuZCBwcm9kdWN0IHJlY29tbWVuZGF0aW9uIChlLmcuLCByZWNvbW1lbmRpbmcgYSBwcm9kdWN0IGJhc2VkIG9uIHVzZXIgYmVoYXZpb3IpLg0KICAgIC0gICAqKlJlZ3Jlc3Npb24qKjogSW52b2x2ZXMgcHJlZGljdGluZyBhIGNvbnRpbnVvdXMgdmFsdWUgb3IgbnVtZXJpY2FsIG91dGNvbWUgYmFzZWQgb24gdGhlIGlucHV0IGZlYXR1cmVzLiBSZWdyZXNzaW9uIHRhc2tzIGFpbSB0byBwcmVkaWN0IGEgc3BlY2lmaWMgdmFsdWUsIHN1Y2ggYXMgYSBob3VzZSBwcmljZSwgc3RvY2sgcHJpY2UsIG9yIGVuZXJneSBjb25zdW1wdGlvbi4NCg0KICAgIFRvIGlsbHVzdHJhdGUgdGhlIGRpZmZlcmVuY2U6DQoNCiAgICAtICAgQ2xhc3NpZmljYXRpb246ICJJcyB0aGlzIGVtYWlsIHNwYW0gb3Igbm90PyIgKCBjYXRlZ29yaWNhbCBsYWJlbCkNCiAgICAtICAgUmVncmVzc2lvbjogIldoYXQgaXMgdGhlIHByZWRpY3RlZCBob3VzZSBwcmljZSBiYXNlZCBvbiBpdHMgZmVhdHVyZXM/IiAoY29udGludW91cyB2YWx1ZSkNCg0KICAgICoqMy4gV2hhdCBpcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGNsdXN0ZXJpbmcgaW4gZGF0YSBtaW5pbmc/KioNCg0KICAgIENsdXN0ZXJpbmcgaXMgYSB0eXBlIG9mIHVuc3VwZXJ2aXNlZCBsZWFybmluZyB0ZWNobmlxdWUgaW4gZGF0YSBtaW5pbmcgdGhhdCBpbnZvbHZlcyBncm91cGluZyBzaW1pbGFyIGluc3RhbmNlcyBvciBkYXRhIHBvaW50cyBpbnRvIGNsdXN0ZXJzLCBiYXNlZCBvbiB0aGVpciBmZWF0dXJlcy4gVGhlIHNpZ25pZmljYW5jZSBvZiBjbHVzdGVyaW5nIGxpZXMgaW4gaXRzIGFiaWxpdHkgdG86DQoNCiAgICAtICAgKipJZGVudGlmeSBwYXR0ZXJucyBhbmQgc3RydWN0dXJlcyoqOiBDbHVzdGVyaW5nIGhlbHBzIHJldmVhbCBoaWRkZW4gcGF0dGVybnMgYW5kIHJlbGF0aW9uc2hpcHMgaW4gdGhlIGRhdGEsIHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHVuZGVybHlpbmcgc3RydWN0dXJlIG9mIHRoZSBkYXRhLg0KICAgIC0gICAqKlNlZ21lbnQgZGF0YSoqOiBDbHVzdGVyaW5nIGVuYWJsZXMgdGhlIHNlZ21lbnRhdGlvbiBvZiBkYXRhIGludG8gZGlzdGluY3QgZ3JvdXBzLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciB0YXJnZXRlZCBtYXJrZXRpbmcsIGN1c3RvbWVyIHByb2ZpbGluZywgb3IgaWRlbnRpZnlpbmcgb3V0bGllcnMuDQogICAgLSAgICoqQW5vbWFseSBkZXRlY3Rpb24qKjogQ2x1c3RlcmluZyBjYW4gaGVscCBpZGVudGlmeSB1bnVzdWFsIG9yIGFub21hbG91cyBkYXRhIHBvaW50cyB0aGF0IGRvIG5vdCBmaXQgaW50byBhbnkgY2x1c3Rlciwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgZGV0ZWN0aW5nIGVycm9ycywgZnJhdWQsIG9yIHVudXN1YWwgYmVoYXZpb3IuDQogICAgLSAgICoqRGF0YSByZWR1Y3Rpb24qKjogQ2x1c3RlcmluZyBjYW4gcmVkdWNlIHRoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgZGF0YSBieSByZXByZXNlbnRpbmcgZWFjaCBjbHVzdGVyIHdpdGggYSBzaW5nbGUgcG9pbnQgb3IgY2VudHJvaWQsIG1ha2luZyBpdCBlYXNpZXIgdG8gYW5hbHl6ZSBhbmQgdmlzdWFsaXplIHRoZSBkYXRhLg0KDQogICAgT3ZlcmFsbCwgY2x1c3RlcmluZyBpcyBhIHBvd2VyZnVsIHRlY2huaXF1ZSBpbiBkYXRhIG1pbmluZyB0aGF0IGNhbiBoZWxwIHVuY292ZXIgaW5zaWdodHMsIGlkZW50aWZ5IHBhdHRlcm5zLCBhbmQgc3VwcG9ydCBkZWNpc2lvbi1tYWtpbmcuDQoNCjQuICAqKlNpZ25pZmljYW5jZSBvZiBDbHVzdGVyaW5nIGluIERhdGEgTWluaW5nKio6IENsdXN0ZXJpbmcgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZSBpdCBoZWxwcyBpbiBpZGVudGlmeWluZyBuYXR1cmFsIGdyb3VwaW5ncyB3aXRoaW4gZGF0YS4gSXQgaXMgdXNlZCB0byBkaXNjb3ZlciBzdHJ1Y3R1cmUgaW4gZGF0YSB3aXRob3V0IGhhdmluZyBwcmlvciBsYWJlbHMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBtYXJrZXQgc2VnbWVudGF0aW9uLCBzb2NpYWwgbmV0d29yayBhbmFseXNpcywgb3JnYW5pemF0aW9uIG9mIGNvbXB1dGluZyBjbHVzdGVycywgZXRjLg0KDQo1LiAgKipFeGFtcGxlIG9mIGFuIEFzc29jaWF0aW9uIFJ1bGUqKjogSW4gYSBncm9jZXJ5IHN0b3JlIGRhdGFzZXQsIGFuIGV4YW1wbGUgb2YgYW4gYXNzb2NpYXRpb24gcnVsZSBtaWdodCBiZTogIklmIGEgY3VzdG9tZXIgYnV5cyBicmVhZCwgdGhleSBhcmUgNzAlIGxpa2VseSB0byBhbHNvIGJ1eSBidXR0ZXIuIiBUaGlzIHJ1bGUgaGVscHMgaW4gdW5kZXJzdGFuZGluZyBjdXN0b21lciBidXlpbmcgcGF0dGVybnMuDQoNCjYuICAqKk9iamVjdCBhbmQgQXR0cmlidXRlIGluIGEgRGF0YSBTZXQqKjoNCg0KICAgIC0gICAqKk9iamVjdCoqOiBBbiBvYmplY3QgaXMgYW4gZW50aXR5IHRoYXQgY29udGFpbnMgZGF0YS4gSW4gYSBkYXRhc2V0LCBlYWNoIHJvdyB0eXBpY2FsbHkgcmVwcmVzZW50cyBhbiBvYmplY3QuIEZvciBleGFtcGxlLCBpbiBhIGRhdGFzZXQgb2Ygc3R1ZGVudHMsIGVhY2ggc3R1ZGVudCBpcyBhbiBvYmplY3QuDQogICAgLSAgICoqQXR0cmlidXRlKio6IEFuIGF0dHJpYnV0ZSBpcyBhIHByb3BlcnR5LCBmZWF0dXJlIG9yIGNoYXJhY3RlcmlzdGljIG9mIGFuIG9iamVjdC4gSW4gdGhlIHN0dWRlbnQgZGF0YXNldCwgYXR0cmlidXRlcyBtaWdodCBpbmNsdWRlIG5hbWUsIGFnZSwgZ3JhZGUsIGV0Yy4NCg0KNy4gICoqTm9taW5hbCB2cy4gT3JkaW5hbCBBdHRyaWJ1dGVzKio6DQoNCiAgICAtICAgKipOb21pbmFsIEF0dHJpYnV0ZXMqKjogVGhlc2UgYXJlIGNhdGVnb3JpY2FsIGF0dHJpYnV0ZXMgd2l0aG91dCBhbnkgb3JkZXIuIEZvciBleGFtcGxlLCBjb2xvcnMgbGlrZSByZWQsIGJsdWUsIGdyZWVuLg0KICAgIC0gICAqKk9yZGluYWwgQXR0cmlidXRlcyoqOiBUaGVzZSBhcmUgY2F0ZWdvcmljYWwgYXR0cmlidXRlcyB3aXRoIGEgbWVhbmluZ2Z1bCBvcmRlciBidXQgbm8gZml4ZWQgaW50ZXJ2YWwgYmV0d2VlbiB0aGVtLiBGb3IgZXhhbXBsZSwgcmFua2luZ3MgbGlrZSBmaXJzdCwgc2Vjb25kLCB0aGlyZC4NCg0KOC4gICoqSW50ZXJ2YWwgdnMuIFJhdGlvIEF0dHJpYnV0ZXMqKjoNCg0KICAgIC0gICAqKkludGVydmFsIEF0dHJpYnV0ZXMqKjogVGhlc2UgaGF2ZSBtZWFuaW5nZnVsIGludGVydmFscyBiZXR3ZWVuIHZhbHVlcyBidXQgbm8gdHJ1ZSB6ZXJvIHBvaW50LiBGb3IgZXhhbXBsZSwgdGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cy4NCiAgICAtICAgKipSYXRpbyBBdHRyaWJ1dGVzKio6IFRoZXNlIGhhdmUgYm90aCBtZWFuaW5nZnVsIGludGVydmFscyBhbmQgYSB0cnVlIHplcm8gcG9pbnQsIGFsbG93aW5nIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgcmF0aW9zLiBGb3IgZXhhbXBsZSwgd2VpZ2h0IG9yIGhlaWdodC4NCg0KOS4gICoqVHJhbnNhY3Rpb24gRGF0YSB2cy4gUmVjb3JkIERhdGEqKjoNCg0KICAgIC0gICAqKlRyYW5zYWN0aW9uIERhdGEqKjogVGhpcyByZWZlcnMgdG8gZGF0YSB0aGF0IGNhcHR1cmVzIHRyYW5zYWN0aW9ucywgdHlwaWNhbGx5IGludm9sdmluZyBhIHRpbWUgY29tcG9uZW50IGFuZCBtdWx0aXBsZSBpdGVtcy4gRm9yIGV4YW1wbGUsIGEgc2FsZXMgdHJhbnNhY3Rpb24gaW4gYSBzdG9yZS4NCiAgICAtICAgKipSZWNvcmQgRGF0YSoqOiBUaGlzIGlzIHN0cnVjdHVyZWQgZGF0YSB3aGVyZSBlYWNoIHJlY29yZCBpcyBhIGZpeGVkIHNldCBvZiBmaWVsZHMuIEZvciBleGFtcGxlLCBhIGRhdGFiYXNlIHRhYmxlIHdoZXJlIGVhY2ggcm93IGlzIGEgcmVjb3JkLg0KDQoxMC4gKipJbXBvcnRhbmNlIG9mIE9yZGVyZWQgRGF0YSBpbiBTZW5zb3IgRGF0YSoqOiBPcmRlcmVkIGRhdGEgaXMgY3J1Y2lhbCBpbiBzZW5zb3IgZGF0YSBiZWNhdXNlIGl0IG9mdGVuIGludm9sdmVzIHRpbWUtc2VyaWVzIGRhdGEgd2hlcmUgdGhlIHNlcXVlbmNlIG9mIGRhdGEgcG9pbnRzIGlzIGltcG9ydGFudC4gVGhpcyBvcmRlciBjYW4gcmV2ZWFsIHRyZW5kcywgcGF0dGVybnMsIGFuZCBhbm9tYWxpZXMgb3ZlciB0aW1lLCB3aGljaCBhcmUgZXNzZW50aWFsIGZvciBtb25pdG9yaW5nIGFuZCBhbmFseXNpcyBpbiBhcHBsaWNhdGlvbnMgbGlrZSB3ZWF0aGVyIGZvcmVjYXN0aW5nLCBoZWFsdGggbW9uaXRvcmluZywgYW5kIGluZHVzdHJpYWwgYXV0b21hdGlvbi4NCg0KIyBWZXJzaW9uIDINCg0KIyMjICoqU3R1ZHkgR3VpZGU6IFVuZGVyc3RhbmRpbmcgRGF0YSBNaW5pbmcgYW5kIERhdGEgQ29uY2VwdHMqKg0KDQojIyMjICoqMS4gSW50cm9kdWN0aW9uIHRvIERhdGEgTWluaW5nKioNCg0KLSAgICoqRGVmaW5pdGlvbioqOiBEYXRhIG1pbmluZyBpcyB0aGUgbm9uLXRyaXZpYWwgZXh0cmFjdGlvbiBvZiBpbXBsaWNpdCwgcHJldmlvdXNseSB1bmtub3duLCBvciB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBsYXJnZSBkYXRhIHNldHMuDQotICAgKipIaXN0b3JpY2FsIEJhY2tncm91bmQqKjoNCiAgICAtICAgKipGb3VuZGF0aW9ucyoqOiBEYXRhIG1pbmluZyBpcyBidWlsdCB1cG9uIHRocmVlIGRpc2NpcGxpbmVzOiBTdGF0aXN0aWNzLCBBcnRpZmljaWFsIEludGVsbGlnZW5jZSAoQUkpLCBhbmQgTWFjaGluZSBMZWFybmluZyAoTUwpLg0KICAgIC0gICAqKktleSBGaWd1cmUqKjogSm9obiBUdWtleSwgY29uc2lkZXJlZCBhIGZvdW5kZXIgb2YgbW9kZXJuIGRhdGEgbWluaW5nLCBjb250cmlidXRlZCB0byBkYXRhIGV4cGxvcmF0aW9uLCB2aXN1YWxpemF0aW9uLCBhbmQgcHJlLXByb2Nlc3NpbmcgdGVjaG5pcXVlcy4NCiAgICAtICAgKipFdm9sdXRpb24qKjogVGhlIHRlcm0gImRhdGEgbWluaW5nIiBlbWVyZ2VkIGluIHRoZSAxOTkwcywgYW5kIHRoZSBmaWVsZCBoYXMgZ3Jvd24gd2l0aCB0aGUgcmlzZSBvZiAiZGF0YSBzY2llbmNlLCIgYSB0ZXJtIGNvaW5lZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVzZWFyY2gtZm9jdXNlZCByb2xlcyBhbmQgcHJhY3RpY2FsIGRhdGEgYW5hbHlzaXMgcm9sZXMgaW4gY29tcGFuaWVzLg0KDQojIyMjICoqMi4gRGF0YSBNaW5pbmcgUHJvY2Vzc2VzIGFuZCBUYXNrcyoqDQoNCi0gICAqKlBpcGVsaW5lKio6DQogICAgMS4gICoqRGF0YSBTZWxlY3Rpb24qKjogQ2hvb3NpbmcgcmVsZXZhbnQgZGF0YSBmb3IgYW5hbHlzaXMuDQogICAgMi4gICoqUHJlLXByb2Nlc3NpbmcqKjogQ2xlYW5pbmcgYW5kIHByZXBhcmluZyB0aGUgZGF0YS4NCiAgICAzLiAgKipUcmFuc2Zvcm1hdGlvbioqOiBDb252ZXJ0aW5nIGRhdGEgaW50byBhIHN1aXRhYmxlIGZvcm1hdC4NCiAgICA0LiAgKipEYXRhIE1pbmluZyoqOiBBcHBseWluZyBhbGdvcml0aG1zIHRvIGV4dHJhY3QgcGF0dGVybnMuDQogICAgNS4gICoqSW50ZXJwcmV0YXRpb24gJiBFdmFsdWF0aW9uKio6IE1ha2luZyB0aGUgcmVzdWx0cyB1bmRlcnN0YW5kYWJsZSBhbmQgYWN0aW9uYWJsZSBmb3IgaHVtYW5zLg0KLSAgICoqS2V5IERpc3RpbmN0aW9ucyoqOg0KICAgIC0gICAqKkRhdGEgTWluaW5nIHZzLiBNYWNoaW5lIExlYXJuaW5nKio6IERhdGEgbWluaW5nIGZvY3VzZXMgb24gbWFraW5nIHBhdHRlcm5zIGludGVycHJldGFibGUgYnkgaHVtYW5zLCB3aGlsZSBNTCBpcyBtb3JlIGFib3V0IGF1dG9tYXRlZCBhbmFseXNpcy4NCi0gICAqKkNhdGVnb3JpZXMgb2YgRGF0YSBNaW5pbmcgVGFza3MqKjoNCiAgICAxLiAgKipQcmVkaWN0aW9uIFRhc2tzKio6IEludm9sdmVzIHByZWRpY3RpbmcgdW5rbm93biBvciBmdXR1cmUgdmFsdWVzIChlLmcuLCBjbGFzc2lmaWNhdGlvbiwgcmVncmVzc2lvbikuDQogICAgMi4gICoqRGVzY3JpcHRpdmUgVGFza3MqKjogRm9jdXNlcyBvbiBtYWtpbmcgZGF0YSBodW1hbi1pbnRlcnByZXRhYmxlIChlLmcuLCBjbHVzdGVyaW5nLCBhc3NvY2lhdGlvbiBydWxlIGRpc2NvdmVyeSkuDQoNCiMjIyMgKiozLiBFeGFtcGxlcyBvZiBEYXRhIE1pbmluZyBUZWNobmlxdWVzKioNCg0KLSAgICoqQ2xhc3NpZmljYXRpb24qKjoNCiAgICAtICAgKipQdXJwb3NlKio6IFByZWRpY3RpbmcgdGhlIGNsYXNzIG9mIHByZXZpb3VzbHkgdW5zZWVuIHJlY29yZHMuDQogICAgLSAgICoqRXhhbXBsZSoqOiBQcmVkaWN0aW5nIGNvbnN1bWVyIGJlaGF2aW9yIGJhc2VkIG9uIGRlbW9ncmFwaGljcyBvciBjbGFzc2lmeWluZyBnYWxheGllcyBieSB0aGVpciBmb3JtYXRpb24gc3RhZ2UuDQotICAgKipSZWdyZXNzaW9uKio6DQogICAgLSAgICoqUHVycG9zZSoqOiBQcmVkaWN0aW5nIGEgY29udGludW91cyB2YWx1ZSByYXRoZXIgdGhhbiBhIGNsYXNzLg0KICAgIC0gICAqKkV4YW1wbGUqKjogRXN0aW1hdGluZyBkZWVwIGFkaXBvc2UgdGlzc3VlIGJhc2VkIG9uIGhlaWdodCBhbmQgd2VpZ2h0Lg0KLSAgICoqQ2x1c3RlcmluZyoqOg0KICAgIC0gICAqKlB1cnBvc2UqKjogR3JvdXBpbmcgc2ltaWxhciBkYXRhIHBvaW50cyBpbnRvIGNsdXN0ZXJzLg0KICAgIC0gICAqKkV4YW1wbGUqKjogRG9jdW1lbnQgY2x1c3RlcmluZyBmb3IgY2F0ZWdvcml6aW5nIG5ld3MgYXJ0aWNsZXMgaW50byBnZW5yZXMuDQotICAgKipBc3NvY2lhdGlvbiBSdWxlIERpc2NvdmVyeSoqOg0KICAgIC0gICAqKlB1cnBvc2UqKjogRmluZGluZyBydWxlcyB0aGF0IGFzc29jaWF0ZSBkaWZmZXJlbnQgYXR0cmlidXRlcyBpbiBhIGRhdGEgc2V0Lg0KICAgIC0gICAqKkV4YW1wbGUqKjogTWFya2V0IGJhc2tldCBhbmFseXNpcywgbGlrZSBkaXNjb3ZlcmluZyB0aGF0IGJ1eWluZyBkaWFwZXJzIGlzIG9mdGVuIGFzc29jaWF0ZWQgd2l0aCBidXlpbmcgYmVlci4NCg0KIyMjIyAqKjQuIFVuZGVyc3RhbmRpbmcgRGF0YSoqDQoNCi0gICAqKkRhdGEgU3RydWN0dXJlKio6DQogICAgLSAgICoqT2JqZWN0cyBhbmQgQXR0cmlidXRlcyoqOg0KICAgICAgICAtICAgQW4gKipvYmplY3QqKiBpcyBhIGNvbGxlY3Rpb24gb2YgYXR0cmlidXRlcyAoZS5nLiwgYSByb3cgaW4gYSB0YWJsZSkuDQogICAgICAgIC0gICAqKkF0dHJpYnV0ZXMqKiAoYWxzbyBrbm93biBhcyB2YXJpYWJsZXMsIGZpZWxkcywgZmVhdHVyZXMpIHJlcHJlc2VudCB0aGUgcHJvcGVydGllcyBvZiB0aGUgZGF0YSAoZS5nLiwgY29sdW1ucyBpbiBhIHRhYmxlKS4NCi0gICAqKlRlcm1pbm9sb2d5Kio6DQogICAgLSAgICoqT2JqZWN0IFN5bm9ueW1zKio6IFJlY29yZHMsIHBvaW50cywgc2FtcGxlcywgaW5zdGFuY2VzLCBjYXNlcywgZW50aXRpZXMuDQogICAgLSAgICoqQXR0cmlidXRlIFN5bm9ueW1zKio6IFZhcmlhYmxlcywgZmllbGRzLCBjaGFyYWN0ZXJpc3RpY3MsIGZlYXR1cmVzLg0KDQojIyMjICoqNS4gVHlwZXMgb2YgQXR0cmlidXRlcyoqDQoNCi0gICAqKkRpc2NyZXRlIEF0dHJpYnV0ZXMqKjoNCiAgICAtICAgKipOb21pbmFsKio6IERpc3RpbmN0IGNhdGVnb3JpZXMgd2l0aG91dCBvcmRlciAoZS5nLiwgZXllIGNvbG9yKS4NCiAgICAtICAgKipPcmRpbmFsKio6IENhdGVnb3JpZXMgd2l0aCBhIHNwZWNpZmljIG9yZGVyIChlLmcuLCBtb3ZpZSByYXRpbmdzKS4NCi0gICAqKkNvbnRpbnVvdXMgQXR0cmlidXRlcyoqOg0KICAgIC0gICAqKkludGVydmFsKio6IE9yZGVyZWQgd2l0aCBlcXVhbCBpbnRlcnZhbHMsIG5vIHRydWUgemVybyAoZS5nLiwgdGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cykuDQogICAgLSAgICoqUmF0aW8qKjogT3JkZXJlZCB3aXRoIGEgdHJ1ZSB6ZXJvLCBzdXBwb3J0cyBtdWx0aXBsaWNhdGlvbiAoZS5nLiwgaGVpZ2h0KS4NCg0KIyMjIyAqKjYuIFR5cGVzIG9mIERhdGEgU2V0cyoqDQoNCi0gICAqKlJlY29yZCBEYXRhKio6DQogICAgLSAgICoqU3RydWN0dXJlKio6IERhdGEgb3JnYW5pemVkIGluIHJvd3MgYW5kIGNvbHVtbnMsIHNpbWlsYXIgdG8gcmVsYXRpb25hbCBkYXRhYmFzZXMuDQogICAgLSAgICoqVHJhbnNhY3Rpb24gRGF0YSoqOiBBIHN1YnNldCB3aGVyZSBub3QgZXZlcnkgY29sdW1uIG5lZWRzIGEgdmFsdWUsIGFraW4gdG8gZG9jdW1lbnQtc3R5bGUgZGF0YWJhc2VzLg0KLSAgICoqR3JhcGggRGF0YSoqOg0KICAgIC0gICAqKlN0cnVjdHVyZSoqOiBEYXRhIHJlcHJlc2VudGVkIGFzIG5vZGVzIGFuZCBlZGdlcywgb2Z0ZW4gdXNlZCBmb3IgcmVsYXRpb25zaGlwcyAoZS5nLiwgaHlwZXJsaW5rcyBvbiB0aGUgd2ViKS4NCi0gICAqKlNlcXVlbnRpYWwgRGF0YSoqOg0KICAgIC0gICAqKlN0cnVjdHVyZSoqOiBEYXRhIHdpdGggYSBwcmVzZXJ2ZWQgb3JkZXIsIG9mdGVuIGluY2x1ZGluZyB0aW1lc3RhbXBzIChlLmcuLCBzZW5zb3IgZGF0YSkuDQoNCiMjIyMgKio3LiBTZWxmLVRlc3QgUXVlc3Rpb25zKioNCg0KLSAgIFJlZmxlY3Qgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gZGF0YSBtaW5pbmcgdGFza3MgKGUuZy4sIGNsYXNzaWZpY2F0aW9uIHZzLiBjbHVzdGVyaW5nKSBhbmQgdGhlIHR5cGVzIG9mIGF0dHJpYnV0ZXMgKGUuZy4sIG5vbWluYWwgdnMuIGludGVydmFsKS4NCi0gICBDb25zaWRlciBleGFtcGxlcyBvZiBkaWZmZXJlbnQgZGF0YSBzZXQgdHlwZXMgYW5kIGhvdyB0aGV5IGFyZSBzdHJ1Y3R1cmVkLg0KDQojIyBTZWxmLVRlc3QgQW5zd2VyczoNCg0KUmVmbGVjdGluZyBvbiB0aGUgKipkaWZmZXJlbmNlcyBiZXR3ZWVuIGRhdGEgbWluaW5nIHRhc2tzIGFuZCB0eXBlcyBvZiBhdHRyaWJ1dGVzKiogaW52b2x2ZXMgdW5kZXJzdGFuZGluZyBob3cgZWFjaCB0YXNrIHV0aWxpemVzIGRhdGEgYXR0cmlidXRlcyBhbmQgaG93IGRhdGFzZXRzIGFyZSBzdHJ1Y3R1cmVkIHRvIGZhY2lsaXRhdGUgdGhlc2UgdGFza3MuDQoNCiMjIyBEYXRhIE1pbmluZyBUYXNrcw0KDQoxLiAgKipDbGFzc2lmaWNhdGlvbioqOg0KICAgIC0gICAqKlB1cnBvc2UqKjogQXNzaWducyBpdGVtcyB0byBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgb3IgY2xhc3Nlcy4NCiAgICAtICAgKipBdHRyaWJ1dGVzKio6IE9mdGVuIGludm9sdmVzIG5vbWluYWwgb3Igb3JkaW5hbCBhdHRyaWJ1dGVzIGFzIHRoZSB0YXJnZXQgdmFyaWFibGUgKGUuZy4sIGNsYXNzIGxhYmVscyBsaWtlICdzcGFtJyBvciAnbm90IHNwYW0nKS4NCiAgICAtICAgKipFeGFtcGxlKio6IEVtYWlsIGNsYXNzaWZpY2F0aW9uIHdoZXJlIHRoZSBkYXRhc2V0IGluY2x1ZGVzIGF0dHJpYnV0ZXMgbGlrZSBlbWFpbCBjb250ZW50LCBzZW5kZXIsIGFuZCB0aW1lLCB3aXRoIHRoZSB0YXJnZXQgYXR0cmlidXRlIGJlaW5nIHRoZSBjbGFzcyBsYWJlbCAoc3BhbS9ub3Qgc3BhbSkuDQoyLiAgKipDbHVzdGVyaW5nKio6DQogICAgLSAgICoqUHVycG9zZSoqOiBHcm91cHMgc2ltaWxhciBpdGVtcyB0b2dldGhlciB3aXRob3V0IHByZWRlZmluZWQgbGFiZWxzLg0KICAgIC0gICAqKkF0dHJpYnV0ZXMqKjogQ2FuIGludm9sdmUgYW55IHR5cGUgb2YgYXR0cmlidXRlLCBidXQgb2Z0ZW4gdXNlcyBudW1lcmljYWwgKGludGVydmFsIG9yIHJhdGlvKSBhdHRyaWJ1dGVzIGZvciBjYWxjdWxhdGluZyBkaXN0YW5jZXMgb3Igc2ltaWxhcml0aWVzLg0KICAgIC0gICAqKkV4YW1wbGUqKjogQ3VzdG9tZXIgc2VnbWVudGF0aW9uIHdoZXJlIHRoZSBkYXRhc2V0IGluY2x1ZGVzIGF0dHJpYnV0ZXMgbGlrZSBwdXJjaGFzZSBoaXN0b3J5LCBhZ2UsIGFuZCBsb2NhdGlvbiwgYW5kIHRoZSBnb2FsIGlzIHRvIGdyb3VwIGN1c3RvbWVycyBpbnRvIHNlZ21lbnRzIGJhc2VkIG9uIHNpbWlsYXJpdHkuDQoNCiMjIyBUeXBlcyBvZiBBdHRyaWJ1dGVzDQoNCjEuICAqKk5vbWluYWwgQXR0cmlidXRlcyoqOg0KICAgIC0gICAqKkNoYXJhY3RlcmlzdGljcyoqOiBDYXRlZ29yaWNhbCB3aXRoIG5vIGluaGVyZW50IG9yZGVyLg0KICAgIC0gICAqKkV4YW1wbGUqKjogQ29sb3JzIChyZWQsIGJsdWUsIGdyZWVuKSBvciBwcm9kdWN0IGNhdGVnb3JpZXMgKGVsZWN0cm9uaWNzLCBjbG90aGluZywgZ3JvY2VyaWVzKS4NCjIuICAqKk9yZGluYWwgQXR0cmlidXRlcyoqOg0KICAgIC0gICAqKkNoYXJhY3RlcmlzdGljcyoqOiBDYXRlZ29yaWNhbCB3aXRoIGEgbWVhbmluZ2Z1bCBvcmRlciBidXQgbm8gZml4ZWQgaW50ZXJ2YWwuDQogICAgLSAgICoqRXhhbXBsZSoqOiBDdXN0b21lciBzYXRpc2ZhY3Rpb24gcmF0aW5ncyAocG9vciwgZmFpciwgZ29vZCwgZXhjZWxsZW50KS4NCjMuICAqKkludGVydmFsIEF0dHJpYnV0ZXMqKjoNCiAgICAtICAgKipDaGFyYWN0ZXJpc3RpY3MqKjogTnVtZXJpY2FsIHdpdGggbWVhbmluZ2Z1bCBpbnRlcnZhbHMgYnV0IG5vIHRydWUgemVyby4NCiAgICAtICAgKipFeGFtcGxlKio6IFRlbXBlcmF0dXJlIGluIENlbHNpdXMgb3IgRmFocmVuaGVpdC4NCjQuICAqKlJhdGlvIEF0dHJpYnV0ZXMqKjoNCiAgICAtICAgKipDaGFyYWN0ZXJpc3RpY3MqKjogTnVtZXJpY2FsIHdpdGggbWVhbmluZ2Z1bCBpbnRlcnZhbHMgYW5kIGEgdHJ1ZSB6ZXJvLg0KICAgIC0gICAqKkV4YW1wbGUqKjogSGVpZ2h0LCB3ZWlnaHQsIG9yIGFnZS4NCg0KIyMjIEV4YW1wbGVzIG9mIERpZmZlcmVudCBEYXRhIFNldCBUeXBlcw0KDQoxLiAgKipUcmFuc2FjdGlvbmFsIERhdGEgU2V0Kio6DQogICAgLSAgICoqU3RydWN0dXJlKio6IEVhY2ggcmVjb3JkIHJlcHJlc2VudHMgYSB0cmFuc2FjdGlvbiwgb2Z0ZW4gd2l0aCBhIHRpbWVzdGFtcCBhbmQgbXVsdGlwbGUgaXRlbXMuDQogICAgLSAgICoqRXhhbXBsZSoqOiBBIHJldGFpbCBzYWxlcyBkYXRhc2V0IHdoZXJlIGVhY2ggcm93IGluY2x1ZGVzIHRyYW5zYWN0aW9uIElELCBkYXRlLCBpdGVtcyBwdXJjaGFzZWQsIGFuZCB0b3RhbCBhbW91bnQuDQoyLiAgKipUaW1lLVNlcmllcyBEYXRhIFNldCoqOg0KICAgIC0gICAqKlN0cnVjdHVyZSoqOiBPcmRlcmVkIGRhdGEgcG9pbnRzIGluZGV4ZWQgYnkgdGltZS4NCiAgICAtICAgKipFeGFtcGxlKio6IFN0b2NrIHByaWNlcyBkYXRhc2V0IHdoZXJlIGVhY2ggcm93IGluY2x1ZGVzIGRhdGUsIG9wZW5pbmcgcHJpY2UsIGNsb3NpbmcgcHJpY2UsIGFuZCB2b2x1bWUuDQozLiAgKipTcGF0aWFsIERhdGEgU2V0Kio6DQogICAgLSAgICoqU3RydWN0dXJlKio6IERhdGEgd2l0aCBzcGF0aWFsIGF0dHJpYnV0ZXMsIG9mdGVuIGluY2x1ZGluZyBjb29yZGluYXRlcy4NCiAgICAtICAgKipFeGFtcGxlKio6IEdlb2dyYXBoaWMgaW5mb3JtYXRpb24gc3lzdGVtIChHSVMpIGRhdGEgd2hlcmUgZWFjaCByZWNvcmQgaW5jbHVkZXMgbG9jYXRpb24gY29vcmRpbmF0ZXMgYW5kIGF0dHJpYnV0ZXMgbGlrZSBlbGV2YXRpb24gb3IgbGFuZCB1c2UgdHlwZS4NCjQuICAqKlRleHR1YWwgRGF0YSBTZXQqKjoNCiAgICAtICAgKipTdHJ1Y3R1cmUqKjogVW5zdHJ1Y3R1cmVkIG9yIHNlbWktc3RydWN0dXJlZCBkYXRhLCBvZnRlbiByZXF1aXJpbmcgcHJlcHJvY2Vzc2luZy4NCiAgICAtICAgKipFeGFtcGxlKio6IEEgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMgb3Igc29jaWFsIG1lZGlhIHBvc3RzIHdoZXJlIGVhY2ggZW50cnkgaW5jbHVkZXMgdGV4dCBjb250ZW50IGFuZCBtZXRhZGF0YSBsaWtlIGF1dGhvciBhbmQgdGltZXN0YW1wLg0KDQojIFF1ZXN0aW9ucyBmcm9tIE1vZHVsZSAxIEFzeW5jaDogDQoNCjEuICAqKklmIHByZWRpY3RpbmcgZnJvbSBvdGhlciBjdXN0b21lcnMsIGRpdmlkaW5nIHVwIGN1c3RvbWVycyBieSBwb3RlbnRpYWwgcHJvZml0YWJpbGl0eSBpczoqKg0KICAgIC0gICAqKkNsYXNzaWZpY2F0aW9uIGFuZCByZWdyZXNzaW9uKiogKENvcnJlY3QpDQogICAgLSAgIERpdmlkaW5nIHVwIGN1c3RvbWVycyBieSBwb3RlbnRpYWwgcHJvZml0YWJpbGl0eSBpcyAqKkNsYXNzaWZpY2F0aW9uKiogYmVjYXVzZSBpdCBpbnZvbHZlcyBjYXRlZ29yaXppbmcgY3VzdG9tZXJzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZWlyIHBvdGVudGlhbCBwcm9maXRhYmlsaXR5IGFuZCBwcmVkaWN0aW5nIGNhdGVnb3JpY2FsIChjbGFzc2lmaWNhdGlvbikgb3IgY29udGludW91cyAocmVncmVzc2lvbikgb3V0Y29tZXMuDQoyLiAgKipFeHRyYWN0aW5nIGZyZXF1ZW5jeSBvZiBzb3VuZCBpczoqKg0KICAgIC0gICAqKk5vdCBkYXRhIG1pbmluZyoqIChDb3JyZWN0KQ0KICAgIC0gICBFeHRyYWN0aW5nIGZyZXF1ZW5jeSBvZiBzb3VuZCBpcyAqKk5vdCBkYXRhIG1pbmluZyoqIGJlY2F1c2UgaXQgaXMgYSBzaWduYWwgcHJvY2Vzc2luZyB0YXNrLCBub3QgYSBkYXRhIG1pbmluZyB0YXNrLg0KMy4gICoqRmluZGluZyBzb21lb25lJ3MgYWRpcG9zZSB0aXNzdWUgbWVhc3VyZSBmcm9tIHdhaXN0IGNpcmN1bWZlcmVuY2UgaXM6KioNCiAgICAtICAgKipSZWdyZXNzaW9uKiogKENvcnJlY3QpDQogICAgLSAgIEZpbmRpbmcgc29tZW9uZSdzIGFkaXBvc2UgdGlzc3VlIG1lYXN1cmUgZnJvbSB3YWlzdCBjaXJjdW1mZXJlbmNlIGlzICoqUmVncmVzc2lvbioqIGJlY2F1c2UgaXQgaW52b2x2ZXMgcHJlZGljdGluZyBhIGNvbnRpbnVvdXMgdmFsdWUgKGFkaXBvc2UgdGlzc3VlIG1lYXN1cmUpIGJhc2VkIG9uIGEgc2luZ2xlIGlucHV0IChhbm90aGVyIHZhcmlhYmxlKSB2YXJpYWJsZSAod2Fpc3QgY2lyY3VtZmVyZW5jZSkuDQo0LiAgKipEZWNpZGluZyBpZiBhIHBlcnNvbiBoYXMgZGlhYmV0ZXMgYmFzZWQgdXBvbiBoaXMgb3IgaGVyIGhpc3RvcnkgYW5kIGRpZXQgaXM6KioNCiAgICAtICAgKipDbGFzc2lmaWNhdGlvbioqIChDb3JyZWN0KQ0KICAgIC0gICAgKipDbGFzc2lmaWNhdGlvbiBUYXNrKiogYmVjYXVzZSBpdCBpbnZvbHZlcyBjYXRlZ29yaXppbmcgYSBwZXJzb24gYXMgZWl0aGVyIGhhdmluZyBkaWFiZXRlcyBvciBub3QuIChwcmVzZW5jZSBvciBhYnNlbmNlIG9mKS4NCjUuICAqKkRlcGVuZGluZyBvbiB0aGUgbWV0aG9kcyB1c2VkLCBkZWNpZGluZyBpZiBzb21lb25lIHdpbGwgbGlrZSBhIG1vdmllIG9uIE5ldGZsaXggZ2l2ZW4gcmF0aW5ncyBvZiBvdGhlciB1c2VycyBpczoqKg0KICAgIC0gICAqKkFuc3dlcnMgQSB0aHJvdWdoIEQqKiAoQ29ycmVjdCkNCg0KICAgICAgICBEZWNpZGluZyBpZiBzb21lb25lIHdpbGwgbGlrZSBhIG1vdmllIG9uIE5ldGZsaXggZ2l2ZW4gcmF0aW5ncyBvZiBvdGhlciB1c2VycyBpcyAqKkFuc3dlcnMgQSB0aHJvdWdoIEQqKiBiZWNhdXNlIGl0IGNhbiBiZSBhcHByb2FjaGVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywgaW5jbHVkaW5nIEFzc29jaWF0aW9uIChlLmcuLCBjb2xsYWJvcmF0aXZlIGZpbHRlcmluZyksIENsYXNzaWZpY2F0aW9uIChlLmcuLCBwcmVkaWN0aW5nIGEgdXNlcidzIHJhdGluZyksIENsdXN0ZXJpbmcgKGUuZy4sIGdyb3VwaW5nIHNpbWlsYXIgdXNlcnMpLCBvciBSZWdyZXNzaW9uIChlLmcuLCBwcmVkaWN0aW5nIGEgdXNlcidzIHJhdGluZykuDQo2LiAgKipEZXBlbmRpbmcgb24gdGhlIG1ldGhvZHMgdXNlZCwgZmluZGluZyB0aGUgZ2VucmUgb2YgYW4gb25saW5lIGFydGljbGUgYmFzZWQgb24gdGhlIHdvcmRzIGluIGl0IGlzOioqDQogICAgLSAgICoqQ2xhc3NpZmljYXRpb24gb3IgY2x1c3RlcmluZyoqIChDb3JyZWN0KQ0KICAgIC0gICBGaW5kaW5nIHRoZSBnZW5yZSBvZiBhbiBvbmxpbmUgYXJ0aWNsZSBiYXNlZCBvbiB0aGUgd29yZHMgaW4gaXQgaXMgKipDbGFzc2lmaWNhdGlvbiBvciBDbHVzdGVyaW5nKiogYmVjYXVzZSBpdCBjYW4gYmUgYXBwcm9hY2hlZCB1c2luZyBlaXRoZXIgQ2xhc3NpZmljYXRpb24gKGUuZy4sIHByZWRpY3RpbmcgYSBzcGVjaWZpYyBnZW5yZSkgb3IgQ2x1c3RlcmluZyAoZS5nLiwgZ3JvdXBpbmcgc2ltaWxhciBhcnRpY2xlcykuDQo3LiAgKipEZXBlbmRpbmcgb24gdGhlIG1ldGhvZHMgdXNlZCwgZmluZGluZyB3aGljaCBHb29nbGUgc2VhcmNoZXMgYXJlIGxpa2VseSB0byBmb2xsb3cgb25lIGFub3RoZXIgaXM6KioNCiAgICAtICAgKipDbGFzc2lmaWNhdGlvbiBvciBjbHVzdGVyaW5nKiogKENvcnJlY3QpDQogICAgLSAgIEl0IGNvdWxkIGludm9sdmUgY2xhc3NpZmljYXRpb24gKHByZWRpY3RpbmcgdGhlIG5leHQgc2VhcmNoKSBvciBjbHVzdGVyaW5nIChncm91cGluZyBzaW1pbGFyIHNlYXJjaGVzKS4NCjguICAqKklzIHRoZSBicmlnaHRuZXNzIGZyb20gYSBsaWdodCBtZXRlciBpbnRlcnZhbCBvciByYXRpbz8qKg0KICAgIC0gICAqKlJhdGlvKiogKENvcnJlY3QpDQogICAgLSAgIEJyaWdodG5lc3MgZnJvbSBhIGxpZ2h0IG1ldGVyIGlzICoqUmF0aW8qKiBiZWNhdXNlIGl0IGhhcyBhIHRydWUgemVybyBwb2ludCAoaS5lLiwgY29tcGxldGUgZGFya25lc3MpIGFuZCBjYW4gYmUgbWVhc3VyZWQgaW4gYSBjb250aW51b3VzIHJhbmdlLg0KOS4gICoqSXMgYW4gYW5nbGUgbWVhc3VyZWQgZnJvbSAw4oCTMzYwIGRlZ3JlZXMgaW50ZXJ2YWwgb3IgcmF0aW8/KioNCiAgICAtICAgKipDb3VsZCBiZSBlaXRoZXIgaW50ZXJ2YWwgb3IgcmF0aW8qKiAoQ29ycmVjdCkNCiAgICAtICAgRGVwZW5kaW5nIG9uIGNvbnRleHQsIGFuZ2xlcyBjb3VsZCBiZSB0cmVhdGVkIGFzIGludGVydmFsIChpZiB0aGVyZSdzIG5vIG1lYW5pbmdmdWwgemVybykgb3IgcmF0aW8gKGlmIDAgZGVncmVlcyBpcyBhYnNvbHV0ZSkuDQogICAgLSAgIEl0IGNhbiBiZSB0cmVhdGVkIGFzIGVpdGhlciBhbiBpbnRlcnZhbCBzY2FsZSAoZS5nLiwgd2hlbiBtZWFzdXJpbmcgYW5nbGVzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXMpIG9yIGEgcmF0aW8gc2NhbGUgKGUuZy4sIHdoZW4gbWVhc3VyaW5nIGFuZ2xlcyBpbiByYWRpYW5zKS4NCjEwLiAqKklzIHRoZSBoZWlnaHQgYWJvdmUgc2VhIGxldmVsIGludGVydmFsIG9yIHJhdGlvPyoqDQogICAgLSAgICoqUmF0aW8qKiAoQ29ycmVjdCkNCiAgICAtICAgSGVpZ2h0IGFib3ZlIHNlYSBsZXZlbCBoYXMgYW4gYWJzb2x1dGUgemVybyAoc2VhIGxldmVsKSwgYW5kIGNhbiBiZSBtZWFzdXJlZCBpbiBhIGNvbnRpbnVvdXMgcmFuZ2UsIG1ha2luZyBpdCBhICoqUmF0aW8gTWVhc3VyZW1lbnQqKi4NCjExLiAqKklzIG1pbGl0YXJ5IHJhbmtpbmcgb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqT3JkaW5hbCoqIChDb3JyZWN0KQ0KICAgIC0gICBNaWxpdGFyeSByYW5raW5nIGlzwqAqKk9yZGluYWwqKsKgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgcmFua2VkIC9zcGVjaWZpYyBvcmRlciAoZS5nLiwgcHJpdmF0ZSwgc2VyZ2VhbnQsIGxpZXV0ZW5hbnQpLCBidXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gcmFua3MgYXJlIG5vdCBuZWNlc3NhcmlseSBlcXVhbC4NCjEyLiAqKklzIGEgY29hdCBjaGVjayBudW1iZXIgb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqTm9taW5hbCoqIChDb3JyZWN0KQ0KICAgIC0gICBBIGNvYXQgY2hlY2sgbnVtYmVyIGlzIGEgbGFiZWwgd2l0aCBubyBpbmhlcmVudCBvcmRlciBvciBudW1lcmljYWwgdmFsdWUsIG1ha2luZyBpdCBub21pbmFsLg0KMTMuICoqSXMgdGltZSBhcyBhLm0uIG9yIHAubS4gb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqQmluYXJ5KiogKENvcnJlY3QpDQogICAgLSAgIFRpbWUgYXMgYS5tLiBvciBwLm0uIGlzICoqQmluYXJ5KiogYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgc2ltcGxlIGRpY2hvdG9teSAoMiBjYXRlZ29yaWVzLCBpLmUuLCBtb3JuaW5nIG9yIGFmdGVybm9vbikuDQoxNC4gKipJcyB0aGUgYnJpZ2h0bmVzcywgYXMgZ2l2ZW4gYnkgYSBodW1hbiwgb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqT3JkaW5hbCoqIChDb3JyZWN0KQ0KICAgIC0gICBIdW1hbi1wZXJjZWl2ZWQgYnJpZ2h0bmVzcyBpc8KgKipPcmRpbmFsKiogYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgc3ViamVjdGl2ZSByYW5raW5nIChlLmcuLCBkaW0sIG1lZGl1bSwgYnJpZ2h0KSwgYnV0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJhbmtzIGFyZSBub3QgbmVjZXNzYXJpbHkgZXF1YWwuDQoxNS4gKipXaGF0IGJlc3QgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb2YgbW92aWVzIGFuZCBhY3RvcnMgd2hvIHBsYXllZCBpbiB0aGVtPyoqDQogICAgLSAgICoqRWl0aGVyIHRyYW5zYWN0aW9uIG9yIGdyYXBoKiogKENvcnJlY3QpDQogICAgLSAgIEEgZGF0YWJhc2Ugb2YgbW92aWVzIGFuZCBhY3RvcnMgd2hvIHBsYXllZCBpbiB0aGVtIGlzICoqRWl0aGVyIHRyYW5zYWN0aW9uIG9yIGdyYXBoKiogYmVjYXVzZSBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgZWl0aGVyIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyAoZS5nLiwgYWN0b3IgWCBwbGF5ZWQgaW4gbW92aWUgWSkgb3IgYSBncmFwaCAoZS5nLiwgYWN0b3JzIGNvbm5lY3RlZCB0byBtb3ZpZXMpLg0KMTYuICoqV2hhdCBiZXN0IGRlc2NyaWJlcyBhIGRhdGFiYXNlIG9mIHNvbWVvbmUncyBBbWF6b24gcHVyY2hhc2UgaGlzdG9yeT8qKg0KICAgIC0gICAqKkVpdGhlciB0cmFuc2FjdGlvbiBvciBncmFwaCoqIChDb3JyZWN0KQ0KICAgIC0gICBBIGRhdGFiYXNlIG9mIHNvbWVvbmUncyBBbWF6b24gcHVyY2hhc2UgaGlzdG9yeSBpcyAqKkVpdGhlciB0cmFuc2FjdGlvbiBvciBzZXF1ZW50aWFsKiogYmVjYXVzZSBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgZWl0aGVyIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyAoZS5nLiwgcHVyY2hhc2UgWCBvbiBkYXRlIFkpIG9yIGEgc2VxdWVuY2Ugb2YgcHVyY2hhc2VzIG92ZXIgdGltZS4NCjE3LiAqKldoYXQgYmVzdCBkZXNjcmliZXMgYSBkYXRhIHNldCBvZiBwZW9wbGUncyBhdHRyaWJ1dGVzIHdpdGggZGlhYmV0ZXM/KioNCiAgICAtICAgKipSZWNvcmQqKiAoQ29ycmVjdCkNCiAgICAtICAgQSBkYXRhIHNldCBvZiBwZW9wbGUncyBhdHRyaWJ1dGVzIHdpdGggZGlhYmV0ZXMgaXMgKipSZWNvcmQqKiBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGluZGl2aWR1YWwgcmVjb3JkcyBvciBjYXNlcywgZWFjaCB3aXRoIHZhcmlvdXMgYXR0cmlidXRlcyAoZS5nLiwgYWdlLCBibG9vZCBwcmVzc3VyZSwgZXRjLikuDQoxOC4gKipXaGF0IGJlc3QgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb2YgeW91ciBtb3ZlbWVudHMgd2hpbGUgc2xlZXBpbmcsIHJlY29yZGVkIGVhY2ggbWludXRlPyoqDQogICAgLSAgICoqU2VxdWVudGlhbCoqIChDb3JyZWN0KQ0KICAgIC0gICBUaGUgZGF0YSBoYXMgYSB0ZW1wb3JhbCBzZXF1ZW5jZSwgbWFraW5nIGl0IHNlcXVlbnRpYWwuDQogICAgLSAgICoqU2VxdWVudGlhbCoqwqBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBtZWFzdXJlbWVudHMgb3ZlciB0aW1lLg0KDQpUaGluayBJJ20gZ29vZCBoZXJlLiBTZXQgYWxlcnQgZm9yIHdlZWtseSByZXZpZXcgYW5kIGhvbWV3b3JrIGNoZWNrIGV2ZXJ5IFdlZG5lc2RheSBhdCBub29uLg0K