1 Introduction

This note outlines the relatively new interdisciplinary field of data science which combines mathematics and statistics, computer science, data and communication technologies, and domain knowledge.

What Is Data Science? https://aws.amazon.com/what-is/data-science/#:~:text=Data%20science%20is%20an%20umbrella,%2C%20mathematics%2C%20and%20statistical%20analysis.

Data science is a multidisciplinary field that combines principles and practices from the fields of mathematics, statistics, computer science, and computer engineering to analyze large amounts of data. The data in data science projects could be text, audio, video, image, etc. Data science projects address questions like what happened, why it happened, what will happen, and what can be done with the results.

History of Data Science

While the term data science is not new, the meanings and connotations have changed over time. The word first appeared in the ’60s as an alternative name for statistics.

  • 1990s and early 2000s: We can clearly see that data science has emerged as a recognized and specialized field. Several data science academic journals began to circulate, and data science proponents like Jeff Wu and William S. Cleveland continued to help develop and expound upon the necessity and potential of data science.

  • 2005: Big data enters the scene. New data technologies Hadoop, Sparks, Cassandra, etc are capable of processing big data.

  • 2014: Due to the increasing importance of data, and organizations’ interest in finding patterns and making better business decisions, demand for data scientists began to see dramatic growth in different parts of the world.

  • 2015: Machine learning, deep learning, and Artificial Intelligence (AI) officially enter the realm of data science. These technologies have driven innovations over the past decade

  • 2018: New regulations in the field are perhaps one of the biggest aspects of the evolution of data science.

  • 2020s: We are seeing additional breakthroughs in AI, machine learning, and an ever-more-increasing demand for qualified professionals.

Data Science Role Outlook: The US Labor Statistics recently released a job outlook in data science and statistics. https://www.bls.gov/ooh/math/data-scientists.htm#:~:text=Data%20scientists%20typically%20do%20the,and%20update%20algorithms%20and%20models

2 What Can Data Science Do?


2.1 What Can Data Science Do?

Data Science is a powerful field that can provide valuable insights and drive decision-making across numerous industries. Here are some of the things that data science can do:

  • Identify Patterns and Trends

Using statistical techniques to find patterns and trends in datasets. This can help uncover insights that were previously hidden.

  • Forecast Outcomes

By creating algorithms and data models, data scientists can predict future outcomes based on historical data.

  • Improve Data Quality

Using machine learning techniques to improve the quality of data or product offerings.

  • Guide Decision Making

The insights derived from data science can be used to guide decision-making and strategic planning in an organization.

  • Communicate Recommendations

Data scientists and statisticians play a crucial role in communicating their findings to other teams and senior staff. This helps the organization to make informed decisions.

  • Stay on Top of Innovations

Data scientists and statisticians need to stay updated with the latest innovations in the field of data science.

  • Deploy Data Tools

Using data tools such as Python, R, SAS, or SQL for data analysis.


2.2 Types of Analyses in Data Science

include_graphics("img/TypesAnalysisInDSCI.jpg")

1. Descriptive analysis

Descriptive analysis examines data to gain insights into what happened or what is happening in the data environment. The primary tools used in descriptive analysis are EDA and basic statistical charts. It is characterized by data visualizations such as pie charts, bar charts, line graphs, tables, or generated narratives.

Example: A flight booking service may record data like the number of tickets booked each day. Descriptive analysis will reveal booking spikes, booking slumps, and high-performing months for this service.

2. Diagnostic analysis

Diagnostic analysis is a deep-dive or detailed data examination to understand why something happened. It is characterized by techniques such as drill-down, data discovery, data mining, and correlations. Multiple data operations and transformations may be performed on a given data set to discover unique patterns in each of these techniques.

Example: The flight service might drill down on a particularly high-performing month to better understand the booking spike. This may lead to the discovery that many customers visit a particular city to attend a monthly sporting event.

3. Predictive analysis

Predictive analysis uses historical data to make accurate forecasts about data patterns that may occur in the future. It is characterized by techniques such as machine learning, forecasting, pattern matching, and predictive modeling. In each of these techniques, computers are trained to reverse engineer causality connections in the data.

Example: The flight service team might use data science to predict flight booking patterns for the coming year at the start of each year. The computer program or algorithm may look at past data and predict booking spikes for certain destinations in May. Having anticipated their customer’s future travel requirements, the company could start targeted advertising for those cities in February.

4. Prescriptive analysis

Prescriptive analytics takes predictive data to the next level. It not only predicts what is likely to happen but also suggests an optimum response to that outcome. It can analyze the potential implications of different choices and recommend the best course of action. It uses visual analytics, simulation, complex event processing, neural networks, and recommendation engines from machine learning.

Example: Prescriptive analysis could look at historical marketing campaigns to maximize the advantage of the upcoming booking spike. A data scientist could project booking outcomes for different levels of marketing spend on various marketing channels. These data forecasts would give the flight booking company greater confidence in their marketing decisions.

 

2.3 Data Science Process

A business problem typically initiates the data science process. A data scientist will work with business stakeholders to understand what business needs.

include_graphics("img/DsciWorkFlow.jpg")


Once the problem has been defined, the data scientist may solve it using the OSEMN data science process:

  • Capturing

Data can be pre-existing, newly acquired, or a data repository downloadable from the internet. Data scientists can extract data from internal or external databases, company CRM software, web server logs, and social media or purchase it from trusted third-party sources.

  • Storage and ETL

Data scrubbing, or data cleaning, is the process of standardizing the data according to a predetermined format. It includes handling missing data, fixing data errors, and removing any data outliers. Some examples of data scrubbing are:·

Changing all date values to a common standard format.·

Fixing spelling mistakes or additional spaces.·
Fixing mathematical inaccuracies or removing commas from large numbers.

  • Data Processing and EDA

Data exploration is preliminary data analysis that is used for planning further data modeling strategies. Data scientists gain an initial understanding of the data using descriptive statistics and data visualization tools. Then they explore the data to identify interesting patterns that can be studied or actioned.

  • Modeling and

Software and machine learning algorithms are used to gain deeper insights, predict outcomes, and prescribe the best course of action. Machine learning techniques like association, classification, and clustering are applied to the training data set. The model might be tested against predetermined test data to assess result accuracy. The data model can be fine-tuned many times to improve result outcomes.

  • Reporting and Deployment

Data scientists work together with analysts and businesses to convert data insights into action. They make diagrams, graphs, and charts to represent trends and predictions. Data summarization helps stakeholders understand and implement results effectively.

  • Monitoring and Updating

2.4 Technical Tools for Data Science

Data science professionals use computing systems to follow the data science process. The top techniques used by data scientists are:

  • Classification

Classification is the sorting of data into specific groups or categories. Computers are trained to identify and sort data. Known data sets are used to build decision algorithms in a computer that quickly processes and categorizes the data. For example:·

Sort products as popular or not popular·
Sort insurance applications as high risk or low risk·
Sort social media comments into positive, negative, or neutral. Data science professionals use computing systems to follow the data science process.

  • Regression

Regression is the method of finding a relationship between two seemingly unrelated data points. The connection is usually modeled around a mathematical formula and represented as a graph or curve. When the value of one data point is known, regression is used to predict the other data point. For example:·

The rate of spread of air-borne diseases.· The relationship between customer satisfaction and the number of employees.·
The relationship between the number of fire stations and the number of injuries due to fire in a particular location.

  • Clustering

Clustering is the method of grouping closely related data together to look for patterns and anomalies. Clustering is different from sorting because the data cannot be accurately classified into fixed categories. Hence the data is grouped into most likely relationships. New patterns and relationships can be discovered with clustering. For example: ·

Group customers with similar purchase behavior for improved customer service.·
Group network traffic to identify daily usage patterns and identify a network attack faster.
Cluster articles into multiple different news categories and use this information to find fake news content. The basic principle behind data science techniques


2.5 What Data Science Cannot Do?

While data science is a powerful tool, it does have its limitations. Here are some things that data science cannot do:

  • Replace Subject Matter Experts: Data science can provide insights and help make informed decisions, but it cannot replace the expertise and judgment of subject matter experts.

  • Guarantee 100% Accuracy: Predictive models in data science are based on probabilities and are therefore not always 100% accurate.

  • Eliminate Bias: If the data used in data science is biased, the results will also be biased. Data scientists can try to minimize bias, but it cannot be completely eliminated.

  • Replace Data Preparation: Data science cannot bypass the data preparation stage. Raw data often needs to be cleaned and transformed before it can be used for analysis.

  • Automate Data Collection: While data science can analyze and draw insights from data, it cannot automate the process of data collection.

  • Solve All Problems: Data science is a tool that can help solve many problems, but not all. Some problems may require other approaches or tools.

  • Work Without Clear Goals: Data science is most effective when there are clear goals and questions to answer. Without these, it can be difficult to extract meaningful insights from the data.

  • Ensure Ethical Use of Data: Data science itself cannot ensure the ethical use of data. This is the responsibility of the data scientists and the organization they work for.

  • Function Without Infrastructure: Data science requires a certain level of infrastructure, including data storage and processing capabilities.

  • Replace Human Intuition and Creativity: While data science can provide valuable insights, it cannot replace human intuition and creativity.


3 Technologies for Data Science


3.1 Computing Technologies

Data science practitioners work with complex technologies such as:

  • ML Tools: Machine learning models and related software are used for predictive and prescriptive analysis.

  • Cloud computing: Cloud technologies have given the flexibility and processing power required for advanced data analytics.

  • Internet of things: IoT refers to various devices that can automatically connect to the Internet. These devices collect data for data science initiatives. They generate massive data which can be used for data mining and data extraction.

  • High-Performance computing: Quantum computers can perform complex calculations at high speed. Skilled data scientists use them for building complex quantitative algorithms.


3.2 Data Science Communication Technologies

Data Science Communication involves the use of various technologies to effectively communicate data insights. Here are some key technologies used in this field:

  • Data Visualization Tools

Tools like Tableau, Matplotlib in Python, and rich graphical libraries in R are used to create visual representations of data, making it easier to identify patterns, trends, and insights. Some powerful emerging interactive technologies are also available due to the recent development of various software programs such as plotly and RShiny. These interactive technologies make visualization and analytics easier to extract hidden information from data through analytics.

  • Computational Notebooks

RMarkdown/R Notebook and Jupyter Notebook are widely used for data science communication. They allow for the creation of documents that combine live code (such as Python or R) with visualizations and narrative texts.

  • Markdown and LaTeX:

