Last Updated: 07/02/2025
Course Title
PSY:3170 – Fantasy Football: Predictive Analytics and Empiricism
(Fall 2025)
Course Meeting Time and
Place
Tuesday and Thursday 11:00 a.m. – 12:15 p.m., 158 Van Allen (VAN)
Course Home
The University of Iowa
The College of Liberal Arts and Sciences
Department of Psychological and Brain Sciences
The College of Liberal Arts and Sciences (CLAS) is the home of this
course, and CLAS governs the add and drop deadlines, academic misconduct
policies, and other policies and procedures. Other UI colleges may have
different policies.
Instructor Contact
Information
Professor
Petersen
Office: 175 Psychological and Brain Sciences Building (PBSB)
E-mail: isaac-t-petersen@uiowa.edu
Office Phone: 467-1014
Student drop-in hours: Monday 4–5 & Thursday 3–5
Note: I’m here to help you learn and succeed. Please come to my office
hours to ask questions about course material, assignments, exams, or
professional development (career-related issues), for instance. I
welcome you to discuss any concerns you might have about the class. I am
also available to meet with you by appointment, although I would
appreciate your making every effort to see me during office hours. The
best way to reach me outside of class is by email.
Departmental
Resources
Department of Psychological and Brain Sciences: https://psychology.uiowa.edu
Department of Psychological and Brain Sciences Main Office: G60
Psychological and Brain Sciences Building (335-2406)
Coordinator of Undergraduate Studies: Professor Windschitl (paul-windschitl@uiowa.edu;
335-3681)
Academic Coordinator: Janeil Page-Jamison (janeil-page@uiowa.edu;
384-3657)
Departmental Executive Officer (DEO)/Department Chair: Professor
Blumberg (mark-blumberg@uiowa.edu;
335-2424)
Prerequisites
The Department of Psychological and Brain Sciences has a hierarchical
course structure that requires students to complete certain prerequisite
courses before taking upper-level courses. This course requires
successful completion (C- or higher) of any of the following statistics
courses (or AP Statistics from high school): PSY 2811, PSQF 1020, PSQF
4143, STAT 1010, STAT 1015, STAT 1020, STAT 1030, STAT 3510, STAT 4143.
The department will check student records to ensure completion of course
prerequisites.
Fulfilling Your
Academic Requirements
Psychology Students: This course will satisfy either an upper-level
elective or a second Cognate (second Cognates are required for Bachelor
of Science [B.S.] students). If you are using this course as a second
Cognate for the B.S. requirements, please see your academic advisor.
Description of
Course
How can we use information to make predictions about uncertain
events? This course is about empiricism (basing theories on observed
data) and judgment, prediction, and decision making in the context of
uncertainty. But this is no ordinary course…
Rather than memorizing these empirical approaches in abstraction,
students will employ these methods in the active, immersive, hands-on
learning laboratory of Fantasy Football. In this way, the course will
weave together two contiguous threads: an introductory overview of data
analysis techniques, and a captivating application of these techniques
through a semester-long experience in Fantasy Football with their
classmates.
The class involves reading primary source material, applying
statistical programming (using R
software), conducting data
analysis, and composing written work on a weekly basis. Students will be
introduced to modern analytical techniques used to make informed
predictions, test theories, and draw conclusions from a given
dataset.
The course uses fantasy football as a lens and application through
which to learn about statistics and empiricism. The class does not
assume that students know anything about football or fantasy football.
The class is welcome to all, assuming the student meets the
prerequisites and that they are interested in learning about empiricism
(basing theories on observed data), statistics, and judgment,
prediction, and decision making in the context of uncertainty. No need
to worry about how well your fantasy team does; your grade does NOT
depend on your team’s performance (however, the league winner receives
extra credit).
Take this class if:
- you want to learn more advanced skills in 1) empiricism, 2)
statistics, 3) programming (using
R
software), and 4)
judgment, prediction, and decision making in the context of
uncertainty;
- you are interested in learning statistics through the lens of a fun
sports domain (fantasy football); or
- you are interested in applying psychological and statistical
concepts to fantasy football, to gain a strong understanding of critical
thinking and decision making in sports.
Do not take this class if:
- you are reluctant to examine fantasy football topics in a scientific
manner;
- you do not want to write public blog articles as part of the class;
or
- you do not want to learn statistics and programming, and do not want
to persist through inevitable challenges along the way.
Course Goals
The course has three overarching goals; to help students:
- Appreciate the value of statistics for answering questions you find
interesting
- Think critically and be a critical consumer of information in
society
- Get excited about learning stats!
Learning Outcomes
By the end of the course, successful students will be able to:
- Think critically and empirically about human behavior and
performance
- Make sense of big data
- Use, evaluate, and interpret statistical analyses
- Communicate data-driven insights
How Students Will
Achieve the Learning Outcomes
Students will achieve the learning outcomes through the following
specific outcomes:
1. Think
critically and empirically about human behavior and performance
- Apply empirical inference and articulate its advantages over
speculative supposition.
- Formulate research questions, hypotheses, and predictions.
- Provide well-reasoned guidance for decision-making under conditions
of uncertainty.
- Describe common flaws in human judgment and decision making,
including heuristics and cognitive biases, and explain how they can be
mitigated analytically.
- Critically evaluate causal claims by generating plausible
alternative explanations.
- Apply core concepts in causal inference, including confounding,
causal pathways, and counterfactuals.
- Compare the strengths and limitations of human and machine
approaches to prediction.
2. Make sense of
big data
- Apply foundational skills in statistical programming using
R
to combine, manipulate, clean, and summarize large
datasets.
3. Use, evaluate,
and interpret statistical analyses
- Conduct data analyses using
R
, including appropriate
application of statistical models.
- Critically evaluate the strengths and limitations of statistical
models and methods used for predicting uncertain events.
- Apply analytical techniques to predict outcomes and uncover latent
causes in observed data.
- Interpret results from statistical analyses and evaluate the
accuracy of predictions.
- Engage in iterative problem-solving, refining analytical strategies
based on results and feedback.
- Use practical analytical skills that can be applied in future
research and job settings.
4. Communicate
data-driven insights
- Communicate statistical findings in writing for a public
audience.
- Identify characteristics of effective data visualizations.
- Create data visualizations.
Textbook
The cost of textbooks has become so high that I do not feel
comfortable requiring students to purchase a textbook. Thus, I created a
textbook for this course. The textbook for this course is available
for free online: https://isaactpetersen.github.io/Fantasy-Football-Analytics-Textbook
Note: There is a section of the book that invites readers to donate
to support its development. IMPORTANT: This donation
option is NOT for you. The book is publicly available
and the donation option is intended for non-UI people who use the
book. Per the UI Policy
Manual, faculty are prohibited from a) receiving
gifts from their students and b) profiting
from recommending or requiring the purchase of course materials from
their students. As described here,
“Faculty members who would otherwise receive royalties or other
remuneration from the purchase of books or materials which they
recommend or require in courses they teach should either refund the
money to the students or make other arrangements to avoid profiting from
their students’ use of the materials (such as transferring it to the
University or one of its units, or to the University of Iowa Center for
Advancement).” Bottom line: please do NOT donate or give
other gifts—they are not allowed!
Required
Materials
For the class, you will be required to have access to a computer that
allows you to install and run software (including R
,
git
, and GitHub Desktop
). A laptop is
preferable, so you can bring it to class and work through examples in
class.
Academic Honesty and
Misconduct
All students in CLAS courses are expected to abide by the college’s
standards of academic honesty. Academic misconduct must be reported
by instructors to CLAS according to these
procedures.
Please note that collaboration with other classmates is not permitted
on quizzes, writing assignments (except when collaboratively troubleshooting R
errors),
or during exams. However, I do encourage you to collaborate with
classmates to to learn R
, statistics, and programming, to
troubleshoot an error you run into, and to prepare for exams
(e.g., informal study groups). In addition, you are expected to follow
the course’s policy on the use of artificial intelligence (AI), which is
outlined below.
On the Use of
Artificial Intelligence
Artificial intelligence (AI) is rapidly reshaping how we interact
with technology. When used responsibly, AI can support your learning—but
only if you remain the primary thinker and writer.
Reasons to Use
AI
AI can be a valuable tool for exploring ideas, understanding data
analysis, and debugging code. It is highly likely that your future
career will involve working with this technology.
Reasons Not to Use
AI
Developing your own writing, analytical, and critical thinking skills
is a key learning outcome of this course. Like building muscles at the
gym, these skills require effort—you don’t get stronger if someone else
(AI) lifts the weights for you. Mastering foundational skills in
writing, analytical, and critical thinking will not only help you
succeed academically but also make you a more effective and discerning
AI user. By developing skills in writing, analysis, and critical
thinking, you will be better equipped in the future to evaluate
AI-generated responses, recognize when and how they are inaccurate, and
improve upon them. Ultimately, strong independent skills in writing,
analysis, and critical thinking will set you apart in a competitive
workplace.
Course Policy on
AI
AI presents thorny issues for education: AI often generates incorrect
content and risks breaching academic integrity. This section governs our
use of AI in this course.
Use of AI is NOT permitted on quizzes or exams.
Use of AI in this course is permitted for the writing assignments under four conditions:
- You complete your first draft of the writing independently
- You disclose how you use AI
- You begin the conversation with the required
prompt
- You submit the full transcript of your
AI interaction along with the assignment
Failure to meet any of these conditions will result in a zero on
the assignment and may be grounds for an academic misconduct
case.
You may choose any AI model, but you must be able to archive and
submit the full conversation. In ChatGPT, for example, you can
generate a shareable link to the transcript.
These four conditions are detailed below. I reserve the right to
revoke this privilege at any time if I suspect it is being abused.
Complete Your
First Draft of Writing Independently
You may use AI to help you troubleshoot code, clarify concepts, and
improve your writing. However, before you engage with any AI tools to
improve your writing, you must write a complete first draft of your
assignment on your own. This draft should represent your best
independent effort to meet the assignment’s goals, including organizing
your ideas, supporting your claims with evidence, and expressing your
thoughts clearly. Then, you may use AI—under the required conditions—to help you refine your
writing.
AI
Disclosure
For each writing assignment, you must clearly disclose whether and
how you used AI tools. Your disclosure must include one or more of the
following options:
Not Used
: Did not use AI in any way for this
assignment
Mentoring
: Used AI to ask questions or clarify
concepts
Code
: Used AI to generate or review code snippets
Editing
: Used AI to critique or improve writing
List all that apply. For instance, if you used AI to understand a
concept and generate example code, your disclosure should include both
Mentoring
and Code
.
Required Initial
Prompt to Use
Each time you use AI, the first message you send to begin the
conversation must be the prompt below. This prompt ensures that AI
use supports your learning rather than replacing your thinking. Do
NOT add, delete, or edit any language in this
prompt—just copy and paste it:
You are an encouraging, positive tutor who helps students work
through problems relating to statistics, statistical computing, research
methods, and writing. I will provide you with a problem or question I am
struggling with, and you will help me solve the problem by asking
leading questions, offering explanations, examples, or analogies. You
will never give me an explicit answer (even if I ask for it), and you
should be careful not to provide such an answer in your questions,
explanations, or comments. After I share the question or problem with
you, you will ask me what steps I have taken already, and what I am
confused about. Wait for my response. Only ask one question at a time.
Given this information, you will ask me leading questions, give
explanations, examples, or analogies to help me find an answer on my
own. You should guide me in an open-ended way. Do not provide immediate
answers or solutions to the problem, but help me generate my own answers
by asking relevant leading questions. Ask me to explain my thinking. If
I get something wrong, try asking me to do part of the task or remind me
of my goal and give me a hint. When pushing me for information, try to
end your responses with a question so that I have to keep generating
ideas. If you see that I am moving in the right direction, tell me I am
on the right track, encourage me to continue working on my own, and end
the conversation. Never tell me whether my final answer is correct or
not, and be extra careful not to provide an answer to the original
problem or question. Always keep an encouraging, positive tone.
AI Transcript
Submission
You must submit the full transcripts of your conversations
with AI. If you had multiple conversations, submit transcripts for all
conversations you used for that assignment.
The preferred method is to include a shareable link at the top
of your assignment. Most platforms (e.g., ChatGPT, Gemini) provide this
functionality. Make sure the link works before submitting.
Course Requirements
and Policies
Lecture
We will meet two times weekly for lectures, at the time and location
described above. My powerpoint presentations
for the lectures will be posted on ICON no later than noon on the day
before the lecture (though I may continue to refine the slides up until
the time of lecture). Please note: powerpoint presentations are
an outline of my points. It is your responsibility to take notes
during class. If you have questions about the lecture notes or need
clarification of any of the points, please ask in class or meet with
Professor Petersen during office hours. If you miss a lecture, get and
review notes with a peer and watch the lecture recording. Then, come to
office hours if you have specific questions.
Lecture
Recordings
My intention is to record lectures so that you may review them.
Recorded lectures will be posted on the “UICapture” tab in ICON. However, please do not count
on recordings being available, in case I accidentally forget to
initiate the recording or there is a technical malfunction.
Attendance and
Participation
Attendance at lectures is required and will be factored into final
grades (see grading section below). There
are 29 lectures during the semester (excluding the examinations); in
addition, there are two required course surveys (one pre-course survey,
one end-of-course survey). You will receive one point for completion of
each course survey and attendance at each lecture, for up to 29 points
(i.e., you will not receive extra credit for attending/completing all 31
lectures/surveys). Thus, you will not be penalized for missing up to
2 lectures. However, you will be responsible for learning any material
missed for quizzes and exams, and I strongly encourage you to attend all
lectures. Poor lecture attendance is likely to affect the quality of
students’ work and success in the course.
Students who miss more than 2 lectures due to participation in
University activities must give the instructor a statement before the
absence signed by a responsible official that specifies the dates
and times the student will miss class. Authorized activities include
participation in athletic teams, the marching band or pep band, debate
teams, and other recognized University groups, as well as participation
in University field trips, service with the National Guard, and jury
duty. Absences due to illnesses or emergencies (that go over 2 lectures)
must be documented with the University of Iowa Absence
Explanation Form and sent to Professor Petersen within 48 hours of
the absence. Per university policy, if a student will be absent 5 or
more consecutive days and the absence is due to illness or other
emergency, please contact the Registrar Service Center at (319)
384-4300 or registrar@uiowa.edu.
Blog Articles
(Writing Assignments)
As part of the class, you will post blog articles (see the course schedule for deadlines). The blog articles
are public; do not take this course if you do not feel
comfortable posting blog articles with your full name in a public
forum. The blog articles are intended to give you practice
integrating skills to advance the learning
objectives of a) thinking critically and empirically about human
behavior and performance, b) making sense of big data, c) using,
evaluating, and interpreting statistical analyses, and d) communicating
data-driven insights. There will be a penalty of 20% for all blog
articles turned in late. Your two lowest scores will be dropped
(excluding the last blog article, which involves in the integration of
at least two analysis approaches that were covered in class). A blog
article is not considered “submitted” until you (a) post the blog
article so that it is live and publicly available, AND (b) submit the
assignment on ICON with a PDF of
the article and a URL link to your blog article. All blog articles
should be submitted to ICON by
11:59 p.m. on the due date.
You are encouraged to submit your blog article well before the
deadline. You can expect to run into technical issues (e.g.,
errors when running your code, issues getting the blog post to compile,
etc.). Thus, you should give yourself plenty of time to troubleshoot (see below) so that you can
submit your blog article on time.
Troubleshooting
Sometimes code you write does not work. That is okay; it happens to
everyone. Learning how to troubleshoot code is an important part of
programming. If you run into issues related to R
,
GitHub
, GitHub Pages
, or your code, here are a
few pointers on how to get things working (as adapted from Luke
Tierney):
- If you receive an error message, read what the message says.
Sometimes reading the error message is all it takes to figure out what
the issue is and how to fix it.
- Read the whole error message: sometimes the most important part is
at the beginning.
- If the message does not make sense to you, perform a Google search
for the error/issue: often someone else has asked about the same issue
and received a useful answer.
- Simplify your code.
- Look carefully at intermediate results.
- Replace complicated data with something smaller and simpler.
- In the process, you may find your mistake.
- Finding your bug usually involves double checking all the things you
are sure you did right until you find the one you did not.
If you are unable to resolve things on your own, you may need to ask
for help, in which case I encourage you to try one (or more) of the
following:
I am quite busy, and I appreciate your making every effort to solve
the issue on your own or using one of the aforementioned ways before
emailing me. I do not often respond to emails during evenings or
weekends, and I cannot be expected to solve last-minute issues that you
could have solved earlier.
Readings &
Quizzes
Readings and other materials (e.g., videos) will be posted on ICON. You are expected to do the
readings (and watch any required videos) before class. You will have an
online quiz on the readings/materials to complete in ICON, on your own, before each
lecture. The quizzes are meant to help you come to class prepared to
contribute so you are best-positioned to learn and to help others learn.
The quizzes are not timed (you can spend as much time as you need on
each quiz up until the deadline). The deadline for each quiz is 30
minutes before class starts. Late responses and multiple submissions
will not be accepted. Your lowest quiz score will be dropped. We will
not accept excused absences for quizzes because (a) you have a week to
complete the quiz (and can submit it at any point during that week), and
(b) we drop your lowest quiz score. Each quiz will be weighted the same
in the final grade. Quiz answers will be viewable after class.
Past experience has shown that in order to do well in this class, you
should read the required material, participate actively in class, and go
over your notes each week. There is too much material being
covered in this class to try to study only by frantic preparation
immediately before exams. Note that lecture will not cover all
relevant material for the course; you will be expected to know the
required readings for exams.
Workload
This is a 3 semester hour course. Students should therefore expect to
spend 6
additional hours per week (outside of class) reading the articles,
reviewing material from lecture, and preparing for quizzes and
exams.
Examinations
There will be 2 exams; one mid-term exam and one non-cumulative final
exam. Exam 1 will be administered during class time. The date, time, and
location of the final exam will be announced by the 5th week of class by
the College of Liberal Arts and Sciences; the duration of the final exam
will be 120 minutes. Each exam will emphasize information presented for
the half of the class that precedes it. However, some integration of
information across sections will be required for questions on the second
exam. The exams will include multiple-choice questions. Exam questions
can come from any of the following sources: lectures or required
readings. For suggested study tips for this class, meet with
Professor Petersen during office hours.
Missing Exams
University
regulations require that students be allowed to make up examinations
that have been missed due to illness, religious holy days, military
service obligations (including service-related medical appointments), or
other unavoidable circumstances or University-sponsored activities.
Students with UI-authorized activities must discuss their absences with
the instructor as soon as possible. Religious obligations must be
communicated within the first three weeks of classes. See below for the
documentation necessary for an absence to be excused and to be eligible
to take a make-up exam.
Students are allowed to make up exams that have been missed due to
illness, mandatory religious observations, official University
activities, or other unavoidable circumstances. Note: the format of the
make-up exam may differ from the original exam. If you know that you
must be away at the time of an exam for one of these reasons, Professor
Petersen must be contacted in advance whenever possible to schedule a
make-up exam. In order to take a make-up exam, you must provide
acceptable documentation to be eligible to take it: including
documentation for any report of illness; any other circumstances must be
documented by the University of Iowa Absence
Explanation Form (located in ICON under “Student Tools”) and must be
approved by Professor Petersen. In sum, to be eligible for a make-up
exam, Professor Petersen must be contacted before the examination
whenever possible, and you must send acceptable form of documentation to
Professor Petersen.
Grading
Final grades will be assigned at the end of semester on the basis of
your total percentage of points earned on exams, quizzes, attendance,
and writing assignments, as detailed below. Grades will be assigned on
an absolute scale (criterion-referenced grading); course grades will not
be curved. Please note: As a matter of fairness to all students, I
assign grades based on performance and do not negotiate grades. Final
grades will be assigned based on the following ranges:
A+ |
97–100% |
A |
93–96 |
A− |
90–92 |
B+ |
87–89 |
B |
83–86 |
B− |
80–82 |
C+ |
75–79 |
C |
70–74 |
C− |
65–69 |
D+ |
60–64 |
D |
55–59 |
D− |
50–54 |
F |
< 50% |
I round up from .5 when determining final grades. For example, a
course percent of 79.50 would receive a B−, whereas a course percent of
79.49 would receive a C+.
Course Grades
Final course grades will be assessed based on your performance in the
activities below. The relative contribution of each component to your
final grade is as follows:
- 25% Examination #1
- 25% Examination #2 (administered only during the class’s Final Exam
time slot)
- 10% Attendance/Participation
- 10% Reading Quizzes
- 30% Writing Assignments
Tentative Course
Outline (exam dates fixed)
This is a tentative course outline. Changes will be
discussed in class. There are 15 weeks in the semester, and class meets
twice per week (30 sections). We will have one exam during the semester
and one final exam during finals week.
1 |
T |
08/26 |
Overview of Class; Overview of Fantasy Football |
Ch 1–2 |
CodeAcademy Module
1 |
2 |
Th |
08/28 |
Statistical Programming: Using R for
Statistical Analysis |
Ch 3 |
CodeAcademy Modules
2–3 |
3 |
T |
09/02 |
Player Evaluation |
Ch 6;
Den Hartigh et al. (2018) |
Set up blog; post welcome article |
4 |
Th |
09/04 |
The Draft |
Ch 7;
Lee & Liu (2022) |
CodeAcademy Modules
5–6 |
5 |
T |
09/09 |
Statistical Programming in R |
Ch 4 |
CodeAcademy Modules
7–10 |
6 |
Th |
09/11 |
Basic Statistics |
Ch 8–9 |
Blog article 1 due! |
7 |
T |
09/16 |
Data Visualization and Interpretation |
Ch 5;
Schwabish (2021) |
CodeAcademy Module
4 |
8 |
Th |
09/18 |
Correlation Analysis |
Ch 10;
Goodwin & Leech (2006) |
Blog article 2 due! |
9 |
T |
09/23 |
Multiple Regression |
Ch 11;
Osborne & Waters (2002) |
|
10 |
Th |
09/25 |
Mixed Models |
Ch 12;
Brauer & Kurtin (2018) |
|
11 |
T |
09/30 |
Causal Inference |
Ch 13;
D’Onofrio et al. (2020) |
Blog article 3 due! |
12 |
Th |
10/02 |
Heuristics and Cognitive Biases in Prediction |
Ch 14;
Tversky & Kahneman (1974) |
|
13 |
T |
10/07 |
Human Judgment vs Actuarial Approaches to
Prediction |
Ch 15;
Kahneman (2011), Ch 21 & 22 |
|
14 |
Th |
10/09 |
Base Rates |
Ch 16;
Kahneman (2011), Ch 14 & 30 |
Blog article 4 due! |
15 |
T |
10/14 |
Midterm Exam |
|
|
16 |
Th |
10/16 |
Evaluation of Prediction/Forecasting Accuracy: Binary
Classification |
Ch 17 (Section 17.1–17.6.6) |
|
17 |
T |
10/21 |
Evaluation of Prediction/Forecasting Accuracy: Binary
Classification |
Ch 17 (Section 17.6.7–17.6.9) |
|
18 |
Th |
10/23 |
Evaluation of Prediction/Forecasting Accuracy:
Continuous Outcomes |
Ch 17 (Section 17.7–end
of chapter) |
Blog article 5 due! |
19 |
T |
10/28 |
Calibration Accuracy: Overconfidence Bias |
Kahneman & Tversky (1996); Massey & Thaler
(2013) |
|
20 |
Th |
10/30 |
Machine Learning |
Ch 19;
Ramasubramanian & Singh (2019), Ch 6 |
Blog article 6 due! |
21 |
T |
11/04 |
Mythbusters: Putting Fantasy Football Beliefs/Anecdotes
to the Test |
Ch 18;
White & Sheldon (2014) |
|
22 |
Th |
11/06 |
Modern Portfolio Theory |
Ch 20;
Chen (2016) |
Blog article 7 due! |
23 |
T |
11/11 |
Cluster Analysis |
Ch 21;
Everitt et al. (2011) |
|
24 |
Th |
11/13 |
Factor Analysis |
Ch 22;
Field et al. (2012), Ch 17 |
Blog article 8 due! |
25 |
T |
11/18 |
Data Reduction: Principal Component Analysis |
Ch 23 |
|
26 |
Th |
11/20 |
Simulation and the Monte Carlo Method |
Ch 24;
Sigal & Chalmers (2016) |
Blog article 9 due! |
|
|
11/24–11/27 |
FALL BREAK – NO CLASSES |
|
|
27 |
T |
12/02 |
Time Series Analysis |
Ch 25;
Hyndman &
Athanasopoulos (2021), Ch 1 (through Section 1.7) |
|
28 |
Th |
12/04 |
Decision Making in the Context of Uncertainty |
Ch 26;
Larrick et al. (2024) |
Blog article 10 due! |
29 |
T |
12/09 |
Sports and Cognitive Psychology: Coaching and Risk
Aversion |
Ch 27 (Section 27.1–27.5);
Moskowitz & Werthheim (2012), Ch 3 & 16 |
|
30 |
Th |
12/11 |
Sports and Cognitive Psychology: Psychological Factors
in Player Performance; Expert Performance and Automaticity |
Ch 27 (Section 27.6–end
of chapter); Moskowitz & Werthheim (2012), Ch 17 |
Blog article 11 due! |
Finals Week |
|
TBD (week of 12/15) |
Final Exam |
|
|
Date and Time of the
Final Exam
The final
examination date and time will be announced by the Registrar
generally by the fifth week of classes, and it will be announced on the
course ICON site once it is known. Do not plan your end of the
semester travel plans until the final exam schedule is made public. It
is your responsibility to know the date, time, and place of the final
exam. According to the Registrar’s final exam policy, students
have a maximum of two weeks after the announced final exam
schedule to request a change if an exam conflict exists or if a
student has more than two exams scheduled for the same day (see the policy
here).
Course Resources
There are many course resources available to help you succeed in the
class, including:
Drop Deadline for this
Course
You may drop an individual course before the drop deadline; after
this deadline you will need collegiate approval. You can look up the
drop deadline for this course here. When you
drop a course, a “W” will appear on your transcript. The mark of “W” is
a neutral mark that does not affect your GPA. To discuss how dropping
(or staying in) a course might affect your academic goals, please
contact your Academic Advisor. Directions for adding or dropping a
course and other registration changes can be found on the Registrar’s
website. Students can find policies on dropping CLAS courses here.
Students should adhere to the academic deadlines
and policies set by the Graduate College.
Feedback about the
Course
I welcome feedback at any point during the class. If you have
comments on the class or my teaching, please feel free to meet with me
during office hours.
Student
Complaints
Students with a complaint about a grade or a related matter should
first discuss the situation with the instructor, and finally with the
DEO (Chair) of the department, school, or program offering the course.
Sometimes students will be referred to the department or program’s
Director of Undergraduate Studies (DUS) or Director of Graduate Studies
(DGS). Students should contact CLAS
Undergraduate Programs for support when the matter is not resolved
at the previous level.
Communication: UI
Email
Students are responsible for all official correspondences sent to
their UI email address (uiowa.edu) and must use this address for any
communication with instructors or staff in the UI community. For the
privacy and the protection of student records, UI faculty and staff can
only correspond with UI email addresses.
Other Expectations
of Student Performance
Students have the right to a distraction-free learning environment.
You have the responsibility to help create such a classroom environment.
Please treat other students in the class and the instructor with
respect. Students are expected to help each other learn and to
contribute overall to the learning environment of the course. Arriving
prepared for class is part of this expectation.
University
Policies
University
Policies
Accommodations
for Students with Disabilities
The University is committed to providing an educational experience that
is accessible to all students. If a student has a diagnosed disability
or other disabling condition that may impact the student’s ability to
complete the course requirements as stated in the syllabus, the student
may seek accommodations through Student Disability
Services (SDS). SDS is responsible for making Letters
of Accommodation (LOA) available to the student. The student must
provide a LOA to the instructor as early in the semester as possible,
but requests not made at least two weeks prior to the scheduled activity
for which an accommodation is sought may not be accommodated. The
LOA will specify what reasonable course accommodations the student is
eligible for and those the instructor should provide. Additional
information can be found on the SDS
website.
Class
Recordings
Students may be enrolled in a class where some sessions will be recorded
or live-streamed. Such recordings/streaming will only be available to
students registered for the class. These recordings are the intellectual
property of the instructor and they may not be shared or reproduced
without the explicit, written consent of the instructor. Further,
students may not share these sessions with those not in the class or
upload them to any other online environment. Doing so would be a breach
of the Code of Student Conduct, and, in some cases, a violation of state
and federal law, including the Federal Education Rights and Privacy Act
(FERPA).
The unauthorized video or audio recording of academic activities
(e.g., lectures, course discussions, office hours, etc.) by a student is
prohibited. Students with a reasonable accommodation for recording
approved by Student Disability Services should notify each instructor
and provide the Letter of Accommodation prior to using the
accommodation. A student may record classroom activities with prior
written permission from the instructor and notice to other students in
the class that audio or video recording may occur. Any and all classroom
recording must be for personal academic use only. The distribution,
sharing, sale, or posting of recordings on the internet (including
social media), in whole or in part, is prohibited and doing so may be a
violation of the Code of Student Life and/or state or federal privacy,
copyright, or other laws.
Where to Get Academic
Support for This Course
Mental Health
Resources and Student Support
Students are encouraged to be mindful of their mental health and seek
help as a preventive measure or if feeling overwhelmed and/or struggling
to meet course expectations. Students are encouraged to talk to their
instructor for assistance with specific class-related concerns. For
additional support and counseling, students are encouraged to contact
University Counseling Service (UCS). Information about UCS, including
resources and how to schedule an appointment, can be found at counseling.uiowa.edu. Find out
more about UI mental health services at: mentalhealth.uiowa.edu,
including the 24-7 UI
Support and Crisis Line.
Additionally, the Office of the Dean of Students can help students
navigate personal crisis situations. They can provide one-on-one
support, help with identifying options, and access to basic needs resources (such as food,
rent, childcare, etc.). Student Care and Assistance: 132 IMU, dos-assistance@uiowa.edu, or
319-335-1162 and more info: dos.uiowa.edu/assistance
If you feel that you or someone you know may be struggling with an
academic, emotional, or psychological problem, the following
organizations are available for assistance:
University of Iowa Academic Advising Center |
353-5700, https://advisingcenter.uiowa.edu |
University Counseling Services |
335-7294, https://www.uiowa.edu/ucs |
Student Health Service - Mental Health |
335-8394, https://studenthealth.uiowa.edu/services/psychiatry |
University of Iowa Hospitals and Clinics Adult
Psychiatry Services Clinic |
353-6314, https://www.uihealthcare.org/Psychiatry |
Seashore Clinic (in the UI Department of Psychological
and Brain Sciences) |
335-2467, https://psychology.uiowa.edu/resources/seashore-clinic |
Women’s Resource and Action Center |
335-1486, https://wrac.uiowa.edu |
Rape Victim Advocacy Program |
319-335-6000 or 800-228-1625, https://www.uiowa.edu/~rvap |
Office of Sexual Misconduct |
319-335-6200, https://osmrc.uiowa.edu |
CommUnity |
855-325-4296, https://builtbycommunity.org/crisis |
Community & Family Resources |
351-4357, https://www.cfrhelps.org/ |
If you or someone you know is contemplating suicide, either
call or text the Suicide and Crisis Lifeline at 988, or call 911.
Disclosures
I am the Owner of Fantasy Football Analytics, LLC, which operates https://fantasyfootballanalytics.net. I do not require
or encourage students to use my website, and I do not promote or endorse
any specific content or services offered by Fantasy Football
Analytics.
Disclaimer
“This material probably won’t win you fantasy football
championships. You could take what we learn and apply it to fantasy
football and you might become 5 percent more likely to win. Or… Consider
the broader relevance of this. You could learn data analysis and figure
out ways to apply it to other systems. And you could be making a
six-figure salary within the next five years.” – Benjamin Motz,
Ph.D.
This syllabus is subject to change. Any changes will be discussed in
class, via email, and/or on ICON.
LS0tCnRpdGxlOiAiQ291cnNlIFN5bGxhYnVzIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICBlcnJvciA9IFRSVUUsCiAgY29tbWVudCA9ICIiKQpgYGAKCkxhc3QgVXBkYXRlZDogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlbS8lZC8lWSIpYAoKIyBDb3Vyc2UgVGl0bGUgeyN0aXRsZX0KClBTWTozMTcwIOKAkyBGYW50YXN5IEZvb3RiYWxsOiBQcmVkaWN0aXZlIEFuYWx5dGljcyBhbmQgRW1waXJpY2lzbSAoRmFsbCAyMDI1KQoKIyBDb3Vyc2UgTWVldGluZyBUaW1lIGFuZCBQbGFjZSB7I2xlY3R1cmVUaW1lfQoKVHVlc2RheSBhbmQgVGh1cnNkYXkgMTE6MDAgYS5tLiDigJMgMTI6MTUgcC5tLiwgMTU4IFZhbiBBbGxlbiAoVkFOKQoKIyBDb3Vyc2UgV2Vic2l0ZSB7I3dlYnNpdGV9CgpodHRwczovL2ljb24udWlvd2EuZWR1CgpUbyBhY2Nlc3MgdGhlIGNvdXJzZSBzaXRlLCBsb2cgaW50byBbSW93YSBDb3Vyc2VzIE9ubGluZSAoSUNPTildKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpIHVzaW5nIHlvdXIgSGF3ayBJRCBhbmQgcGFzc3dvcmQuCgojIENvdXJzZSBIb21lIHsjaG9tZX0KClRoZSBVbml2ZXJzaXR5IG9mIElvd2FcClRoZSBDb2xsZWdlIG9mIExpYmVyYWwgQXJ0cyBhbmQgU2NpZW5jZXNcCkRlcGFydG1lbnQgb2YgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMKClRoZSBDb2xsZWdlIG9mIExpYmVyYWwgQXJ0cyBhbmQgU2NpZW5jZXMgKENMQVMpIGlzIHRoZSBob21lIG9mIHRoaXMgY291cnNlLCBhbmQgQ0xBUyBnb3Zlcm5zIHRoZSBhZGQgYW5kIGRyb3AgZGVhZGxpbmVzLCBhY2FkZW1pYyBtaXNjb25kdWN0IHBvbGljaWVzLCBhbmQgb3RoZXIgcG9saWNpZXMgYW5kIHByb2NlZHVyZXMuCk90aGVyIFVJIGNvbGxlZ2VzIG1heSBoYXZlIGRpZmZlcmVudCBwb2xpY2llcy4KCiMgSW5zdHJ1Y3RvciBDb250YWN0IEluZm9ybWF0aW9uIHsjaW5zdHJ1Y3Rvcn0KCltQcm9mZXNzb3IgUGV0ZXJzZW5dKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUvcGVvcGxlL2lzYWFjLXBldGVyc2VuKVwKT2ZmaWNlOiAxNzUgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKFBCU0IpXApFLW1haWw6IFtpc2FhYy10LXBldGVyc2VuQHVpb3dhLmVkdV0obWFpbHRvOmlzYWFjLXQtcGV0ZXJzZW5AdWlvd2EuZWR1KVwKT2ZmaWNlIFBob25lOiA0NjctMTAxNFwKU3R1ZGVudCBkcm9wLWluIGhvdXJzOiBNb25kYXkgNOKAkzUgJiBUaHVyc2RheSAz4oCTNVwKTm90ZTogSSdtIGhlcmUgdG8gaGVscCB5b3UgbGVhcm4gYW5kIHN1Y2NlZWQuClBsZWFzZSBjb21lIHRvIG15IG9mZmljZSBob3VycyB0byBhc2sgcXVlc3Rpb25zIGFib3V0IGNvdXJzZSBtYXRlcmlhbCwgYXNzaWdubWVudHMsIGV4YW1zLCBvciBwcm9mZXNzaW9uYWwgZGV2ZWxvcG1lbnQgKGNhcmVlci1yZWxhdGVkIGlzc3VlcyksIGZvciBpbnN0YW5jZS4KSSB3ZWxjb21lIHlvdSB0byBkaXNjdXNzIGFueSBjb25jZXJucyB5b3UgbWlnaHQgaGF2ZSBhYm91dCB0aGUgY2xhc3MuCkkgYW0gYWxzbyBhdmFpbGFibGUgdG8gbWVldCB3aXRoIHlvdSBieSBhcHBvaW50bWVudCwgYWx0aG91Z2ggSSB3b3VsZCBhcHByZWNpYXRlIHlvdXIgbWFraW5nIGV2ZXJ5IGVmZm9ydCB0byBzZWUgbWUgZHVyaW5nIG9mZmljZSBob3Vycy4KVGhlIGJlc3Qgd2F5IHRvIHJlYWNoIG1lIG91dHNpZGUgb2YgY2xhc3MgaXMgYnkgZW1haWwuCgojIERlcGFydG1lbnRhbCBSZXNvdXJjZXMgeyNkZXB0UmVzb3VyY2VzfQoKRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlczogW2h0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHVdKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUpXApEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIE1haW4gT2ZmaWNlOiBHNjAgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKDMzNS0yNDA2KVwKQ29vcmRpbmF0b3Igb2YgVW5kZXJncmFkdWF0ZSBTdHVkaWVzOiBQcm9mZXNzb3IgV2luZHNjaGl0bCAoW3BhdWwtd2luZHNjaGl0bEB1aW93YS5lZHVdKG1haWx0bzpwYXVsLXdpbmRzY2hpdGxAdWlvd2EuZWR1KTsgMzM1LTM2ODEpXApBY2FkZW1pYyBDb29yZGluYXRvcjogSmFuZWlsIFBhZ2UtSmFtaXNvbiAoW2phbmVpbC1wYWdlQHVpb3dhLmVkdV0obWFpbHRvOmphbmVpbC1wYWdlQHVpb3dhLmVkdSk7IDM4NC0zNjU3KVwKRGVwYXJ0bWVudGFsIEV4ZWN1dGl2ZSBPZmZpY2VyIChERU8pL0RlcGFydG1lbnQgQ2hhaXI6IFByb2Zlc3NvciBCbHVtYmVyZyAoW21hcmstYmx1bWJlcmdAdWlvd2EuZWR1XShtYWlsdG86bWFyay1ibHVtYmVyZ0B1aW93YS5lZHUpOyAzMzUtMjQyNCkKCiMgUHJlcmVxdWlzaXRlcyB7I3ByZXJlcXN9CgpUaGUgRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlcyBoYXMgYSBoaWVyYXJjaGljYWwgY291cnNlIHN0cnVjdHVyZSB0aGF0IHJlcXVpcmVzIHN0dWRlbnRzIHRvIGNvbXBsZXRlIGNlcnRhaW4gcHJlcmVxdWlzaXRlIGNvdXJzZXMgYmVmb3JlIHRha2luZyB1cHBlci1sZXZlbCBjb3Vyc2VzLgpUaGlzIGNvdXJzZSByZXF1aXJlcyBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKEMtIG9yIGhpZ2hlcikgb2YgYW55IG9mIHRoZSBmb2xsb3dpbmcgc3RhdGlzdGljcyBjb3Vyc2VzIChvciBBUCBTdGF0aXN0aWNzIGZyb20gaGlnaCBzY2hvb2wpOgpQU1kgMjgxMSwgUFNRRiAxMDIwLCBQU1FGIDQxNDMsIFNUQVQgMTAxMCwgU1RBVCAxMDE1LCBTVEFUIDEwMjAsIFNUQVQgMTAzMCwgU1RBVCAzNTEwLCBTVEFUIDQxNDMuClRoZSBkZXBhcnRtZW50IHdpbGwgY2hlY2sgc3R1ZGVudCByZWNvcmRzIHRvIGVuc3VyZSBjb21wbGV0aW9uIG9mIGNvdXJzZSBwcmVyZXF1aXNpdGVzLgoKIyBGdWxmaWxsaW5nIFlvdXIgQWNhZGVtaWMgUmVxdWlyZW1lbnRzIHsjYWNhZGVtaWNSZXF1aXJlbWVudHN9CgpQc3ljaG9sb2d5IFN0dWRlbnRzOiBUaGlzIGNvdXJzZSB3aWxsIHNhdGlzZnkgZWl0aGVyIGFuIHVwcGVyLWxldmVsIGVsZWN0aXZlIG9yIGEgc2Vjb25kIENvZ25hdGUgKHNlY29uZCBDb2duYXRlcyBhcmUgcmVxdWlyZWQgZm9yIEJhY2hlbG9yIG9mIFNjaWVuY2UgW0IuUy5dIHN0dWRlbnRzKS4KSWYgeW91IGFyZSB1c2luZyB0aGlzIGNvdXJzZSBhcyBhIHNlY29uZCBDb2duYXRlIGZvciB0aGUgQi5TLiByZXF1aXJlbWVudHMsIHBsZWFzZSBzZWUgeW91ciBhY2FkZW1pYyBhZHZpc29yLgoKIyBEZXNjcmlwdGlvbiBvZiBDb3Vyc2UgeyNkZXNjcmlwdGlvbn0KCkhvdyBjYW4gd2UgdXNlIGluZm9ybWF0aW9uIHRvIG1ha2UgcHJlZGljdGlvbnMgYWJvdXQgdW5jZXJ0YWluIGV2ZW50cz8KVGhpcyBjb3Vyc2UgaXMgYWJvdXQgZW1waXJpY2lzbSAoYmFzaW5nIHRoZW9yaWVzIG9uIG9ic2VydmVkIGRhdGEpIGFuZCBqdWRnbWVudCwgcHJlZGljdGlvbiwgYW5kIGRlY2lzaW9uIG1ha2luZyBpbiB0aGUgY29udGV4dCBvZiB1bmNlcnRhaW50eS4KQnV0IHRoaXMgaXMgbm8gb3JkaW5hcnkgY291cnNlLi4uCgpSYXRoZXIgdGhhbiBtZW1vcml6aW5nIHRoZXNlIGVtcGlyaWNhbCBhcHByb2FjaGVzIGluIGFic3RyYWN0aW9uLCBzdHVkZW50cyB3aWxsIGVtcGxveSB0aGVzZSBtZXRob2RzIGluIHRoZSBhY3RpdmUsIGltbWVyc2l2ZSwgaGFuZHMtb24gbGVhcm5pbmcgbGFib3JhdG9yeSBvZiBGYW50YXN5IEZvb3RiYWxsLgpJbiB0aGlzIHdheSwgdGhlIGNvdXJzZSB3aWxsIHdlYXZlIHRvZ2V0aGVyIHR3byBjb250aWd1b3VzIHRocmVhZHM6IGFuIGludHJvZHVjdG9yeSBvdmVydmlldyBvZiBkYXRhIGFuYWx5c2lzIHRlY2huaXF1ZXMsIGFuZCBhIGNhcHRpdmF0aW5nIGFwcGxpY2F0aW9uIG9mIHRoZXNlIHRlY2huaXF1ZXMgdGhyb3VnaCBhIHNlbWVzdGVyLWxvbmcgZXhwZXJpZW5jZSBpbiBGYW50YXN5IEZvb3RiYWxsIHdpdGggdGhlaXIgY2xhc3NtYXRlcy5bXmFkYXB0ZWRdCgpUaGUgY2xhc3MgaW52b2x2ZXMgcmVhZGluZyBwcmltYXJ5IHNvdXJjZSBtYXRlcmlhbCwgYXBwbHlpbmcgc3RhdGlzdGljYWwgcHJvZ3JhbW1pbmcgKHVzaW5nIGBSYCBzb2Z0d2FyZSksIGNvbmR1Y3RpbmcgZGF0YSBhbmFseXNpcywgYW5kIGNvbXBvc2luZyB3cml0dGVuIHdvcmsgb24gYSB3ZWVrbHkgYmFzaXMuClN0dWRlbnRzIHdpbGwgYmUgaW50cm9kdWNlZCB0byBtb2Rlcm4gYW5hbHl0aWNhbCB0ZWNobmlxdWVzIHVzZWQgdG8gbWFrZSBpbmZvcm1lZCBwcmVkaWN0aW9ucywgdGVzdCB0aGVvcmllcywgYW5kIGRyYXcgY29uY2x1c2lvbnMgZnJvbSBhIGdpdmVuIGRhdGFzZXQuCgpUaGUgY291cnNlIHVzZXMgZmFudGFzeSBmb290YmFsbCBhcyBhIGxlbnMgYW5kIGFwcGxpY2F0aW9uIHRocm91Z2ggd2hpY2ggdG8gbGVhcm4gYWJvdXQgc3RhdGlzdGljcyBhbmQgZW1waXJpY2lzbS4KVGhlIGNsYXNzIGRvZXMgbm90IGFzc3VtZSB0aGF0IHN0dWRlbnRzIGtub3cgYW55dGhpbmcgYWJvdXQgZm9vdGJhbGwgb3IgZmFudGFzeSBmb290YmFsbC4KVGhlIGNsYXNzIGlzIHdlbGNvbWUgdG8gYWxsLCBhc3N1bWluZyB0aGUgc3R1ZGVudCBtZWV0cyB0aGUgcHJlcmVxdWlzaXRlcyBhbmQgdGhhdCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIGFib3V0IGVtcGlyaWNpc20gKGJhc2luZyB0aGVvcmllcyBvbiBvYnNlcnZlZCBkYXRhKSwgc3RhdGlzdGljcywgYW5kIGp1ZGdtZW50LCBwcmVkaWN0aW9uLCBhbmQgZGVjaXNpb24gbWFraW5nIGluIHRoZSBjb250ZXh0IG9mIHVuY2VydGFpbnR5LgpObyBuZWVkIHRvIHdvcnJ5IGFib3V0IGhvdyB3ZWxsIHlvdXIgZmFudGFzeSB0ZWFtIGRvZXM7IHlvdXIgZ3JhZGUgZG9lcyBOT1QgZGVwZW5kIG9uIHlvdXIgdGVhbSdzIHBlcmZvcm1hbmNlIChob3dldmVyLCB0aGUgbGVhZ3VlIHdpbm5lciByZWNlaXZlcyBbZXh0cmEgY3JlZGl0XSgjZXh0cmFDcmVkaXQpKS4KClRha2UgdGhpcyBjbGFzcyBpZjoKCi0geW91IHdhbnQgdG8gbGVhcm4gbW9yZSBhZHZhbmNlZCBza2lsbHMgaW4gMSkgZW1waXJpY2lzbSwgMikgc3RhdGlzdGljcywgMykgcHJvZ3JhbW1pbmcgKHVzaW5nIGBSYCBzb2Z0d2FyZSksIGFuZCA0KSBqdWRnbWVudCwgcHJlZGljdGlvbiwgYW5kIGRlY2lzaW9uIG1ha2luZyBpbiB0aGUgY29udGV4dCBvZiB1bmNlcnRhaW50eTsKLSB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgc3RhdGlzdGljcyB0aHJvdWdoIHRoZSBsZW5zIG9mIGEgZnVuIHNwb3J0cyBkb21haW4gKGZhbnRhc3kgZm9vdGJhbGwpOyBvcgotIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhcHBseWluZyBwc3ljaG9sb2dpY2FsIGFuZCBzdGF0aXN0aWNhbCBjb25jZXB0cyB0byBmYW50YXN5IGZvb3RiYWxsLCB0byBnYWluIGEgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgY3JpdGljYWwgdGhpbmtpbmcgYW5kIGRlY2lzaW9uIG1ha2luZyBpbiBzcG9ydHMuCgoqRG8gbm90IHRha2UgdGhpcyBjbGFzcyBpZio6CgotIHlvdSBhcmUgcmVsdWN0YW50IHRvIGV4YW1pbmUgZmFudGFzeSBmb290YmFsbCB0b3BpY3MgaW4gYSBzY2llbnRpZmljIG1hbm5lcjsKLSB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgcHVibGljIGJsb2cgYXJ0aWNsZXMgYXMgcGFydCBvZiB0aGUgY2xhc3M7IG9yCi0geW91IGRvIG5vdCB3YW50IHRvIGxlYXJuIHN0YXRpc3RpY3MgYW5kIHByb2dyYW1taW5nLCBhbmQgZG8gbm90IHdhbnQgdG8gcGVyc2lzdCB0aHJvdWdoIGluZXZpdGFibGUgY2hhbGxlbmdlcyBhbG9uZyB0aGUgd2F5LgoKW15hZGFwdGVkXToKICAgIEVsZW1lbnRzIG9mIHRoaXMgc3lsbGFidXMgYW5kIGNvdXJzZSB3ZXJlIGJvcnJvd2VkIGFuZCBhZGFwdGVkICh3aXRoIHBlcm1pc3Npb24pIGZyb20gYSBzaW1pbGFyIGNvdXJzZSBieSBCZW5qYW1pbiBNb3R6LgoKIyMgV2hhdCBpcyBGYW50YXN5IEZvb3RiYWxsPyBBbmQgV2h5IEZvY3VzIG9uIEZhbnRhc3kgRm9vdGJhbGw/IHsjZmFudGFzeUZvb3RiYWxsfQoKRmFudGFzeSBmb290YmFsbCBpcyBhbiBvbmxpbmUgZ2FtZSB3aGVyZSBwYXJ0aWNpcGFudHMgYXNzZW1ibGUgKGkuZS4sICJkcmFmdCIpIGltYWdpbmFyeSB0ZWFtcyBjb21wb3NlZCBvZiByZWFsLWxpZmUgTmF0aW9uYWwgRm9vdGJhbGwgTGVhZ3VlIChORkwpIHBsYXllcnMuCkluIHRoZSBnYW1lIG9mIGZhbnRhc3kgZm9vdGJhbGwsIHBhcnRpY2lwYW50cyBjb21wZXRlIGFnYWluc3Qgb3RoZXJzLCBhY2N1bXVsYXRpbmcgImZhbnRhc3kiIHBvaW50cyBiYXNlZCBvbiBwbGF5ZXJzJyBhY3R1YWwgc3RhdGlzdGljYWwgcGVyZm9ybWFuY2VzIGluIGdhbWVzIChhbmQgdGhlIGdvYWwgaXMgdG8gb3V0c2NvcmUgb25lJ3Mgb3Bwb25lbnQgZWFjaCB3ZWVrIHRvIHdpbiBtYXRjaGVzIGFuZCB1bHRpbWF0ZWx5IGNsYWltIHZpY3RvcnkgaW4gdGhlIGxlYWd1ZSkuCkZhbnRhc3kgZm9vdGJhbGwgcmVsaWVzIGhlYXZpbHkgb24gcHJlZGljdGlvbuKAlHRyeWluZyB0byBwcmVkaWN0IHdoaWNoIHBsYXllcnMgd2lsbCBwZXJmb3JtIGJlc3QgYW5kIHNlbGVjdGluZyB0aGVtIGFjY29yZGluZ2x5LgpJbiB0aGlzIHdheSwgZmFudGFzeSBmb290YmFsbCBwcm92aWRlcyBhIHBsZXRob3JhIG9mIGRlY2lzaW9uIG1ha2luZyBvcHBvcnR1bml0aWVzIGluIHRoZSBmYWNlIG9mIHVuY2VydGFpbnR5LCBhbmQgYSB3ZWFsdGggb2YgZGF0YSBmb3IgYW5hbHl6aW5nIHRoZXNlIGRlY2lzaW9ucy4KSG93ZXZlciwgdW5saWtlIG1hbnkgb3RoZXIgYXBwbGllZCBkb21haW5zIGluIHBzeWNob2xvZ3ksIGZhbnRhc3kgZm9vdGJhbGwgKDEpIGFsbG93cyBhIHBlcnNvbiB0byBzZWUgdGhlIGFjY3VyYWN5IG9mIHRoZWlyIHByZWRpY3Rpb25zIG9uIGEgdGltZWx5IGJhc2lzIGFuZCAoMikgcHJvdmlkZXMgYSBzYWZlIGVudmlyb25tZW50IGZvciBmcmllbmRseSBjb21wZXRpdGlvbi4KVGh1cywgaXQgcHJvdmlkZXMgYSB1bmlxdWUgZG9tYWluIHRvIGV2YWx1YXRl4oCUYW5kIGltcHJvdmXigJR0aGUgYWNjdXJhY3kgb2YgdmFyaW91cyBwcmVkaWN0aW9uIG1vZGVscy4KCiMgQ291cnNlIEdvYWxzIHsjZ29hbHN9CgpUaGUgY291cnNlIGhhcyB0aHJlZSBvdmVyYXJjaGluZyBnb2FsczsgdG8gaGVscCBzdHVkZW50czoKCjEuIEFwcHJlY2lhdGUgdGhlIHZhbHVlIG9mIHN0YXRpc3RpY3MgZm9yIGFuc3dlcmluZyBxdWVzdGlvbnMgeW91IGZpbmQgaW50ZXJlc3RpbmcKMS4gVGhpbmsgY3JpdGljYWxseSBhbmQgYmUgYSBjcml0aWNhbCBjb25zdW1lciBvZiBpbmZvcm1hdGlvbiBpbiBzb2NpZXR5CjEuIEdldCBleGNpdGVkIGFib3V0IGxlYXJuaW5nIHN0YXRzIQoKIyBMZWFybmluZyBPdXRjb21lcyB7I2xlYXJuaW5nT3V0Y29tZXN9CgpCeSB0aGUgZW5kIG9mIHRoZSBjb3Vyc2UsIHN1Y2Nlc3NmdWwgc3R1ZGVudHMgd2lsbCBiZSBhYmxlIHRvOgoKMS4gVGhpbmsgY3JpdGljYWxseSBhbmQgZW1waXJpY2FsbHkgYWJvdXQgaHVtYW4gYmVoYXZpb3IgYW5kIHBlcmZvcm1hbmNlCjEuIE1ha2Ugc2Vuc2Ugb2YgYmlnIGRhdGEKMS4gVXNlLCBldmFsdWF0ZSwgYW5kIGludGVycHJldCBzdGF0aXN0aWNhbCBhbmFseXNlcwoxLiBDb21tdW5pY2F0ZSBkYXRhLWRyaXZlbiBpbnNpZ2h0cwoKIyMgSG93IFN0dWRlbnRzIFdpbGwgQWNoaWV2ZSB0aGUgTGVhcm5pbmcgT3V0Y29tZXMgeyNsZWFybmluZ091dGNvbWVzSG93QWNoaWV2ZX0KClN0dWRlbnRzIHdpbGwgYWNoaWV2ZSB0aGUgbGVhcm5pbmcgb3V0Y29tZXMgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNwZWNpZmljIG91dGNvbWVzOgoKIyMjIDEuIFRoaW5rIGNyaXRpY2FsbHkgYW5kIGVtcGlyaWNhbGx5IGFib3V0IGh1bWFuIGJlaGF2aW9yIGFuZCBwZXJmb3JtYW5jZSB7I2xlYXJuaW5nT3V0Y29tZXNUaGlua0NyaXRpY2FsbHl9CgotIEFwcGx5IGVtcGlyaWNhbCBpbmZlcmVuY2UgYW5kIGFydGljdWxhdGUgaXRzIGFkdmFudGFnZXMgb3ZlciBzcGVjdWxhdGl2ZSBzdXBwb3NpdGlvbi4KLSBGb3JtdWxhdGUgcmVzZWFyY2ggcXVlc3Rpb25zLCBoeXBvdGhlc2VzLCBhbmQgcHJlZGljdGlvbnMuCi0gUHJvdmlkZSB3ZWxsLXJlYXNvbmVkIGd1aWRhbmNlIGZvciBkZWNpc2lvbi1tYWtpbmcgdW5kZXIgY29uZGl0aW9ucyBvZiB1bmNlcnRhaW50eS4KLSBEZXNjcmliZSBjb21tb24gZmxhd3MgaW4gaHVtYW4ganVkZ21lbnQgYW5kIGRlY2lzaW9uIG1ha2luZywgaW5jbHVkaW5nIGhldXJpc3RpY3MgYW5kIGNvZ25pdGl2ZSBiaWFzZXMsIGFuZCBleHBsYWluIGhvdyB0aGV5IGNhbiBiZSBtaXRpZ2F0ZWQgYW5hbHl0aWNhbGx5LgotIENyaXRpY2FsbHkgZXZhbHVhdGUgY2F1c2FsIGNsYWltcyBieSBnZW5lcmF0aW5nIHBsYXVzaWJsZSBhbHRlcm5hdGl2ZSBleHBsYW5hdGlvbnMuCi0gQXBwbHkgY29yZSBjb25jZXB0cyBpbiBjYXVzYWwgaW5mZXJlbmNlLCBpbmNsdWRpbmcgY29uZm91bmRpbmcsIGNhdXNhbCBwYXRod2F5cywgYW5kIGNvdW50ZXJmYWN0dWFscy4KLSBDb21wYXJlIHRoZSBzdHJlbmd0aHMgYW5kIGxpbWl0YXRpb25zIG9mIGh1bWFuIGFuZCBtYWNoaW5lIGFwcHJvYWNoZXMgdG8gcHJlZGljdGlvbi4KCiMjIyAyLiBNYWtlIHNlbnNlIG9mIGJpZyBkYXRhIHsjbGVhcm5pbmdPdXRjb21lc0JpZ0RhdGF9CgotIEFwcGx5IGZvdW5kYXRpb25hbCBza2lsbHMgaW4gc3RhdGlzdGljYWwgcHJvZ3JhbW1pbmcgdXNpbmcgYFJgIHRvIGNvbWJpbmUsIG1hbmlwdWxhdGUsIGNsZWFuLCBhbmQgc3VtbWFyaXplIGxhcmdlIGRhdGFzZXRzLgoKIyMjIDMuIFVzZSwgZXZhbHVhdGUsIGFuZCBpbnRlcnByZXQgc3RhdGlzdGljYWwgYW5hbHlzZXMgeyNsZWFybmluZ091dGNvbWVzQW5hbHlzZXN9CgotIENvbmR1Y3QgZGF0YSBhbmFseXNlcyB1c2luZyBgUmAsIGluY2x1ZGluZyBhcHByb3ByaWF0ZSBhcHBsaWNhdGlvbiBvZiBzdGF0aXN0aWNhbCBtb2RlbHMuCi0gQ3JpdGljYWxseSBldmFsdWF0ZSB0aGUgc3RyZW5ndGhzIGFuZCBsaW1pdGF0aW9ucyBvZiBzdGF0aXN0aWNhbCBtb2RlbHMgYW5kIG1ldGhvZHMgdXNlZCBmb3IgcHJlZGljdGluZyB1bmNlcnRhaW4gZXZlbnRzLgotIEFwcGx5IGFuYWx5dGljYWwgdGVjaG5pcXVlcyB0byBwcmVkaWN0IG91dGNvbWVzIGFuZCB1bmNvdmVyIGxhdGVudCBjYXVzZXMgaW4gb2JzZXJ2ZWQgZGF0YS4KLSBJbnRlcnByZXQgcmVzdWx0cyBmcm9tIHN0YXRpc3RpY2FsIGFuYWx5c2VzIGFuZCBldmFsdWF0ZSB0aGUgYWNjdXJhY3kgb2YgcHJlZGljdGlvbnMuCi0gRW5nYWdlIGluIGl0ZXJhdGl2ZSBwcm9ibGVtLXNvbHZpbmcsIHJlZmluaW5nIGFuYWx5dGljYWwgc3RyYXRlZ2llcyBiYXNlZCBvbiByZXN1bHRzIGFuZCBmZWVkYmFjay4KLSBVc2UgcHJhY3RpY2FsIGFuYWx5dGljYWwgc2tpbGxzIHRoYXQgY2FuIGJlIGFwcGxpZWQgaW4gZnV0dXJlIHJlc2VhcmNoIGFuZCBqb2Igc2V0dGluZ3MuCgojIyMgNC4gQ29tbXVuaWNhdGUgZGF0YS1kcml2ZW4gaW5zaWdodHMgeyNsZWFybmluZ091dGNvbWVzQ29tbXVuaWNhdGlvbn0KCi0gQ29tbXVuaWNhdGUgc3RhdGlzdGljYWwgZmluZGluZ3MgaW4gd3JpdGluZyBmb3IgYSBwdWJsaWMgYXVkaWVuY2UuCi0gSWRlbnRpZnkgY2hhcmFjdGVyaXN0aWNzIG9mIGVmZmVjdGl2ZSBkYXRhIHZpc3VhbGl6YXRpb25zLgotIENyZWF0ZSBkYXRhIHZpc3VhbGl6YXRpb25zLgoKIyBUZXh0Ym9vayB7I3RleHRib29rfQoKVGhlIGNvc3Qgb2YgdGV4dGJvb2tzIGhhcyBiZWNvbWUgc28gaGlnaCB0aGF0IEkgZG8gbm90IGZlZWwgY29tZm9ydGFibGUgcmVxdWlyaW5nIHN0dWRlbnRzIHRvIHB1cmNoYXNlIGEgdGV4dGJvb2suClRodXMsIEkgY3JlYXRlZCBhIHRleHRib29rIGZvciB0aGlzIGNvdXJzZS4KVGhlIHRleHRib29rIGZvciB0aGlzIGNvdXJzZSBpcyBhdmFpbGFibGUgPHU+Zm9yIGZyZWU8L3U+IG9ubGluZToKaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2sKCk5vdGU6IFRoZXJlIGlzIGEgc2VjdGlvbiBvZiB0aGUgYm9vayB0aGF0IGludml0ZXMgcmVhZGVycyB0byBkb25hdGUgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQuCioqSU1QT1JUQU5UKio6IFRoaXMgZG9uYXRpb24gb3B0aW9uIGlzIDx1PipOT1QqPC91PiBmb3IgeW91LgpUaGUgYm9vayBpcyBwdWJsaWNseSBhdmFpbGFibGUgYW5kIHRoZSBkb25hdGlvbiBvcHRpb24gaXMgPHU+aW50ZW5kZWQgZm9yIG5vbi1VSSBwZW9wbGU8L3U+IHdobyB1c2UgdGhlIGJvb2suClBlciB0aGUgW1VJIFBvbGljeSBNYW51YWxdKGh0dHBzOi8vb3BzbWFudWFsLnVpb3dhLmVkdSksIGZhY3VsdHkgYXJlIHByb2hpYml0ZWQgZnJvbSBhKSBbcmVjZWl2aW5nIGdpZnRzIGZyb20gdGhlaXIgc3R1ZGVudHNdKGh0dHBzOi8vb3BzbWFudWFsLnVpb3dhLmVkdS9jb21tdW5pdHktcG9saWNpZXMvcHJvaGliaXRpb24tZ2l2aW5nLWFuZC1yZWNlaXZpbmctZ2lmdHMpIGFuZCBiKSBbcHJvZml0aW5nIGZyb20gcmVjb21tZW5kaW5nIG9yIHJlcXVpcmluZyB0aGUgcHVyY2hhc2Ugb2YgY291cnNlIG1hdGVyaWFscyBmcm9tIHRoZWlyIHN0dWRlbnRzXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvaHVtYW4tcmVzb3VyY2VzL2NvbXBlbnNhdGlvbi9zdXBwbGVtZW50YWwtYWN0aXZpdGllcy1hbmQtZXh0cmEtY29tcGVuc2F0aW9uKS4KQXMgZGVzY3JpYmVkIFtoZXJlXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvaHVtYW4tcmVzb3VyY2VzL2NvbXBlbnNhdGlvbi9zdXBwbGVtZW50YWwtYWN0aXZpdGllcy1hbmQtZXh0cmEtY29tcGVuc2F0aW9uKSwgIkZhY3VsdHkgbWVtYmVycyB3aG8gd291bGQgb3RoZXJ3aXNlIHJlY2VpdmUgcm95YWx0aWVzIG9yIG90aGVyIHJlbXVuZXJhdGlvbiBmcm9tIHRoZSBwdXJjaGFzZSBvZiBib29rcyBvciBtYXRlcmlhbHMgd2hpY2ggdGhleSByZWNvbW1lbmQgb3IgcmVxdWlyZSBpbiBjb3Vyc2VzIHRoZXkgdGVhY2ggc2hvdWxkIGVpdGhlciByZWZ1bmQgdGhlIG1vbmV5IHRvIHRoZSBzdHVkZW50cyBvciBtYWtlIG90aGVyIGFycmFuZ2VtZW50cyB0byBhdm9pZCBwcm9maXRpbmcgZnJvbSB0aGVpciBzdHVkZW50cycgdXNlIG9mIHRoZSBtYXRlcmlhbHMgKHN1Y2ggYXMgdHJhbnNmZXJyaW5nIGl0IHRvIHRoZSBVbml2ZXJzaXR5IG9yIG9uZSBvZiBpdHMgdW5pdHMsIG9yIHRvIHRoZSBVbml2ZXJzaXR5IG9mIElvd2EgQ2VudGVyIGZvciBBZHZhbmNlbWVudCkuIgpCb3R0b20gbGluZTogPHU+KipwbGVhc2UgZG8gTk9UIGRvbmF0ZSBvciBnaXZlIG90aGVyIGdpZnRz4oCUdGhleSBhcmUgbm90IGFsbG93ZWQhKio8L3U+CgojIFJlcXVpcmVkIE1hdGVyaWFscyB7I3JlcXVpcmVkTWF0ZXJpYWxzfQoKRm9yIHRoZSBjbGFzcywgeW91IHdpbGwgYmUgcmVxdWlyZWQgdG8gaGF2ZSBhY2Nlc3MgdG8gYSBjb21wdXRlciB0aGF0IGFsbG93cyB5b3UgdG8gaW5zdGFsbCBhbmQgcnVuIHNvZnR3YXJlIChpbmNsdWRpbmcgYFJgLCBgZ2l0YCwgYW5kIGBHaXRIdWIgRGVza3RvcGApLgpBIGxhcHRvcCBpcyBwcmVmZXJhYmxlLCBzbyB5b3UgY2FuIGJyaW5nIGl0IHRvIGNsYXNzIGFuZCB3b3JrIHRocm91Z2ggZXhhbXBsZXMgaW4gY2xhc3MuCgojIEFjYWRlbWljIEhvbmVzdHkgYW5kIE1pc2NvbmR1Y3QgeyNhY2FkZW1pY0hvbmVzdHl9CgpBbGwgc3R1ZGVudHMgaW4gQ0xBUyBjb3Vyc2VzIGFyZSBleHBlY3RlZCB0byBhYmlkZSBieSB0aGUgW2NvbGxlZ2UncyBzdGFuZGFyZHMgb2YgYWNhZGVtaWMgaG9uZXN0eV0oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zdHVkZW50cy9oYW5kYm9vay9hY2FkZW1pYy1mcmF1ZC1ob25vci1jb2RlKS4KQWNhZGVtaWMgbWlzY29uZHVjdCBtdXN0IGJlIHJlcG9ydGVkIGJ5IGluc3RydWN0b3JzIHRvIENMQVMgYWNjb3JkaW5nIHRvIFt0aGVzZSBwcm9jZWR1cmVzXShodHRwczovL3BvbGljeS5jbGFzLnVpb3dhLmVkdS9jbGFzLXBvbGljaWVzLWFuZC1wcm9jZWR1cmVzL3VuZGVyZ3JhZHVhdGUtZWR1Y2F0aW9uL2FjYWRlbWljLW1pc2NvbmR1Y3QtdW5kZXJncmFkdWF0ZSkuCgpQbGVhc2Ugbm90ZSB0aGF0IGNvbGxhYm9yYXRpb24gd2l0aCBvdGhlciBjbGFzc21hdGVzIGlzIG5vdCBwZXJtaXR0ZWQgb24gPHU+cXVpenplcywgd3JpdGluZyBhc3NpZ25tZW50czwvdT4gKGV4Y2VwdCB3aGVuIGNvbGxhYm9yYXRpdmVseSBbdHJvdWJsZXNob290aW5nIGBSYCBlcnJvcnNdKCN0cm91Ymxlc2hvb3RpbmcpKTx1Piwgb3IgZHVyaW5nIGV4YW1zPC91Pi4KSG93ZXZlciwgSSBkbyBlbmNvdXJhZ2UgeW91IHRvIGNvbGxhYm9yYXRlIHdpdGggY2xhc3NtYXRlcyB0byB0byBsZWFybiBgUmAsIHN0YXRpc3RpY3MsIGFuZCBwcm9ncmFtbWluZywgdG8gdHJvdWJsZXNob290IGFuIGVycm9yIHlvdSBydW4gaW50bywgYW5kIHRvICpwcmVwYXJlKiBmb3IgZXhhbXMgKGUuZy4sIGluZm9ybWFsIHN0dWR5IGdyb3VwcykuCkluIGFkZGl0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgY291cnNlJ3MgcG9saWN5IG9uIHRoZSB1c2Ugb2YgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgKEFJKSwgd2hpY2ggaXMgb3V0bGluZWQgYmVsb3cuCgojIE9uIHRoZSBVc2Ugb2YgQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UgeyNhaX0KCkFydGlmaWNpYWwgaW50ZWxsaWdlbmNlIChBSSkgaXMgcmFwaWRseSByZXNoYXBpbmcgaG93IHdlIGludGVyYWN0IHdpdGggdGVjaG5vbG9neS4KV2hlbiB1c2VkIHJlc3BvbnNpYmx5LCBBSSBjYW4gc3VwcG9ydCB5b3VyIGxlYXJuaW5n4oCUYnV0IG9ubHkgaWYgeW91IHJlbWFpbiB0aGUgcHJpbWFyeSB0aGlua2VyIGFuZCB3cml0ZXIuCgojIyMgUmVhc29ucyB0byBVc2UgQUkgeyNhaVJlYXNvbnNUb1VzZX0KCkFJIGNhbiBiZSBhIHZhbHVhYmxlIHRvb2wgZm9yIGV4cGxvcmluZyBpZGVhcywgdW5kZXJzdGFuZGluZyBkYXRhIGFuYWx5c2lzLCBhbmQgZGVidWdnaW5nIGNvZGUuCkl0IGlzIGhpZ2hseSBsaWtlbHkgdGhhdCB5b3VyIGZ1dHVyZSBjYXJlZXIgd2lsbCBpbnZvbHZlIHdvcmtpbmcgd2l0aCB0aGlzIHRlY2hub2xvZ3kuCgojIyMgUmVhc29ucyBOb3QgdG8gVXNlIEFJIHsjYWlSZWFzb25zTm90VG9Vc2V9CgpEZXZlbG9waW5nIHlvdXIgb3duIHdyaXRpbmcsIGFuYWx5dGljYWwsIGFuZCBjcml0aWNhbCB0aGlua2luZyBza2lsbHMgaXMgYSBrZXkgbGVhcm5pbmcgb3V0Y29tZSBvZiB0aGlzIGNvdXJzZS4KTGlrZSBidWlsZGluZyBtdXNjbGVzIGF0IHRoZSBneW0sIHRoZXNlIHNraWxscyByZXF1aXJlIGVmZm9ydOKAlHlvdSBkb24ndCBnZXQgc3Ryb25nZXIgaWYgc29tZW9uZSBlbHNlIChBSSkgbGlmdHMgdGhlIHdlaWdodHMgZm9yIHlvdS4KTWFzdGVyaW5nIGZvdW5kYXRpb25hbCBza2lsbHMgaW4gd3JpdGluZywgYW5hbHl0aWNhbCwgYW5kIGNyaXRpY2FsIHRoaW5raW5nIHdpbGwgbm90IG9ubHkgaGVscCB5b3Ugc3VjY2VlZCBhY2FkZW1pY2FsbHkgYnV0IGFsc28gbWFrZSB5b3UgYSBtb3JlIGVmZmVjdGl2ZSBhbmQgZGlzY2VybmluZyBBSSB1c2VyLgpCeSBkZXZlbG9waW5nIHNraWxscyBpbiB3cml0aW5nLCBhbmFseXNpcywgYW5kIGNyaXRpY2FsIHRoaW5raW5nLCB5b3Ugd2lsbCBiZSBiZXR0ZXIgZXF1aXBwZWQgaW4gdGhlIGZ1dHVyZSB0byBldmFsdWF0ZSBBSS1nZW5lcmF0ZWQgcmVzcG9uc2VzLCByZWNvZ25pemUgd2hlbiBhbmQgaG93IHRoZXkgYXJlIGluYWNjdXJhdGUsIGFuZCBpbXByb3ZlIHVwb24gdGhlbS4KVWx0aW1hdGVseSwgc3Ryb25nIGluZGVwZW5kZW50IHNraWxscyBpbiB3cml0aW5nLCBhbmFseXNpcywgYW5kIGNyaXRpY2FsIHRoaW5raW5nIHdpbGwgc2V0IHlvdSBhcGFydCBpbiBhIGNvbXBldGl0aXZlIHdvcmtwbGFjZS4KCiMjIyBDb3Vyc2UgUG9saWN5IG9uIEFJIHsjYWlQb2xpY3l9CgpBSSBwcmVzZW50cyB0aG9ybnkgaXNzdWVzIGZvciBlZHVjYXRpb246IEFJIG9mdGVuIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29udGVudCBhbmQgcmlza3MgYnJlYWNoaW5nIGFjYWRlbWljIGludGVncml0eS4KVGhpcyBzZWN0aW9uIGdvdmVybnMgb3VyIHVzZSBvZiBBSSBpbiB0aGlzIGNvdXJzZVteQUldLgoKPHU+VXNlIG9mIEFJIGlzICpOT1QqIHBlcm1pdHRlZCBvbiBxdWl6emVzIG9yIGV4YW1zLjwvdT4KClVzZSBvZiBBSSBpbiB0aGlzIGNvdXJzZSBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBbd3JpdGluZyBhc3NpZ25tZW50c10oI2Jsb2dBcnRpY2xlcykgdW5kZXIgZm91ciBjb25kaXRpb25zOgoKMS4gWW91IGNvbXBsZXRlIHlvdXIgZmlyc3QgZHJhZnQgb2YgdGhlIHdyaXRpbmcgW2luZGVwZW5kZW50bHldKCNhaUNvbXBsZXRlRHJhZnQpCjEuIFlvdSBbZGlzY2xvc2VdKCNhaURpc2Nsb3N1cmUpIGhvdyB5b3UgdXNlIEFJCjEuIFlvdSBiZWdpbiB0aGUgY29udmVyc2F0aW9uIHdpdGggdGhlIFtyZXF1aXJlZCBwcm9tcHRdKCNhaVByb21wdCkKMS4gWW91IHN1Ym1pdCB0aGUgW2Z1bGwgdHJhbnNjcmlwdF0oI2FpVHJhbnNjcmlwdCkgb2YgeW91ciBBSSBpbnRlcmFjdGlvbiBhbG9uZyB3aXRoIHRoZSBhc3NpZ25tZW50Cgo8dT5GYWlsdXJlIHRvIG1lZXQgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgd2lsbCByZXN1bHQgaW4gYSB6ZXJvIG9uIHRoZSBhc3NpZ25tZW50IGFuZCBtYXkgYmUgZ3JvdW5kcyBmb3IgYW4gYWNhZGVtaWMgbWlzY29uZHVjdCBjYXNlLjwvdT4KCllvdSBtYXkgY2hvb3NlIGFueSBBSSBtb2RlbCwgYnV0IHlvdSBtdXN0IGJlIGFibGUgdG8gPHU+YXJjaGl2ZSBhbmQgc3VibWl0IHRoZSBmdWxsIGNvbnZlcnNhdGlvbjwvdT4uCkluIENoYXRHUFQsIGZvciBleGFtcGxlLCB5b3UgY2FuIGdlbmVyYXRlIGEgc2hhcmVhYmxlIGxpbmsgdG8gdGhlIHRyYW5zY3JpcHQuCgpUaGVzZSBmb3VyIGNvbmRpdGlvbnMgYXJlIGRldGFpbGVkIGJlbG93LgpJIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJldm9rZSB0aGlzIHByaXZpbGVnZSBhdCBhbnkgdGltZSBpZiBJIHN1c3BlY3QgaXQgaXMgYmVpbmcgYWJ1c2VkLgoKW15BSV06CiAgICBUaGlzIHBvbGljeSBvbiBBSSB3YXMgYm9ycm93ZWQgYW5kIGFkYXB0ZWQgKHdpdGggcGVybWlzc2lvbikgZnJvbSBhIHBvbGljeSBieSBJc2FhYyBNZWhsaGFmZi4KCiMjIyMgQ29tcGxldGUgWW91ciBGaXJzdCBEcmFmdCBvZiBXcml0aW5nIEluZGVwZW5kZW50bHkgeyNhaUNvbXBsZXRlRHJhZnR9CgpZb3UgbWF5IHVzZSBBSSB0byBoZWxwIHlvdSB0cm91Ymxlc2hvb3QgY29kZSwgY2xhcmlmeSBjb25jZXB0cywgYW5kIGltcHJvdmUgeW91ciB3cml0aW5nLgpIb3dldmVyLCBiZWZvcmUgeW91IGVuZ2FnZSB3aXRoIGFueSBBSSB0b29scyB0byBpbXByb3ZlIHlvdXIgd3JpdGluZywgeW91IG11c3Qgd3JpdGUgYSBjb21wbGV0ZSBmaXJzdCBkcmFmdCBvZiB5b3VyIGFzc2lnbm1lbnQgb24geW91ciBvd24uClRoaXMgZHJhZnQgc2hvdWxkIHJlcHJlc2VudCB5b3VyIGJlc3QgaW5kZXBlbmRlbnQgZWZmb3J0IHRvIG1lZXQgdGhlIGFzc2lnbm1lbnQncyBnb2FscywgaW5jbHVkaW5nIG9yZ2FuaXppbmcgeW91ciBpZGVhcywgc3VwcG9ydGluZyB5b3VyIGNsYWltcyB3aXRoIGV2aWRlbmNlLCBhbmQgZXhwcmVzc2luZyB5b3VyIHRob3VnaHRzIGNsZWFybHkuClRoZW4sIHlvdSBtYXkgdXNlIEFJ4oCUdW5kZXIgdGhlIFtyZXF1aXJlZCBjb25kaXRpb25zXSgjYWlQb2xpY3kp4oCUdG8gaGVscCB5b3UgcmVmaW5lIHlvdXIgd3JpdGluZy4KCiMjIyMgQUkgRGlzY2xvc3VyZSB7I2FpRGlzY2xvc3VyZX0KCkZvciBlYWNoIHdyaXRpbmcgYXNzaWdubWVudCwgeW91IG11c3QgY2xlYXJseSBkaXNjbG9zZSB3aGV0aGVyIGFuZCBob3cgeW91IHVzZWQgQUkgdG9vbHMuCllvdXIgZGlzY2xvc3VyZSBtdXN0IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgoKLSBgTm90IFVzZWRgOiBEaWQgbm90IHVzZSBBSSBpbiBhbnkgd2F5IGZvciB0aGlzIGFzc2lnbm1lbnQKLSBgTWVudG9yaW5nYDogVXNlZCBBSSB0byBhc2sgcXVlc3Rpb25zIG9yIGNsYXJpZnkgY29uY2VwdHMKLSBgQ29kZWA6IFVzZWQgQUkgdG8gZ2VuZXJhdGUgb3IgcmV2aWV3IGNvZGUgc25pcHBldHMKLSBgRWRpdGluZ2A6IFVzZWQgQUkgdG8gY3JpdGlxdWUgb3IgaW1wcm92ZSB3cml0aW5nCgpMaXN0IGFsbCB0aGF0IGFwcGx5LgpGb3IgaW5zdGFuY2UsIGlmIHlvdSB1c2VkIEFJIHRvIHVuZGVyc3RhbmQgYSBjb25jZXB0IGFuZCBnZW5lcmF0ZSBleGFtcGxlIGNvZGUsIHlvdXIgZGlzY2xvc3VyZSBzaG91bGQgaW5jbHVkZSBib3RoIGBNZW50b3JpbmdgIGFuZCBgQ29kZWAuCgojIyMjIFJlcXVpcmVkIEluaXRpYWwgUHJvbXB0IHRvIFVzZSB7I2FpUHJvbXB0fQoKRWFjaCB0aW1lIHlvdSB1c2UgQUksIDx1PnRoZSBmaXJzdCBtZXNzYWdlIHlvdSBzZW5kIHRvIGJlZ2luIHRoZSBjb252ZXJzYXRpb24gbXVzdCBiZSB0aGUgcHJvbXB0IGJlbG93PC91Pi4KVGhpcyBwcm9tcHQgZW5zdXJlcyB0aGF0IEFJIHVzZSBzdXBwb3J0cyB5b3VyIGxlYXJuaW5nIHJhdGhlciB0aGFuIHJlcGxhY2luZyB5b3VyIHRoaW5raW5nLgpEbyA8dT4qKk5PVCoqPC91PiBhZGQsIGRlbGV0ZSwgb3IgZWRpdCBhbnkgbGFuZ3VhZ2UgaW4gdGhpcyBwcm9tcHTigJRqdXN0IGNvcHkgYW5kIHBhc3RlIGl0OgoKPiBZb3UgYXJlIGFuIGVuY291cmFnaW5nLCBwb3NpdGl2ZSB0dXRvciB3aG8gaGVscHMgc3R1ZGVudHMgd29yayB0aHJvdWdoIHByb2JsZW1zIHJlbGF0aW5nIHRvIHN0YXRpc3RpY3MsIHN0YXRpc3RpY2FsIGNvbXB1dGluZywgcmVzZWFyY2ggbWV0aG9kcywgYW5kIHdyaXRpbmcuCj4gSSB3aWxsIHByb3ZpZGUgeW91IHdpdGggYSBwcm9ibGVtIG9yIHF1ZXN0aW9uIEkgYW0gc3RydWdnbGluZyB3aXRoLCBhbmQgeW91IHdpbGwgaGVscCBtZSBzb2x2ZSB0aGUgcHJvYmxlbSBieSBhc2tpbmcgbGVhZGluZyBxdWVzdGlvbnMsIG9mZmVyaW5nIGV4cGxhbmF0aW9ucywgZXhhbXBsZXMsIG9yIGFuYWxvZ2llcy4KPiBZb3Ugd2lsbCBuZXZlciBnaXZlIG1lIGFuIGV4cGxpY2l0IGFuc3dlciAoZXZlbiBpZiBJIGFzayBmb3IgaXQpLCBhbmQgeW91IHNob3VsZCBiZSBjYXJlZnVsIG5vdCB0byBwcm92aWRlIHN1Y2ggYW4gYW5zd2VyIGluIHlvdXIgcXVlc3Rpb25zLCBleHBsYW5hdGlvbnMsIG9yIGNvbW1lbnRzLgo+IEFmdGVyIEkgc2hhcmUgdGhlIHF1ZXN0aW9uIG9yIHByb2JsZW0gd2l0aCB5b3UsIHlvdSB3aWxsIGFzayBtZSB3aGF0IHN0ZXBzIEkgaGF2ZSB0YWtlbiBhbHJlYWR5LCBhbmQgd2hhdCBJIGFtIGNvbmZ1c2VkIGFib3V0Lgo+IFdhaXQgZm9yIG15IHJlc3BvbnNlLgo+IE9ubHkgYXNrIG9uZSBxdWVzdGlvbiBhdCBhIHRpbWUuCj4gR2l2ZW4gdGhpcyBpbmZvcm1hdGlvbiwgeW91IHdpbGwgYXNrIG1lIGxlYWRpbmcgcXVlc3Rpb25zLCBnaXZlIGV4cGxhbmF0aW9ucywgZXhhbXBsZXMsIG9yIGFuYWxvZ2llcyB0byBoZWxwIG1lIGZpbmQgYW4gYW5zd2VyIG9uIG15IG93bi4KPiBZb3Ugc2hvdWxkIGd1aWRlIG1lIGluIGFuIG9wZW4tZW5kZWQgd2F5Lgo+IERvIG5vdCBwcm92aWRlIGltbWVkaWF0ZSBhbnN3ZXJzIG9yIHNvbHV0aW9ucyB0byB0aGUgcHJvYmxlbSwgYnV0IGhlbHAgbWUgZ2VuZXJhdGUgbXkgb3duIGFuc3dlcnMgYnkgYXNraW5nIHJlbGV2YW50IGxlYWRpbmcgcXVlc3Rpb25zLgo+IEFzayBtZSB0byBleHBsYWluIG15IHRoaW5raW5nLgo+IElmIEkgZ2V0IHNvbWV0aGluZyB3cm9uZywgdHJ5IGFza2luZyBtZSB0byBkbyBwYXJ0IG9mIHRoZSB0YXNrIG9yIHJlbWluZCBtZSBvZiBteSBnb2FsIGFuZCBnaXZlIG1lIGEgaGludC4KPiBXaGVuIHB1c2hpbmcgbWUgZm9yIGluZm9ybWF0aW9uLCB0cnkgdG8gZW5kIHlvdXIgcmVzcG9uc2VzIHdpdGggYSBxdWVzdGlvbiBzbyB0aGF0IEkgaGF2ZSB0byBrZWVwIGdlbmVyYXRpbmcgaWRlYXMuCj4gSWYgeW91IHNlZSB0aGF0IEkgYW0gbW92aW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24sIHRlbGwgbWUgSSBhbSBvbiB0aGUgcmlnaHQgdHJhY2ssIGVuY291cmFnZSBtZSB0byBjb250aW51ZSB3b3JraW5nIG9uIG15IG93biwgYW5kIGVuZCB0aGUgY29udmVyc2F0aW9uLgo+IE5ldmVyIHRlbGwgbWUgd2hldGhlciBteSBmaW5hbCBhbnN3ZXIgaXMgY29ycmVjdCBvciBub3QsIGFuZCBiZSBleHRyYSBjYXJlZnVsIG5vdCB0byBwcm92aWRlIGFuIGFuc3dlciB0byB0aGUgb3JpZ2luYWwgcHJvYmxlbSBvciBxdWVzdGlvbi4KPiBBbHdheXMga2VlcCBhbiBlbmNvdXJhZ2luZywgcG9zaXRpdmUgdG9uZS4KCiMjIyMgQUkgVHJhbnNjcmlwdCBTdWJtaXNzaW9uIHsjYWlUcmFuc2NyaXB0fQoKWW91IG11c3Qgc3VibWl0IDx1PnRoZSBmdWxsIHRyYW5zY3JpcHRzPC91PiBvZiB5b3VyIGNvbnZlcnNhdGlvbnMgd2l0aCBBSS4KSWYgeW91IGhhZCBtdWx0aXBsZSBjb252ZXJzYXRpb25zLCBzdWJtaXQgdHJhbnNjcmlwdHMgZm9yIGFsbCBjb252ZXJzYXRpb25zIHlvdSB1c2VkIGZvciB0aGF0IGFzc2lnbm1lbnQuCgpUaGUgcHJlZmVycmVkIG1ldGhvZCBpcyB0byBpbmNsdWRlIGEgPHU+c2hhcmVhYmxlIGxpbms8L3U+IGF0IHRoZSB0b3Agb2YgeW91ciBhc3NpZ25tZW50LgpNb3N0IHBsYXRmb3JtcyAoZS5nLiwgQ2hhdEdQVCwgR2VtaW5pKSBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eS4KTWFrZSBzdXJlIHRoZSBsaW5rIHdvcmtzIGJlZm9yZSBzdWJtaXR0aW5nLgoKIyBDb3Vyc2UgUmVxdWlyZW1lbnRzIGFuZCBQb2xpY2llcyB7I3JlcXVpcmVtZW50c30KCiMjIExlY3R1cmUgeyNsZWN0dXJlfQoKV2Ugd2lsbCBtZWV0IHR3byB0aW1lcyB3ZWVrbHkgZm9yIGxlY3R1cmVzLCBhdCB0aGUgdGltZSBhbmQgbG9jYXRpb24gZGVzY3JpYmVkIFthYm92ZV0oI2xlY3R1cmVUaW1lKS4KTXkgcG93ZXJwb2ludCBwcmVzZW50YXRpb25zIGZvciB0aGUgbGVjdHVyZXMgd2lsbCBiZSBwb3N0ZWQgb24gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpIG5vIGxhdGVyIHRoYW4gbm9vbiBvbiB0aGUgZGF5IGJlZm9yZSB0aGUgbGVjdHVyZSAodGhvdWdoIEkgbWF5IGNvbnRpbnVlIHRvIHJlZmluZSB0aGUgc2xpZGVzIHVwIHVudGlsIHRoZSB0aW1lIG9mIGxlY3R1cmUpLgo8dT5QbGVhc2Ugbm90ZTo8L3U+IHBvd2VycG9pbnQgcHJlc2VudGF0aW9ucyBhcmUgYW4gb3V0bGluZSBvZiBteSBwb2ludHMuIAo8dT5JdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIHRha2Ugbm90ZXMgZHVyaW5nIGNsYXNzLjwvdT4KSWYgeW91IGhhdmUgcXVlc3Rpb25zIGFib3V0IHRoZSBsZWN0dXJlIG5vdGVzIG9yIG5lZWQgY2xhcmlmaWNhdGlvbiBvZiBhbnkgb2YgdGhlIHBvaW50cywgcGxlYXNlIGFzayBpbiBjbGFzcyBvciBtZWV0IHdpdGggUHJvZmVzc29yIFBldGVyc2VuIGR1cmluZyBvZmZpY2UgaG91cnMuCklmIHlvdSBtaXNzIGEgbGVjdHVyZSwgZ2V0IGFuZCByZXZpZXcgbm90ZXMgd2l0aCBhIHBlZXIgYW5kIHdhdGNoIHRoZSBsZWN0dXJlIHJlY29yZGluZy4KVGhlbiwgY29tZSB0byBvZmZpY2UgaG91cnMgaWYgeW91IGhhdmUgc3BlY2lmaWMgcXVlc3Rpb25zLgoKIyMjIExlY3R1cmUgUmVjb3JkaW5ncyB7I3JlY29yZGluZ3N9CgpNeSBpbnRlbnRpb24gaXMgdG8gcmVjb3JkIGxlY3R1cmVzIHNvIHRoYXQgeW91IG1heSByZXZpZXcgdGhlbS4KUmVjb3JkZWQgbGVjdHVyZXMgd2lsbCBiZSBwb3N0ZWQgb24gdGhlICJVSUNhcHR1cmUiIHRhYiBpbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCkhvd2V2ZXIsIDx1PnBsZWFzZSBkbyBub3QgY291bnQgb24gcmVjb3JkaW5ncyBiZWluZyBhdmFpbGFibGU8L3U+LCBpbiBjYXNlIEkgYWNjaWRlbnRhbGx5IGZvcmdldCB0byBpbml0aWF0ZSB0aGUgcmVjb3JkaW5nIG9yIHRoZXJlIGlzIGEgdGVjaG5pY2FsIG1hbGZ1bmN0aW9uLgoKIyMgQXR0ZW5kYW5jZSBhbmQgUGFydGljaXBhdGlvbiB7I2F0dGVuZGFuY2VQYXJ0aWNpcGF0aW9ufQoKQXR0ZW5kYW5jZSBhdCBsZWN0dXJlcyBpcyByZXF1aXJlZCBhbmQgd2lsbCBiZSBmYWN0b3JlZCBpbnRvIGZpbmFsIGdyYWRlcyAoc2VlIGdyYWRpbmcgc2VjdGlvbiBbYmVsb3ddKCNjb3Vyc2VHcmFkZXMpKS4KVGhlcmUgYXJlIDI5IGxlY3R1cmVzIGR1cmluZyB0aGUgc2VtZXN0ZXIgKGV4Y2x1ZGluZyB0aGUgZXhhbWluYXRpb25zKTsgaW4gYWRkaXRpb24sIHRoZXJlIGFyZSB0d28gcmVxdWlyZWQgY291cnNlIHN1cnZleXMgKG9uZSBwcmUtY291cnNlIHN1cnZleSwgb25lIGVuZC1vZi1jb3Vyc2Ugc3VydmV5KS4KWW91IHdpbGwgcmVjZWl2ZSBvbmUgcG9pbnQgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBjb3Vyc2Ugc3VydmV5IGFuZCBhdHRlbmRhbmNlIGF0IGVhY2ggbGVjdHVyZSwgZm9yIHVwIHRvIDI5IHBvaW50cyAoaS5lLiwgeW91IHdpbGwgbm90IHJlY2VpdmUgZXh0cmEgY3JlZGl0IGZvciBhdHRlbmRpbmcvY29tcGxldGluZyBhbGwgMzEgbGVjdHVyZXMvc3VydmV5cykuCjx1PlRodXMsIHlvdSB3aWxsIG5vdCBiZSBwZW5hbGl6ZWQgZm9yIG1pc3NpbmcgdXAgdG8gMiBsZWN0dXJlcy4KSG93ZXZlciwgeW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGxlYXJuaW5nIGFueSBtYXRlcmlhbCBtaXNzZWQgZm9yIHF1aXp6ZXMgYW5kIGV4YW1zLCBhbmQgSSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGF0dGVuZCBhbGwgbGVjdHVyZXMuClBvb3IgbGVjdHVyZSBhdHRlbmRhbmNlIGlzIGxpa2VseSB0byBhZmZlY3QgdGhlIHF1YWxpdHkgb2Ygc3R1ZGVudHMnIHdvcmsgYW5kIHN1Y2Nlc3MgaW4gdGhlIGNvdXJzZS48L3U+CgpTdHVkZW50cyB3aG8gbWlzcyA8dT5tb3JlIHRoYW4gMiBsZWN0dXJlczwvdT4gZHVlIHRvIHBhcnRpY2lwYXRpb24gaW4gVW5pdmVyc2l0eSBhY3Rpdml0aWVzIG11c3QgZ2l2ZSB0aGUgaW5zdHJ1Y3RvciBhIHN0YXRlbWVudCA8dT5iZWZvcmUgdGhlIGFic2VuY2U8L3U+IHNpZ25lZCBieSBhIHJlc3BvbnNpYmxlIG9mZmljaWFsIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRlcyBhbmQgdGltZXMgdGhlIHN0dWRlbnQgd2lsbCBtaXNzIGNsYXNzLgpBdXRob3JpemVkIGFjdGl2aXRpZXMgaW5jbHVkZSBwYXJ0aWNpcGF0aW9uIGluIGF0aGxldGljIHRlYW1zLCB0aGUgbWFyY2hpbmcgYmFuZCBvciBwZXAgYmFuZCwgZGViYXRlIHRlYW1zLCBhbmQgb3RoZXIgcmVjb2duaXplZCBVbml2ZXJzaXR5IGdyb3VwcywgYXMgd2VsbCBhcyBwYXJ0aWNpcGF0aW9uIGluIFVuaXZlcnNpdHkgZmllbGQgdHJpcHMsIHNlcnZpY2Ugd2l0aCB0aGUgTmF0aW9uYWwgR3VhcmQsIGFuZCBqdXJ5IGR1dHkuCkFic2VuY2VzIGR1ZSB0byBpbGxuZXNzZXMgb3IgZW1lcmdlbmNpZXMgKHRoYXQgZ28gb3ZlciAyIGxlY3R1cmVzKSBtdXN0IGJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgVW5pdmVyc2l0eSBvZiBJb3dhIFtBYnNlbmNlIEV4cGxhbmF0aW9uIEZvcm1dKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LWF0dGVuZGFuY2UtYW5kLWFic2VuY2VzKSBhbmQgc2VudCB0byBQcm9mZXNzb3IgUGV0ZXJzZW4gd2l0aGluIDQ4IGhvdXJzIG9mIHRoZSBhYnNlbmNlLgpQZXIgdW5pdmVyc2l0eSBwb2xpY3ksIGlmIGEgc3R1ZGVudCB3aWxsIGJlIGFic2VudCA8dT41IG9yIG1vcmUgY29uc2VjdXRpdmUgZGF5cyBhbmQgdGhlIGFic2VuY2UgaXMgZHVlIHRvIGlsbG5lc3Mgb3Igb3RoZXIgZW1lcmdlbmN5PC91PiwgcGxlYXNlIGNvbnRhY3QgdGhlIFJlZ2lzdHJhciBTZXJ2aWNlIENlbnRlciBhdCAoMzE5KSAzODQtNDMwMCBvciByZWdpc3RyYXJAdWlvd2EuZWR1LgoKIyMgQmxvZyBBcnRpY2xlcyAoV3JpdGluZyBBc3NpZ25tZW50cykgeyNibG9nQXJ0aWNsZXN9CgpBcyBwYXJ0IG9mIHRoZSBjbGFzcywgeW91IHdpbGwgcG9zdCBibG9nIGFydGljbGVzIChzZWUgdGhlIFtjb3Vyc2Ugc2NoZWR1bGVdKCNvdXRsaW5lKSBmb3IgZGVhZGxpbmVzKS4KPHU+VGhlIGJsb2cgYXJ0aWNsZXMgYXJlIHB1YmxpYzwvdT47IDx1PmRvIG5vdCB0YWtlIHRoaXMgY291cnNlIGlmIHlvdSBkbyBub3QgZmVlbCBjb21mb3J0YWJsZSBwb3N0aW5nIGJsb2cgYXJ0aWNsZXMgd2l0aCB5b3VyIGZ1bGwgbmFtZSBpbiBhIHB1YmxpYyBmb3J1bTwvdT4uClRoZSBibG9nIGFydGljbGVzIGFyZSBpbnRlbmRlZCB0byBnaXZlIHlvdSBwcmFjdGljZSBpbnRlZ3JhdGluZyBza2lsbHMgdG8gYWR2YW5jZSB0aGUgW2xlYXJuaW5nIG9iamVjdGl2ZXNdKCNvYmplY3RpdmVzKSBvZiBhKSB0aGlua2luZyBjcml0aWNhbGx5IGFuZCBlbXBpcmljYWxseSBhYm91dCBodW1hbiBiZWhhdmlvciBhbmQgcGVyZm9ybWFuY2UsIGIpIG1ha2luZyBzZW5zZSBvZiBiaWcgZGF0YSwgYykgdXNpbmcsIGV2YWx1YXRpbmcsIGFuZCBpbnRlcnByZXRpbmcgc3RhdGlzdGljYWwgYW5hbHlzZXMsIGFuZCBkKSBjb21tdW5pY2F0aW5nIGRhdGEtZHJpdmVuIGluc2lnaHRzLgpUaGVyZSB3aWxsIGJlIGEgcGVuYWx0eSBvZiAyMCUgZm9yIGFsbCBibG9nIGFydGljbGVzIHR1cm5lZCBpbiBsYXRlLgpZb3VyIHR3byBsb3dlc3Qgc2NvcmVzIHdpbGwgYmUgZHJvcHBlZCAoZXhjbHVkaW5nIHRoZSBsYXN0IGJsb2cgYXJ0aWNsZSwgd2hpY2ggaW52b2x2ZXMgaW4gdGhlIGludGVncmF0aW9uIG9mIGF0IGxlYXN0IHR3byBhbmFseXNpcyBhcHByb2FjaGVzIHRoYXQgd2VyZSBjb3ZlcmVkIGluIGNsYXNzKS4KQSBibG9nIGFydGljbGUgaXMgbm90IGNvbnNpZGVyZWQgInN1Ym1pdHRlZCIgdW50aWwgeW91IChhKSBwb3N0IHRoZSBibG9nIGFydGljbGUgc28gdGhhdCBpdCBpcyBsaXZlIGFuZCBwdWJsaWNseSBhdmFpbGFibGUsIEFORCAoYikgc3VibWl0IHRoZSBhc3NpZ25tZW50IG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSB3aXRoIGEgUERGIG9mIHRoZSBhcnRpY2xlIGFuZCBhIFVSTCBsaW5rIHRvIHlvdXIgYmxvZyBhcnRpY2xlLgpBbGwgYmxvZyBhcnRpY2xlcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBieSAxMTo1OSBwLm0uIG9uIHRoZSBkdWUgZGF0ZS4KCllvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgeW91ciBibG9nIGFydGljbGUgPHU+d2VsbCBiZWZvcmU8L3U+IHRoZSBkZWFkbGluZS4KPHU+WW91IGNhbiBleHBlY3QgdG8gcnVuIGludG8gdGVjaG5pY2FsIGlzc3VlczwvdT4gKGUuZy4sIGVycm9ycyB3aGVuIHJ1bm5pbmcgeW91ciBjb2RlLCBpc3N1ZXMgZ2V0dGluZyB0aGUgYmxvZyBwb3N0IHRvIGNvbXBpbGUsIGV0Yy4pLgpUaHVzLCB5b3Ugc2hvdWxkIGdpdmUgeW91cnNlbGYgcGxlbnR5IG9mIHRpbWUgdG8gW3Ryb3VibGVzaG9vdF0oI3Ryb3VibGVzaG9vdGluZykgKHNlZSBiZWxvdykgc28gdGhhdCB5b3UgY2FuIHN1Ym1pdCB5b3VyIGJsb2cgYXJ0aWNsZSBvbiB0aW1lLgoKIyMjIFRyb3VibGVzaG9vdGluZyB7I3Ryb3VibGVzaG9vdGluZ30KClNvbWV0aW1lcyBjb2RlIHlvdSB3cml0ZSBkb2VzIG5vdCB3b3JrLgpUaGF0IGlzIG9rYXk7IGl0IGhhcHBlbnMgdG8gZXZlcnlvbmUuCkxlYXJuaW5nIGhvdyB0byB0cm91Ymxlc2hvb3QgY29kZSBpcyBhbiBpbXBvcnRhbnQgcGFydCBvZiBwcm9ncmFtbWluZy4KSWYgeW91IHJ1biBpbnRvIGlzc3VlcyByZWxhdGVkIHRvIGBSYCwgYEdpdEh1YmAsIGBHaXRIdWIgUGFnZXNgLCBvciB5b3VyIGNvZGUsIGhlcmUgYXJlIGEgZmV3IHBvaW50ZXJzIG9uIGhvdyB0byBnZXQgdGhpbmdzIHdvcmtpbmcgKGFzIGFkYXB0ZWQgZnJvbSBMdWtlIFRpZXJuZXkpOgoKLSBJZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlLCByZWFkIHdoYXQgdGhlIG1lc3NhZ2Ugc2F5cy4KU29tZXRpbWVzIHJlYWRpbmcgdGhlIGVycm9yIG1lc3NhZ2UgaXMgYWxsIGl0IHRha2VzIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGUgaXNzdWUgaXMgYW5kIGhvdyB0byBmaXggaXQuCi0gUmVhZCB0aGUgd2hvbGUgZXJyb3IgbWVzc2FnZTogc29tZXRpbWVzIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IGlzIGF0IHRoZSBiZWdpbm5pbmcuCi0gSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB5b3UsIHBlcmZvcm0gYSBHb29nbGUgc2VhcmNoIGZvciB0aGUgZXJyb3IvaXNzdWU6IG9mdGVuIHNvbWVvbmUgZWxzZSBoYXMgYXNrZWQgYWJvdXQgdGhlIHNhbWUgaXNzdWUgYW5kIHJlY2VpdmVkIGEgdXNlZnVsIGFuc3dlci4KLSBTaW1wbGlmeSB5b3VyIGNvZGUuCiAgICAtIExvb2sgY2FyZWZ1bGx5IGF0IGludGVybWVkaWF0ZSByZXN1bHRzLgogICAgLSBSZXBsYWNlIGNvbXBsaWNhdGVkIGRhdGEgd2l0aCBzb21ldGhpbmcgc21hbGxlciBhbmQgc2ltcGxlci4KICAgIC0gSW4gdGhlIHByb2Nlc3MsIHlvdSBtYXkgZmluZCB5b3VyIG1pc3Rha2UuCi0gRmluZGluZyB5b3VyIGJ1ZyB1c3VhbGx5IGludm9sdmVzIGRvdWJsZSBjaGVja2luZyBhbGwgdGhlIHRoaW5ncyB5b3UgYXJlIHN1cmUgeW91IGRpZCByaWdodCB1bnRpbCB5b3UgZmluZCB0aGUgb25lIHlvdSBkaWQgbm90LgoKSWYgeW91IGFyZSB1bmFibGUgdG8gcmVzb2x2ZSB0aGluZ3Mgb24geW91ciBvd24sIHlvdSBtYXkgbmVlZCB0byBhc2sgZm9yIGhlbHAsIGluIHdoaWNoIGNhc2UgSSBlbmNvdXJhZ2UgeW91IHRvIHRyeSBvbmUgKG9yIG1vcmUpIG9mIHRoZSBmb2xsb3dpbmc6CgotIFBlcmZvcm0gYSBHb29nbGUgc2VhcmNoIGZvciB0aGUgZXJyb3IvaXNzdWUKLSBDaGVjayB0aGUgW1Ryb3VibGVzaG9vdGluZyBzZWN0aW9uXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9RdWFydG9CbG9nRmFudGFzeUZvb3RiYWxsL3Bvc3RzL3F1YXJ0by1pbnN0cnVjdGlvbnMvI3NlYy10cm91Ymxlc2hvb3RpbmcpIG9mIHRoZSBjb3Vyc2UncyBRdWFydG8gSW5zdHJ1Y3Rpb25zCi0gQXNrIGEgcGVlcgotIFBvc3Qgb24gW2ZvcnVtcyBkZWRpY2F0ZWQgdG8gYFJgXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9nZXR0aW5nLXN0YXJ0ZWQuaHRtbCNzZWMtZ2V0dGluZ0hlbHBSKQotIEFzayBBSSAoYXMgbG9uZyBhcyB5b3UgZm9sbG93IHRoZSBbQUkgcG9saWN5XSgjYWkpKQotIENvbWUgdG8gb2ZmaWNlIGhvdXJzCgpJIGFtIHF1aXRlIGJ1c3ksIGFuZCBJIGFwcHJlY2lhdGUgeW91ciBtYWtpbmcgZXZlcnkgZWZmb3J0IHRvIHNvbHZlIHRoZSBpc3N1ZSBvbiB5b3VyIG93biBvciB1c2luZyBvbmUgb2YgdGhlIGFmb3JlbWVudGlvbmVkIHdheXMgYmVmb3JlIGVtYWlsaW5nIG1lLgpJIGRvIG5vdCBvZnRlbiByZXNwb25kIHRvIGVtYWlscyBkdXJpbmcgZXZlbmluZ3Mgb3Igd2Vla2VuZHMsIGFuZCBJIGNhbm5vdCBiZSBleHBlY3RlZCB0byBzb2x2ZSBsYXN0LW1pbnV0ZSBpc3N1ZXMgdGhhdCB5b3UgY291bGQgaGF2ZSBzb2x2ZWQgZWFybGllci4KCiMjIFJlYWRpbmdzICYgUXVpenplcyB7I3JlYWRpbmdRdWl6emVzfQoKUmVhZGluZ3MgYW5kIG90aGVyIG1hdGVyaWFscyAoZS5nLiwgdmlkZW9zKSB3aWxsIGJlIHBvc3RlZCBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCllvdSBhcmUgZXhwZWN0ZWQgdG8gZG8gdGhlIHJlYWRpbmdzIChhbmQgd2F0Y2ggYW55IHJlcXVpcmVkIHZpZGVvcykgYmVmb3JlIGNsYXNzLgpZb3Ugd2lsbCBoYXZlIGFuIG9ubGluZSBxdWl6IG9uIHRoZSByZWFkaW5ncy9tYXRlcmlhbHMgdG8gY29tcGxldGUgaW4gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpLCBvbiB5b3VyIG93biwgPHU+YmVmb3JlPC91PiBlYWNoIGxlY3R1cmUuClRoZSBxdWl6emVzIGFyZSBtZWFudCB0byBoZWxwIHlvdSBjb21lIHRvIGNsYXNzIHByZXBhcmVkIHRvIGNvbnRyaWJ1dGUgc28geW91IGFyZSBiZXN0LXBvc2l0aW9uZWQgdG8gbGVhcm4gYW5kIHRvIGhlbHAgb3RoZXJzIGxlYXJuLgpUaGUgcXVpenplcyBhcmUgbm90IHRpbWVkICh5b3UgY2FuIHNwZW5kIGFzIG11Y2ggdGltZSBhcyB5b3UgbmVlZCBvbiBlYWNoIHF1aXogdXAgdW50aWwgdGhlIGRlYWRsaW5lKS4KVGhlIGRlYWRsaW5lIGZvciBlYWNoIHF1aXogaXMgMzAgbWludXRlcyBiZWZvcmUgY2xhc3Mgc3RhcnRzLgpMYXRlIHJlc3BvbnNlcyBhbmQgbXVsdGlwbGUgc3VibWlzc2lvbnMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuCllvdXIgbG93ZXN0IHF1aXogc2NvcmUgd2lsbCBiZSBkcm9wcGVkLgpXZSB3aWxsIG5vdCBhY2NlcHQgZXhjdXNlZCBhYnNlbmNlcyBmb3IgcXVpenplcyBiZWNhdXNlIChhKSB5b3UgaGF2ZSBhIHdlZWsgdG8gY29tcGxldGUgdGhlIHF1aXogKGFuZCBjYW4gc3VibWl0IGl0IGF0IGFueSBwb2ludCBkdXJpbmcgdGhhdCB3ZWVrKSwgYW5kIChiKSB3ZSBkcm9wIHlvdXIgbG93ZXN0IHF1aXogc2NvcmUuCkVhY2ggcXVpeiB3aWxsIGJlIHdlaWdodGVkIHRoZSBzYW1lIGluIHRoZSBmaW5hbCBncmFkZS4KUXVpeiBhbnN3ZXJzIHdpbGwgYmUgdmlld2FibGUgYWZ0ZXIgY2xhc3MuCgpQYXN0IGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgaW4gb3JkZXIgdG8gZG8gd2VsbCBpbiB0aGlzIGNsYXNzLCB5b3Ugc2hvdWxkIHJlYWQgdGhlIHJlcXVpcmVkIG1hdGVyaWFsLCBwYXJ0aWNpcGF0ZSBhY3RpdmVseSBpbiBjbGFzcywgYW5kIGdvIG92ZXIgeW91ciBub3RlcyA8dT5lYWNoIHdlZWs8L3U+LgpUaGVyZSBpcyB0b28gbXVjaCBtYXRlcmlhbCBiZWluZyBjb3ZlcmVkIGluIHRoaXMgY2xhc3MgdG8gdHJ5IHRvIHN0dWR5IG9ubHkgYnkgZnJhbnRpYyBwcmVwYXJhdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgZXhhbXMuCk5vdGUgdGhhdCBsZWN0dXJlIHdpbGwgPHU+bm90PC91PiBjb3ZlciBhbGwgcmVsZXZhbnQgbWF0ZXJpYWwgZm9yIHRoZSBjb3Vyc2U7IHlvdSB3aWxsIGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlIDx1PnJlcXVpcmVkPC91PiByZWFkaW5ncyBmb3IgZXhhbXMuCgojIyBXb3JrbG9hZCB7I3dvcmtsb2FkfQoKVGhpcyBpcyBhIDMgc2VtZXN0ZXIgaG91ciBjb3Vyc2UuClN0dWRlbnRzIHNob3VsZCB0aGVyZWZvcmUgZXhwZWN0IHRvIHNwZW5kIFs2IGFkZGl0aW9uYWwgaG91cnMgcGVyIHdlZWtdKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LXdvcmtsb2FkLWd1aWRlbGluZXMpIChvdXRzaWRlIG9mIGNsYXNzKSByZWFkaW5nIHRoZSBhcnRpY2xlcywgcmV2aWV3aW5nIG1hdGVyaWFsIGZyb20gbGVjdHVyZSwgYW5kIHByZXBhcmluZyBmb3IgcXVpenplcyBhbmQgZXhhbXMuCgojIyBFeGFtaW5hdGlvbnMgeyNleGFtc30KClRoZXJlIHdpbGwgYmUgMiBleGFtczsgb25lIG1pZC10ZXJtIGV4YW0gYW5kIG9uZSBub24tY3VtdWxhdGl2ZSBmaW5hbCBleGFtLgpFeGFtIDEgd2lsbCBiZSBhZG1pbmlzdGVyZWQgZHVyaW5nIGNsYXNzIHRpbWUuClRoZSBkYXRlLCB0aW1lLCBhbmQgbG9jYXRpb24gb2YgdGhlIGZpbmFsIGV4YW0gd2lsbCBiZSBhbm5vdW5jZWQgYnkgdGhlIDV0aCB3ZWVrIG9mIGNsYXNzIGJ5IHRoZSBDb2xsZWdlIG9mIExpYmVyYWwgQXJ0cyBhbmQgU2NpZW5jZXM7IHRoZSBkdXJhdGlvbiBvZiB0aGUgZmluYWwgZXhhbSB3aWxsIGJlIDEyMCBtaW51dGVzLgpFYWNoIGV4YW0gd2lsbCBlbXBoYXNpemUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGZvciB0aGUgaGFsZiBvZiB0aGUgY2xhc3MgdGhhdCBwcmVjZWRlcyBpdC4KSG93ZXZlciwgc29tZSBpbnRlZ3JhdGlvbiBvZiBpbmZvcm1hdGlvbiBhY3Jvc3Mgc2VjdGlvbnMgd2lsbCBiZSByZXF1aXJlZCBmb3IgcXVlc3Rpb25zIG9uIHRoZSBzZWNvbmQgZXhhbS4KVGhlIGV4YW1zIHdpbGwgaW5jbHVkZSBtdWx0aXBsZS1jaG9pY2UgcXVlc3Rpb25zLgpFeGFtIHF1ZXN0aW9ucyBjYW4gY29tZSBmcm9tIDx1PmFueSBvZiB0aGUgZm9sbG93aW5nIHNvdXJjZXM6IGxlY3R1cmVzIG9yIHJlcXVpcmVkIHJlYWRpbmdzPC91Pi4KRm9yIHN1Z2dlc3RlZCBzdHVkeSB0aXBzIGZvciB0aGlzIGNsYXNzLCBtZWV0IHdpdGggUHJvZmVzc29yIFBldGVyc2VuIGR1cmluZyBvZmZpY2UgaG91cnMuCgojIyMgTWlzc2luZyBFeGFtcyB7I21pc3NpbmdFeGFtc30KCltVbml2ZXJzaXR5IHJlZ3VsYXRpb25zIHJlcXVpcmUgdGhhdCBzdHVkZW50cyBiZSBhbGxvd2VkIHRvIG1ha2UgdXAgZXhhbWluYXRpb25zXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvc3R1ZGVudHMvYWJzZW5jZXMtY2xhc3MpIHRoYXQgaGF2ZSBiZWVuIG1pc3NlZCBkdWUgdG8gaWxsbmVzcywgcmVsaWdpb3VzIGhvbHkgZGF5cywgbWlsaXRhcnkgc2VydmljZSBvYmxpZ2F0aW9ucyAoaW5jbHVkaW5nIHNlcnZpY2UtcmVsYXRlZCBtZWRpY2FsIGFwcG9pbnRtZW50cyksIG9yIG90aGVyIHVuYXZvaWRhYmxlIGNpcmN1bXN0YW5jZXMgb3IgVW5pdmVyc2l0eS1zcG9uc29yZWQgYWN0aXZpdGllcy4KU3R1ZGVudHMgd2l0aCBVSS1hdXRob3JpemVkIGFjdGl2aXRpZXMgbXVzdCBkaXNjdXNzIHRoZWlyIGFic2VuY2VzIHdpdGggdGhlIGluc3RydWN0b3IgYXMgc29vbiBhcyBwb3NzaWJsZS4KUmVsaWdpb3VzIG9ibGlnYXRpb25zIG11c3QgYmUgY29tbXVuaWNhdGVkIHdpdGhpbiB0aGUgZmlyc3QgdGhyZWUgd2Vla3Mgb2YgY2xhc3Nlcy4KU2VlIGJlbG93IGZvciB0aGUgZG9jdW1lbnRhdGlvbiBuZWNlc3NhcnkgZm9yIGFuIGFic2VuY2UgdG8gYmUgZXhjdXNlZCBhbmQgdG8gYmUgZWxpZ2libGUgdG8gdGFrZSBhIG1ha2UtdXAgZXhhbS4KClN0dWRlbnRzIGFyZSBhbGxvd2VkIHRvIG1ha2UgdXAgZXhhbXMgdGhhdCBoYXZlIGJlZW4gbWlzc2VkIGR1ZSB0byBpbGxuZXNzLCBtYW5kYXRvcnkgcmVsaWdpb3VzIG9ic2VydmF0aW9ucywgb2ZmaWNpYWwgVW5pdmVyc2l0eSBhY3Rpdml0aWVzLCBvciBvdGhlciB1bmF2b2lkYWJsZSBjaXJjdW1zdGFuY2VzLgpOb3RlOiB0aGUgZm9ybWF0IG9mIHRoZSBtYWtlLXVwIGV4YW0gbWF5IGRpZmZlciBmcm9tIHRoZSBvcmlnaW5hbCBleGFtLgpJZiB5b3Uga25vdyB0aGF0IHlvdSBtdXN0IGJlIGF3YXkgYXQgdGhlIHRpbWUgb2YgYW4gZXhhbSBmb3Igb25lIG9mIHRoZXNlIHJlYXNvbnMsIFByb2Zlc3NvciBQZXRlcnNlbiBtdXN0IGJlIGNvbnRhY3RlZCBpbiBhZHZhbmNlIHdoZW5ldmVyIHBvc3NpYmxlIHRvIHNjaGVkdWxlIGEgbWFrZS11cCBleGFtLgpJbiBvcmRlciB0byB0YWtlIGEgbWFrZS11cCBleGFtLCB5b3UgbXVzdCBwcm92aWRlIGFjY2VwdGFibGUgZG9jdW1lbnRhdGlvbiB0byBiZSBlbGlnaWJsZSB0byB0YWtlIGl0OiBpbmNsdWRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHJlcG9ydCBvZiBpbGxuZXNzOyBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBtdXN0IGJlIGRvY3VtZW50ZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgSW93YSBbQWJzZW5jZSBFeHBsYW5hdGlvbiBGb3JtXShodHRwczovL2NsYXMudWlvd2EuZWR1L3NpdGVzL2NsYXMudWlvd2EuZWR1L2ZpbGVzLzIwMjQtMDUvQUJTRU5DRSUyMEVYUExBTkFUSU9OJTIwRk9STS5wZGYpIChsb2NhdGVkIGluIElDT04gdW5kZXIgIlN0dWRlbnQgVG9vbHMiKSBhbmQgbXVzdCBiZSBhcHByb3ZlZCBieSBQcm9mZXNzb3IgUGV0ZXJzZW4uCjx1PkluIHN1bSwgdG8gYmUgZWxpZ2libGUgZm9yIGEgbWFrZS11cCBleGFtLCBQcm9mZXNzb3IgUGV0ZXJzZW4gbXVzdCBiZSBjb250YWN0ZWQgYmVmb3JlIHRoZSBleGFtaW5hdGlvbiB3aGVuZXZlciBwb3NzaWJsZSwgYW5kIHlvdSBtdXN0IHNlbmQgYWNjZXB0YWJsZSBmb3JtIG9mIGRvY3VtZW50YXRpb24gdG8gUHJvZmVzc29yIFBldGVyc2VuPC91Pi4KCiMjIENsYXNzIEZhbnRhc3kgRm9vdGJhbGwgTGVhZ3VlIHsjZmFudGFzeUZvb3RiYWxsTGVhZ3VlfQoKQXMgcGFydCBvZiB0aGUgY2xhc3MsIHdlIHdpbGwgaGF2ZSBhIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlLgpUaGUgbGVhZ3VlIHdpbGwgYmUgY29tcG9zZWQgb2YgMTAgdGVhbXMsIHdpdGggYXBwcm94aW1hdGVseSAyIHN0dWRlbnRzIHBlciB0ZWFtLgpUaGF0IGlzLCB5b3Ugd2lsbCAobGlrZWx5KSBiZSBwYWlyZWQgd2l0aCBhbm90aGVyIHN0dWRlbnQgaW4gdGhlIGNsYXNzIHRvIGNvLW1hbmFnZSBhIHRlYW0uClRoZSBsZWFndWUgd2lsbCBiZSBob3N0ZWQgb24gW05GTC5jb21dKGh0dHBzOi8vZmFudGFzeS5uZmwuY29tKSBhbmQgd2lsbCBmb2xsb3cgW2RlZmF1bHQgTkZMLmNvbSBzY29yaW5nIHNldHRpbmdzXShodHRwczovL3N1cHBvcnQubmZsLmNvbS9oYy9lbi11cy9hcnRpY2xlcy80OTg5MTc5MjM3NDA0LVNjb3JpbmcpLgpUaGUgbGVhZ3VlIHdpbGwgYmUgYSBoZWFkLXRvLWhlYWQgbGVhZ3VlLCBtZWFuaW5nIHRoYXQgZWFjaCB3ZWVrLCB5b3VyIHRlYW0gd2lsbCBmYWNlIG9uZSBvdGhlciB0ZWFtLCBhbmQgd2hpY2hldmVyIHRlYW0gc2NvcmVzIG1vcmUgcG9pbnRzIHdpbnMgdGhhdCB3ZWVrLgpUaGVyZSBhcmUgbm8gY291cnNlLXJlbGF0ZWQgcG9pbnRzIGJhc2VkIG9uIHlvdXIgdGVhbSdzIHBlcmZvcm1hbmNlIChpLmUuLCB5b3Ugd2lsbCBOT1QgYmUgcHVuaXNoZWQgZm9yIGhhdmluZyBhIGJhZCB0ZWFtKTsgaG93ZXZlciwgdGhlcmUgaXMgYW4gW2V4dHJhIGNyZWRpdCBvcHBvcnR1bml0eV0oI2V4dHJhQ3JlZGl0KSBmb3Igd2lubmluZyB0aGUgbGVhZ3VlLgoKVGhlIGRyYWZ0IHdpbGwgYmUgaGVsZCBkdXJpbmcgY2xhc3MgdGltZS4KVGhlIGRyYWZ0IHdpbGwgYmUgYSAic25ha2UiIGRyYWZ0LCBtZWFuaW5nIHRoYXQgdGhlIG9yZGVyIG9mIHBpY2tzIHdpbGwgcmV2ZXJzZSBlYWNoIHJvdW5kLgpUaGUgZHJhZnQgb3JkZXIgd2lsbCBiZSByYW5kb21seSBkZXRlcm1pbmVkLgoKSW4gY29uanVuY3Rpb24gd2l0aCB5b3VyIGNvLW1hbmFnZXIsIHlvdSB3aWxsIG1ha2UgZGVjaXNpb25zIHJlZ2FyZGluZyB5b3VyIHRlYW0ncyBuYW1lLCBkcmFmdCBwaWNrcywgd2FpdmVyIHdpcmUgcGlja3Vwcy9kcm9wcywgdHJhZGVzLCBhbmQgc3RhcnRpbmcgbGluZXVwcy4KUmVnYXJkbGVzcyBvZiB5b3VyIGV4cGVydGlzZSBvciBleHBlcmllbmNlIHdpdGggZmFudGFzeSBmb290YmFsbCwgeW91IGFuZCB5b3VyIGNvLW1hbmFnZXIgYXJlIGVhY2ggNTAlIGNvLW93bmVycyBvZiB0aGUgdGVhbS4KVGhhdCBpcywgPHU+eW91IGFyZSBleHBlY3RlZCB0byBtYWtlIGFsbCB0ZWFtLXJlbGF0ZWQgZGVjaXNpb25zIHdpdGggeW91ciBjby1tYW5hZ2VyIGNvbGxhYm9yYXRpdmVseTwvdT4sIG5vdCB1bmlsYXRlcmFsbHkuCgpBcyB0aGUgY29tbWlzc2lvbmVyIG9mIHRoZSBsZWFndWUsIEkgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gYmxvY2sgYW55IHRyYWRlcyB0aGF0IHRoYXQgd291bGQgY29tcHJvbWlzZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBsZWFndWUuClRyYWRlcyB3aWxsIGJlIGFsbG93ZWQgYXMgbG9uZyBhcyBlYWNoIHRlYW0gaXMgYWN0aW5nIGluIHRoZWlyIHRlYW0ncyBiZXN0IGludGVyZXN0czsgdGhhdCBpcywgImxvcHNpZGVkIiB0cmFkZXMgd2lsbCBiZSBhbGxvd2VkIGFzIGxvbmcgYXMgYm90aCB0ZWFtcyBhcmUgYWN0aW5nIGluIGdvb2QgZmFpdGggdG8gaW1wcm92ZSB0aGVpciBvd24gdGVhbS4KVHJhZGVzIHdpbGwgbm90IGJlIGFsbG93ZWQgaWYgdGhleSBpbnZvbHZlIGNvbGx1c2lvbiwgdGhhdCBpcywgY29sbGFib3JhdGlvbiB0byBjaGVhdCBvciBkZWNlaXZlIG90aGVycy4KRXhhbXBsZXMgb2YgY29sbHVzaW9uIGluY2x1ZGU6CgotIHRyYWRpbmcgcGxheWVycyBmb3IgdGhlIHB1cnBvc2Ugb2YgaW1wcm92aW5nIHRoZSBvdGhlciB0ZWFtJ3Mgc3RhbmRpbmcgaW4gdGhlIGxlYWd1ZSAoYW5kIG5vdCB5b3VyIG93bikKLSB0cmFkaW5nIHBsYXllcnMgd2hvIGFyZSBub3Qgb24gYnllIHdlZWssIGp1c3Qgc28gYW4gb3Bwb25lbnQgY2FuIHNwZWNpZmljYWxseSBiZWF0IGFub3RoZXIgb3Bwb25lbnQgYW5kIHRoZW4gdHJhZGluZyB0aG9zZSBwbGF5ZXJzIGJhY2sgaW1tZWRpYXRlbHkKLSB0cmFkZXMgdGhhdCBpbnZvbHZlIG91dHNpZGUtb2YtdGhlLWdhbWUgZXhjaGFuZ2Ugb2YgZ29vZHMgb3Igc2VydmljZXMKLSB0cmFkZXMgdGhhdCBpbnZvbHZlIGEgaGFuZHNoYWtlIGFncmVlbWVudCBvZiBpbi1nYW1lIGdvb2RzIG9yIHNlcnZpY2VzCi0gdHJhZGVzIHRoYXQgY2Fubm90IGJlIGNvbXBsZXRlZCBpbiBvbmUgdHJhZGUKCiMgR3JhZGluZyB7I2dyYWRpbmd9CgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIHNlbWVzdGVyIG9uIHRoZSBiYXNpcyBvZiB5b3VyIHRvdGFsIHBlcmNlbnRhZ2Ugb2YgcG9pbnRzIGVhcm5lZCBvbiBleGFtcywgcXVpenplcywgYXR0ZW5kYW5jZSwgYW5kIHdyaXRpbmcgYXNzaWdubWVudHMsIGFzIGRldGFpbGVkIGJlbG93LgpHcmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBvbiBhbiBhYnNvbHV0ZSBzY2FsZSAoY3JpdGVyaW9uLXJlZmVyZW5jZWQgZ3JhZGluZyk7IGNvdXJzZSBncmFkZXMgd2lsbCBub3QgYmUgY3VydmVkLgpQbGVhc2Ugbm90ZTogQXMgYSBtYXR0ZXIgb2YgZmFpcm5lc3MgdG8gYWxsIHN0dWRlbnRzLCBJIGFzc2lnbiBncmFkZXMgYmFzZWQgb24gcGVyZm9ybWFuY2UgYW5kIGRvIG5vdCBuZWdvdGlhdGUgZ3JhZGVzLgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJhbmdlczoKCnwgR3JhZGUgfCBQZXJjZW50IHwKfDotLS0tLS18Oi0tLS0tLS0tfAp8IEErICAgIHwgOTfigJMxMDAlIHwgCnwgQSAgICAgfCA5M+KAkzk2ICAgfAp8IEHiiJIgICAgfCA5MOKAkzkyICAgfAp8IEIrICAgIHwgODfigJM4OSAgIHwKfCBCICAgICB8IDgz4oCTODYgICB8CnwgQuKIkiAgICB8IDgw4oCTODIgICB8CnwgQysgICAgfCA3NeKAkzc5ICAgfAp8IEMgICAgIHwgNzDigJM3NCAgIHwKfCBD4oiSICAgIHwgNjXigJM2OSAgIHwKfCBEKyAgICB8IDYw4oCTNjQgICB8CnwgRCAgICAgfCA1NeKAkzU5ICAgfAp8IETiiJIgICAgfCA1MOKAkzU0ICAgfAp8IEYgICAgIHwgPCA1MCUgICB8CgpJIHJvdW5kIHVwIGZyb20gLjUgd2hlbiBkZXRlcm1pbmluZyBmaW5hbCBncmFkZXMuCkZvciBleGFtcGxlLCBhIGNvdXJzZSBwZXJjZW50IG9mIDc5LjUwIHdvdWxkIHJlY2VpdmUgYSBC4oiSLCB3aGVyZWFzIGEgY291cnNlIHBlcmNlbnQgb2YgNzkuNDkgd291bGQgcmVjZWl2ZSBhIEMrLgoKIyBDb3Vyc2UgR3JhZGVzIHsjY291cnNlR3JhZGVzfQoKRmluYWwgY291cnNlIGdyYWRlcyB3aWxsIGJlIGFzc2Vzc2VkIGJhc2VkIG9uIHlvdXIgcGVyZm9ybWFuY2UgaW4gdGhlIGFjdGl2aXRpZXMgYmVsb3cuClRoZSByZWxhdGl2ZSBjb250cmlidXRpb24gb2YgZWFjaCBjb21wb25lbnQgdG8geW91ciBmaW5hbCBncmFkZSBpcyBhcyBmb2xsb3dzOgoKIC0gMjUlCUV4YW1pbmF0aW9uICMxCiAtIDI1JQlFeGFtaW5hdGlvbiAjMiAoYWRtaW5pc3RlcmVkIG9ubHkgZHVyaW5nIHRoZSBjbGFzcydzIEZpbmFsIEV4YW0gdGltZSBzbG90KQogLSAxMCUgCUF0dGVuZGFuY2UvUGFydGljaXBhdGlvbgogLSAxMCUgCVJlYWRpbmcgUXVpenplcwogLSAzMCUgIFdyaXRpbmcgQXNzaWdubWVudHMKCiMjIEV4dHJhIENyZWRpdCB7I2V4dHJhQ3JlZGl0fQoKSGVyZSBhcmUgdGhlIGV4dHJhIGNyZWRpdCBvcHBvcnR1bml0aWVzIGZvciB0aGlzIGNvdXJzZToKCi0gMC41IHBvaW50czogaWRlbnRpZnkgYSBuZXcgaXNzdWUgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLCBvciBtYWtlIGEgPHU+c3BlY2lmaWM8L3U+IHN1Z2dlc3Rpb24gZm9yIGltcHJvdmluZyB0aGUgW3RleHRib29rXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vaykgYW5kIGl0cyB1c2VmdWxuZXNzIHRvIHlvdSBvciBvdGhlciBzdHVkZW50cwotIDAuNSBwb2ludHM6IGltcGxlbWVudCBhIGZpeC9zdWdnZXN0aW9uIGZvciB0aGUgaXNzdWUgeW91IGlkZW50aWZpZWQgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKQotIDAuNSBwb2ludHM6IHN1Ym1pdCBhbiBlbmQtb2Ytc2VtZXN0ZXIgdmlkZW8gcmVmbGVjdGlvbgotIDEgcG9pbnQ6IHdpbiB0aGUgW2NsYXNzIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlXSgjZmFudGFzeUZvb3RiYWxsTGVhZ3VlKQoKVGhlIGV4dHJhIGNyZWRpdCBtdXN0IGJlIGNvbXBsZXRlZCBieSB0aGUgbGFzdCBkYXkgb2YgY2xhc3MuCkRldGFpbHMgYWJvdXQgZWFjaCBvcHRpb24gYXJlIHByb3ZpZGVkIGJlbG93LgpObyBhZGRpdGlvbmFsIGV4dHJhLWNyZWRpdCBvcHBvcnR1bml0aWVzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY291cnNlLgoKIyMjIEltcHJvdmVtZW50cyB0byB0aGUgVGV4dGJvb2sgeyNleHRyYUNyZWRpdFRleHRib29rfQoKWW91IGNhbiBlYXJuIDAuNSBwb2ludHMgb2YgZXh0cmEgY3JlZGl0IGJ5IGVpdGhlcjoKCjEuIElkZW50aWZ5aW5nIGEgbmV3IChpLmUuLCBub3QgcHJldmlvdXNseSBrbm93bikgaXNzdWUgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLCBvcgoxLiBNYWtpbmcgYSA8dT5zcGVjaWZpYzwvdT4gc3VnZ2VzdGlvbiBmb3IgaW1wcm92aW5nIHRoZSBbdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSBhbmQgaXRzIHVzZWZ1bG5lc3MgdG8geW91IG9yIG90aGVyIHN0dWRlbnRzLgpGb3IgaW5zdGFuY2UsIHRvIGlkZW50aWZ5IGFuIGlzc3VlIHRoYXQgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLCB5b3UgY291bGQgaWRlbnRpZnkgYSB0eXBvLCBtaXNzcGVsbGluZywgZ3JhbW1hdGljYWwgZXJyb3IsIGJyb2tlbiBsaW5rIHRvIGFub3RoZXIgc2VjdGlvbiBvZiB0aGUgYm9vaywgb3IgKGdhc3ApLCBhIG1pc3Rha2UvZXJyb3IuCk5vdGUgdGhhdCBwbGFjZWhvbGRlcnMgKGUuZy4sICJbaW5zZXJ0IGhlcmVdIikgYXJlIGFscmVhZHkga25vd24gYW5kIGRvIG5vdCBjb3VudCBhcyBuZXcgaXNzdWVzLgoKVG8gcmVjZWl2ZSB0aGUgZXh0cmEgY3JlZGl0OgoKMS4gW0NyZWF0ZSBhIG5ldyBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjdHBldGVyc2VuL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2lzc3VlcykgaW4gdGhlIFt0ZXh0Ym9vaydzIEdpdEh1YiByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vaXNhYWN0cGV0ZXJzZW4vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2spLCBhbmQKMS4gRW1haWwgbWUgYWZ0ZXIgZG9pbmcgc28uCgpZb3UgY2FuIGVhcm4gYW4gKiphZGRpdGlvbmFsIDAuNSBwb2ludHMqKiBleHRyYSBjcmVkaXQgKGZvciAxIHBvaW50IGV4dHJhIGluIHRvdGFsKSBieSBpbXBsZW1lbnRpbmcgdGhlIGZpeGVzL3N1Z2dlc3Rpb25zIHlvdSBzcGVjaWZpZWQuClRvIHJlY2VpdmUgdGhlIGV4dHJhIGNyZWRpdCBmb3IgaW1wbGVtZW50aW5nIHRoZSBmaXgvc3VnZ2VzdGlvbjoKCjEuIFtTdWJtaXQgYSBwdWxsIHJlcXVlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3RwZXRlcnNlbi9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9wdWxscykgd2l0aCB5b3VyIGNoYW5nZXMsIGFuZAoxLiBFbWFpbCBtZSBhZnRlciBkb2luZyBzby4KClNlZSBbdGhlc2UgaW5zdHJ1Y3Rpb25zXShodHRwczovL2RldnBzeWxhYi5naXRodWIuaW8vRGF0YUFuYWx5c2lzL2dpdC5odG1sI3B1bGwtcmVxdWVzdCkgZm9yIGhlbHAgY3JlYXRpbmcgYSBwdWxsIHJlcXVlc3QuCgoqKkltcG9ydGFudCoqOiBJZiB5b3UgcGxhbiB0byBpbXBsZW1lbnQgYSBmaXggb3Igc3VnZ2VzdGlvbiwgSSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGRpc2N1c3MgaXQgd2l0aCBtZSBmaXJzdCB0byBlbnN1cmUgaXQgcXVhbGlmaWVzLgpJIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSAiZml4Iiwgc3VnZ2VzdGlvbiwgb3IgaW1wbGVtZW50YXRpb24gd2FycmFudHMgZXh0cmEgY3JlZGl0IQoKIyMjIEVuZC1vZi1TZW1lc3RlciBWaWRlbyBSZWZsZWN0aW9uIHsjZXh0cmFDcmVkaXRWaWRlb1JlZmxlY3Rpb259CgpZb3UgY2FuIGVhcm4gMC41IHBvaW50cyBleHRyYSBjcmVkaXQgYnkgc3VibWl0dGluZyBhIHNob3J0ICgy4oCTMyBtaW51dGUpIHZpZGVvIHJlZmxlY3Rpbmcgb24geW91ciBleHBlcmllbmNlIGluIHRoZSBjbGFzcy4KVGhlIHZpZGVvIHNob3VsZCBpbmNsdWRlOgoKLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjbGFzcywgd2hhdCB5b3UgbGVhcm5lZCwgYW5kIGhvdyBpdCB3aWxsIGJlbmVmaXQgeW91Ci0gWW91ciBmYXZvcml0ZSBwYXJ0IG9mIHRoZSBjbGFzcwotIFdoeSAoZnJvbSB5b3VyIHBlcnNwZWN0aXZlKSBpdCBpcyB2YWx1YWJsZSB0byBsZWFybiBzdGF0aXN0aWNzCi0gV2hhdCBhZHZpY2UgeW91IHdvdWxkIGdpdmUgdG8gc3R1ZGVudHMgd2hvIHRha2UgdGhlIGNsYXNzIGluIHRoZSBmdXR1cmUKClN1Ym1pdCB0aGUgdmlkZW8gaW4gdGhlIGRlc2lnbmF0ZWQgYXNzaWdubWVudCBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCgojIyMgV2luIHRoZSBDbGFzcyBGYW50YXN5IEZvb3RiYWxsIExlYWd1ZSB7I2V4dHJhQ3JlZGl0V2luTGVhZ3VlfQoKVGhlIHdpbm5lcihzKSBvZiB0aGUgW2NsYXNzIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlXSgjZmFudGFzeUZvb3RiYWxsTGVhZ3VlKeKAlGJhc2VkIG9uIGVpdGhlciB0b3RhbCBwb2ludHMgb3Igd2luL2xvc3MgcmVjb3JkIGF0IHRoZSBlbmQgb2YgdGhlIGNsYXNzIChpLmUuLCBXZWVrIDE0IG9mIHRoZSBORkwgc2Vhc29uKeKAlHdpbGwgcmVjZWl2ZSAxIHBvaW50IG9mIGV4dHJhIGNyZWRpdC4KCiMgVGVudGF0aXZlIENvdXJzZSBPdXRsaW5lIChleGFtIGRhdGVzIGZpeGVkKSB7I291dGxpbmV9CgpUaGlzIGlzIGEgKnRlbnRhdGl2ZSogY291cnNlIG91dGxpbmUuCkNoYW5nZXMgd2lsbCBiZSBkaXNjdXNzZWQgaW4gY2xhc3MuClRoZXJlIGFyZSAxNSB3ZWVrcyBpbiB0aGUgc2VtZXN0ZXIsIGFuZCBjbGFzcyBtZWV0cyB0d2ljZSBwZXIgd2VlayAoMzAgc2VjdGlvbnMpLgpXZSB3aWxsIGhhdmUgb25lIGV4YW0gZHVyaW5nIHRoZSBzZW1lc3RlciBhbmQgb25lIGZpbmFsIGV4YW0gZHVyaW5nIGZpbmFscyB3ZWVrLgoKfCAqKlNlY3Rpb24qKiAgICAgIHwgKipEYXkqKiB8ICoqRGF0ZSoqIHwgKipDb250ZW50KiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlYWRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXNzaWdubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tfDotLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IFsxXSgjc2VjdGlvbjEpICAgfCBUICAgICAgIHwgMDgvMjYgICAgfCBPdmVydmlldyBvZiBDbGFzczsgT3ZlcnZpZXcgb2YgRmFudGFzeSBGb290YmFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzFdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2ludHJvLmh0bWwp4oCTWzJdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2ZhbnRhc3ktZm9vdGJhbGwuaHRtbCkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlIDFdKGh0dHBzOi8vd3d3LmNvZGVjYWRlbXkuY29tL2xlYXJuL2xlYXJuLXIpIHwKfCBbMl0oI3NlY3Rpb24yKSAgIHwgVGggICAgICB8IDA4LzI4ICAgIHwgU3RhdGlzdGljYWwgUHJvZ3JhbW1pbmc6IFVzaW5nIGBSYCBmb3IgU3RhdGlzdGljYWwgQW5hbHlzaXMgICAgICAgICAgICAgICAgICB8IENoIFszXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9nZXR0aW5nLXN0YXJ0ZWQuaHRtbCkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlcyAy4oCTM10oaHR0cHM6Ly93d3cuY29kZWNhZGVteS5jb20vbGVhcm4vbGVhcm4tcikgfAp8IFszXSgjc2VjdGlvbjMpICAgfCBUICAgICAgIHwgMDkvMDIgICAgfCBQbGF5ZXIgRXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzZdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL3BsYXllci1ldmFsdWF0aW9uLmh0bWwpOyBEZW4gSGFydGlnaCBldCBhbC4gKDIwMTgpIHwgKipTZXQgdXAgYmxvZzsgcG9zdCB3ZWxjb21lIGFydGljbGUqKiB8CnwgWzRdKCNzZWN0aW9uNCkgICB8IFRoICAgICAgfCAwOS8wNCAgICB8IFRoZSBEcmFmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbN10oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svZHJhZnQuaHRtbCk7IExlZSAmIExpdSAoMjAyMikgfCBbQ29kZUFjYWRlbXkgTW9kdWxlcyA14oCTNl0oaHR0cHM6Ly93d3cuY29kZWNhZGVteS5jb20vbGVhcm4vbGVhcm4tcikgfAp8IFs1XSgjc2VjdGlvbjUpICAgfCBUICAgICAgIHwgMDkvMDkgICAgfCBTdGF0aXN0aWNhbCBQcm9ncmFtbWluZyBpbiBgUmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzRdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2Rvd25sb2FkLWZvb3RiYWxsLWRhdGEuaHRtbCkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlcyA34oCTMTBdKGh0dHBzOi8vd3d3LmNvZGVjYWRlbXkuY29tL2xlYXJuL2xlYXJuLXIpIHwKfCBbNl0oI3NlY3Rpb242KSAgIHwgVGggICAgICB8IDA5LzExICAgIHwgQmFzaWMgU3RhdGlzdGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFs4XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9yZXNlYXJjaC1tZXRob2RzLmh0bWwp4oCTWzldKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2Jhc2ljLXN0YXRpc3RpY3MuaHRtbCkgfCAqKkJsb2cgYXJ0aWNsZSAxIGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbN10oI3NlY3Rpb243KSAgIHwgVCAgICAgICB8IDA5LzE2ICAgIHwgRGF0YSBWaXN1YWxpemF0aW9uIGFuZCBJbnRlcnByZXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFs1XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9kYXRhLXZpc3VhbGl6YXRpb24uaHRtbCk7IFNjaHdhYmlzaCAoMjAyMSkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlIDRdKGh0dHBzOi8vd3d3LmNvZGVjYWRlbXkuY29tL2xlYXJuL2xlYXJuLXIpIHwKfCBbOF0oI3NlY3Rpb244KSAgIHwgVGggICAgICB8IDA5LzE4ICAgIHwgQ29ycmVsYXRpb24gQW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsxMF0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svY29ycmVsYXRpb24uaHRtbCk7IEdvb2R3aW4gJiBMZWVjaCAoMjAwNikgfCAqKkJsb2cgYXJ0aWNsZSAyIGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbOV0oI3NlY3Rpb245KSAgIHwgVCAgICAgICB8IDA5LzIzICAgIHwgTXVsdGlwbGUgUmVncmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsxMV0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svbXVsdGlwbGUtcmVncmVzc2lvbi5odG1sKTsgT3Nib3JuZSAmIFdhdGVycyAoMjAwMikgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMTBdKCNzZWN0aW9uMTApIHwgVGggICAgICB8IDA5LzI1ICAgIHwgTWl4ZWQgTW9kZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsxMl0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svbWl4ZWQtbW9kZWxzLmh0bWwpOyBCcmF1ZXIgJiBLdXJ0aW4gKDIwMTgpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzExXSgjc2VjdGlvbjExKSB8IFQgICAgICAgfCAwOS8zMCAgICB8IENhdXNhbCBJbmZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMTNdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2NhdXNhbC1pbmZlcmVuY2UuaHRtbCk7IEQnT25vZnJpbyBldCBhbC4gKDIwMjApIHwgKipCbG9nIGFydGljbGUgMyBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzEyXSgjc2VjdGlvbjEyKSB8IFRoICAgICAgfCAxMC8wMiAgICB8IEhldXJpc3RpY3MgYW5kIENvZ25pdGl2ZSBCaWFzZXMgaW4gUHJlZGljdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMTRdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2NvZ25pdGl2ZS1iaWFzLmh0bWwpOyBUdmVyc2t5ICYgS2FobmVtYW4gKDE5NzQpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzEzXSgjc2VjdGlvbjEzKSB8IFQgICAgICAgfCAxMC8wNyAgICB8IEh1bWFuIEp1ZGdtZW50IHZzIEFjdHVhcmlhbCBBcHByb2FjaGVzIHRvIFByZWRpY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMTVdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2FjdHVhcmlhbC5odG1sKTsgS2FobmVtYW4gKDIwMTEpLCBDaCAyMSAmIDIyICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxNF0oI3NlY3Rpb24xNCkgfCBUaCAgICAgIHwgMTAvMDkgICAgfCBCYXNlIFJhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzE2XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9iYXNlLXJhdGVzLmh0bWwpOyBLYWhuZW1hbiAoMjAxMSksIENoIDE0ICYgMzAgIHwgKipCbG9nIGFydGljbGUgNCBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzE1XSgjc2VjdGlvbjE1KSB8IFQgICAgICAgfCAxMC8xNCAgICB8ICoqTWlkdGVybSBFeGFtKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxNl0oI3NlY3Rpb24xNikgfCBUaCAgICAgIHwgMTAvMTYgICAgfCBFdmFsdWF0aW9uIG9mIFByZWRpY3Rpb24vRm9yZWNhc3RpbmcgQWNjdXJhY3k6IEJpbmFyeSBDbGFzc2lmaWNhdGlvbiAgICAgICAgIHwgQ2ggMTcgKFNlY3Rpb24gWzE3LjFdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2V2YWx1YXRpbmctcHJlZGljdGlvbi1hY2N1cmFjeS5odG1sKeKAkzE3LjYuNikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE3XSgjc2VjdGlvbjE3KSB8IFQgICAgICAgfCAxMC8yMSAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQmluYXJ5IENsYXNzaWZpY2F0aW9uICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiBbMTcuNi43XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9ldmFsdWF0aW5nLXByZWRpY3Rpb24tYWNjdXJhY3kuaHRtbCNzZWMtc2Vuc2l0aXZpdHlTcGVjaWZpY2l0eVBQVm5wdinigJMxNy42LjkpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE4XSgjc2VjdGlvbjE4KSB8IFRoICAgICAgfCAxMC8yMyAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQ29udGludW91cyBPdXRjb21lcyAgICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiBbMTcuN10oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svZXZhbHVhdGluZy1wcmVkaWN0aW9uLWFjY3VyYWN5Lmh0bWwjc2VjLXRocmVzaG9sZEluZGVwZW5kZW50QWNjdXJhY3kp4oCTZW5kIG9mIGNoYXB0ZXIpIHwgKipCbG9nIGFydGljbGUgNSBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzE5XSgjc2VjdGlvbjE5KSB8IFQgICAgICAgfCAxMC8yOCAgICB8IENhbGlicmF0aW9uIEFjY3VyYWN5OiBPdmVyY29uZmlkZW5jZSBCaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLYWhuZW1hbiAmIFR2ZXJza3kgKDE5OTYpOyBNYXNzZXkgJiBUaGFsZXIgKDIwMTMpIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyMF0oI3NlY3Rpb24yMCkgfCBUaCAgICAgIHwgMTAvMzAgICAgfCBNYWNoaW5lIExlYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzE5XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9tYWNoaW5lLWxlYXJuaW5nLmh0bWwpOyBSYW1hc3VicmFtYW5pYW4gJiBTaW5naCAoMjAxOSksIENoIDYgfCAqKkJsb2cgYXJ0aWNsZSA2IGR1ZSEqKiAgICAgICB8CnwgWzIxXSgjc2VjdGlvbjIxKSB8IFQgICAgICAgfCAxMS8wNCAgICB8IE15dGhidXN0ZXJzOiBQdXR0aW5nIEZhbnRhc3kgRm9vdGJhbGwgQmVsaWVmcy9BbmVjZG90ZXMgdG8gdGhlIFRlc3QgICAgICAgICAgfCBDaCBbMThdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL215dGhidXN0ZXJzLmh0bWwpOyBXaGl0ZSAmIFNoZWxkb24gKDIwMTQpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzIyXSgjc2VjdGlvbjIyKSB8IFRoICAgICAgfCAxMS8wNiAgICB8IE1vZGVybiBQb3J0Zm9saW8gVGhlb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMjBdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL21vZGVybi1wb3J0Zm9saW8tdGhlb3J5Lmh0bWwpOyBDaGVuICgyMDE2KSB8ICoqQmxvZyBhcnRpY2xlIDcgZHVlISoqICAgICAgICAgICAgICAgfAp8IFsyM10oI3NlY3Rpb24yMykgfCBUICAgICAgIHwgMTEvMTEgICAgfCBDbHVzdGVyIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzIxXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9jbHVzdGVyLWFuYWx5c2lzLmh0bWwpOyBFdmVyaXR0IGV0IGFsLiAoMjAxMSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjRdKCNzZWN0aW9uMjQpIHwgVGggICAgICB8IDExLzEzICAgIHwgRmFjdG9yIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsyMl0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svZmFjdG9yLWFuYWx5c2lzLmh0bWwpOyBGaWVsZCBldCBhbC4gKDIwMTIpLCBDaCAxNyB8ICoqQmxvZyBhcnRpY2xlIDggZHVlISoqICAgICAgICAgICAgICAgfAp8IFsyNV0oI3NlY3Rpb24yNSkgfCBUICAgICAgIHwgMTEvMTggICAgfCBEYXRhIFJlZHVjdGlvbjogUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzIzXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9wY2EuaHRtbCkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjZdKCNzZWN0aW9uMjYpIHwgVGggICAgICB8IDExLzIwICAgIHwgU2ltdWxhdGlvbiBhbmQgdGhlIE1vbnRlIENhcmxvIE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsyNF0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svc2ltdWxhdGlvbi5odG1sKTsgU2lnYWwgJiBDaGFsbWVycyAoMjAxNikgfCAqKkJsb2cgYXJ0aWNsZSA5IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8IDExLzI04oCTMTEvMjcgfCAqKkZBTEwgQlJFQUsg4oCTIE5PIENMQVNTRVMqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyN10oI3NlY3Rpb24yNykgfCBUICAgICAgIHwgMTIvMDIgICAgfCBUaW1lIFNlcmllcyBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzI1XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay90aW1lLXNlcmllcy1hbmFseXNpcy5odG1sKTsgW0h5bmRtYW4gJiBBdGhhbmFzb3BvdWxvcyAoMjAyMSksIENoIDFdKGh0dHBzOi8vb3RleHRzLmNvbS9mcHAzL2ludHJvLmh0bWwpICh0aHJvdWdoIFNlY3Rpb24gMS43KSB8ICAgICAgICB8CnwgWzI4XSgjc2VjdGlvbjI4KSB8IFRoICAgICAgfCAxMi8wNCAgICB8IERlY2lzaW9uIE1ha2luZyBpbiB0aGUgQ29udGV4dCBvZiBVbmNlcnRhaW50eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMjZdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2RlY2lzaW9uLW1ha2luZy5odG1sKTsgTGFycmljayBldCBhbC4gKDIwMjQpIHwgKipCbG9nIGFydGljbGUgMTAgZHVlISoqICAgICAgICAgICAgICB8CnwgWzI5XSgjc2VjdGlvbjI5KSB8IFQgICAgICAgfCAxMi8wOSAgICB8IFNwb3J0cyBhbmQgQ29nbml0aXZlIFBzeWNob2xvZ3k6IENvYWNoaW5nIGFuZCBSaXNrIEF2ZXJzaW9uICAgICAgICAgICAgICAgICAgfCBDaCAyNyAoU2VjdGlvbiBbMjcuMV0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svc3BvcnRzLWNvZ25pdGl2ZS1wc3ljaG9sb2d5Lmh0bWwp4oCTMjcuNSk7IE1vc2tvd2l0eiAmIFdlcnRoaGVpbSAoMjAxMiksIENoIDMgJiAxNiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzMwXSgjc2VjdGlvbjMwKSB8IFRoICAgICAgfCAxMi8xMSAgICB8IFNwb3J0cyBhbmQgQ29nbml0aXZlIFBzeWNob2xvZ3k6IFBzeWNob2xvZ2ljYWwgRmFjdG9ycyBpbiBQbGF5ZXIgUGVyZm9ybWFuY2U7IEV4cGVydCBQZXJmb3JtYW5jZSBhbmQgQXV0b21hdGljaXR5IHwgQ2ggMjcgKFNlY3Rpb24gWzI3LjZdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL3Nwb3J0cy1jb2duaXRpdmUtcHN5Y2hvbG9neS5odG1sI3NlYy1wc3ljaG9sb2dpY2FsRmFjdG9yc1BlcmZvcm1hbmNlKeKAk2VuZCBvZiBjaGFwdGVyKTsgTW9za293aXR6ICYgV2VydGhoZWltICgyMDEyKSwgQ2ggMTcgfCAqKkJsb2cgYXJ0aWNsZSAxMSBkdWUhKiogICAgICAgfAp8IEZpbmFscyBXZWVrICAgICAgfCAgICAgICAgIHwgVEJEICh3ZWVrIG9mIDEyLzE1KSB8ICoqRmluYWwgRXhhbSoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCiMgRGF0ZSBhbmQgVGltZSBvZiB0aGUgRmluYWwgRXhhbSB7I2ZpbmFsRXhhbX0KClRoZSBbZmluYWwgZXhhbWluYXRpb24gZGF0ZSBhbmQgdGltZV0oaHR0cHM6Ly9yZWdpc3RyYXIudWlvd2EuZWR1L2ZpbmFsLWV4YW0tc2NoZWR1bGVzKSB3aWxsIGJlIGFubm91bmNlZCBieSB0aGUgUmVnaXN0cmFyIGdlbmVyYWxseSBieSB0aGUgZmlmdGggd2VlayBvZiBjbGFzc2VzLCBhbmQgaXQgd2lsbCBiZSBhbm5vdW5jZWQgb24gdGhlIGNvdXJzZSBJQ09OIHNpdGUgb25jZSBpdCBpcyBrbm93bi4KPHU+RG8gbm90IHBsYW4geW91ciBlbmQgb2YgdGhlIHNlbWVzdGVyIHRyYXZlbCBwbGFucyB1bnRpbCB0aGUgZmluYWwgZXhhbSBzY2hlZHVsZSBpcyBtYWRlIHB1YmxpYy4KSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBrbm93IHRoZSBkYXRlLCB0aW1lLCBhbmQgcGxhY2Ugb2YgdGhlIGZpbmFsIGV4YW0uPC91PgpBY2NvcmRpbmcgdG8gdGhlIFJlZ2lzdHJhcidzIGZpbmFsIGV4YW0gcG9saWN5LCBzdHVkZW50cyA8dT5oYXZlIGEgbWF4aW11bSBvZiB0d28gd2Vla3MgYWZ0ZXIgdGhlIGFubm91bmNlZCBmaW5hbCBleGFtIHNjaGVkdWxlPC91PiB0byByZXF1ZXN0IGEgY2hhbmdlIGlmIGFuIGV4YW0gY29uZmxpY3QgZXhpc3RzIG9yIGlmIGEgc3R1ZGVudCBoYXMgbW9yZSB0aGFuIHR3byBleGFtcyBzY2hlZHVsZWQgZm9yIHRoZSBzYW1lIGRheSAoc2VlIHRoZSBbcG9saWN5XShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvbWFrZXVwLWZpbmFsLWV4YW1pbmF0aW9uLXBvbGljaWVzKSBoZXJlKS4KCiMgQ291cnNlIFJlc291cmNlcyB7I2NvdXJzZVJlc291cmNlc30KClRoZXJlIGFyZSBtYW55IGNvdXJzZSByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHN1Y2NlZWQgaW4gdGhlIGNsYXNzLCBpbmNsdWRpbmc6CgotIFBvd2VycG9pbnQgc2xpZGVzIGZvciBsZWN0dXJlCi0gZ2V0dGluZyBhbmQgcmV2aWV3aW5nIG1pc3NlZCBub3RlcyBmcm9tIGEgcGVlcgotIFtsZWN0dXJlIHJlY29yZGluZ3NdKCNyZWNvcmRpbmdzKQotIHRoZSBbY291cnNlIHRleHRib29rXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vaykgYW5kIGFzc2lnbmVkIHJlYWRpbmdzCi0gcmV2aWV3IHlvdXIgcmVhZGluZyBxdWl6emVzIGFuZCB0aGUgYW5zd2VycwotIGluc3RydWN0b3Igb2ZmaWNlIGhvdXJzCi0gcGVlciBzdHVkeSBncm91cHMKLSBUdXRvciBJb3dhOiBodHRwczovL3R1dG9yLnVpb3dhLmVkdQoKIyBEcm9wIERlYWRsaW5lIGZvciB0aGlzIENvdXJzZSB7I2Ryb3BEZWFkbGluZX0KCllvdSBtYXkgZHJvcCBhbiBpbmRpdmlkdWFsIGNvdXJzZSBiZWZvcmUgdGhlIGRyb3AgZGVhZGxpbmU7IGFmdGVyIHRoaXMgZGVhZGxpbmUgeW91IHdpbGwgbmVlZCBjb2xsZWdpYXRlIGFwcHJvdmFsLgpZb3UgY2FuIGxvb2sgdXAgdGhlIGRyb3AgZGVhZGxpbmUgZm9yIHRoaXMgY291cnNlIFtoZXJlXShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvY291cnNlLWRlYWRsaW5lcykuCldoZW4geW91IGRyb3AgYSBjb3Vyc2UsIGEgIlciIHdpbGwgYXBwZWFyIG9uIHlvdXIgdHJhbnNjcmlwdC4KVGhlIG1hcmsgb2YgIlciIGlzIGEgbmV1dHJhbCBtYXJrIHRoYXQgZG9lcyBub3QgYWZmZWN0IHlvdXIgR1BBLgpUbyBkaXNjdXNzIGhvdyBkcm9wcGluZyAob3Igc3RheWluZyBpbikgYSBjb3Vyc2UgbWlnaHQgYWZmZWN0IHlvdXIgYWNhZGVtaWMgZ29hbHMsIHBsZWFzZSBjb250YWN0IHlvdXIgQWNhZGVtaWMgQWR2aXNvci4KRGlyZWN0aW9ucyBmb3IgYWRkaW5nIG9yIGRyb3BwaW5nIGEgY291cnNlIGFuZCBvdGhlciByZWdpc3RyYXRpb24gY2hhbmdlcyBjYW4gYmUgZm91bmQgb24gdGhlIFtSZWdpc3RyYXIncyB3ZWJzaXRlXShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvY2hhbmdlLXJlZ2lzdHJhdGlvbi1teXVpKS4KU3R1ZGVudHMgY2FuIGZpbmQgcG9saWNpZXMgb24gZHJvcHBpbmcgQ0xBUyBjb3Vyc2VzIFtoZXJlXShodHRwczovL2NsYXMudWlvd2EuZWR1L3N0dWRlbnRzL3N0dWRlbnRzLWFjYWRlbWljLXBvbGljaWVzL3JlZ2lzdHJhdGlvbi1wb2xpY2llcyNkcm9wcGluZykuClN0dWRlbnRzIHNob3VsZCBhZGhlcmUgdG8gdGhlIFthY2FkZW1pYyBkZWFkbGluZXNdKGh0dHBzOi8vZ3JhZC51aW93YS5lZHUvYWNhZGVtaWNzL2RlYWRsaW5lcykgYW5kIHBvbGljaWVzIHNldCBieSB0aGUgR3JhZHVhdGUgQ29sbGVnZS4KCiMgRmVlZGJhY2sgYWJvdXQgdGhlIENvdXJzZSB7I2ZlZWRiYWNrfQoKSSB3ZWxjb21lIGZlZWRiYWNrIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIGNsYXNzLgpJZiB5b3UgaGF2ZSBjb21tZW50cyBvbiB0aGUgY2xhc3Mgb3IgbXkgdGVhY2hpbmcsIHBsZWFzZSBmZWVsIGZyZWUgdG8gbWVldCB3aXRoIG1lIGR1cmluZyBvZmZpY2UgaG91cnMuCgojIyBTdHVkZW50IENvbXBsYWludHMgeyNjb21wbGFpbnRzfQoKU3R1ZGVudHMgd2l0aCBhIGNvbXBsYWludCBhYm91dCBhIGdyYWRlIG9yIGEgcmVsYXRlZCBtYXR0ZXIgc2hvdWxkIGZpcnN0IGRpc2N1c3MgdGhlIHNpdHVhdGlvbiB3aXRoIHRoZSBpbnN0cnVjdG9yLCBhbmQgZmluYWxseSB3aXRoIHRoZSBERU8gKENoYWlyKSBvZiB0aGUgZGVwYXJ0bWVudCwgc2Nob29sLCBvciBwcm9ncmFtIG9mZmVyaW5nIHRoZSBjb3Vyc2UuClNvbWV0aW1lcyBzdHVkZW50cyB3aWxsIGJlIHJlZmVycmVkIHRvIHRoZSBkZXBhcnRtZW50IG9yIHByb2dyYW0ncyBEaXJlY3RvciBvZiBVbmRlcmdyYWR1YXRlIFN0dWRpZXMgKERVUykgb3IgRGlyZWN0b3Igb2YgR3JhZHVhdGUgU3R1ZGllcyAoREdTKS4KU3R1ZGVudHMgc2hvdWxkIGNvbnRhY3QgW0NMQVMgVW5kZXJncmFkdWF0ZSBQcm9ncmFtc10oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zdHVkZW50cy9oYW5kYm9vay9zdHVkZW50LXJpZ2h0cy1yZXNwb25zaWJpbGl0aWVzI3JpZ2h0cykgZm9yIHN1cHBvcnQgd2hlbiB0aGUgbWF0dGVyIGlzIG5vdCByZXNvbHZlZCBhdCB0aGUgcHJldmlvdXMgbGV2ZWwuCgojIENvbW11bmljYXRpb246IFVJIEVtYWlsIHsjZW1haWx9CgpTdHVkZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGFsbCBvZmZpY2lhbCBjb3JyZXNwb25kZW5jZXMgc2VudCB0byB0aGVpciBVSSBlbWFpbCBhZGRyZXNzICh1aW93YS5lZHUpIGFuZCBtdXN0IHVzZSB0aGlzIGFkZHJlc3MgZm9yIGFueSBjb21tdW5pY2F0aW9uIHdpdGggaW5zdHJ1Y3RvcnMgb3Igc3RhZmYgaW4gdGhlIFVJIGNvbW11bml0eS4KRm9yIHRoZSBwcml2YWN5IGFuZCB0aGUgcHJvdGVjdGlvbiBvZiBzdHVkZW50IHJlY29yZHMsIFVJIGZhY3VsdHkgYW5kIHN0YWZmIGNhbiBvbmx5IGNvcnJlc3BvbmQgd2l0aCBVSSBlbWFpbCBhZGRyZXNzZXMuCgojIyBPdGhlciBFeHBlY3RhdGlvbnMgb2YgU3R1ZGVudCBQZXJmb3JtYW5jZSB7I290aGVyRXhwZWN0YXRpb25zfQoKU3R1ZGVudHMgaGF2ZSB0aGUgcmlnaHQgdG8gYSBkaXN0cmFjdGlvbi1mcmVlIGxlYXJuaW5nIGVudmlyb25tZW50LgpZb3UgaGF2ZSB0aGUgcmVzcG9uc2liaWxpdHkgdG8gaGVscCBjcmVhdGUgc3VjaCBhIGNsYXNzcm9vbSBlbnZpcm9ubWVudC4KUGxlYXNlIHRyZWF0IG90aGVyIHN0dWRlbnRzIGluIHRoZSBjbGFzcyBhbmQgdGhlIGluc3RydWN0b3Igd2l0aCByZXNwZWN0LgpTdHVkZW50cyBhcmUgZXhwZWN0ZWQgdG8gaGVscCBlYWNoIG90aGVyIGxlYXJuIGFuZCB0byBjb250cmlidXRlIG92ZXJhbGwgdG8gdGhlIGxlYXJuaW5nIGVudmlyb25tZW50IG9mIHRoZSBjb3Vyc2UuCkFycml2aW5nIHByZXBhcmVkIGZvciBjbGFzcyBpcyBwYXJ0IG9mIHRoaXMgZXhwZWN0YXRpb24uCgojIFVuaXZlcnNpdHkgUG9saWNpZXMgeyNVSW93YVBvbGljaWVzfQoKW1VuaXZlcnNpdHkgUG9saWNpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCgpbQWNjb21tb2RhdGlvbnMgZm9yIFN0dWRlbnRzIHdpdGggRGlzYWJpbGl0aWVzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKVwKVGhlIFVuaXZlcnNpdHkgaXMgY29tbWl0dGVkIHRvIHByb3ZpZGluZyBhbiBlZHVjYXRpb25hbCBleHBlcmllbmNlIHRoYXQgaXMgYWNjZXNzaWJsZSB0byBhbGwgc3R1ZGVudHMuCklmIGEgc3R1ZGVudCBoYXMgYSBkaWFnbm9zZWQgZGlzYWJpbGl0eSBvciBvdGhlciBkaXNhYmxpbmcgY29uZGl0aW9uIHRoYXQgbWF5IGltcGFjdCB0aGUgc3R1ZGVudCdzIGFiaWxpdHkgdG8gY29tcGxldGUgdGhlIGNvdXJzZSByZXF1aXJlbWVudHMgYXMgc3RhdGVkIGluIHRoZSBzeWxsYWJ1cywgdGhlIHN0dWRlbnQgbWF5IHNlZWsgYWNjb21tb2RhdGlvbnMgdGhyb3VnaCBbU3R1ZGVudCBEaXNhYmlsaXR5IFNlcnZpY2VzXShodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUvc3R1ZGVudHMpIChTRFMpLgpTRFMgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBbTGV0dGVycyBvZiBBY2NvbW1vZGF0aW9uIChMT0EpXShodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUvc3R1ZGVudHMvbGV0dGVyLWFjY29tbW9kYXRpb25zLWxvYSkgYXZhaWxhYmxlIHRvIHRoZSBzdHVkZW50Lgo8dT5UaGUgc3R1ZGVudCBtdXN0IHByb3ZpZGUgYSBMT0EgdG8gdGhlIGluc3RydWN0b3IgYXMgZWFybHkgaW4gdGhlIHNlbWVzdGVyIGFzIHBvc3NpYmxlLCBidXQgcmVxdWVzdHMgbm90IG1hZGUgYXQgbGVhc3QgdHdvIHdlZWtzIHByaW9yIHRvIHRoZSBzY2hlZHVsZWQgYWN0aXZpdHkgZm9yIHdoaWNoIGFuIGFjY29tbW9kYXRpb24gaXMgc291Z2h0IG1heSBub3QgYmUgYWNjb21tb2RhdGVkLjwvdT4KVGhlIExPQSB3aWxsIHNwZWNpZnkgd2hhdCByZWFzb25hYmxlIGNvdXJzZSBhY2NvbW1vZGF0aW9ucyB0aGUgc3R1ZGVudCBpcyBlbGlnaWJsZSBmb3IgYW5kIHRob3NlIHRoZSBpbnN0cnVjdG9yIHNob3VsZCBwcm92aWRlLgpBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBvbiB0aGUgW1NEUyB3ZWJzaXRlXShodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUvc3R1ZGVudHMvYXBwbHkpLgoKW0NsYXNzIFJlY29yZGluZ3NdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpXApTdHVkZW50cyBtYXkgYmUgZW5yb2xsZWQgaW4gYSBjbGFzcyB3aGVyZSBzb21lIHNlc3Npb25zIHdpbGwgYmUgcmVjb3JkZWQgb3IgbGl2ZS1zdHJlYW1lZC4KU3VjaCByZWNvcmRpbmdzL3N0cmVhbWluZyB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIHRvIHN0dWRlbnRzIHJlZ2lzdGVyZWQgZm9yIHRoZSBjbGFzcy4KVGhlc2UgcmVjb3JkaW5ncyBhcmUgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiB0aGUgaW5zdHJ1Y3RvciBhbmQgdGhleSBtYXkgbm90IGJlIHNoYXJlZCBvciByZXByb2R1Y2VkIHdpdGhvdXQgdGhlIGV4cGxpY2l0LCB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGluc3RydWN0b3IuCkZ1cnRoZXIsIHN0dWRlbnRzIG1heSBub3Qgc2hhcmUgdGhlc2Ugc2Vzc2lvbnMgd2l0aCB0aG9zZSBub3QgaW4gdGhlIGNsYXNzIG9yIHVwbG9hZCB0aGVtIHRvIGFueSBvdGhlciBvbmxpbmUgZW52aXJvbm1lbnQuCkRvaW5nIHNvIHdvdWxkIGJlIGEgYnJlYWNoIG9mIHRoZSBDb2RlIG9mIFN0dWRlbnQgQ29uZHVjdCwgYW5kLCBpbiBzb21lIGNhc2VzLCBhIHZpb2xhdGlvbiBvZiBzdGF0ZSBhbmQgZmVkZXJhbCBsYXcsIGluY2x1ZGluZyB0aGUgRmVkZXJhbCBFZHVjYXRpb24gUmlnaHRzIGFuZCBQcml2YWN5IEFjdCAoRkVSUEEpLgoKVGhlIHVuYXV0aG9yaXplZCB2aWRlbyBvciBhdWRpbyByZWNvcmRpbmcgb2YgYWNhZGVtaWMgYWN0aXZpdGllcyAoZS5nLiwgbGVjdHVyZXMsIGNvdXJzZSBkaXNjdXNzaW9ucywgb2ZmaWNlIGhvdXJzLCBldGMuKSBieSBhIHN0dWRlbnQgaXMgcHJvaGliaXRlZC4KU3R1ZGVudHMgd2l0aCBhIHJlYXNvbmFibGUgYWNjb21tb2RhdGlvbiBmb3IgcmVjb3JkaW5nIGFwcHJvdmVkIGJ5IFN0dWRlbnQgRGlzYWJpbGl0eSBTZXJ2aWNlcyBzaG91bGQgbm90aWZ5IGVhY2ggaW5zdHJ1Y3RvciBhbmQgcHJvdmlkZSB0aGUgTGV0dGVyIG9mIEFjY29tbW9kYXRpb24gcHJpb3IgdG8gdXNpbmcgdGhlIGFjY29tbW9kYXRpb24uCkEgc3R1ZGVudCBtYXkgcmVjb3JkIGNsYXNzcm9vbSBhY3Rpdml0aWVzIHdpdGggcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gdGhlIGluc3RydWN0b3IgYW5kIG5vdGljZSB0byBvdGhlciBzdHVkZW50cyBpbiB0aGUgY2xhc3MgdGhhdCBhdWRpbyBvciB2aWRlbyByZWNvcmRpbmcgbWF5IG9jY3VyLgpBbnkgYW5kIGFsbCBjbGFzc3Jvb20gcmVjb3JkaW5nIG11c3QgYmUgZm9yIHBlcnNvbmFsIGFjYWRlbWljIHVzZSBvbmx5LgpUaGUgZGlzdHJpYnV0aW9uLCBzaGFyaW5nLCBzYWxlLCBvciBwb3N0aW5nIG9mIHJlY29yZGluZ3Mgb24gdGhlIGludGVybmV0IChpbmNsdWRpbmcgc29jaWFsIG1lZGlhKSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgaXMgcHJvaGliaXRlZCBhbmQgZG9pbmcgc28gbWF5IGJlIGEgdmlvbGF0aW9uIG9mIHRoZSBDb2RlIG9mIFN0dWRlbnQgTGlmZSBhbmQvb3Igc3RhdGUgb3IgZmVkZXJhbCBwcml2YWN5LCBjb3B5cmlnaHQsIG9yIG90aGVyIGxhd3MuCgotIFtGcmVlIFNwZWVjaCBhbmQgRXhwcmVzc2lvbl0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbTm9uLURpc2NyaW1pbmF0aW9uXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtBY2NvbW1vZGF0aW9ucyBmb3IgU3R1ZGVudHMgd2l0aCBEaXNhYmlsaXRpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCi0gW0Fic2VuY2VzIGZyb20gQ2xhc3NdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCi0gW0Fic2VuY2VzIGZvciBSZWxpZ2lvdXMgSG9seSBEYXlzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtBYnNlbmNlcyBmb3IgTWlsaXRhcnkgU2VydmljZSBPYmxpZ2F0aW9uc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQ2xhc3Nyb29tIEV4cGVjdGF0aW9uc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbU2V4dWFsIEhhcmFzc21lbnQvTWlzY29uZHVjdCBhbmQgU3VwcG9ydGl2ZSBNZWFzdXJlc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQ29uZmxpY3QgUmVzb2x1dGlvbl0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbTWVudGFsIEhlYWx0aF0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQmFzaWMgTmVlZHMgYW5kIFN0dWRlbnQgU3VwcG9ydF0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQ2xhc3MgUmVjb3JkaW5nc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKCiMgV2hlcmUgdG8gR2V0IEFjYWRlbWljIFN1cHBvcnQgZm9yIFRoaXMgQ291cnNlIHsjYWNhZGVtaWMtc3VwcG9ydH0KCi0gRHJvcC1pbiBzdHVkeSBncm91cHMgYW5kIG9uZS1vbi1vbmUgdHV0b3Jpbmc6IHN0dWRlbnQgZHJvcC1pbiBob3VycyBvZiB0aGUgaW5zdHJ1Y3RvcgotIEZvcm1hbCB0dXRvcmluZzogVHV0b3IgSW93YTogaHR0cHM6Ly90dXRvci51aW93YS5lZHUKLSBVSSBXcml0aW5nIENlbnRlcjogaHR0cHM6Ly93cml0aW5nY2VudGVyLnVpb3dhLmVkdQotIEFjYWRlbWljIGFjY29tbW9kYXRpb25zOiBodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUKCiMgTWVudGFsIEhlYWx0aCBSZXNvdXJjZXMgYW5kIFN0dWRlbnQgU3VwcG9ydCB7I21lbnRhbC1oZWFsdGh9CgpTdHVkZW50cyBhcmUgZW5jb3VyYWdlZCB0byBiZSBtaW5kZnVsIG9mIHRoZWlyIG1lbnRhbCBoZWFsdGggYW5kIHNlZWsgaGVscCBhcyBhIHByZXZlbnRpdmUgbWVhc3VyZSBvciBpZiBmZWVsaW5nIG92ZXJ3aGVsbWVkIGFuZC9vciBzdHJ1Z2dsaW5nIHRvIG1lZXQgY291cnNlIGV4cGVjdGF0aW9ucy4KU3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gdGFsayB0byB0aGVpciBpbnN0cnVjdG9yIGZvciBhc3Npc3RhbmNlIHdpdGggc3BlY2lmaWMgY2xhc3MtcmVsYXRlZCBjb25jZXJucy4KRm9yIGFkZGl0aW9uYWwgc3VwcG9ydCBhbmQgY291bnNlbGluZywgc3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gY29udGFjdCBVbml2ZXJzaXR5IENvdW5zZWxpbmcgU2VydmljZSAoVUNTKS4KSW5mb3JtYXRpb24gYWJvdXQgVUNTLCBpbmNsdWRpbmcgcmVzb3VyY2VzIGFuZCBob3cgdG8gc2NoZWR1bGUgYW4gYXBwb2ludG1lbnQsIGNhbiBiZSBmb3VuZCBhdCBbY291bnNlbGluZy51aW93YS5lZHVdKGh0dHA6Ly9jb3Vuc2VsaW5nLnVpb3dhLmVkdSkuCkZpbmQgb3V0IG1vcmUgYWJvdXQgVUkgbWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBhdDogW21lbnRhbGhlYWx0aC51aW93YS5lZHVdKGh0dHA6Ly9tZW50YWxoZWFsdGgudWlvd2EuZWR1KSwgaW5jbHVkaW5nIHRoZSAyNC03IFtVSSBTdXBwb3J0IGFuZCBDcmlzaXMgTGluZV0oaHR0cHM6Ly9tZW50YWxoZWFsdGgudWlvd2EuZWR1L3VpLXN1cHBvcnQtYW5kLWNyaXNpcy1saW5lKS4KCkFkZGl0aW9uYWxseSwgdGhlIE9mZmljZSBvZiB0aGUgRGVhbiBvZiBTdHVkZW50cyBjYW4gaGVscCBzdHVkZW50cyBuYXZpZ2F0ZSBwZXJzb25hbCBjcmlzaXMgc2l0dWF0aW9ucy4KVGhleSBjYW4gcHJvdmlkZSBvbmUtb24tb25lIHN1cHBvcnQsIGhlbHAgd2l0aCBpZGVudGlmeWluZyBvcHRpb25zLCBhbmQgYWNjZXNzIHRvIFtiYXNpYyBuZWVkcyByZXNvdXJjZXMgKHN1Y2ggYXMgZm9vZCwgcmVudCwgY2hpbGRjYXJlLCBldGMuKV0oaHR0cDovL2Jhc2ljbmVlZHMudWlvd2EuZWR1KS4KU3R1ZGVudCBDYXJlIGFuZCBBc3Npc3RhbmNlOiAxMzIgSU1VLCBbZG9zLWFzc2lzdGFuY2VAdWlvd2EuZWR1XShtYWlsdG86ZG9zLWFzc2lzdGFuY2VAdWlvd2EuZWR1KSwgb3IgMzE5LTMzNS0xMTYyIGFuZCBtb3JlIGluZm86IFtkb3MudWlvd2EuZWR1L2Fzc2lzdGFuY2VdKGh0dHBzOi8vZG9zLnVpb3dhLmVkdS9hc3Npc3RhbmNlKQoKSWYgeW91IGZlZWwgdGhhdCB5b3Ugb3Igc29tZW9uZSB5b3Uga25vdyBtYXkgYmUgc3RydWdnbGluZyB3aXRoIGFuIGFjYWRlbWljLCBlbW90aW9uYWwsIG9yIHBzeWNob2xvZ2ljYWwgcHJvYmxlbSwgdGhlIGZvbGxvd2luZyBvcmdhbml6YXRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFzc2lzdGFuY2U6Cgp8IFNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29udGFjdCBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBVbml2ZXJzaXR5IG9mIElvd2EgQWNhZGVtaWMgQWR2aXNpbmcgQ2VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1My01NzAwLCBodHRwczovL2FkdmlzaW5nY2VudGVyLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgfAp8IFVuaXZlcnNpdHkgQ291bnNlbGluZyBTZXJ2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTcyOTQsIGh0dHBzOi8vd3d3LnVpb3dhLmVkdS91Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgU3R1ZGVudCBIZWFsdGggU2VydmljZSAtIE1lbnRhbCBIZWFsdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMzUtODM5NCwgaHR0cHM6Ly9zdHVkZW50aGVhbHRoLnVpb3dhLmVkdS9zZXJ2aWNlcy9wc3ljaGlhdHJ5ICAgIHwKfCBVbml2ZXJzaXR5IG9mIElvd2EgSG9zcGl0YWxzIGFuZCBDbGluaWNzIEFkdWx0IFBzeWNoaWF0cnkgU2VydmljZXMgQ2xpbmljICB8IDM1My02MzE0LCBodHRwczovL3d3dy51aWhlYWx0aGNhcmUub3JnL1BzeWNoaWF0cnkgICAgICAgICAgICAgICAgfAp8IFNlYXNob3JlIENsaW5pYyAoaW4gdGhlIFVJIERlcGFydG1lbnQgb2YgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMpIHwgMzM1LTI0NjcsIGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUvcmVzb3VyY2VzL3NlYXNob3JlLWNsaW5pYyB8CnwgV29tZW4ncyBSZXNvdXJjZSBhbmQgQWN0aW9uIENlbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMzUtMTQ4NiwgaHR0cHM6Ly93cmFjLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBSYXBlIFZpY3RpbSBBZHZvY2FjeSBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMxOS0zMzUtNjAwMCBvciA4MDAtMjI4LTE2MjUsIGh0dHBzOi8vd3d3LnVpb3dhLmVkdS9+cnZhcCAgICAgICAgfAp8IE9mZmljZSBvZiBTZXh1YWwgTWlzY29uZHVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzE5LTMzNS02MjAwLCBodHRwczovL29zbXJjLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgQ29tbVVuaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4NTUtMzI1LTQyOTYsIGh0dHBzOi8vYnVpbHRieWNvbW11bml0eS5vcmcvY3Jpc2lzICAgICAgICAgICAgICAgIHwKfCBDb21tdW5pdHkgJiBGYW1pbHkgUmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1MS00MzU3LCBodHRwczovL3d3dy5jZnJoZWxwcy5vcmcvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKPHU+SWYgeW91IG9yIHNvbWVvbmUgeW91IGtub3cgaXMgY29udGVtcGxhdGluZyBzdWljaWRlPC91PiwgZWl0aGVyIGNhbGwgb3IgdGV4dCB0aGUgU3VpY2lkZSBhbmQgQ3Jpc2lzIExpZmVsaW5lIGF0IDk4OCwgb3IgY2FsbCA5MTEuCgojIERpc2Nsb3N1cmVzIHsjZGlzY2xvc3VyZXN9CgpJIGFtIHRoZSBPd25lciBvZiBGYW50YXN5IEZvb3RiYWxsIEFuYWx5dGljcywgTExDLCB3aGljaCBvcGVyYXRlcyBodHRwczovL2ZhbnRhc3lmb290YmFsbGFuYWx5dGljcy5uZXQuCkkgZG8gbm90IHJlcXVpcmUgb3IgZW5jb3VyYWdlIHN0dWRlbnRzIHRvIHVzZSBteSB3ZWJzaXRlLCBhbmQgSSBkbyBub3QgcHJvbW90ZSBvciBlbmRvcnNlIGFueSBzcGVjaWZpYyBjb250ZW50IG9yIHNlcnZpY2VzIG9mZmVyZWQgYnkgRmFudGFzeSBGb290YmFsbCBBbmFseXRpY3MuCgojIERpc2NsYWltZXIgeyNkaXNjbGFpbWVyfQoKIipUaGlzIG1hdGVyaWFsIHByb2JhYmx5IHdvbid0IHdpbiB5b3UgZmFudGFzeSBmb290YmFsbCBjaGFtcGlvbnNoaXBzLgpZb3UgY291bGQgdGFrZSB3aGF0IHdlIGxlYXJuIGFuZCBhcHBseSBpdCB0byBmYW50YXN5IGZvb3RiYWxsIGFuZCB5b3UgbWlnaHQgYmVjb21lIDUgcGVyY2VudCBtb3JlIGxpa2VseSB0byB3aW4uCk9yLi4uCkNvbnNpZGVyIHRoZSBicm9hZGVyIHJlbGV2YW5jZSBvZiB0aGlzLgpZb3UgY291bGQgbGVhcm4gZGF0YSBhbmFseXNpcyBhbmQgZmlndXJlIG91dCB3YXlzIHRvIGFwcGx5IGl0IHRvIG90aGVyIHN5c3RlbXMuCkFuZCB5b3UgY291bGQgYmUgbWFraW5nIGEgc2l4LWZpZ3VyZSBzYWxhcnkgd2l0aGluIHRoZSBuZXh0IGZpdmUgeWVhcnMuKiIK4oCTIEJlbmphbWluIE1vdHosIFBoLkQuCgpUaGlzIHN5bGxhYnVzIGlzIHN1YmplY3QgdG8gY2hhbmdlLgpBbnkgY2hhbmdlcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiBjbGFzcywgdmlhIGVtYWlsLCBhbmQvb3Igb24gSUNPTi4K