Markdown is used for formatting text, while LaTeX is used for creating high-quality technical and scientific documentation. Both can be used in RMarkdown/R Notebook and Jupyter Notebook to create well-structured, readable documents. RMarkdown is also a powerful web development tool to generate web-based reports with both static and interactive visual content.

  • GitHub - Version Control and Collaboration

GitHub is a platform for version control and collaboration. It allows data scientists to work together and share their code and notebooks. It is also convenient to host static web pages

  • Presentation Software and technologies

Tools like our old friends Microsoft PowerPoint or Google Slides are often used to present data science findings to non-technical stakeholders.

  • Platforms for Technical Communication

There are several key elements of technical communication that require integrating different platforms to accomplish effective technical communication.

Clarity and Conciseness: Technical communication aims to make complex information clear and easily understandable for the target audience. This involves using straightforward language, avoiding unnecessary jargon, and organizing information logically to convey information efficiently.

Purpose: Technical communication serves various purposes, such as informing, instructing, persuading, or documenting. The purpose guides the structure and content of the communication.

Document Design: Effective technical communication often involves thoughtful document design. This includes the use of headings, lists, graphics, and other visual elements to enhance comprehension and make the information more accessible.

Medium Selection: Technical communication can take various forms, including written documents, presentations, videos, and interactive content. Choosing the appropriate medium for the message and audience is crucial.

Platforms like Slack or Microsoft Teams are used for real-time communication within a data science team. Other platforms such as GitHub, Anaconda, RStudio, SAS Viya, etc. are

  • Data Science Platforms

A data science platform is a software solution that enables data scientists to effectively plan strategies, discover actionable insights from interpreting data, and communicate their insights across the entire organization—all within a single environment. They also allow for collaborative data science work and include features for sharing and presenting data science results. Popular platforms include AWS Sage Maker, Microsoft Azure ML, Anaconda, etc.


LS0tDQp0aXRsZTogIldoYXQgaXMgRGF0YSBTY2llbmNlPyINCmRhdGU6ICI4LzEwLzIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Kb3B0aW9ucyhyZXBvcyA9IGxpc3QoQ1JBTj0iaHR0cDovL2NyYW4ucnN0dWRpby5jb20vIikpDQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCg0KDQoNClwNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyBub3RlIG91dGxpbmVzIHRoZSByZWxhdGl2ZWx5IG5ldyBpbnRlcmRpc2NpcGxpbmFyeSBmaWVsZCBvZiAqKmRhdGEgc2NpZW5jZSoqIHdoaWNoIGNvbWJpbmVzIG1hdGhlbWF0aWNzIGFuZCBzdGF0aXN0aWNzLCBjb21wdXRlciBzY2llbmNlLCBkYXRhIGFuZCBjb21tdW5pY2F0aW9uIHRlY2hub2xvZ2llcywgYW5kIGRvbWFpbiBrbm93bGVkZ2UuICANCg0KDQoqKldoYXQgSXMgRGF0YSBTY2llbmNlPyoqIDxodHRwczovL2F3cy5hbWF6b24uY29tL3doYXQtaXMvZGF0YS1zY2llbmNlLyM6fjp0ZXh0PURhdGElMjBzY2llbmNlJTIwaXMlMjBhbiUyMHVtYnJlbGxhLCUyQyUyMG1hdGhlbWF0aWNzJTJDJTIwYW5kJTIwc3RhdGlzdGljYWwlMjBhbmFseXNpcy4+DQoNCkRhdGEgc2NpZW5jZSBpcyBhIG11bHRpZGlzY2lwbGluYXJ5IGZpZWxkIHRoYXQgY29tYmluZXMgcHJpbmNpcGxlcyBhbmQgcHJhY3RpY2VzIGZyb20gdGhlIGZpZWxkcyBvZiBtYXRoZW1hdGljcywgc3RhdGlzdGljcywgY29tcHV0ZXIgc2NpZW5jZSwgYW5kIGNvbXB1dGVyIGVuZ2luZWVyaW5nIHRvIGFuYWx5emUgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLiBUaGUgZGF0YSBpbiBkYXRhIHNjaWVuY2UgcHJvamVjdHMgY291bGQgYmUgdGV4dCwgYXVkaW8sIHZpZGVvLCBpbWFnZSwgZXRjLiBEYXRhIHNjaWVuY2UgcHJvamVjdHMgYWRkcmVzcyBxdWVzdGlvbnMgbGlrZSB3aGF0IGhhcHBlbmVkLCB3aHkgaXQgaGFwcGVuZWQsIHdoYXQgd2lsbCBoYXBwZW4sIGFuZCB3aGF0IGNhbiBiZSBkb25lIHdpdGggdGhlIHJlc3VsdHMuDQoNCg0KKipIaXN0b3J5IG9mIERhdGEgU2NpZW5jZSoqDQoNCg0KV2hpbGUgdGhlIHRlcm0gZGF0YSBzY2llbmNlIGlzIG5vdCBuZXcsIHRoZSBtZWFuaW5ncyBhbmQgY29ubm90YXRpb25zIGhhdmUgY2hhbmdlZCBvdmVyIHRpbWUuIFRoZSB3b3JkIGZpcnN0IGFwcGVhcmVkIGluIHRoZSDigJk2MHMgYXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3Igc3RhdGlzdGljcy4NCg0KKiAqKjE5OTBzIGFuZCBlYXJseSAyMDAwcyoqOiBXZSBjYW4gY2xlYXJseSBzZWUgdGhhdCBkYXRhIHNjaWVuY2UgaGFzIGVtZXJnZWQgYXMgYSByZWNvZ25pemVkIGFuZCBzcGVjaWFsaXplZCBmaWVsZC4gU2V2ZXJhbCBkYXRhIHNjaWVuY2UgYWNhZGVtaWMgam91cm5hbHMgYmVnYW4gdG8gY2lyY3VsYXRlLCBhbmQgZGF0YSBzY2llbmNlIHByb3BvbmVudHMgbGlrZSBKZWZmIFd1IGFuZCBXaWxsaWFtIFMuIENsZXZlbGFuZCBjb250aW51ZWQgdG8gaGVscCBkZXZlbG9wIGFuZCBleHBvdW5kIHVwb24gdGhlIG5lY2Vzc2l0eSBhbmQgcG90ZW50aWFsIG9mIGRhdGEgc2NpZW5jZS4NCg0KKiAqKjIwMDUqKjogQmlnIGRhdGEgZW50ZXJzIHRoZSBzY2VuZS4gTmV3IGRhdGEgdGVjaG5vbG9naWVzIEhhZG9vcCwgU3BhcmtzLCBDYXNzYW5kcmEsIGV0YyBhcmUgY2FwYWJsZSBvZiBwcm9jZXNzaW5nICoqYmlnIGRhdGEqKi4gDQoNCiogKioyMDE0Kio6IER1ZSB0byB0aGUgaW5jcmVhc2luZyBpbXBvcnRhbmNlIG9mIGRhdGEsIGFuZCBvcmdhbml6YXRpb25z4oCZIGludGVyZXN0IGluIGZpbmRpbmcgcGF0dGVybnMgYW5kIG1ha2luZyBiZXR0ZXIgYnVzaW5lc3MgZGVjaXNpb25zLCBkZW1hbmQgZm9yIGRhdGEgc2NpZW50aXN0cyBiZWdhbiB0byBzZWUgZHJhbWF0aWMgZ3Jvd3RoIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgd29ybGQuDQoNCiogKioyMDE1Kio6IE1hY2hpbmUgbGVhcm5pbmcsIGRlZXAgbGVhcm5pbmcsIGFuZCBBcnRpZmljaWFsIEludGVsbGlnZW5jZSAoQUkpIG9mZmljaWFsbHkgZW50ZXIgdGhlIHJlYWxtIG9mIGRhdGEgc2NpZW5jZS4gVGhlc2UgdGVjaG5vbG9naWVzIGhhdmUgZHJpdmVuIGlubm92YXRpb25zIG92ZXIgdGhlIHBhc3QgZGVjYWRlIA0KDQoqICoqMjAxOCoqOiBOZXcgcmVndWxhdGlvbnMgaW4gdGhlIGZpZWxkIGFyZSBwZXJoYXBzIG9uZSBvZiB0aGUgYmlnZ2VzdCBhc3BlY3RzIG9mIHRoZSBldm9sdXRpb24gb2YgZGF0YSBzY2llbmNlLg0KDQoqICoqMjAyMHMqKjogV2UgYXJlIHNlZWluZyBhZGRpdGlvbmFsIGJyZWFrdGhyb3VnaHMgaW4gQUksIG1hY2hpbmUgbGVhcm5pbmcsIGFuZCBhbiBldmVyLW1vcmUtaW5jcmVhc2luZyBkZW1hbmQgZm9yIHF1YWxpZmllZCBwcm9mZXNzaW9uYWxzLg0KDQoNCioqRGF0YSBTY2llbmNlIFJvbGUgT3V0bG9vayoqOiBUaGUgVVMgTGFib3IgU3RhdGlzdGljcyByZWNlbnRseSByZWxlYXNlZCBhIGpvYiBvdXRsb29rIGluIGRhdGEgc2NpZW5jZSBhbmQgc3RhdGlzdGljcy4NCjxodHRwczovL3d3dy5ibHMuZ292L29vaC9tYXRoL2RhdGEtc2NpZW50aXN0cy5odG0jOn46dGV4dD1EYXRhJTIwc2NpZW50aXN0cyUyMHR5cGljYWxseSUyMGRvJTIwdGhlLGFuZCUyMHVwZGF0ZSUyMGFsZ29yaXRobXMlMjBhbmQlMjBtb2RlbHM+DQoNCg0KDQojIFdoYXQgQ2FuIERhdGEgU2NpZW5jZSBEbz8gDQoNClwNCg0KIyMgV2hhdCBDYW4gRGF0YSBTY2llbmNlIERvPw0KDQpEYXRhIFNjaWVuY2UgaXMgYSBwb3dlcmZ1bCBmaWVsZCB0aGF0IGNhbiBwcm92aWRlIHZhbHVhYmxlIGluc2lnaHRzIGFuZCBkcml2ZSBkZWNpc2lvbi1tYWtpbmcgYWNyb3NzIG51bWVyb3VzIGluZHVzdHJpZXMuIEhlcmUgYXJlIHNvbWUgb2YgdGhlIHRoaW5ncyB0aGF0IGRhdGEgc2NpZW5jZSBjYW4gZG86DQoNCiogKipJZGVudGlmeSBQYXR0ZXJucyBhbmQgVHJlbmRzKiogDQoNClVzaW5nIHN0YXRpc3RpY2FsIHRlY2huaXF1ZXMgdG8gZmluZCBwYXR0ZXJucyBhbmQgdHJlbmRzIGluIGRhdGFzZXRzLiBUaGlzIGNhbiBoZWxwIHVuY292ZXIgaW5zaWdodHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuLg0KDQoqICoqRm9yZWNhc3QgT3V0Y29tZXMqKg0KDQpCeSBjcmVhdGluZyBhbGdvcml0aG1zIGFuZCBkYXRhIG1vZGVscywgZGF0YSBzY2llbnRpc3RzIGNhbiBwcmVkaWN0IGZ1dHVyZSBvdXRjb21lcyBiYXNlZCBvbiBoaXN0b3JpY2FsIGRhdGEuDQoNCiogKipJbXByb3ZlIERhdGEgUXVhbGl0eSoqIA0KDQpVc2luZyBtYWNoaW5lIGxlYXJuaW5nIHRlY2huaXF1ZXMgdG8gaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiBkYXRhIG9yIHByb2R1Y3Qgb2ZmZXJpbmdzLg0KDQoqICoqR3VpZGUgRGVjaXNpb24gTWFraW5nKioNCg0KVGhlIGluc2lnaHRzIGRlcml2ZWQgZnJvbSBkYXRhIHNjaWVuY2UgY2FuIGJlIHVzZWQgdG8gZ3VpZGUgZGVjaXNpb24tbWFraW5nIGFuZCBzdHJhdGVnaWMgcGxhbm5pbmcgaW4gYW4gb3JnYW5pemF0aW9uLg0KDQoqICoqQ29tbXVuaWNhdGUgUmVjb21tZW5kYXRpb25zKiogDQoNCkRhdGEgc2NpZW50aXN0cyBhbmQgc3RhdGlzdGljaWFucyBwbGF5IGEgY3J1Y2lhbCByb2xlIGluIGNvbW11bmljYXRpbmcgdGhlaXIgZmluZGluZ3MgdG8gb3RoZXIgdGVhbXMgYW5kIHNlbmlvciBzdGFmZi4gVGhpcyBoZWxwcyB0aGUgb3JnYW5pemF0aW9uIHRvIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zLg0KDQoNCiogKipTdGF5IG9uIFRvcCBvZiBJbm5vdmF0aW9ucyoqIA0KDQpEYXRhIHNjaWVudGlzdHMgYW5kIHN0YXRpc3RpY2lhbnMgbmVlZCB0byBzdGF5IHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IGlubm92YXRpb25zIGluIHRoZSBmaWVsZCBvZiBkYXRhIHNjaWVuY2UuDQoNCiogKipEZXBsb3kgRGF0YSBUb29scyoqIA0KDQpVc2luZyBkYXRhIHRvb2xzIHN1Y2ggYXMgUHl0aG9uLCBSLCBTQVMsIG9yIFNRTCBmb3IgZGF0YSBhbmFseXNpcy4NCg0KXA0KDQojIyBUeXBlcyBvZiBBbmFseXNlcyBpbiBEYXRhIFNjaWVuY2UgDQoNCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjgwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJpbWcvVHlwZXNBbmFseXNpc0luRFNDSS5qcGciKQ0KYGBgDQoNCg0KKioxLiBEZXNjcmlwdGl2ZSBhbmFseXNpcyoqDQoNCkRlc2NyaXB0aXZlIGFuYWx5c2lzIGV4YW1pbmVzIGRhdGEgdG8gZ2FpbiBpbnNpZ2h0cyBpbnRvIHdoYXQgaGFwcGVuZWQgb3Igd2hhdCBpcyBoYXBwZW5pbmcgaW4gdGhlIGRhdGEgZW52aXJvbm1lbnQuIFRoZSBwcmltYXJ5IHRvb2xzIHVzZWQgaW4gKmRlc2NyaXB0aXZlIGFuYWx5c2lzKiBhcmUgRURBIGFuZCBiYXNpYyBzdGF0aXN0aWNhbCBjaGFydHMuIEl0IGlzIGNoYXJhY3Rlcml6ZWQgYnkgZGF0YSB2aXN1YWxpemF0aW9ucyBzdWNoIGFzIHBpZSBjaGFydHMsIGJhciBjaGFydHMsIGxpbmUgZ3JhcGhzLCB0YWJsZXMsIG9yIGdlbmVyYXRlZCBuYXJyYXRpdmVzLiANCg0KKipFeGFtcGxlKio6IEEgZmxpZ2h0IGJvb2tpbmcgc2VydmljZSBtYXkgcmVjb3JkIGRhdGEgbGlrZSB0aGUgbnVtYmVyIG9mIHRpY2tldHMgYm9va2VkIGVhY2ggZGF5LiBEZXNjcmlwdGl2ZSBhbmFseXNpcyB3aWxsIHJldmVhbCBib29raW5nIHNwaWtlcywgYm9va2luZyBzbHVtcHMsIGFuZCBoaWdoLXBlcmZvcm1pbmcgbW9udGhzIGZvciB0aGlzIHNlcnZpY2UuDQoNCg0KKioyLiBEaWFnbm9zdGljIGFuYWx5c2lzKioNCg0KRGlhZ25vc3RpYyBhbmFseXNpcyBpcyBhIGRlZXAtZGl2ZSBvciBkZXRhaWxlZCBkYXRhIGV4YW1pbmF0aW9uIHRvIHVuZGVyc3RhbmQgd2h5IHNvbWV0aGluZyBoYXBwZW5lZC4gSXQgaXMgY2hhcmFjdGVyaXplZCBieSB0ZWNobmlxdWVzIHN1Y2ggYXMgZHJpbGwtZG93biwgZGF0YSBkaXNjb3ZlcnksIGRhdGEgbWluaW5nLCBhbmQgY29ycmVsYXRpb25zLiBNdWx0aXBsZSBkYXRhIG9wZXJhdGlvbnMgYW5kIHRyYW5zZm9ybWF0aW9ucyBtYXkgYmUgcGVyZm9ybWVkIG9uIGEgZ2l2ZW4gZGF0YSBzZXQgdG8gZGlzY292ZXIgdW5pcXVlIHBhdHRlcm5zIGluIGVhY2ggb2YgdGhlc2UgdGVjaG5pcXVlcy4NCg0KDQoNCioqRXhhbXBsZSoqOiBUaGUgZmxpZ2h0IHNlcnZpY2UgbWlnaHQgZHJpbGwgZG93biBvbiBhIHBhcnRpY3VsYXJseSBoaWdoLXBlcmZvcm1pbmcgbW9udGggdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGJvb2tpbmcgc3Bpa2UuIFRoaXMgbWF5IGxlYWQgdG8gdGhlIGRpc2NvdmVyeSB0aGF0IG1hbnkgY3VzdG9tZXJzIHZpc2l0IGEgcGFydGljdWxhciBjaXR5IHRvIGF0dGVuZCBhIG1vbnRobHkgc3BvcnRpbmcgZXZlbnQuDQoNCioqMy4gUHJlZGljdGl2ZSBhbmFseXNpcyoqDQoNClByZWRpY3RpdmUgYW5hbHlzaXMgdXNlcyBoaXN0b3JpY2FsIGRhdGEgdG8gbWFrZSBhY2N1cmF0ZSBmb3JlY2FzdHMgYWJvdXQgZGF0YSBwYXR0ZXJucyB0aGF0IG1heSBvY2N1ciBpbiB0aGUgZnV0dXJlLiBJdCBpcyBjaGFyYWN0ZXJpemVkIGJ5IHRlY2huaXF1ZXMgc3VjaCBhcyBtYWNoaW5lIGxlYXJuaW5nLCBmb3JlY2FzdGluZywgcGF0dGVybiBtYXRjaGluZywgYW5kIHByZWRpY3RpdmUgbW9kZWxpbmcuIEluIGVhY2ggb2YgdGhlc2UgdGVjaG5pcXVlcywgY29tcHV0ZXJzIGFyZSB0cmFpbmVkIHRvIHJldmVyc2UgZW5naW5lZXIgY2F1c2FsaXR5IGNvbm5lY3Rpb25zIGluIHRoZSBkYXRhLg0KDQoqKkV4YW1wbGUqKjogVGhlIGZsaWdodCBzZXJ2aWNlIHRlYW0gbWlnaHQgdXNlIGRhdGEgc2NpZW5jZSB0byBwcmVkaWN0IGZsaWdodCBib29raW5nIHBhdHRlcm5zIGZvciB0aGUgY29taW5nIHllYXIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggeWVhci4gVGhlIGNvbXB1dGVyIHByb2dyYW0gb3IgYWxnb3JpdGhtIG1heSBsb29rIGF0IHBhc3QgZGF0YSBhbmQgcHJlZGljdCBib29raW5nIHNwaWtlcyBmb3IgY2VydGFpbiBkZXN0aW5hdGlvbnMgaW4gTWF5LiBIYXZpbmcgYW50aWNpcGF0ZWQgdGhlaXIgY3VzdG9tZXLigJlzIGZ1dHVyZSB0cmF2ZWwgcmVxdWlyZW1lbnRzLCB0aGUgY29tcGFueSBjb3VsZCBzdGFydCB0YXJnZXRlZCBhZHZlcnRpc2luZyBmb3IgdGhvc2UgY2l0aWVzIGluIEZlYnJ1YXJ5Lg0KDQoNCioqNC4gUHJlc2NyaXB0aXZlIGFuYWx5c2lzKioNCg0KUHJlc2NyaXB0aXZlIGFuYWx5dGljcyB0YWtlcyBwcmVkaWN0aXZlIGRhdGEgdG8gdGhlIG5leHQgbGV2ZWwuIEl0IG5vdCBvbmx5IHByZWRpY3RzIHdoYXQgaXMgbGlrZWx5IHRvIGhhcHBlbiBidXQgYWxzbyBzdWdnZXN0cyBhbiBvcHRpbXVtIHJlc3BvbnNlIHRvIHRoYXQgb3V0Y29tZS4gSXQgY2FuIGFuYWx5emUgdGhlIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMgb2YgZGlmZmVyZW50IGNob2ljZXMgYW5kIHJlY29tbWVuZCB0aGUgYmVzdCBjb3Vyc2Ugb2YgYWN0aW9uLiBJdCB1c2VzIHZpc3VhbCBhbmFseXRpY3MsIHNpbXVsYXRpb24sIGNvbXBsZXggZXZlbnQgcHJvY2Vzc2luZywgbmV1cmFsIG5ldHdvcmtzLCBhbmQgcmVjb21tZW5kYXRpb24gZW5naW5lcyBmcm9tIG1hY2hpbmUgbGVhcm5pbmcuICAgICAgICAgDQoNCg0KKipFeGFtcGxlKio6IFByZXNjcmlwdGl2ZSBhbmFseXNpcyBjb3VsZCBsb29rIGF0IGhpc3RvcmljYWwgbWFya2V0aW5nIGNhbXBhaWducyB0byBtYXhpbWl6ZSB0aGUgYWR2YW50YWdlIG9mIHRoZSB1cGNvbWluZyBib29raW5nIHNwaWtlLiBBIGRhdGEgc2NpZW50aXN0IGNvdWxkIHByb2plY3QgYm9va2luZyBvdXRjb21lcyBmb3IgZGlmZmVyZW50IGxldmVscyBvZiBtYXJrZXRpbmcgc3BlbmQgb24gdmFyaW91cyBtYXJrZXRpbmcgY2hhbm5lbHMuIFRoZXNlIGRhdGEgZm9yZWNhc3RzIHdvdWxkIGdpdmUgdGhlIGZsaWdodCBib29raW5nIGNvbXBhbnkgZ3JlYXRlciBjb25maWRlbmNlIGluIHRoZWlyIG1hcmtldGluZyBkZWNpc2lvbnMuDQoNCg0KXCAgDQoNCg0KIyMgRGF0YSBTY2llbmNlIFByb2Nlc3MNCg0KQSBidXNpbmVzcyBwcm9ibGVtIHR5cGljYWxseSBpbml0aWF0ZXMgdGhlIGRhdGEgc2NpZW5jZSBwcm9jZXNzLiBBIGRhdGEgc2NpZW50aXN0IHdpbGwgd29yayB3aXRoIGJ1c2luZXNzIHN0YWtlaG9sZGVycyB0byB1bmRlcnN0YW5kIHdoYXQgYnVzaW5lc3MgbmVlZHMuIA0KDQoNCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjgwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJpbWcvRHNjaVdvcmtGbG93LmpwZyIpDQpgYGANCg0KXA0KDQpPbmNlIHRoZSBwcm9ibGVtIGhhcyBiZWVuIGRlZmluZWQsIHRoZSBkYXRhIHNjaWVudGlzdCBtYXkgc29sdmUgaXQgdXNpbmcgdGhlIE9TRU1OIGRhdGEgc2NpZW5jZSBwcm9jZXNzOg0KDQoqICoqQ2FwdHVyaW5nKioNCg0KRGF0YSBjYW4gYmUgcHJlLWV4aXN0aW5nLCBuZXdseSBhY3F1aXJlZCwgb3IgYSBkYXRhIHJlcG9zaXRvcnkgZG93bmxvYWRhYmxlIGZyb20gdGhlIGludGVybmV0LiBEYXRhIHNjaWVudGlzdHMgY2FuIGV4dHJhY3QgZGF0YSBmcm9tIGludGVybmFsIG9yIGV4dGVybmFsIGRhdGFiYXNlcywgY29tcGFueSBDUk0gc29mdHdhcmUsIHdlYiBzZXJ2ZXIgbG9ncywgYW5kIHNvY2lhbCBtZWRpYSBvciBwdXJjaGFzZSBpdCBmcm9tIHRydXN0ZWQgdGhpcmQtcGFydHkgc291cmNlcy4NCg0KKiAqKlN0b3JhZ2UgYW5kIEVUTCoqDQoNCkRhdGEgc2NydWJiaW5nLCBvciBkYXRhIGNsZWFuaW5nLCBpcyB0aGUgcHJvY2VzcyBvZiBzdGFuZGFyZGl6aW5nIHRoZSBkYXRhIGFjY29yZGluZyB0byBhIHByZWRldGVybWluZWQgZm9ybWF0LiBJdCBpbmNsdWRlcyBoYW5kbGluZyBtaXNzaW5nIGRhdGEsIGZpeGluZyBkYXRhIGVycm9ycywgYW5kIHJlbW92aW5nIGFueSBkYXRhIG91dGxpZXJzLiBTb21lIGV4YW1wbGVzIG9mIGRhdGEgc2NydWJiaW5nIGFyZTrCtyANCg0KQ2hhbmdpbmcgYWxsIGRhdGUgdmFsdWVzIHRvIGEgY29tbW9uIHN0YW5kYXJkIGZvcm1hdC7CtyAgDQoNCkZpeGluZyBzcGVsbGluZyBtaXN0YWtlcyBvciBhZGRpdGlvbmFsIHNwYWNlcy7CtyAgDQpGaXhpbmcgbWF0aGVtYXRpY2FsIGluYWNjdXJhY2llcyBvciByZW1vdmluZyBjb21tYXMgZnJvbSBsYXJnZSBudW1iZXJzLg0KDQoqICoqRGF0YSBQcm9jZXNzaW5nIGFuZCBFREEqKg0KDQpEYXRhIGV4cGxvcmF0aW9uIGlzIHByZWxpbWluYXJ5IGRhdGEgYW5hbHlzaXMgdGhhdCBpcyB1c2VkIGZvciBwbGFubmluZyBmdXJ0aGVyIGRhdGEgbW9kZWxpbmcgc3RyYXRlZ2llcy4gRGF0YSBzY2llbnRpc3RzIGdhaW4gYW4gaW5pdGlhbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkYXRhIHVzaW5nIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYW5kIGRhdGEgdmlzdWFsaXphdGlvbiB0b29scy4gVGhlbiB0aGV5IGV4cGxvcmUgdGhlIGRhdGEgdG8gaWRlbnRpZnkgaW50ZXJlc3RpbmcgcGF0dGVybnMgdGhhdCBjYW4gYmUgc3R1ZGllZCBvciBhY3Rpb25lZC4gICAgICANCg0KKiAqKk1vZGVsaW5nIGFuZCoqDQoNClNvZnR3YXJlIGFuZCBtYWNoaW5lIGxlYXJuaW5nIGFsZ29yaXRobXMgYXJlIHVzZWQgdG8gZ2FpbiBkZWVwZXIgaW5zaWdodHMsIHByZWRpY3Qgb3V0Y29tZXMsIGFuZCBwcmVzY3JpYmUgdGhlIGJlc3QgY291cnNlIG9mIGFjdGlvbi4gTWFjaGluZSBsZWFybmluZyB0ZWNobmlxdWVzIGxpa2UgYXNzb2NpYXRpb24sIGNsYXNzaWZpY2F0aW9uLCBhbmQgY2x1c3RlcmluZyBhcmUgYXBwbGllZCB0byB0aGUgdHJhaW5pbmcgZGF0YSBzZXQuIFRoZSBtb2RlbCBtaWdodCBiZSB0ZXN0ZWQgYWdhaW5zdCBwcmVkZXRlcm1pbmVkIHRlc3QgZGF0YSB0byBhc3Nlc3MgcmVzdWx0IGFjY3VyYWN5LiBUaGUgZGF0YSBtb2RlbCBjYW4gYmUgZmluZS10dW5lZCBtYW55IHRpbWVzIHRvIGltcHJvdmUgcmVzdWx0IG91dGNvbWVzLiANCg0KKiAqKlJlcG9ydGluZyBhbmQgRGVwbG95bWVudCoqDQoNCkRhdGEgc2NpZW50aXN0cyB3b3JrIHRvZ2V0aGVyIHdpdGggYW5hbHlzdHMgYW5kIGJ1c2luZXNzZXMgdG8gY29udmVydCBkYXRhIGluc2lnaHRzIGludG8gYWN0aW9uLiBUaGV5IG1ha2UgZGlhZ3JhbXMsIGdyYXBocywgYW5kIGNoYXJ0cyB0byByZXByZXNlbnQgdHJlbmRzIGFuZCBwcmVkaWN0aW9ucy4gRGF0YSBzdW1tYXJpemF0aW9uIGhlbHBzIHN0YWtlaG9sZGVycyB1bmRlcnN0YW5kIGFuZCBpbXBsZW1lbnQgcmVzdWx0cyBlZmZlY3RpdmVseS4NCg0KDQoqICoqTW9uaXRvcmluZyBhbmQgVXBkYXRpbmcqKg0KDQoNCiMjIFRlY2huaWNhbCBUb29scyBmb3IgRGF0YSBTY2llbmNlDQoNCg0KRGF0YSBzY2llbmNlIHByb2Zlc3Npb25hbHMgdXNlIGNvbXB1dGluZyBzeXN0ZW1zIHRvIGZvbGxvdyB0aGUgZGF0YSBzY2llbmNlIHByb2Nlc3MuIFRoZSB0b3AgdGVjaG5pcXVlcyB1c2VkIGJ5IGRhdGEgc2NpZW50aXN0cyBhcmU6DQoNCiogKipDbGFzc2lmaWNhdGlvbioqDQoNCkNsYXNzaWZpY2F0aW9uIGlzIHRoZSBzb3J0aW5nIG9mIGRhdGEgaW50byBzcGVjaWZpYyBncm91cHMgb3IgY2F0ZWdvcmllcy4gQ29tcHV0ZXJzIGFyZSB0cmFpbmVkIHRvIGlkZW50aWZ5IGFuZCBzb3J0IGRhdGEuIEtub3duIGRhdGEgc2V0cyBhcmUgdXNlZCB0byBidWlsZCBkZWNpc2lvbiBhbGdvcml0aG1zIGluIGEgY29tcHV0ZXIgdGhhdCBxdWlja2x5IHByb2Nlc3NlcyBhbmQgY2F0ZWdvcml6ZXMgdGhlIGRhdGEuIEZvciBleGFtcGxlOsK3ICANCg0KU29ydCBwcm9kdWN0cyBhcyBwb3B1bGFyIG9yIG5vdCBwb3B1bGFywrcgIA0KU29ydCBpbnN1cmFuY2UgYXBwbGljYXRpb25zIGFzIGhpZ2ggcmlzayBvciBsb3cgcmlza8K3ICANClNvcnQgc29jaWFsIG1lZGlhIGNvbW1lbnRzIGludG8gcG9zaXRpdmUsIG5lZ2F0aXZlLCBvciBuZXV0cmFsLg0KRGF0YSBzY2llbmNlIHByb2Zlc3Npb25hbHMgdXNlIGNvbXB1dGluZyBzeXN0ZW1zIHRvIGZvbGxvdyB0aGUgZGF0YSBzY2llbmNlIHByb2Nlc3MuIA0KDQoqICoqUmVncmVzc2lvbioqDQoNClJlZ3Jlc3Npb24gaXMgdGhlIG1ldGhvZCBvZiBmaW5kaW5nIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHNlZW1pbmdseSB1bnJlbGF0ZWQgZGF0YSBwb2ludHMuIFRoZSBjb25uZWN0aW9uIGlzIHVzdWFsbHkgbW9kZWxlZCBhcm91bmQgYSBtYXRoZW1hdGljYWwgZm9ybXVsYSBhbmQgcmVwcmVzZW50ZWQgYXMgYSBncmFwaCBvciBjdXJ2ZS4gV2hlbiB0aGUgdmFsdWUgb2Ygb25lIGRhdGEgcG9pbnQgaXMga25vd24sIHJlZ3Jlc3Npb24gaXMgdXNlZCB0byBwcmVkaWN0IHRoZSBvdGhlciBkYXRhIHBvaW50LiBGb3IgZXhhbXBsZTrCtyAgDQoNClRoZSByYXRlIG9mIHNwcmVhZCBvZiBhaXItYm9ybmUgZGlzZWFzZXMuwrcgDQogVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBhbmQgdGhlIG51bWJlciBvZiBlbXBsb3llZXMuwrcgIA0KVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZmlyZSBzdGF0aW9ucyBhbmQgdGhlIG51bWJlciBvZiBpbmp1cmllcyBkdWUgdG8gZmlyZSBpbiBhIHBhcnRpY3VsYXIgbG9jYXRpb24uIA0KDQoqICoqQ2x1c3RlcmluZyoqDQoNCkNsdXN0ZXJpbmcgaXMgdGhlIG1ldGhvZCBvZiBncm91cGluZyBjbG9zZWx5IHJlbGF0ZWQgZGF0YSB0b2dldGhlciB0byBsb29rIGZvciBwYXR0ZXJucyBhbmQgYW5vbWFsaWVzLiBDbHVzdGVyaW5nIGlzIGRpZmZlcmVudCBmcm9tIHNvcnRpbmcgYmVjYXVzZSB0aGUgZGF0YSBjYW5ub3QgYmUgYWNjdXJhdGVseSBjbGFzc2lmaWVkIGludG8gZml4ZWQgY2F0ZWdvcmllcy4gSGVuY2UgdGhlIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIG1vc3QgbGlrZWx5IHJlbGF0aW9uc2hpcHMuIE5ldyBwYXR0ZXJucyBhbmQgcmVsYXRpb25zaGlwcyBjYW4gYmUgZGlzY292ZXJlZCB3aXRoIGNsdXN0ZXJpbmcuIEZvciBleGFtcGxlOiDCtyAgDQoNCkdyb3VwIGN1c3RvbWVycyB3aXRoIHNpbWlsYXIgcHVyY2hhc2UgYmVoYXZpb3IgZm9yIGltcHJvdmVkIGN1c3RvbWVyIHNlcnZpY2UuwrcgIA0KR3JvdXAgbmV0d29yayB0cmFmZmljIHRvIGlkZW50aWZ5IGRhaWx5IHVzYWdlIHBhdHRlcm5zIGFuZCBpZGVudGlmeSBhIG5ldHdvcmsgYXR0YWNrIGZhc3Rlci4gIA0KQ2x1c3RlciBhcnRpY2xlcyBpbnRvIG11bHRpcGxlIGRpZmZlcmVudCBuZXdzIGNhdGVnb3JpZXMgYW5kIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGZpbmQgZmFrZSBuZXdzIGNvbnRlbnQuDQpUaGUgYmFzaWMgcHJpbmNpcGxlIGJlaGluZCBkYXRhIHNjaWVuY2UgdGVjaG5pcXVlcw0KDQpcDQoNCiMjIFdoYXQgRGF0YSBTY2llbmNlIENhbm5vdCBEbz8NCg0KV2hpbGUgZGF0YSBzY2llbmNlIGlzIGEgcG93ZXJmdWwgdG9vbCwgaXQgZG9lcyBoYXZlIGl0cyBsaW1pdGF0aW9ucy4gSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBkYXRhIHNjaWVuY2UgY2Fubm90IGRvOg0KDQoqICoqUmVwbGFjZSBTdWJqZWN0IE1hdHRlciBFeHBlcnRzKio6IERhdGEgc2NpZW5jZSBjYW4gcHJvdmlkZSBpbnNpZ2h0cyBhbmQgaGVscCBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucywgYnV0IGl0IGNhbm5vdCByZXBsYWNlIHRoZSBleHBlcnRpc2UgYW5kIGp1ZGdtZW50IG9mIHN1YmplY3QgbWF0dGVyIGV4cGVydHMuDQoNCiogKipHdWFyYW50ZWUgMTAwJSBBY2N1cmFjeSoqOiBQcmVkaWN0aXZlIG1vZGVscyBpbiBkYXRhIHNjaWVuY2UgYXJlIGJhc2VkIG9uIHByb2JhYmlsaXRpZXMgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGFsd2F5cyAxMDAlIGFjY3VyYXRlLg0KDQoqICoqRWxpbWluYXRlIEJpYXMqKjogSWYgdGhlIGRhdGEgdXNlZCBpbiBkYXRhIHNjaWVuY2UgaXMgYmlhc2VkLCB0aGUgcmVzdWx0cyB3aWxsIGFsc28gYmUgYmlhc2VkLiBEYXRhIHNjaWVudGlzdHMgY2FuIHRyeSB0byBtaW5pbWl6ZSBiaWFzLCBidXQgaXQgY2Fubm90IGJlIGNvbXBsZXRlbHkgZWxpbWluYXRlZC4NCg0KKiAqKlJlcGxhY2UgRGF0YSBQcmVwYXJhdGlvbioqOiBEYXRhIHNjaWVuY2UgY2Fubm90IGJ5cGFzcyB0aGUgZGF0YSBwcmVwYXJhdGlvbiBzdGFnZS4gUmF3IGRhdGEgb2Z0ZW4gbmVlZHMgdG8gYmUgY2xlYW5lZCBhbmQgdHJhbnNmb3JtZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBhbmFseXNpcy4NCg0KKiAqKkF1dG9tYXRlIERhdGEgQ29sbGVjdGlvbioqOiBXaGlsZSBkYXRhIHNjaWVuY2UgY2FuIGFuYWx5emUgYW5kIGRyYXcgaW5zaWdodHMgZnJvbSBkYXRhLCBpdCBjYW5ub3QgYXV0b21hdGUgdGhlIHByb2Nlc3Mgb2YgZGF0YSBjb2xsZWN0aW9uLg0KDQoqICoqU29sdmUgQWxsIFByb2JsZW1zKio6IERhdGEgc2NpZW5jZSBpcyBhIHRvb2wgdGhhdCBjYW4gaGVscCBzb2x2ZSBtYW55IHByb2JsZW1zLCBidXQgbm90IGFsbC4gU29tZSBwcm9ibGVtcyBtYXkgcmVxdWlyZSBvdGhlciBhcHByb2FjaGVzIG9yIHRvb2xzLg0KDQoqICoqV29yayBXaXRob3V0IENsZWFyIEdvYWxzKio6IERhdGEgc2NpZW5jZSBpcyBtb3N0IGVmZmVjdGl2ZSB3aGVuIHRoZXJlIGFyZSBjbGVhciBnb2FscyBhbmQgcXVlc3Rpb25zIHRvIGFuc3dlci4gV2l0aG91dCB0aGVzZSwgaXQgY2FuIGJlIGRpZmZpY3VsdCB0byBleHRyYWN0IG1lYW5pbmdmdWwgaW5zaWdodHMgZnJvbSB0aGUgZGF0YS4NCg0KKiAqKkVuc3VyZSBFdGhpY2FsIFVzZSBvZiBEYXRhKio6IERhdGEgc2NpZW5jZSBpdHNlbGYgY2Fubm90IGVuc3VyZSB0aGUgZXRoaWNhbCB1c2Ugb2YgZGF0YS4gVGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGRhdGEgc2NpZW50aXN0cyBhbmQgdGhlIG9yZ2FuaXphdGlvbiB0aGV5IHdvcmsgZm9yLg0KDQoqICoqRnVuY3Rpb24gV2l0aG91dCBJbmZyYXN0cnVjdHVyZSoqOiBEYXRhIHNjaWVuY2UgcmVxdWlyZXMgYSBjZXJ0YWluIGxldmVsIG9mIGluZnJhc3RydWN0dXJlLCBpbmNsdWRpbmcgZGF0YSBzdG9yYWdlIGFuZCBwcm9jZXNzaW5nIGNhcGFiaWxpdGllcy4NCg0KKiAqKlJlcGxhY2UgSHVtYW4gSW50dWl0aW9uIGFuZCBDcmVhdGl2aXR5Kio6IFdoaWxlIGRhdGEgc2NpZW5jZSBjYW4gcHJvdmlkZSB2YWx1YWJsZSBpbnNpZ2h0cywgaXQgY2Fubm90IHJlcGxhY2UgaHVtYW4gaW50dWl0aW9uIGFuZCBjcmVhdGl2aXR5Lg0KDQoNClwNCg0KIyBUZWNobm9sb2dpZXMgZm9yIERhdGEgU2NpZW5jZQ0KDQpcDQoNCiMjIENvbXB1dGluZyBUZWNobm9sb2dpZXMNCg0KRGF0YSBzY2llbmNlIHByYWN0aXRpb25lcnMgd29yayB3aXRoIGNvbXBsZXggdGVjaG5vbG9naWVzIHN1Y2ggYXM6DQoNCiogKipNTCBUb29scyoqOiBNYWNoaW5lIGxlYXJuaW5nIG1vZGVscyBhbmQgcmVsYXRlZCBzb2Z0d2FyZSBhcmUgdXNlZCBmb3IgcHJlZGljdGl2ZSBhbmQgcHJlc2NyaXB0aXZlIGFuYWx5c2lzLg0KDQoqICoqQ2xvdWQgY29tcHV0aW5nKio6IENsb3VkIHRlY2hub2xvZ2llcyBoYXZlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBhbmQgcHJvY2Vzc2luZyBwb3dlciByZXF1aXJlZCBmb3IgYWR2YW5jZWQgZGF0YSBhbmFseXRpY3MuDQoNCiogKipJbnRlcm5ldCBvZiB0aGluZ3MqKjogSW9UIHJlZmVycyB0byB2YXJpb3VzIGRldmljZXMgdGhhdCBjYW4gYXV0b21hdGljYWxseSBjb25uZWN0IHRvIHRoZSBJbnRlcm5ldC4gVGhlc2UgZGV2aWNlcyBjb2xsZWN0IGRhdGEgZm9yIGRhdGEgc2NpZW5jZSBpbml0aWF0aXZlcy4gVGhleSBnZW5lcmF0ZSBtYXNzaXZlIGRhdGEgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRhdGEgbWluaW5nIGFuZCBkYXRhIGV4dHJhY3Rpb24uDQoNCiogKipIaWdoLVBlcmZvcm1hbmNlIGNvbXB1dGluZyoqOiBRdWFudHVtIGNvbXB1dGVycyBjYW4gcGVyZm9ybSBjb21wbGV4IGNhbGN1bGF0aW9ucyBhdCBoaWdoIHNwZWVkLiBTa2lsbGVkIGRhdGEgc2NpZW50aXN0cyB1c2UgdGhlbSBmb3IgYnVpbGRpbmcgY29tcGxleCBxdWFudGl0YXRpdmUgYWxnb3JpdGhtcy4NCg0KDQpcDQoNCiMjIERhdGEgU2NpZW5jZSBDb21tdW5pY2F0aW9uIFRlY2hub2xvZ2llcw0KDQpEYXRhIFNjaWVuY2UgQ29tbXVuaWNhdGlvbiBpbnZvbHZlcyB0aGUgdXNlIG9mIHZhcmlvdXMgdGVjaG5vbG9naWVzIHRvIGVmZmVjdGl2ZWx5IGNvbW11bmljYXRlIGRhdGEgaW5zaWdodHMuIEhlcmUgYXJlIHNvbWUga2V5IHRlY2hub2xvZ2llcyB1c2VkIGluIHRoaXMgZmllbGQ6DQoNCiogKipEYXRhIFZpc3VhbGl6YXRpb24gVG9vbHMqKg0KDQpUb29scyBsaWtlIFRhYmxlYXUsIE1hdHBsb3RsaWIgaW4gUHl0aG9uLCBhbmQgcmljaCBncmFwaGljYWwgbGlicmFyaWVzIGluIFIgYXJlIHVzZWQgdG8gY3JlYXRlIHZpc3VhbCByZXByZXNlbnRhdGlvbnMgb2YgZGF0YSwgbWFraW5nIGl0IGVhc2llciB0byBpZGVudGlmeSBwYXR0ZXJucywgdHJlbmRzLCBhbmQgaW5zaWdodHMuIFNvbWUgcG93ZXJmdWwgZW1lcmdpbmcgaW50ZXJhY3RpdmUgdGVjaG5vbG9naWVzIGFyZSBhbHNvIGF2YWlsYWJsZSBkdWUgdG8gdGhlIHJlY2VudCBkZXZlbG9wbWVudCBvZiB2YXJpb3VzIHNvZnR3YXJlIHByb2dyYW1zIHN1Y2ggYXMgYHBsb3RseWAgYW5kIGBSU2hpbnlgLiBUaGVzZSBpbnRlcmFjdGl2ZSB0ZWNobm9sb2dpZXMgbWFrZSB2aXN1YWxpemF0aW9uIGFuZCBhbmFseXRpY3MgZWFzaWVyIHRvIGV4dHJhY3QgaGlkZGVuIGluZm9ybWF0aW9uIGZyb20gZGF0YSB0aHJvdWdoIGFuYWx5dGljcy4gIA0KDQoqICoqQ29tcHV0YXRpb25hbCBOb3RlYm9va3MqKg0KDQpSTWFya2Rvd24vUiBOb3RlYm9vayBhbmQgSnVweXRlciBOb3RlYm9vayBhcmUgd2lkZWx5IHVzZWQgZm9yIGRhdGEgc2NpZW5jZSBjb21tdW5pY2F0aW9uLiBUaGV5IGFsbG93IGZvciB0aGUgY3JlYXRpb24gb2YgZG9jdW1lbnRzIHRoYXQgY29tYmluZSBsaXZlIGNvZGUgKHN1Y2ggYXMgUHl0aG9uIG9yIFIpIHdpdGggdmlzdWFsaXphdGlvbnMgYW5kIG5hcnJhdGl2ZSB0ZXh0cy4NCg0KKiAqKk1hcmtkb3duIGFuZCBMYVRlWCoqOiANCg0KTWFya2Rvd24gaXMgdXNlZCBmb3IgZm9ybWF0dGluZyB0ZXh0LCB3aGlsZSBMYVRlWCBpcyB1c2VkIGZvciBjcmVhdGluZyBoaWdoLXF1YWxpdHkgdGVjaG5pY2FsIGFuZCBzY2llbnRpZmljIGRvY3VtZW50YXRpb24uIEJvdGggY2FuIGJlIHVzZWQgaW4gUk1hcmtkb3duL1IgTm90ZWJvb2sgYW5kIEp1cHl0ZXIgTm90ZWJvb2sgdG8gY3JlYXRlIHdlbGwtc3RydWN0dXJlZCwgcmVhZGFibGUgZG9jdW1lbnRzLiBSTWFya2Rvd24gaXMgYWxzbyBhIHBvd2VyZnVsIHdlYiBkZXZlbG9wbWVudCB0b29sIHRvIGdlbmVyYXRlIHdlYi1iYXNlZCByZXBvcnRzIHdpdGggYm90aCBzdGF0aWMgYW5kIGludGVyYWN0aXZlIHZpc3VhbCBjb250ZW50Lg0KDQoqICoqR2l0SHViIC0gVmVyc2lvbiBDb250cm9sIGFuZCBDb2xsYWJvcmF0aW9uKiogDQoNCkdpdEh1YiBpcyBhIHBsYXRmb3JtIGZvciB2ZXJzaW9uIGNvbnRyb2wgYW5kIGNvbGxhYm9yYXRpb24uIEl0IGFsbG93cyBkYXRhIHNjaWVudGlzdHMgdG8gd29yayB0b2dldGhlciBhbmQgc2hhcmUgdGhlaXIgY29kZSBhbmQgbm90ZWJvb2tzLiBJdCBpcyBhbHNvIGNvbnZlbmllbnQgdG8gaG9zdCBzdGF0aWMgd2ViIHBhZ2VzIA0KDQoqICoqUHJlc2VudGF0aW9uIFNvZnR3YXJlIGFuZCB0ZWNobm9sb2dpZXMqKg0KDQpUb29scyBsaWtlIG91ciBvbGQgZnJpZW5kcyBNaWNyb3NvZnQgUG93ZXJQb2ludCBvciBHb29nbGUgU2xpZGVzIGFyZSBvZnRlbiB1c2VkIHRvIHByZXNlbnQgZGF0YSBzY2llbmNlIGZpbmRpbmdzIHRvIG5vbi10ZWNobmljYWwgc3Rha2Vob2xkZXJzLiANCg0KKiAqKlBsYXRmb3JtcyBmb3IgVGVjaG5pY2FsIENvbW11bmljYXRpb24qKg0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBrZXkgZWxlbWVudHMgb2YgdGVjaG5pY2FsIGNvbW11bmljYXRpb24gdGhhdCByZXF1aXJlIGludGVncmF0aW5nIGRpZmZlcmVudCBwbGF0Zm9ybXMgdG8gYWNjb21wbGlzaCBlZmZlY3RpdmUgdGVjaG5pY2FsIGNvbW11bmljYXRpb24uDQoNCioqQ2xhcml0eSBhbmQgQ29uY2lzZW5lc3MqKjogVGVjaG5pY2FsIGNvbW11bmljYXRpb24gYWltcyB0byBtYWtlIGNvbXBsZXggaW5mb3JtYXRpb24gY2xlYXIgYW5kIGVhc2lseSB1bmRlcnN0YW5kYWJsZSBmb3IgdGhlIHRhcmdldCBhdWRpZW5jZS4gVGhpcyBpbnZvbHZlcyB1c2luZyBzdHJhaWdodGZvcndhcmQgbGFuZ3VhZ2UsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGphcmdvbiwgYW5kIG9yZ2FuaXppbmcgaW5mb3JtYXRpb24gbG9naWNhbGx5IHRvIGNvbnZleSBpbmZvcm1hdGlvbiBlZmZpY2llbnRseS4NCg0KKipQdXJwb3NlKio6IFRlY2huaWNhbCBjb21tdW5pY2F0aW9uIHNlcnZlcyB2YXJpb3VzIHB1cnBvc2VzLCBzdWNoIGFzIGluZm9ybWluZywgaW5zdHJ1Y3RpbmcsIHBlcnN1YWRpbmcsIG9yIGRvY3VtZW50aW5nLiBUaGUgcHVycG9zZSBndWlkZXMgdGhlIHN0cnVjdHVyZSBhbmQgY29udGVudCBvZiB0aGUgY29tbXVuaWNhdGlvbi4NCg0KKipEb2N1bWVudCBEZXNpZ24qKjogRWZmZWN0aXZlIHRlY2huaWNhbCBjb21tdW5pY2F0aW9uIG9mdGVuIGludm9sdmVzIHRob3VnaHRmdWwgZG9jdW1lbnQgZGVzaWduLiBUaGlzIGluY2x1ZGVzIHRoZSB1c2Ugb2YgaGVhZGluZ3MsIGxpc3RzLCBncmFwaGljcywgYW5kIG90aGVyIHZpc3VhbCBlbGVtZW50cyB0byBlbmhhbmNlIGNvbXByZWhlbnNpb24gYW5kIG1ha2UgdGhlIGluZm9ybWF0aW9uIG1vcmUgYWNjZXNzaWJsZS4NCg0KKipNZWRpdW0gU2VsZWN0aW9uKio6IFRlY2huaWNhbCBjb21tdW5pY2F0aW9uIGNhbiB0YWtlIHZhcmlvdXMgZm9ybXMsIGluY2x1ZGluZyB3cml0dGVuIGRvY3VtZW50cywgcHJlc2VudGF0aW9ucywgdmlkZW9zLCBhbmQgaW50ZXJhY3RpdmUgY29udGVudC4gQ2hvb3NpbmcgdGhlIGFwcHJvcHJpYXRlIG1lZGl1bSBmb3IgdGhlIG1lc3NhZ2UgYW5kIGF1ZGllbmNlIGlzIGNydWNpYWwuDQoNClBsYXRmb3JtcyBsaWtlIFNsYWNrIG9yIE1pY3Jvc29mdCBUZWFtcyBhcmUgdXNlZCBmb3IgcmVhbC10aW1lIGNvbW11bmljYXRpb24gd2l0aGluIGEgZGF0YSBzY2llbmNlIHRlYW0uIE90aGVyIHBsYXRmb3JtcyBzdWNoIGFzIEdpdEh1YiwgQW5hY29uZGEsIFJTdHVkaW8sIFNBUyBWaXlhLCBldGMuIGFyZSAgICANCg0KDQoqICoqRGF0YSBTY2llbmNlIFBsYXRmb3JtcyoqDQoNCkEgZGF0YSBzY2llbmNlIHBsYXRmb3JtIGlzIGEgc29mdHdhcmUgc29sdXRpb24gdGhhdCBlbmFibGVzIGRhdGEgc2NpZW50aXN0cyB0byBlZmZlY3RpdmVseSBwbGFuIHN0cmF0ZWdpZXMsIGRpc2NvdmVyIGFjdGlvbmFibGUgaW5zaWdodHMgZnJvbSBpbnRlcnByZXRpbmcgZGF0YSwgYW5kIGNvbW11bmljYXRlIHRoZWlyIGluc2lnaHRzIGFjcm9zcyB0aGUgZW50aXJlIG9yZ2FuaXphdGlvbuKAlGFsbCB3aXRoaW4gYSBzaW5nbGUgZW52aXJvbm1lbnQuIFRoZXkgYWxzbyBhbGxvdyBmb3IgY29sbGFib3JhdGl2ZSBkYXRhIHNjaWVuY2Ugd29yayBhbmQgaW5jbHVkZSBmZWF0dXJlcyBmb3Igc2hhcmluZyBhbmQgcHJlc2VudGluZyBkYXRhIHNjaWVuY2UgcmVzdWx0cy4gUG9wdWxhciBwbGF0Zm9ybXMgaW5jbHVkZSBBV1MgU2FnZSBNYWtlciwgTWljcm9zb2Z0IEF6dXJlIE1MLCBBbmFjb25kYSwgZXRjLiANCg0KXA0KDQojIEZpZWxkcyBSZWxhdGVkIHRvIERhdGEgU2NpZW5jZQ0KDQpEYXRhIHNjaWVuY2UgaXMgYW4gYWxsLWVuY29tcGFzc2luZyB0ZXJtIGZvciBvdGhlciBkYXRhLXJlbGF0ZWQgcm9sZXMgYW5kIGZpZWxkcy4gV2UgbG9vayBhdCBicmllZmx5IHRoZXNlIGFyZWFzLiBJbiBhZGRpdGlvbiwgd2UgYWxzbyBwb2ludCBvdXQgc29tZSBvZiB0aGUgY2hhbGxlbmdlcyBhbmQgc29tZSBNTC1zcGVjaWZpYyB0b29scy4NCg0KXA0KDQojIyBEYXRhIFNjaWVuY2UgYW5kIFJlbGF0ZWQgQXJlYXMNCg0KV2UgaGF2ZSBtZW50aW9uZWQgdGhhdCBkYXRhIHNjaWVuY2UgYXMgYW4gZW1lcmdpbmcgbXVsdGlkaXNjaXBsaW5hcnkgZmllbGQgaXMgYnVpbHQgb24gZm91ciBwaWxsYXJzOiBNYXRoZW1hdGljcyBhbmQgU3RhdGlzdGljcywgQ29tcHV0YXRpb25hbCBTY2llbmNlIChkYXRhYmFzZXMgYW5kIHByb2dyYW1taW5nKSwgaW50ZXJhY3RpdmUgdGVjaG5vbG9naWVzIGFuZCBzdHJhdGVnaWVzIGZvciBjb21tdW5pY2F0aW9uLCBhbmQgZG9tYWluIGtub3dsZWRnZS4gV2UgbmV4dCBicmllZmx5IGRlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkYXRhIHNjaWVuY2UgYW5kIHRoZSByZWxhdGVkIGZpZWxkcy4gDQoNCiogKmRhdGEgc2NpZW5jZSBhbmQgZGF0YSBhbmFseXRpY3MqDQoNCldoaWxlIHRoZSB0ZXJtcyBtYXkgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHksIGRhdGEgYW5hbHl0aWNzIGlzIGEgc3Vic2V0IG9mIGRhdGEgc2NpZW5jZS4gRGF0YSBzY2llbmNlIGlzIGFuIHVtYnJlbGxhIHRlcm0gZm9yIGFsbCBhc3BlY3RzIG9mIGRhdGEgcHJvY2Vzc2luZ+KAlGZyb20gdGhlIGNvbGxlY3Rpb24gdG8gbW9kZWxpbmcgdG8gaW5zaWdodHMuIE9uIHRoZSBvdGhlciBoYW5kLCBkYXRhIGFuYWx5dGljcyBpcyBtYWlubHkgY29uY2VybmVkIHdpdGggc3RhdGlzdGljcywgbWF0aGVtYXRpY3MsIGFuZCBzdGF0aXN0aWNhbCBhbmFseXNpcy4gSXQgZm9jdXNlcyBvbiBvbmx5IGRhdGEgYW5hbHlzaXMsIHdoaWxlIGRhdGEgc2NpZW5jZSBpcyByZWxhdGVkIHRvIHRoZSBiaWdnZXIgcGljdHVyZSBhcm91bmQgb3JnYW5pemF0aW9uYWwgZGF0YS4gSW4gbW9zdCB3b3JrcGxhY2VzLCBkYXRhIHNjaWVudGlzdHMgYW5kIGRhdGEgYW5hbHlzdHMgd29yayB0b2dldGhlciB0b3dhcmRzIGNvbW1vbiBidXNpbmVzcyBnb2Fscy4gQSBkYXRhIGFuYWx5c3QgbWF5IHNwZW5kIG1vcmUgdGltZSBvbiByb3V0aW5lIGFuYWx5c2lzLCBwcm92aWRpbmcgcmVndWxhciByZXBvcnRzLiBBIGRhdGEgc2NpZW50aXN0IG1heSBkZXNpZ24gdGhlIHdheSBkYXRhIGlzIHN0b3JlZCwgbWFuaXB1bGF0ZWQsIGFuZCBhbmFseXplZC4gU2ltcGx5IHB1dCwgYSBkYXRhIGFuYWx5c3QgbWFrZXMgc2Vuc2Ugb3V0IG9mIGV4aXN0aW5nIGRhdGEsIHdoZXJlYXMgYSBkYXRhIHNjaWVudGlzdCBjcmVhdGVzIG5ldyBtZXRob2RzIGFuZCB0b29scyB0byBwcm9jZXNzIGRhdGEgZm9yIHVzZSBieSBhbmFseXN0cy4NCg0KKiAqZGF0YSBzY2llbmNlIGFuZCBidXNpbmVzcyBhbmFseXRpY3MqDQoNCldoaWxlIHRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiBkYXRhIHNjaWVuY2UgYW5kIGJ1c2luZXNzIGFuYWx5dGljcywgdGhlIGtleSBkaWZmZXJlbmNlIGlzIHRoZSB1c2Ugb2YgdGVjaG5vbG9neSBpbiBlYWNoIGZpZWxkLiBEYXRhIHNjaWVudGlzdHMgd29yayBtb3JlIGNsb3NlbHkgd2l0aCBkYXRhIHRlY2hub2xvZ3kgdGhhbiBidXNpbmVzcyBhbmFseXN0cy4gQnVzaW5lc3MgYW5hbHlzdHMgYnJpZGdlIHRoZSBnYXAgYmV0d2VlbiBidXNpbmVzcyBhbmQgSVQuIFRoZXkgZGVmaW5lIGJ1c2luZXNzIGNhc2VzLCBjb2xsZWN0IGluZm9ybWF0aW9uIGZyb20gc3Rha2Vob2xkZXJzLCBvciB2YWxpZGF0ZSBzb2x1dGlvbnMuIERhdGEgc2NpZW50aXN0cywgb24gdGhlIG90aGVyIGhhbmQsIHVzZSB0ZWNobm9sb2d5IHRvIHdvcmsgd2l0aCBidXNpbmVzcyBkYXRhLiBUaGV5IG1heSB3cml0ZSBwcm9ncmFtcywgYXBwbHkgbWFjaGluZSBsZWFybmluZyB0ZWNobmlxdWVzIHRvIGNyZWF0ZSBtb2RlbHMgYW5kIGRldmVsb3AgbmV3IGFsZ29yaXRobXMuIERhdGEgc2NpZW50aXN0cyBub3Qgb25seSB1bmRlcnN0YW5kIHRoZSBwcm9ibGVtIGJ1dCBjYW4gYWxzbyBidWlsZCBhIHRvb2wgdGhhdCBwcm92aWRlcyBzb2x1dGlvbnMgdG8gdGhlIHByb2JsZW0uIEl04oCZcyBub3QgdW51c3VhbCB0byBmaW5kIGJ1c2luZXNzIGFuYWx5c3RzIGFuZCBkYXRhIHNjaWVudGlzdHMgd29ya2luZyBvbiB0aGUgc2FtZSB0ZWFtLiBCdXNpbmVzcyBhbmFseXN0cyB0YWtlIHRoZSBvdXRwdXQgZnJvbSBkYXRhIHNjaWVudGlzdHMgYW5kIHVzZSBpdCB0byB0ZWxsIGEgc3RvcnkgdGhhdCB0aGUgYnJvYWRlciBidXNpbmVzcyBjYW4gdW5kZXJzdGFuZC4NCg0KKiAqZGF0YSBzY2llbmNlIGFuZCBkYXRhIGVuZ2luZWVyaW5nKg0KDQpEYXRhIGVuZ2luZWVycyBidWlsZCBhbmQgbWFpbnRhaW4gdGhlIHN5c3RlbXMgdGhhdCBhbGxvdyBkYXRhIHNjaWVudGlzdHMgdG8gYWNjZXNzIGFuZCBpbnRlcnByZXQgZGF0YS4gVGhleSB3b3JrIG1vcmUgY2xvc2VseSB3aXRoIHVuZGVybHlpbmcgdGVjaG5vbG9neSB0aGFuIGEgZGF0YSBzY2llbnRpc3QuIFRoZSByb2xlIGdlbmVyYWxseSBpbnZvbHZlcyBjcmVhdGluZyBkYXRhIG1vZGVscywgYnVpbGRpbmcgZGF0YSBwaXBlbGluZXMsIGFuZCBvdmVyc2VlaW5nIGV4dHJhY3QsIHRyYW5zZm9ybSwgYW5kIGxvYWQgKEVUTCkuIERlcGVuZGluZyBvbiB0aGUgb3JnYW5pemF0aW9uJ3Mgc2V0dXAgYW5kIHNpemUsIHRoZSBkYXRhIGVuZ2luZWVyIG1heSBhbHNvIG1hbmFnZSByZWxhdGVkIGluZnJhc3RydWN0dXJlIGxpa2UgYmlnLWRhdGEgc3RvcmFnZSwgc3RyZWFtaW5nLCBhbmQgcHJvY2Vzc2luZyBwbGF0Zm9ybXMgbGlrZSBBbWF6b24gUzMuRGF0YSBzY2llbnRpc3RzIHVzZSB0aGUgZGF0YSB0aGF0IGRhdGEgZW5naW5lZXJzIGhhdmUgcHJvY2Vzc2VkIHRvIGJ1aWxkIGFuZCB0cmFpbiBwcmVkaWN0aXZlIG1vZGVscy4gRGF0YSBzY2llbnRpc3RzIG1heSB0aGVuIGhhbmQgb3ZlciB0aGUgcmVzdWx0cyB0byB0aGUgYW5hbHlzdHMgZm9yIGZ1cnRoZXIgZGVjaXNpb24tbWFraW5nLg0KDQoqICpkYXRhIHNjaWVuY2UgYW5kIG1hY2hpbmUgbGVhcm5pbmcqDQoNCk1hY2hpbmUgbGVhcm5pbmcgaXMgdGhlIHNjaWVuY2Ugb2YgdHJhaW5pbmcgbWFjaGluZXMgdG8gYW5hbHl6ZSBhbmQgbGVhcm4gZnJvbSBkYXRhIHRoZSB3YXkgaHVtYW5zIGRvLiBJdCBpcyBvbmUgb2YgdGhlIG1ldGhvZHMgdXNlZCBpbiBkYXRhIHNjaWVuY2UgcHJvamVjdHMgdG8gZ2FpbiBhdXRvbWF0ZWQgaW5zaWdodHMgZnJvbSBkYXRhLiBNYWNoaW5lIGxlYXJuaW5nIGVuZ2luZWVycyBzcGVjaWFsaXplIGluIGNvbXB1dGluZywgYWxnb3JpdGhtcywgYW5kIGNvZGluZyBza2lsbHMgc3BlY2lmaWMgdG8gbWFjaGluZSBsZWFybmluZyBtZXRob2RzLiBEYXRhIHNjaWVudGlzdHMgbWlnaHQgdXNlIG1hY2hpbmUgbGVhcm5pbmcgbWV0aG9kcyBhcyBhIHRvb2wgb3Igd29yayBjbG9zZWx5IHdpdGggb3RoZXIgbWFjaGluZSBsZWFybmluZyBlbmdpbmVlcnMgdG8gcHJvY2VzcyBkYXRhLg0KDQoqICpkYXRhIHNjaWVuY2UgYW5kIHN0YXRpc3RpY3MqDQoNClN0YXRpc3RpY3MgaXMgYSBtYXRoZW1hdGljYWxseS1iYXNlZCBmaWVsZCB0aGF0IHNlZWtzIHRvIGNvbGxlY3QgYW5kIGludGVycHJldCBxdWFudGl0YXRpdmUgZGF0YS4gSW4gY29udHJhc3QsIGRhdGEgc2NpZW5jZSBpcyBhIG11bHRpZGlzY2lwbGluYXJ5IGZpZWxkIHRoYXQgdXNlcyBzY2llbnRpZmljIG1ldGhvZHMsIHByb2Nlc3NlcywgYW5kIHN5c3RlbXMgdG8gZXh0cmFjdCBrbm93bGVkZ2UgZnJvbSBkYXRhIGluIHZhcmlvdXMgZm9ybXMuIERhdGEgc2NpZW50aXN0cyB1c2UgbWV0aG9kcyBmcm9tIG1hbnkgZGlzY2lwbGluZXMsIGluY2x1ZGluZyBzdGF0aXN0aWNzLiBIb3dldmVyLCB0aGUgZmllbGRzIGRpZmZlciBpbiB0aGVpciBwcm9jZXNzZXMgYW5kIHRoZSBwcm9ibGVtcyB0aGV5IHN0dWR5LiAgDQoNCg0KIyMgRGF0YSBTY2llbmNlIFRvb2xzIG9uIEFXUw0KDQpBV1MgaGFzIGEgcmFuZ2Ugb2YgdG9vbHMgdG8gc3VwcG9ydCBkYXRhIHNjaWVudGlzdHMgYXJvdW5kIHRoZSBnbG9iZToNCg0KIyMjICpEYXRhIHN0b3JhZ2UqDQoNCkZvciBkYXRhIHdhcmVob3VzaW5nLCAqKkFtYXpvbiBSZWRzaGlmdCoqIGNhbiBydW4gY29tcGxleCBxdWVyaWVzIGFnYWluc3Qgc3RydWN0dXJlZCBvciB1bnN0cnVjdHVyZWQgZGF0YS4gQW5hbHlzdHMgYW5kIGRhdGEgc2NpZW50aXN0cyBjYW4gdXNlIEFXUyBHbHVlIHRvIG1hbmFnZSBhbmQgc2VhcmNoIGZvciBkYXRhLiBBV1MgR2x1ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSB1bmlmaWVkIGNhdGFsb2cgb2YgYWxsIGRhdGEgaW4gdGhlIGRhdGEgbGFrZSwgd2l0aCBtZXRhZGF0YSBhdHRhY2hlZCB0byBtYWtlIGl0IGRpc2NvdmVyYWJsZS4NCg0KIyMjICpNYWNoaW5lIGxlYXJuaW5nKg0KDQoqKkFtYXpvbiBTYWdlTWFrZXIqKiBpcyBhIGZ1bGx5LW1hbmFnZWQgbWFjaGluZSBsZWFybmluZyBzZXJ2aWNlIHRoYXQgcnVucyBvbiB0aGUgKipBbWF6b24gRWxhc3RpYyBDb21wdXRlIENsb3VkIChFQzIpKiouIEl0IGFsbG93cyB1c2VycyB0byBvcmdhbml6ZSBkYXRhLCBidWlsZCwgdHJhaW4sIGFuZCBkZXBsb3kgbWFjaGluZSBsZWFybmluZyBtb2RlbHMsIGFuZCBzY2FsZSBvcGVyYXRpb25zLg0KDQojIyMgKkFuYWx5dGljcyoNCg0KKipBbWF6b24gQXRoZW5hKiogaXMgYW4gaW50ZXJhY3RpdmUgcXVlcnkgc2VydmljZSB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gYW5hbHl6ZSBkYXRhIGluICoqQW1hem9uIFMzKiogb3IgR2xhY2llci4gSXQgaXMgZmFzdCwgc2VydmVybGVzcywgYW5kIHdvcmtzIHVzaW5nIHN0YW5kYXJkIFNRTCBxdWVyaWVzLg0KDQoqKkFtYXpvbiBFbGFzdGljIE1hcFJlZHVjZSAoRU1SKSoqIHByb2Nlc3NlcyBiaWcgZGF0YSB1c2luZyBzZXJ2ZXJzIGxpa2UgU3BhcmsgYW5kIEhhZG9vcC4NCg0KKipBbWF6b24gS2luZXNpcyoqIGFsbG93cyBhZ2dyZWdhdGlvbiBhbmQgcHJvY2Vzc2luZyBvZiBzdHJlYW1pbmcgZGF0YSBpbiByZWFsIHRpbWUuIEl0IHVzZXMgd2Vic2l0ZSBjbGlja3N0cmVhbXMsIGFwcGxpY2F0aW9uIGxvZ3MsIGFuZCB0ZWxlbWV0cnkgZGF0YSBmcm9tIElvVCBkZXZpY2VzLiANCiANCioqQW1hem9uIE9wZW5TZWFyY2gqKiBhbGxvd3Mgc2VhcmNoLCBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24gb2YgcGV0YWJ5dGVzIG9mIGRhdGEuDQoNCg0KDQoNCiMjIERhdGEgU2NpZW5jZSBjaGFsbGVuZ2VzDQoNCg0KKiAqTXVsdGlwbGUgZGF0YSBzb3VyY2VzKg0KDQpEaWZmZXJlbnQgdHlwZXMgb2YgYXBwcyBhbmQgdG9vbHMgZ2VuZXJhdGUgZGF0YSBpbiB2YXJpb3VzIGZvcm1hdHMuIERhdGEgc2NpZW50aXN0cyBoYXZlIHRvIGNsZWFuIGFuZCBwcmVwYXJlIGRhdGEgdG8gbWFrZSBpdCBjb25zaXN0ZW50LiBUaGlzIGNhbiBiZSB0ZWRpb3VzIGFuZCB0aW1lLWNvbnN1bWluZy4NCg0KKiAqVW5kZXJzdGFuZGluZyB0aGUgYnVzaW5lc3MgcHJvYmxlbSoNCg0KRGF0YSBzY2llbnRpc3RzIGhhdmUgdG8gd29yayB3aXRoIG11bHRpcGxlIHN0YWtlaG9sZGVycyBhbmQgYnVzaW5lc3MgbWFuYWdlcnMgdG8gZGVmaW5lIHRoZSBwcm9ibGVtIHRvIGJlIHNvbHZlZC4gVGhpcyBjYW4gYmUgY2hhbGxlbmdpbmfigJRlc3BlY2lhbGx5IGluIGxhcmdlIGNvbXBhbmllcyB3aXRoIG11bHRpcGxlIHRlYW1zIHRoYXQgaGF2ZSB2YXJ5aW5nIHJlcXVpcmVtZW50cy4NCg0KKiAqRWxpbWluYXRpb24gb2YgYmlhcyoNCg0KTWFjaGluZSBsZWFybmluZyB0b29scyBhcmUgbm90IGNvbXBsZXRlbHkgYWNjdXJhdGUsIGFuZCBzb21lIHVuY2VydGFpbnR5IG9yIGJpYXMgY2FuIGV4aXN0IGFzIGEgcmVzdWx0LiBCaWFzZXMgYXJlIGltYmFsYW5jZXMgaW4gdGhlIHRyYWluaW5nIGRhdGEgb3IgcHJlZGljdGlvbiBiZWhhdmlvciBvZiB0aGUgbW9kZWwgYWNyb3NzIGRpZmZlcmVudCBncm91cHMsIHN1Y2ggYXMgYWdlIG9yIGluY29tZSBicmFja2V0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSB0b29sIGlzIHRyYWluZWQgcHJpbWFyaWx5IG9uIGRhdGEgZnJvbSBtaWRkbGUtYWdlZCBpbmRpdmlkdWFscywgaXQgbWF5IGJlIGxlc3MgYWNjdXJhdGUgd2hlbiBtYWtpbmcgcHJlZGljdGlvbnMgaW52b2x2aW5nIHlvdW5nZXIgYW5kIG9sZGVyIHBlb3BsZS4gVGhlIGZpZWxkIG9mIG1hY2hpbmUgbGVhcm5pbmcgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gYWRkcmVzcyBiaWFzZXMgYnkgZGV0ZWN0aW5nIHRoZW0gYW5kIG1lYXN1cmluZyB0aGVtIGluIHRoZSBkYXRhIGFuZCBtb2RlbC4NCg==