Last Updated: 07/02/2025
Course Title
PSY:2301 – Introduction to Clinical Psychology (Spring 2025)
Course Meeting Time and
Place
Monday & Wednesday 10:30–11:20 a.m., 100 Phillips Hall (PH)
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 11:20–12:20 & Thursday 2–4
Note: I’m here to help you learn and succeed in PSY:2301. 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 e-mail.
Discussion
Sections
All discussion sections are in 53 VAN. The day and time of the
discussion section differ by section:
A01 |
Monday 3:30–4:20 |
Olivia Adamson |
A02 |
Monday 4:30–5:20 |
Olivia Adamson |
A03 |
Tuesday 8:30–9:20 |
James Lopez |
A04 |
Tuesday 12:30–1:20 |
Gonzalo Quinones |
A05 |
Tuesday 1:30–2:20 |
James Lopez |
A06 |
Wednesday 2:30–3:20 |
Gonzalo Quinones |
A07 |
Wednesday 3:30–4:20 |
Gonzalo Quinones |
A08 |
Thursday 9:30–10:20 |
Olivia Adamson |
A09 |
Thursday 10:30–11:20 |
Olivia Adamson |
A10 |
Friday 1:30–2:20 |
Gonzalo Quinones |
Graduate Teaching
Assistants
The class has three graduate teaching assistants (TAs).
Gonzalo Quinones
Office: 364 Psychological and Brain Sciences Building (PBSB)
Sections: A04, A06, A07, A10
Student drop-in hours: Tuesday 10:00–12:00 and Wednesday
9:00–10:00
E-mail: gonzalo-quinones@uiowa.edu
Olivia Adamson
Office: 364 Psychological and Brain Sciences Building (PBSB)
Sections: A01, A02, A08, A09
Student drop-in hours: Monday 12:00–2:00 (in-person and/or by zoom) and
Thursday 8–9am (over zoom)
E-mail: olivia-adamson@uiowa.edu
James Lopez
Office: 364 Psychological and Brain Sciences Building (PBSB)
Sections: A03, A05
Student drop-in hours: Monday 9:00–10:30
E-mail: james-lopez@uiowa.edu
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 Psychology department has a hierarchical course structure that
requires students to complete certain prerequisites before taking
upper-level classes. The prerequisite for this course is Elementary
Psychology (PSY:1001).
Description of
Course
This course is designed to introduce you to the concepts and methods
of the science of clinical psychology.
It has three areas of emphasis:
- Fundamentals of Scientific Clinical Psychology
- Evidence-Based Psychological Assessment
- Evidence-Based Psychological Intervention
This course will provide an introduction to (a) major theoretical
models and research methods in scientific clinical psychology; (b)
several psychological problems that are particularly relevant to college
students (depression, anxiety, and alcohol abuse); (c) the general
principles underlying the construction, administration, and
interpretation of evidence-based clinical assessments; and (d)
empirically supported approaches to psychological intervention. You
are urged to reconsider your decision to take this class if you are
reluctant to examine these topics in a scientific manner.
Note: Some topics and movies will deal with sensitive or
controversial issues such as alcohol problems, depression, anxiety,
abuse, sexual assault, eating disorders, and suicide.
Learning Outcomes
Taking this course should make you a more informed consumer of claims
about contemporary clinical psychology and may assist in your evaluation
of clinical psychology or other related potential career goals. This
course is not designed to provide extensive information on the nature of
psychological disorders (see Abnormal Psychology course) or to provide
you with the skills to assess and treat psychological problems.
Required Textbook
There isn’t a required or recommended textbook. Instead, this course
will include a combination of book chapters, peer-reviewed journal
articles, and popular media articles. The source for all exam questions
will be lecture, discussion, and all required readings for lectures and
section, which will be provided on the course website on ICON. The cost of textbooks has become
so high that I am not comfortable requiring one for this course when I
can cover the material adequately in other ways. There also is no
textbook available that covers the material as we do in class.
Attendance at lectures will be critical as a result, however. If you
miss a lecture or section, you will need to watch the lecture recording
or get notes from a peer, because we do not provide notes or re-present
missed lecture or section material in meetings. Once you have the notes
from a peer, review them carefully on your own, then get into office
hours with me or one of the TAs to address any specific questions that
you have as soon as possible. Feel free to come to office hours with me
or with one of the TAs to discuss how best to study for a course without
a textbook.
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 on
quizzes and during exams is not permitted. However, I do encourage you
to collaborate with classmates 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.
Artificial
Intelligence (AI) Policy
Because writing, analytical, and critical thinking skills are part of
the learning outcomes of this course, all work submitted by students
should be prepared by the student. You are training these cognitive
muscles; if you go to the gym, you would not have AI lift the weights
for you. For these reasons, AI-generated submissions are not permitted
and will be treated as plagiarism. Learning these core foundational
skills will make you a better user of AI in the future, because you will
be better-positioned in the future to critically evaluate AI responses
and to identify when (and the ways in which) its responses are
inaccurate. Moreover, in many industries, use of AI is not permitted
because you cannot share the company’s proprietary information. Thus,
developing strong competencies in these domains (without the use of AI)
will prepare you for a competitive workplace.
Course Requirements
and Policies
Lecture
We will meet twice weekly for lectures, at the time and location
described above. My powerpoint presentations
for each lecture will be posted on ICON no later than noon the day before
a 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. I strongly recommend bringing the powerpoint presentations to
class to take notes.
You should feel free to ask questions during lecture, although some
questions may need to be deferred given the size of the class and the
need to complete coverage of specific material during lecture.
Questions and further discussion of class material are always
welcome during office hours, during discussion section, and via
e-mail. Please bear in mind that extensive or complex questions may not
be addressable over e-mail.
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. Recordings will be available up
to 48 hours after class (for Wednesday lectures) or until the Wednesday
class period (for Monday lectures). However, please do not count on
recordings being available, in case I accidentally forget to
initiate the recording or there is a technical malfunction. The
availability of lecture recordings will not be extended beyond 48 hours
after lecture—the recordings are meant to help people keep up with
lectures and for students to retrieve the relevant content if they
missed anything during the live lecture or if they miss the lecture;
they are not meant to be a study method that allows people to fall
behind in class from week to week. If you miss something and are unable
to watch the lecture recording, you can get/review notes with a peer,
and then come to office hours if you have specific questions.
Discussion
Section
In addition to lecture, you also have a weekly discussion section,
except during exam weeks. The day and time of the weekly discussion
section differs based on the section, see above.
Attendance and
Participation
Discussion section attendance and participation are mandatory and
will be worth 8% of your final grade. You must attend section, pay
attention, participate verbally, and complete the required
activities during section to receive any attendance and participation
points, as indicated by your submission of the required written
responses during section at the end of the section session. There
will be 13 discussions during the semester, and you will receive one
point for submitting an appropriate written response at the end of each
section, up to a maximum of 11 points (i.e., you will not receive
extra credit for submitting appropriate responses for all 13
discussions). Thus, you will not be penalized for missing two sections,
although you still will be responsible for the covered material on
exams, etc., and I urge you strongly to attend all sections. This
strategy is designed to facilitate my management of the excuses
associated with an occasional missed section (i.e., no more than two
during the semester). In other words, make sure you attend and
participate in at least 11 of your discussion sections this
semester!!
If you have to a section for an excusable reason (e.g., you are
sick), let your TA know as soon as possible that you will have to miss
class—preferably before class, and no later than 48 hours after class.
It is up to our discretion what is considered an excused absence. If it
is an excused absence, a TA will send you notes from the section you
missed, and you will be able to submit the in-class writing assignment
by emailing it to your TA—you will still need to submit the writing
assignment within one week of the missed discussion section to get
attendence credit for that section. If you miss a section, you can
attend a different section during the same week only with the
permission of the instructor of the different section, but you
will not receive attendance and participation points for doing so
(unless the absence is excused by the instructor).
Lecture attendance is not mandatory, but it is strongly encouraged;
most material presented in lecture is not included in the readings, and
lecture recordings may not always be available. You are responsible
for and will be tested on all material presented in lectures, discussion
sections, and in the required readings. Regular attendance and good
attention to lectures will improve what you get out of this class and is
likely to improve your performance on the exams.
Readings &
Quizzes
Readings and other materials will be posted on ICON. You are expected to do the
readings before discussion section. You will have an online quiz on the
readings to complete in ICON, on
your own, before each discussion section. 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 your
scheduled discussion section starts. We will not accept late responses
or multiple submissions. 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 at the end of the week
(i.e., after the last discussion section has taken their quiz).
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 and section 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 discussion section, and preparing
for quizzes and exams.
Examinations
There will be 3 exams. Exams 1 and 2 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. The exams
will include multiple-choice questions. Each exam will emphasize
information presented for the third of the class that precedes it.
However, some integration of information across sections will be
required for questions on the second and third exams. Exam questions can
come from any of the following sources: lectures, sections, or
required readings. For suggested study tips for this class, see here.
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 or the TA 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 or the TA must be contacted before the
examination whenever possible, and you must send acceptable form of
documentation to Professor Petersen or the TA.
Grading System and the
Use of +/-
Final grades will be assigned at the end of semester on the basis of
your total percentage of points earned on exams, quizzes, and section
participation, as detailed below. Grades will be assigned on an absolute
scale (criterion-referenced grading); course grades will not be curved.
No extra-credit opportunities are available for this course. 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:
- 28% Examination #1
- 28% Examination #2
- 28% Examination #3 (administered only during the class’s Final Exam
time slot)
- 8% Discussion Attendance/Participation
- 8% Reading Quizzes
Tentative Course
Outline (exam dates fixed)
Section Notes
- Sections will not be held during the week of examinations.
Therefore, sections are cancelled on the following dates: Monday 2/27 –
Friday 3/3 and Monday 4/3 – Friday 4/7.
Unit One
Unit One: Fundamentals of Scientific Clinical
Psychology
1/16 |
MLK Day (no class!) |
1/18 |
Introduction and Contemporary Clinical Psychology |
1/23 |
Classification and Diagnosis |
1/25 |
Classification and Diagnosis |
1/30 |
Research Methods in Clinical Psychology (content focus
on sexual assault) |
2/1 |
Research Methods in Clinical Psychology (content focus
on sexual assault) |
2/6 |
Mood Disorders |
2/8 |
Mood Disorders |
2/13 |
Mood Disorders and Suicide |
2/15 |
Anxiety Disorders |
2/20 |
Anxiety Disorders |
2/22 |
Alcohol Use Disorders |
2/27 |
Examination #1 (no sections this week!) |
Unit Two
Unit Two: Evidence-Based Psychological Assessment and
Prediction
3/1 |
Overview of Assessment and Prediction |
3/6 |
Overview of Assessment and Prediction |
3/8 |
Interviewing, Observation, and Self-Monitoring |
3/13 |
Spring Break (no class!) |
3/15 |
Spring Break (no class!) |
3/20 |
Interviewing, Observation, and Self-Monitoring |
3/22 |
Intelligence Testing |
3/27 |
Intelligence Testing |
3/29 |
Personality Assessment |
4/3 |
Personality Assessment; Wrap Up |
4/5 |
Examination #2 (no sections this week!) |
Unit Three
Unit Three: Evidence-Based Psychological
Intervention
4/10 |
Major Approaches to Intervention |
4/12 |
Major Approaches to Intervention |
4/17 |
Cognitive-Behavioral Therapy for Panic Disorder;
Transdiagnostic Treatment for Emotional Disorders |
4/19 |
Evaluation of Interventions |
4/24 |
Evidence-Based Treatments; Influences on Treatment
Outcome |
4/26 |
Dissemination of Evidence-Based Treatments |
5/1 |
Intervention Controversies |
5/3 |
Wrap-Up |
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:
- Powerpoint slides for lecture
- Powerpoint slides for discussion section
- getting and reviewing missed notes from a peer
- lecture recordings
- study questions after each lecture (see the “Study Questions” folder
under the “Files” tab on ICON)
- Quizlet questions (see the “Quizlet” folder under the “Files” tab on
ICON)
- practice exam questions that we post leading up to the exam (these
will be made available in the “Practice Exam Questions” folder under the
“Files” tab on ICON)
- review your quizzes and the answers
- our guide on how to study for the
class
- TA office hours
- instructor office hours
- peer study groups
- Tutor Iowa: https://tutor.uiowa.edu
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.
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, the TAs, 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.
Course Requests
We have a centralized location to keep track of requests, forms,
etc., so we can make sure we meet your needs. Course requests include,
for instance, requests to join a peer study group, setting up a time to
review your exam, requesting accommodations, etc. Please submit course
requests (e.g., to join a peer study group) here: [UPDATE LINK!] https://uiowa.qualtrics.com/jfe/form/SV_1HUyg6ZaR4CcjWu.
If you have accessibility accommodations from Student Disability
Services (SDS), please submit your SDS accommodations letters at this
link.
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
Some of the topics covered in class involve problems that can be
quite common among college students. 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.
Disclaimer
This syllabus is subject to change. Any changes will be discussed in
class, via email, and/or on ICON.
LS0tCnRpdGxlOiAiQ291cnNlIFN5bGxhYnVzIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICBlcnJvciA9IFRSVUUsCiAgY29tbWVudCA9ICIiKQpgYGAKCkxhc3QgVXBkYXRlZDogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlbS8lZC8lWSIpYAoKIyBDb3Vyc2UgVGl0bGUgeyN0aXRsZX0KClBTWToyMzAxIOKAkyBJbnRyb2R1Y3Rpb24gdG8gQ2xpbmljYWwgUHN5Y2hvbG9neSAoU3ByaW5nIDIwMjUpCgojIENvdXJzZSBNZWV0aW5nIFRpbWUgYW5kIFBsYWNlIHsjbGVjdHVyZVRpbWV9CgpNb25kYXkgJiBXZWRuZXNkYXkgMTA6MzDigJMxMToyMCBhLm0uLCAxMDAgUGhpbGxpcHMgSGFsbCAoUEgpCgojIENvdXJzZSBXZWJzaXRlIHsjd2Vic2l0ZX0KCmh0dHBzOi8vaWNvbi51aW93YS5lZHUKClRvIGFjY2VzcyB0aGUgY291cnNlIHNpdGUsIGxvZyBpbnRvIFtJb3dhIENvdXJzZXMgT25saW5lIChJQ09OKV0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkgdXNpbmcgeW91ciBIYXdrIElEIGFuZCBwYXNzd29yZC4KCiMgQ291cnNlIEhvbWUgeyNob21lfQoKVGhlIFVuaXZlcnNpdHkgb2YgSW93YVwKVGhlIENvbGxlZ2Ugb2YgTGliZXJhbCBBcnRzIGFuZCBTY2llbmNlc1wKRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlcwoKVGhlIENvbGxlZ2Ugb2YgTGliZXJhbCBBcnRzIGFuZCBTY2llbmNlcyAoQ0xBUykgaXMgdGhlIGhvbWUgb2YgdGhpcyBjb3Vyc2UsIGFuZCBDTEFTIGdvdmVybnMgdGhlIGFkZCBhbmQgZHJvcCBkZWFkbGluZXMsIGFjYWRlbWljIG1pc2NvbmR1Y3QgcG9saWNpZXMsIGFuZCBvdGhlciBwb2xpY2llcyBhbmQgcHJvY2VkdXJlcy4KT3RoZXIgVUkgY29sbGVnZXMgbWF5IGhhdmUgZGlmZmVyZW50IHBvbGljaWVzLgoKIyBJbnN0cnVjdG9yIENvbnRhY3QgSW5mb3JtYXRpb24geyNpbnN0cnVjdG9yfQoKW1Byb2Zlc3NvciBQZXRlcnNlbl0oaHR0cHM6Ly9wc3ljaG9sb2d5LnVpb3dhLmVkdS9wZW9wbGUvaXNhYWMtcGV0ZXJzZW4pXApPZmZpY2U6IDE3NSBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlcyBCdWlsZGluZyAoUEJTQilcCkUtbWFpbDogW2lzYWFjLXQtcGV0ZXJzZW5AdWlvd2EuZWR1XShtYWlsdG86aXNhYWMtdC1wZXRlcnNlbkB1aW93YS5lZHUpXApPZmZpY2UgUGhvbmU6IDQ2Ny0xMDE0XApTdHVkZW50IGRyb3AtaW4gaG91cnM6IE1vbmRheSAxMToyMOKAkzEyOjIwICYgVGh1cnNkYXkgMuKAkzRcCk5vdGU6IEknbSBoZXJlIHRvIGhlbHAgeW91IGxlYXJuIGFuZCBzdWNjZWVkIGluIFBTWToyMzAxLgpQbGVhc2UgY29tZSB0byBteSBvZmZpY2UgaG91cnMgdG8gYXNrIHF1ZXN0aW9ucyBhYm91dCBjb3Vyc2UgbWF0ZXJpYWwsIGFzc2lnbm1lbnRzLCBleGFtcywgb3IgcHJvZmVzc2lvbmFsIGRldmVsb3BtZW50IChjYXJlZXItcmVsYXRlZCBpc3N1ZXMpLCBmb3IgaW5zdGFuY2UuCkkgd2VsY29tZSB5b3UgdG8gZGlzY3VzcyBhbnkgY29uY2VybnMgeW91IG1pZ2h0IGhhdmUgYWJvdXQgdGhlIGNsYXNzLgpJIGFtIGFsc28gYXZhaWxhYmxlIHRvIG1lZXQgd2l0aCB5b3UgYnkgYXBwb2ludG1lbnQsIGFsdGhvdWdoIEkgd291bGQgYXBwcmVjaWF0ZSB5b3VyIG1ha2luZyBldmVyeSBlZmZvcnQgdG8gc2VlIG1lIGR1cmluZyBvZmZpY2UgaG91cnMuClRoZSBiZXN0IHdheSB0byByZWFjaCBtZSBvdXRzaWRlIG9mIGNsYXNzIGlzIGJ5IGUtbWFpbC4KCiMgRGlzY3Vzc2lvbiBTZWN0aW9ucyB7I3NlY3Rpb25zfQoKQWxsIGRpc2N1c3Npb24gc2VjdGlvbnMgYXJlIGluIDUzIFZBTi4KVGhlIGRheSBhbmQgdGltZSBvZiB0aGUgZGlzY3Vzc2lvbiBzZWN0aW9uIGRpZmZlciBieSBzZWN0aW9uOgoKfCBTZWN0aW9uIHwgRGF5L1RpbWUgICAgICAgICAgICAgIHwgVGVhY2hpbmcgQXNzaXN0YW50IHwKfDotLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBBMDEgICAgIHwgTW9uZGF5IDM6MzDigJM0OjIwICAgICAgfCBPbGl2aWEgQWRhbXNvbiAgICAgfAp8IEEwMiAgICAgfCBNb25kYXkgNDozMOKAkzU6MjAgICAgICB8IE9saXZpYSBBZGFtc29uICAgICB8CnwgQTAzICAgICB8IFR1ZXNkYXkgODozMOKAkzk6MjAgICAgIHwgSmFtZXMgTG9wZXogICAgICAgIHwKfCBBMDQgICAgIHwgVHVlc2RheSAxMjozMOKAkzE6MjAgICAgfCBHb256YWxvIFF1aW5vbmVzICAgfAp8IEEwNSAgICAgfCBUdWVzZGF5IDE6MzDigJMyOjIwICAgICB8IEphbWVzIExvcGV6ICAgICAgICB8CnwgQTA2ICAgICB8IFdlZG5lc2RheSAyOjMw4oCTMzoyMCAgIHwgR29uemFsbyBRdWlub25lcyAgIHwKfCBBMDcgICAgIHwgV2VkbmVzZGF5IDM6MzDigJM0OjIwICAgfCBHb256YWxvIFF1aW5vbmVzICAgfAp8IEEwOCAgICAgfCBUaHVyc2RheSA5OjMw4oCTMTA6MjAgICB8IE9saXZpYSBBZGFtc29uICAgICB8CnwgQTA5ICAgICB8IFRodXJzZGF5IDEwOjMw4oCTMTE6MjAgIHwgT2xpdmlhIEFkYW1zb24gICAgIHwKfCBBMTAgICAgIHwgRnJpZGF5IDE6MzDigJMyOjIwICAgICAgfCBHb256YWxvIFF1aW5vbmVzICAgfAoKIyBHcmFkdWF0ZSBUZWFjaGluZyBBc3Npc3RhbnRzIHsjVEFzfQoKVGhlIGNsYXNzIGhhcyB0aHJlZSBncmFkdWF0ZSB0ZWFjaGluZyBhc3Npc3RhbnRzIChUQXMpLgoKR29uemFsbyBRdWlub25lc1wKT2ZmaWNlOiAzNjQgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKFBCU0IpXApTZWN0aW9uczogQTA0LCBBMDYsIEEwNywgQTEwXApTdHVkZW50IGRyb3AtaW4gaG91cnM6IFR1ZXNkYXkgMTA6MDDigJMxMjowMCBhbmQgV2VkbmVzZGF5IDk6MDDigJMxMDowMFwKRS1tYWlsOiBnb256YWxvLXF1aW5vbmVzQHVpb3dhLmVkdQoKT2xpdmlhIEFkYW1zb25cCk9mZmljZTogMzY0IFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIEJ1aWxkaW5nIChQQlNCKVwKU2VjdGlvbnM6IEEwMSwgQTAyLCBBMDgsIEEwOVwKU3R1ZGVudCBkcm9wLWluIGhvdXJzOiBNb25kYXkgMTI6MDDigJMyOjAwIChpbi1wZXJzb24gYW5kL29yIGJ5IHpvb20pIGFuZCBUaHVyc2RheSA44oCTOWFtIChvdmVyIHpvb20pXApFLW1haWw6IG9saXZpYS1hZGFtc29uQHVpb3dhLmVkdQoKSmFtZXMgTG9wZXpcCk9mZmljZTogMzY0IFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIEJ1aWxkaW5nIChQQlNCKVwKU2VjdGlvbnM6IEEwMywgQTA1XApTdHVkZW50IGRyb3AtaW4gaG91cnM6IE1vbmRheSA5OjAw4oCTMTA6MzBcCkUtbWFpbDogamFtZXMtbG9wZXpAdWlvd2EuZWR1CgojIERlcGFydG1lbnRhbCBSZXNvdXJjZXMgeyNkZXB0UmVzb3VyY2VzfQoKRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlczogW2h0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHVdKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUpXApEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIE1haW4gT2ZmaWNlOiBHNjAgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKDMzNS0yNDA2KVwKQ29vcmRpbmF0b3Igb2YgVW5kZXJncmFkdWF0ZSBTdHVkaWVzOiBQcm9mZXNzb3IgV2luZHNjaGl0bCAoW3BhdWwtd2luZHNjaGl0bEB1aW93YS5lZHVdKG1haWx0bzpwYXVsLXdpbmRzY2hpdGxAdWlvd2EuZWR1KTsgMzM1LTM2ODEpXApBY2FkZW1pYyBDb29yZGluYXRvcjogSmFuZWlsIFBhZ2UtSmFtaXNvbiAoW2phbmVpbC1wYWdlQHVpb3dhLmVkdV0obWFpbHRvOmphbmVpbC1wYWdlQHVpb3dhLmVkdSk7IDM4NC0zNjU3KVwKRGVwYXJ0bWVudGFsIEV4ZWN1dGl2ZSBPZmZpY2VyIChERU8pL0RlcGFydG1lbnQgQ2hhaXI6IFByb2Zlc3NvciBCbHVtYmVyZyAoW21hcmstYmx1bWJlcmdAdWlvd2EuZWR1XShtYWlsdG86bWFyay1ibHVtYmVyZ0B1aW93YS5lZHUpOyAzMzUtMjQyNCkKCiMgUHJlcmVxdWlzaXRlcyB7I3ByZXJlcXN9CgpUaGUgUHN5Y2hvbG9neSBkZXBhcnRtZW50IGhhcyBhIGhpZXJhcmNoaWNhbCBjb3Vyc2Ugc3RydWN0dXJlIHRoYXQgcmVxdWlyZXMgc3R1ZGVudHMgdG8gY29tcGxldGUgY2VydGFpbiBwcmVyZXF1aXNpdGVzIGJlZm9yZSB0YWtpbmcgdXBwZXItbGV2ZWwgY2xhc3Nlcy4KVGhlIHByZXJlcXVpc2l0ZSBmb3IgdGhpcyBjb3Vyc2UgaXMgRWxlbWVudGFyeSBQc3ljaG9sb2d5IChQU1k6MTAwMSkuCgojIERlc2NyaXB0aW9uIG9mIENvdXJzZSB7I2Rlc2NyaXB0aW9ufQoKVGhpcyBjb3Vyc2UgaXMgZGVzaWduZWQgdG8gaW50cm9kdWNlIHlvdSB0byB0aGUgY29uY2VwdHMgYW5kIG1ldGhvZHMgb2YgdGhlIHNjaWVuY2Ugb2YgY2xpbmljYWwgcHN5Y2hvbG9neS4KCkl0IGhhcyB0aHJlZSBhcmVhcyBvZiBlbXBoYXNpczoKCjEuIEZ1bmRhbWVudGFscyBvZiBTY2llbnRpZmljIENsaW5pY2FsIFBzeWNob2xvZ3kKMS4gRXZpZGVuY2UtQmFzZWQgUHN5Y2hvbG9naWNhbCBBc3Nlc3NtZW50CjEuIEV2aWRlbmNlLUJhc2VkIFBzeWNob2xvZ2ljYWwgSW50ZXJ2ZW50aW9uCgpUaGlzIGNvdXJzZSB3aWxsIHByb3ZpZGUgYW4gaW50cm9kdWN0aW9uIHRvIChhKSBtYWpvciB0aGVvcmV0aWNhbCBtb2RlbHMgYW5kIHJlc2VhcmNoIG1ldGhvZHMgaW4gc2NpZW50aWZpYyBjbGluaWNhbCBwc3ljaG9sb2d5OyAoYikgc2V2ZXJhbCBwc3ljaG9sb2dpY2FsIHByb2JsZW1zIHRoYXQgYXJlIHBhcnRpY3VsYXJseSByZWxldmFudCB0byBjb2xsZWdlIHN0dWRlbnRzIChkZXByZXNzaW9uLCBhbnhpZXR5LCBhbmQgYWxjb2hvbCBhYnVzZSk7IChjKSB0aGUgZ2VuZXJhbCBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIGNvbnN0cnVjdGlvbiwgYWRtaW5pc3RyYXRpb24sIGFuZCBpbnRlcnByZXRhdGlvbiBvZiBldmlkZW5jZS1iYXNlZCBjbGluaWNhbCBhc3Nlc3NtZW50czsgYW5kIChkKSBlbXBpcmljYWxseSBzdXBwb3J0ZWQgYXBwcm9hY2hlcyB0byBwc3ljaG9sb2dpY2FsIGludGVydmVudGlvbi4KKllvdSBhcmUgdXJnZWQgdG8gcmVjb25zaWRlciB5b3VyIGRlY2lzaW9uIHRvIHRha2UgdGhpcyBjbGFzcyBpZiB5b3UgYXJlIHJlbHVjdGFudCB0byBleGFtaW5lIHRoZXNlIHRvcGljcyBpbiBhIHNjaWVudGlmaWMgbWFubmVyLioKCk5vdGU6IFNvbWUgdG9waWNzIGFuZCBtb3ZpZXMgd2lsbCBkZWFsIHdpdGggc2Vuc2l0aXZlIG9yIGNvbnRyb3ZlcnNpYWwgaXNzdWVzIHN1Y2ggYXMgYWxjb2hvbCBwcm9ibGVtcywgZGVwcmVzc2lvbiwgYW54aWV0eSwgYWJ1c2UsIHNleHVhbCBhc3NhdWx0LCBlYXRpbmcgZGlzb3JkZXJzLCBhbmQgc3VpY2lkZS4KCiMgTGVhcm5pbmcgT3V0Y29tZXMgeyNsZWFybmluZ091dGNvbWVzfQoKVGFraW5nIHRoaXMgY291cnNlIHNob3VsZCBtYWtlIHlvdSBhIG1vcmUgaW5mb3JtZWQgY29uc3VtZXIgb2YgY2xhaW1zIGFib3V0IGNvbnRlbXBvcmFyeSBjbGluaWNhbCBwc3ljaG9sb2d5IGFuZCBtYXkgYXNzaXN0IGluIHlvdXIgZXZhbHVhdGlvbiBvZiBjbGluaWNhbCBwc3ljaG9sb2d5IG9yIG90aGVyIHJlbGF0ZWQgcG90ZW50aWFsIGNhcmVlciBnb2Fscy4KVGhpcyBjb3Vyc2UgaXMgbm90IGRlc2lnbmVkIHRvIHByb3ZpZGUgZXh0ZW5zaXZlIGluZm9ybWF0aW9uIG9uIHRoZSBuYXR1cmUgb2YgcHN5Y2hvbG9naWNhbCBkaXNvcmRlcnMgKHNlZSBBYm5vcm1hbCBQc3ljaG9sb2d5IGNvdXJzZSkgb3IgdG8gcHJvdmlkZSB5b3Ugd2l0aCB0aGUgc2tpbGxzIHRvIGFzc2VzcyBhbmQgdHJlYXQgcHN5Y2hvbG9naWNhbCBwcm9ibGVtcy4KCiMgUmVxdWlyZWQgVGV4dGJvb2sgeyN0ZXh0Ym9va30KClRoZXJlIGlzbid0IGEgcmVxdWlyZWQgb3IgcmVjb21tZW5kZWQgdGV4dGJvb2suCkluc3RlYWQsIHRoaXMgY291cnNlIHdpbGwgaW5jbHVkZSBhIGNvbWJpbmF0aW9uIG9mIGJvb2sgY2hhcHRlcnMsIHBlZXItcmV2aWV3ZWQgam91cm5hbCBhcnRpY2xlcywgYW5kIHBvcHVsYXIgbWVkaWEgYXJ0aWNsZXMuClRoZSBzb3VyY2UgZm9yIGFsbCBleGFtIHF1ZXN0aW9ucyB3aWxsIGJlIGxlY3R1cmUsIGRpc2N1c3Npb24sIGFuZCBhbGwgcmVxdWlyZWQgcmVhZGluZ3MgZm9yIGxlY3R1cmVzIGFuZCBzZWN0aW9uLCB3aGljaCB3aWxsIGJlIHByb3ZpZGVkIG9uIHRoZSBjb3Vyc2Ugd2Vic2l0ZSBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuClRoZSBjb3N0IG9mIHRleHRib29rcyBoYXMgYmVjb21lIHNvIGhpZ2ggdGhhdCBJIGFtIG5vdCBjb21mb3J0YWJsZSByZXF1aXJpbmcgb25lIGZvciB0aGlzIGNvdXJzZSB3aGVuIEkgY2FuIGNvdmVyIHRoZSBtYXRlcmlhbCBhZGVxdWF0ZWx5IGluIG90aGVyIHdheXMuClRoZXJlIGFsc28gaXMgbm8gdGV4dGJvb2sgYXZhaWxhYmxlIHRoYXQgY292ZXJzIHRoZSBtYXRlcmlhbCBhcyB3ZSBkbyBpbiBjbGFzcy4KQXR0ZW5kYW5jZSBhdCBsZWN0dXJlcyB3aWxsIGJlIGNyaXRpY2FsIGFzIGEgcmVzdWx0LCBob3dldmVyLgpJZiB5b3UgbWlzcyBhIGxlY3R1cmUgb3Igc2VjdGlvbiwgeW91IHdpbGwgbmVlZCB0byB3YXRjaCB0aGUgbGVjdHVyZSByZWNvcmRpbmcgb3IgZ2V0IG5vdGVzIGZyb20gYSBwZWVyLCBiZWNhdXNlIHdlIGRvIG5vdCBwcm92aWRlIG5vdGVzIG9yIHJlLXByZXNlbnQgbWlzc2VkIGxlY3R1cmUgb3Igc2VjdGlvbiBtYXRlcmlhbCBpbiBtZWV0aW5ncy4KT25jZSB5b3UgaGF2ZSB0aGUgbm90ZXMgZnJvbSBhIHBlZXIsIHJldmlldyB0aGVtIGNhcmVmdWxseSBvbiB5b3VyIG93biwgdGhlbiBnZXQgaW50byBvZmZpY2UgaG91cnMgd2l0aCBtZSBvciBvbmUgb2YgdGhlIFRBcyB0byBhZGRyZXNzIGFueSBzcGVjaWZpYyBxdWVzdGlvbnMgdGhhdCB5b3UgaGF2ZSBhcyBzb29uIGFzIHBvc3NpYmxlLgpGZWVsIGZyZWUgdG8gY29tZSB0byBvZmZpY2UgaG91cnMgd2l0aCBtZSBvciB3aXRoIG9uZSBvZiB0aGUgVEFzIHRvIGRpc2N1c3MgaG93IGJlc3QgdG8gc3R1ZHkgZm9yIGEgY291cnNlIHdpdGhvdXQgYSB0ZXh0Ym9vay4KCiMgQWNhZGVtaWMgSG9uZXN0eSBhbmQgTWlzY29uZHVjdCB7I2FjYWRlbWljSG9uZXN0eX0KCkFsbCBzdHVkZW50cyBpbiBDTEFTIGNvdXJzZXMgYXJlIGV4cGVjdGVkIHRvIGFiaWRlIGJ5IHRoZSBbY29sbGVnZSdzIHN0YW5kYXJkcyBvZiBhY2FkZW1pYyBob25lc3R5XShodHRwczovL2NsYXMudWlvd2EuZWR1L3N0dWRlbnRzL2hhbmRib29rL2FjYWRlbWljLWZyYXVkLWhvbm9yLWNvZGUpLgpBY2FkZW1pYyBtaXNjb25kdWN0IG11c3QgYmUgcmVwb3J0ZWQgYnkgaW5zdHJ1Y3RvcnMgdG8gQ0xBUyBhY2NvcmRpbmcgdG8gW3RoZXNlIHByb2NlZHVyZXNdKGh0dHBzOi8vcG9saWN5LmNsYXMudWlvd2EuZWR1L2NsYXMtcG9saWNpZXMtYW5kLXByb2NlZHVyZXMvdW5kZXJncmFkdWF0ZS1lZHVjYXRpb24vYWNhZGVtaWMtbWlzY29uZHVjdC11bmRlcmdyYWR1YXRlKS4KUGxlYXNlIG5vdGUgdGhhdCBjb2xsYWJvcmF0aW9uIHdpdGggb3RoZXIgY2xhc3NtYXRlcyBvbiBxdWl6emVzIGFuZCBkdXJpbmcgZXhhbXMgaXMgbm90IHBlcm1pdHRlZC4KSG93ZXZlciwgSSBkbyBlbmNvdXJhZ2UgeW91IHRvIGNvbGxhYm9yYXRlIHdpdGggY2xhc3NtYXRlcyB0byAqcHJlcGFyZSogZm9yIGV4YW1zIChlLmcuLCBpbmZvcm1hbCBzdHVkeSBncm91cHMpLgpJbiBhZGRpdGlvbiwgeW91IGFyZSBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGNvdXJzZSdzIHBvbGljeSBvbiB0aGUgdXNlIG9mIGFydGlmaWNpYWwgaW50ZWxsaWdlbmNlIChBSSksIHdoaWNoIGlzIG91dGxpbmVkIGJlbG93LgoKIyBBcnRpZmljaWFsIEludGVsbGlnZW5jZSAoQUkpIFBvbGljeSB7I2FpfQoKQmVjYXVzZSB3cml0aW5nLCBhbmFseXRpY2FsLCBhbmQgY3JpdGljYWwgdGhpbmtpbmcgc2tpbGxzIGFyZSBwYXJ0IG9mIHRoZSBsZWFybmluZyBvdXRjb21lcyBvZiB0aGlzIGNvdXJzZSwgYWxsIHdvcmsgc3VibWl0dGVkIGJ5IHN0dWRlbnRzIHNob3VsZCBiZSBwcmVwYXJlZCBieSB0aGUgc3R1ZGVudC4KWW91IGFyZSB0cmFpbmluZyB0aGVzZSBjb2duaXRpdmUgbXVzY2xlczsgaWYgeW91IGdvIHRvIHRoZSBneW0sIHlvdSB3b3VsZCBub3QgaGF2ZSBBSSBsaWZ0IHRoZSB3ZWlnaHRzIGZvciB5b3UuCkZvciB0aGVzZSByZWFzb25zLCBBSS1nZW5lcmF0ZWQgc3VibWlzc2lvbnMgYXJlIG5vdCBwZXJtaXR0ZWQgYW5kIHdpbGwgYmUgdHJlYXRlZCBhcyBwbGFnaWFyaXNtLgpMZWFybmluZyB0aGVzZSBjb3JlIGZvdW5kYXRpb25hbCBza2lsbHMgd2lsbCBtYWtlIHlvdSBhIGJldHRlciB1c2VyIG9mIEFJIGluIHRoZSBmdXR1cmUsIGJlY2F1c2UgeW91IHdpbGwgYmUgYmV0dGVyLXBvc2l0aW9uZWQgaW4gdGhlIGZ1dHVyZSB0byBjcml0aWNhbGx5IGV2YWx1YXRlIEFJIHJlc3BvbnNlcyBhbmQgdG8gaWRlbnRpZnkgd2hlbiAoYW5kIHRoZSB3YXlzIGluIHdoaWNoKSBpdHMgcmVzcG9uc2VzIGFyZSBpbmFjY3VyYXRlLgpNb3Jlb3ZlciwgaW4gbWFueSBpbmR1c3RyaWVzLCB1c2Ugb2YgQUkgaXMgbm90IHBlcm1pdHRlZCBiZWNhdXNlIHlvdSBjYW5ub3Qgc2hhcmUgdGhlIGNvbXBhbnkncyBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbi4KVGh1cywgZGV2ZWxvcGluZyBzdHJvbmcgY29tcGV0ZW5jaWVzIGluIHRoZXNlIGRvbWFpbnMgKHdpdGhvdXQgdGhlIHVzZSBvZiBBSSkgd2lsbCBwcmVwYXJlIHlvdSBmb3IgYSBjb21wZXRpdGl2ZSB3b3JrcGxhY2UuCgojIENvdXJzZSBSZXF1aXJlbWVudHMgYW5kIFBvbGljaWVzIHsjcmVxdWlyZW1lbnRzfQoKIyMgTGVjdHVyZSB7I2xlY3R1cmV9CgpXZSB3aWxsIG1lZXQgdHdpY2Ugd2Vla2x5IGZvciBsZWN0dXJlcywgYXQgdGhlIHRpbWUgYW5kIGxvY2F0aW9uIGRlc2NyaWJlZCBbYWJvdmVdKCNsZWN0dXJlVGltZSkuCk15IHBvd2VycG9pbnQgcHJlc2VudGF0aW9ucyBmb3IgZWFjaCBsZWN0dXJlIHdpbGwgYmUgcG9zdGVkIG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBubyBsYXRlciB0aGFuIG5vb24gdGhlIGRheSBiZWZvcmUgYSBsZWN0dXJlICh0aG91Z2ggSSBtYXkgY29udGludWUgdG8gcmVmaW5lIHRoZSBzbGlkZXMgdXAgdW50aWwgdGhlIHRpbWUgb2YgbGVjdHVyZSkuCjx1PlBsZWFzZSBub3RlOjwvdT4gcG93ZXJwb2ludCBwcmVzZW50YXRpb25zIGFyZSBhbiBvdXRsaW5lIG9mIG15IHBvaW50cy4gCjx1Pkl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gdGFrZSBub3RlcyBkdXJpbmcgY2xhc3MuPC91PgpJIHN0cm9uZ2x5IHJlY29tbWVuZCBicmluZ2luZyB0aGUgcG93ZXJwb2ludCBwcmVzZW50YXRpb25zIHRvIGNsYXNzIHRvIHRha2Ugbm90ZXMuCgpZb3Ugc2hvdWxkIGZlZWwgZnJlZSB0byBhc2sgcXVlc3Rpb25zIGR1cmluZyBsZWN0dXJlLCBhbHRob3VnaCBzb21lIHF1ZXN0aW9ucyBtYXkgbmVlZCB0byBiZSBkZWZlcnJlZCBnaXZlbiB0aGUgc2l6ZSBvZiB0aGUgY2xhc3MgYW5kIHRoZSBuZWVkIHRvIGNvbXBsZXRlIGNvdmVyYWdlIG9mIHNwZWNpZmljIG1hdGVyaWFsIGR1cmluZyBsZWN0dXJlLgo8dT5RdWVzdGlvbnMgYW5kIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvZiBjbGFzcyBtYXRlcmlhbCBhcmUgYWx3YXlzIHdlbGNvbWU8L3U+IGR1cmluZyBvZmZpY2UgaG91cnMsIGR1cmluZyBkaXNjdXNzaW9uIHNlY3Rpb24sIGFuZCB2aWEgZS1tYWlsLgpQbGVhc2UgYmVhciBpbiBtaW5kIHRoYXQgZXh0ZW5zaXZlIG9yIGNvbXBsZXggcXVlc3Rpb25zIG1heSBub3QgYmUgYWRkcmVzc2FibGUgb3ZlciBlLW1haWwuCgojIyMgTGVjdHVyZSBSZWNvcmRpbmdzIHsjcmVjb3JkaW5nc30KCk15IGludGVudGlvbiBpcyB0byByZWNvcmQgbGVjdHVyZXMgc28gdGhhdCB5b3UgbWF5IHJldmlldyB0aGVtLgpSZWNvcmRlZCBsZWN0dXJlcyB3aWxsIGJlIHBvc3RlZCBvbiB0aGUgIlVJQ2FwdHVyZSIgdGFiIGluIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KS4KUmVjb3JkaW5ncyB3aWxsIGJlIGF2YWlsYWJsZSB1cCB0byA0OCBob3VycyBhZnRlciBjbGFzcyAoZm9yIFdlZG5lc2RheSBsZWN0dXJlcykgb3IgdW50aWwgdGhlIFdlZG5lc2RheSBjbGFzcyBwZXJpb2QgKGZvciBNb25kYXkgbGVjdHVyZXMpLgpIb3dldmVyLCA8dT5wbGVhc2UgZG8gbm90IGNvdW50IG9uIHJlY29yZGluZ3MgYmVpbmcgYXZhaWxhYmxlPC91PiwgaW4gY2FzZSBJIGFjY2lkZW50YWxseSBmb3JnZXQgdG8gaW5pdGlhdGUgdGhlIHJlY29yZGluZyBvciB0aGVyZSBpcyBhIHRlY2huaWNhbCBtYWxmdW5jdGlvbi4KVGhlIGF2YWlsYWJpbGl0eSBvZiBsZWN0dXJlIHJlY29yZGluZ3Mgd2lsbCBub3QgYmUgZXh0ZW5kZWQgYmV5b25kIDQ4IGhvdXJzIGFmdGVyIGxlY3R1cmXigJR0aGUgcmVjb3JkaW5ncyBhcmUgbWVhbnQgdG8gaGVscCBwZW9wbGUga2VlcCB1cCB3aXRoIGxlY3R1cmVzIGFuZCBmb3Igc3R1ZGVudHMgdG8gcmV0cmlldmUgdGhlIHJlbGV2YW50IGNvbnRlbnQgaWYgdGhleSBtaXNzZWQgYW55dGhpbmcgZHVyaW5nIHRoZSBsaXZlIGxlY3R1cmUgb3IgaWYgdGhleSBtaXNzIHRoZSBsZWN0dXJlOyB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgYSBzdHVkeSBtZXRob2QgdGhhdCBhbGxvd3MgcGVvcGxlIHRvIGZhbGwgYmVoaW5kIGluIGNsYXNzIGZyb20gd2VlayB0byB3ZWVrLgpJZiB5b3UgbWlzcyBzb21ldGhpbmcgYW5kIGFyZSB1bmFibGUgdG8gd2F0Y2ggdGhlIGxlY3R1cmUgcmVjb3JkaW5nLCB5b3UgY2FuIGdldC9yZXZpZXcgbm90ZXMgd2l0aCBhIHBlZXIsIGFuZCB0aGVuIGNvbWUgdG8gb2ZmaWNlIGhvdXJzIGlmIHlvdSBoYXZlIHNwZWNpZmljIHF1ZXN0aW9ucy4KCiMjIERpc2N1c3Npb24gU2VjdGlvbiB7I2Rpc2N1c3Npb25TZWN0aW9ufQoKSW4gYWRkaXRpb24gdG8gbGVjdHVyZSwgeW91IGFsc28gaGF2ZSBhIHdlZWtseSBkaXNjdXNzaW9uIHNlY3Rpb24sIGV4Y2VwdCBkdXJpbmcgZXhhbSB3ZWVrcy4KVGhlIGRheSBhbmQgdGltZSBvZiB0aGUgd2Vla2x5IGRpc2N1c3Npb24gc2VjdGlvbiBkaWZmZXJzIGJhc2VkIG9uIHRoZSBzZWN0aW9uLCBzZWUgW2Fib3ZlXSgjc2VjdGlvbnMpLgoKIyMgQXR0ZW5kYW5jZSBhbmQgUGFydGljaXBhdGlvbiB7I2F0dGVuZGFuY2VQYXJ0aWNpcGF0aW9ufQoKRGlzY3Vzc2lvbiBzZWN0aW9uIGF0dGVuZGFuY2UgYW5kIHBhcnRpY2lwYXRpb24gYXJlIG1hbmRhdG9yeSBhbmQgd2lsbCBiZSB3b3J0aCA4JSBvZiB5b3VyIGZpbmFsIGdyYWRlLgpZb3UgbXVzdCBhdHRlbmQgc2VjdGlvbiwgcGF5IGF0dGVudGlvbiwgcGFydGljaXBhdGUgdmVyYmFsbHksIDx1PmFuZDwvdT4gY29tcGxldGUgdGhlIHJlcXVpcmVkIGFjdGl2aXRpZXMgZHVyaW5nIHNlY3Rpb24gdG8gcmVjZWl2ZSBhbnkgYXR0ZW5kYW5jZSBhbmQgcGFydGljaXBhdGlvbiBwb2ludHMsIGFzIGluZGljYXRlZCBieSB5b3VyIDx1PnN1Ym1pc3Npb24gb2YgdGhlIHJlcXVpcmVkIHdyaXR0ZW4gcmVzcG9uc2VzIGR1cmluZyBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gc2Vzc2lvbjwvdT4uClRoZXJlIHdpbGwgYmUgMTMgZGlzY3Vzc2lvbnMgZHVyaW5nIHRoZSBzZW1lc3RlciwgYW5kIHlvdSB3aWxsIHJlY2VpdmUgb25lIHBvaW50IGZvciBzdWJtaXR0aW5nIGFuIGFwcHJvcHJpYXRlIHdyaXR0ZW4gcmVzcG9uc2UgYXQgdGhlIGVuZCBvZiBlYWNoIHNlY3Rpb24sIHVwIHRvIGEgPHU+bWF4aW11bTwvdT4gb2YgMTEgcG9pbnRzIChpLmUuLCB5b3Ugd2lsbCBub3QgcmVjZWl2ZSBleHRyYSBjcmVkaXQgZm9yIHN1Ym1pdHRpbmcgYXBwcm9wcmlhdGUgcmVzcG9uc2VzIGZvciBhbGwgMTMgZGlzY3Vzc2lvbnMpLgpUaHVzLCB5b3Ugd2lsbCBub3QgYmUgcGVuYWxpemVkIGZvciBtaXNzaW5nIHR3byBzZWN0aW9ucywgYWx0aG91Z2ggeW91IHN0aWxsIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHRoZSBjb3ZlcmVkIG1hdGVyaWFsIG9uIGV4YW1zLCBldGMuLCBhbmQgSSB1cmdlIHlvdSBzdHJvbmdseSB0byBhdHRlbmQgYWxsIHNlY3Rpb25zLgpUaGlzIHN0cmF0ZWd5IGlzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgbXkgbWFuYWdlbWVudCBvZiB0aGUgZXhjdXNlcyBhc3NvY2lhdGVkIHdpdGggYW4gb2NjYXNpb25hbCBtaXNzZWQgc2VjdGlvbiAoaS5lLiwgbm8gbW9yZSB0aGFuIHR3byBkdXJpbmcgdGhlIHNlbWVzdGVyKS4KSW4gb3RoZXIgd29yZHMsIG1ha2Ugc3VyZSB5b3UgYXR0ZW5kIGFuZCBwYXJ0aWNpcGF0ZSBpbiBhdCBsZWFzdCAxMSBvZiB5b3VyIGRpc2N1c3Npb24gc2VjdGlvbnMgdGhpcyBzZW1lc3RlciEhCgpJZiB5b3UgaGF2ZSB0byBhIHNlY3Rpb24gZm9yIGFuIGV4Y3VzYWJsZSByZWFzb24gKGUuZy4sIHlvdSBhcmUgc2ljayksIGxldCB5b3VyIFRBIGtub3cgYXMgc29vbiBhcyBwb3NzaWJsZSB0aGF0IHlvdSB3aWxsIGhhdmUgdG8gbWlzcyBjbGFzc+KAlHByZWZlcmFibHkgYmVmb3JlIGNsYXNzLCBhbmQgbm8gbGF0ZXIgdGhhbiA0OCBob3VycyBhZnRlciBjbGFzcy4KSXQgaXMgdXAgdG8gb3VyIGRpc2NyZXRpb24gd2hhdCBpcyBjb25zaWRlcmVkIGFuIGV4Y3VzZWQgYWJzZW5jZS4KSWYgaXQgaXMgYW4gZXhjdXNlZCBhYnNlbmNlLCBhIFRBIHdpbGwgc2VuZCB5b3Ugbm90ZXMgZnJvbSB0aGUgc2VjdGlvbiB5b3UgbWlzc2VkLCBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBzdWJtaXQgdGhlIGluLWNsYXNzIHdyaXRpbmcgYXNzaWdubWVudCBieSBlbWFpbGluZyBpdCB0byB5b3VyIFRB4oCUPHU+eW91IHdpbGwgc3RpbGwgbmVlZCB0byBzdWJtaXQgdGhlIHdyaXRpbmcgYXNzaWdubWVudCB3aXRoaW4gb25lIHdlZWsgb2YgdGhlIG1pc3NlZCBkaXNjdXNzaW9uIHNlY3Rpb24gdG8gZ2V0IGF0dGVuZGVuY2UgY3JlZGl0IGZvciB0aGF0IHNlY3Rpb248L3U+LgpJZiB5b3UgbWlzcyBhIHNlY3Rpb24sIHlvdSBjYW4gYXR0ZW5kIGEgZGlmZmVyZW50IHNlY3Rpb24gZHVyaW5nIHRoZSBzYW1lIHdlZWsgPHU+b25seSB3aXRoIHRoZSBwZXJtaXNzaW9uIG9mIHRoZSBpbnN0cnVjdG9yIG9mIHRoZSBkaWZmZXJlbnQgc2VjdGlvbjwvdT4sIDx1PmJ1dCB5b3Ugd2lsbCBub3QgcmVjZWl2ZSBhdHRlbmRhbmNlIGFuZCBwYXJ0aWNpcGF0aW9uIHBvaW50cyBmb3IgZG9pbmcgc288L3U+ICh1bmxlc3MgdGhlIGFic2VuY2UgaXMgZXhjdXNlZCBieSB0aGUgaW5zdHJ1Y3RvcikuCgpMZWN0dXJlIGF0dGVuZGFuY2UgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IGlzIHN0cm9uZ2x5IGVuY291cmFnZWQ7IG1vc3QgbWF0ZXJpYWwgcHJlc2VudGVkIGluIGxlY3R1cmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZWFkaW5ncywgYW5kIGxlY3R1cmUgcmVjb3JkaW5ncyBtYXkgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuCjx1PllvdSBhcmUgcmVzcG9uc2libGUgZm9yIGFuZCB3aWxsIGJlIHRlc3RlZCBvbiBhbGwgbWF0ZXJpYWwgcHJlc2VudGVkIGluIGxlY3R1cmVzLCBkaXNjdXNzaW9uIHNlY3Rpb25zLCBhbmQgaW4gdGhlIHJlcXVpcmVkIHJlYWRpbmdzPC91Pi4KUmVndWxhciBhdHRlbmRhbmNlIGFuZCBnb29kIGF0dGVudGlvbiB0byBsZWN0dXJlcyB3aWxsIGltcHJvdmUgd2hhdCB5b3UgZ2V0IG91dCBvZiB0aGlzIGNsYXNzIGFuZCBpcyBsaWtlbHkgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlIG9uIHRoZSBleGFtcy4KCiMjIFJlYWRpbmdzICYgUXVpenplcyB7I3JlYWRpbmdRdWl6emVzfQoKUmVhZGluZ3MgYW5kIG90aGVyIG1hdGVyaWFscyB3aWxsIGJlIHBvc3RlZCBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCllvdSBhcmUgZXhwZWN0ZWQgdG8gZG8gdGhlIHJlYWRpbmdzIGJlZm9yZSBkaXNjdXNzaW9uIHNlY3Rpb24uCllvdSB3aWxsIGhhdmUgYW4gb25saW5lIHF1aXogb24gdGhlIHJlYWRpbmdzIHRvIGNvbXBsZXRlIGluIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSwgb24geW91ciBvd24sIDx1PmJlZm9yZTwvdT4gZWFjaCBkaXNjdXNzaW9uIHNlY3Rpb24uClRoZSBxdWl6emVzIGFyZSBtZWFudCB0byBoZWxwIHlvdSBjb21lIHRvIGNsYXNzIHByZXBhcmVkIHRvIGNvbnRyaWJ1dGUgc28geW91IGFyZSBiZXN0LXBvc2l0aW9uZWQgdG8gbGVhcm4gYW5kIHRvIGhlbHAgb3RoZXJzIGxlYXJuLgpUaGUgcXVpenplcyBhcmUgbm90IHRpbWVkICh5b3UgY2FuIHNwZW5kIGFzIG11Y2ggdGltZSBhcyB5b3UgbmVlZCBvbiBlYWNoIHF1aXogdXAgdW50aWwgdGhlIGRlYWRsaW5lKS4KVGhlIGRlYWRsaW5lIGZvciBlYWNoIHF1aXogaXMgMzAgbWludXRlcyBiZWZvcmUgeW91ciBzY2hlZHVsZWQgZGlzY3Vzc2lvbiBzZWN0aW9uIHN0YXJ0cy4KV2Ugd2lsbCBub3QgYWNjZXB0IGxhdGUgcmVzcG9uc2VzIG9yIG11bHRpcGxlIHN1Ym1pc3Npb25zLgpZb3VyIGxvd2VzdCBxdWl6IHNjb3JlIHdpbGwgYmUgZHJvcHBlZC4KV2Ugd2lsbCBub3QgYWNjZXB0IGV4Y3VzZWQgYWJzZW5jZXMgZm9yIHF1aXp6ZXMgYmVjYXVzZSAoYSkgeW91IGhhdmUgYSB3ZWVrIHRvIGNvbXBsZXRlIHRoZSBxdWl6IChhbmQgY2FuIHN1Ym1pdCBpdCBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoYXQgd2VlayksIGFuZCAoYikgd2UgZHJvcCB5b3VyIGxvd2VzdCBxdWl6IHNjb3JlLgpFYWNoIHF1aXogd2lsbCBiZSB3ZWlnaHRlZCB0aGUgc2FtZSBpbiB0aGUgZmluYWwgZ3JhZGUuClF1aXogYW5zd2VycyB3aWxsIGJlIHZpZXdhYmxlIGF0IHRoZSBlbmQgb2YgdGhlIHdlZWsgKGkuZS4sIGFmdGVyIHRoZSBsYXN0IGRpc2N1c3Npb24gc2VjdGlvbiBoYXMgdGFrZW4gdGhlaXIgcXVpeikuCgpQYXN0IGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgaW4gb3JkZXIgdG8gZG8gd2VsbCBpbiB0aGlzIGNsYXNzLCB5b3Ugc2hvdWxkIHJlYWQgdGhlIHJlcXVpcmVkIG1hdGVyaWFsLCBwYXJ0aWNpcGF0ZSBhY3RpdmVseSBpbiBjbGFzcywgYW5kIGdvIG92ZXIgeW91ciBub3RlcyA8dT5lYWNoIHdlZWs8L3U+LgpUaGVyZSBpcyB0b28gbXVjaCBtYXRlcmlhbCBiZWluZyBjb3ZlcmVkIGluIHRoaXMgY2xhc3MgdG8gdHJ5IHRvIHN0dWR5IG9ubHkgYnkgZnJhbnRpYyBwcmVwYXJhdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgZXhhbXMuCk5vdGUgdGhhdCBsZWN0dXJlIGFuZCBzZWN0aW9uIHdpbGwgPHU+bm90PC91PiBjb3ZlciBhbGwgcmVsZXZhbnQgbWF0ZXJpYWwgZm9yIHRoZSBjb3Vyc2U7IHlvdSB3aWxsIGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlIDx1PnJlcXVpcmVkPC91PiByZWFkaW5ncyBmb3IgZXhhbXMuCgojIyBXb3JrbG9hZCB7I3dvcmtsb2FkfQoKVGhpcyBpcyBhIDMgc2VtZXN0ZXIgaG91ciBjb3Vyc2UuClN0dWRlbnRzIHNob3VsZCB0aGVyZWZvcmUgZXhwZWN0IHRvIHNwZW5kIFs2IGFkZGl0aW9uYWwgaG91cnMgcGVyIHdlZWtdKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LXdvcmtsb2FkLWd1aWRlbGluZXMpIChvdXRzaWRlIG9mIGNsYXNzKSByZWFkaW5nIHRoZSBhcnRpY2xlcywgcmV2aWV3aW5nIG1hdGVyaWFsIGZyb20gbGVjdHVyZSBhbmQgZGlzY3Vzc2lvbiBzZWN0aW9uLCBhbmQgcHJlcGFyaW5nIGZvciBxdWl6emVzIGFuZCBleGFtcy4KCiMjIEV4YW1pbmF0aW9ucyB7I2V4YW1zfQoKVGhlcmUgd2lsbCBiZSAzIGV4YW1zLgpFeGFtcyAxIGFuZCAyIHdpbGwgYmUgYWRtaW5pc3RlcmVkIGR1cmluZyBjbGFzcyB0aW1lLgpUaGUgZGF0ZSwgdGltZSwgYW5kIGxvY2F0aW9uIG9mIHRoZSBmaW5hbCBleGFtIHdpbGwgYmUgYW5ub3VuY2VkIGJ5IHRoZSA1dGggd2VlayBvZiBjbGFzcyBieSB0aGUgQ29sbGVnZSBvZiBMaWJlcmFsIEFydHMgYW5kIFNjaWVuY2VzOyB0aGUgZHVyYXRpb24gb2YgdGhlIGZpbmFsIGV4YW0gd2lsbCBiZSAxMjAgbWludXRlcy4KVGhlIGV4YW1zIHdpbGwgaW5jbHVkZSBtdWx0aXBsZS1jaG9pY2UgcXVlc3Rpb25zLgpFYWNoIGV4YW0gd2lsbCBlbXBoYXNpemUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGZvciB0aGUgdGhpcmQgb2YgdGhlIGNsYXNzIHRoYXQgcHJlY2VkZXMgaXQuCkhvd2V2ZXIsIHNvbWUgaW50ZWdyYXRpb24gb2YgaW5mb3JtYXRpb24gYWNyb3NzIHNlY3Rpb25zIHdpbGwgYmUgcmVxdWlyZWQgZm9yIHF1ZXN0aW9ucyBvbiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBleGFtcy4KRXhhbSBxdWVzdGlvbnMgY2FuIGNvbWUgZnJvbSA8dT5hbnkgb2YgdGhlIGZvbGxvd2luZyBzb3VyY2VzOiBsZWN0dXJlcywgc2VjdGlvbnMsIG9yIHJlcXVpcmVkIHJlYWRpbmdzPC91Pi4KRm9yIHN1Z2dlc3RlZCBzdHVkeSB0aXBzIGZvciB0aGlzIGNsYXNzLCBzZWUgW2hlcmVdKGhvd1RvU3R1ZHkuaHRtbCkuCgojIyMgTWlzc2luZyBFeGFtcyB7I21pc3NpbmdFeGFtc30KCltVbml2ZXJzaXR5IHJlZ3VsYXRpb25zIHJlcXVpcmUgdGhhdCBzdHVkZW50cyBiZSBhbGxvd2VkIHRvIG1ha2UgdXAgZXhhbWluYXRpb25zXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvc3R1ZGVudHMvYWJzZW5jZXMtY2xhc3MpIHRoYXQgaGF2ZSBiZWVuIG1pc3NlZCBkdWUgdG8gaWxsbmVzcywgcmVsaWdpb3VzIGhvbHkgZGF5cywgbWlsaXRhcnkgc2VydmljZSBvYmxpZ2F0aW9ucyAoaW5jbHVkaW5nIHNlcnZpY2UtcmVsYXRlZCBtZWRpY2FsIGFwcG9pbnRtZW50cyksIG9yIG90aGVyIHVuYXZvaWRhYmxlIGNpcmN1bXN0YW5jZXMgb3IgVW5pdmVyc2l0eS1zcG9uc29yZWQgYWN0aXZpdGllcy4KU3R1ZGVudHMgd2l0aCBVSS1hdXRob3JpemVkIGFjdGl2aXRpZXMgbXVzdCBkaXNjdXNzIHRoZWlyIGFic2VuY2VzIHdpdGggdGhlIGluc3RydWN0b3IgYXMgc29vbiBhcyBwb3NzaWJsZS4KUmVsaWdpb3VzIG9ibGlnYXRpb25zIG11c3QgYmUgY29tbXVuaWNhdGVkIHdpdGhpbiB0aGUgZmlyc3QgdGhyZWUgd2Vla3Mgb2YgY2xhc3Nlcy4KU2VlIGJlbG93IGZvciB0aGUgZG9jdW1lbnRhdGlvbiBuZWNlc3NhcnkgZm9yIGFuIGFic2VuY2UgdG8gYmUgZXhjdXNlZCBhbmQgdG8gYmUgZWxpZ2libGUgdG8gdGFrZSBhIG1ha2UtdXAgZXhhbS4KClN0dWRlbnRzIGFyZSBhbGxvd2VkIHRvIG1ha2UgdXAgZXhhbXMgdGhhdCBoYXZlIGJlZW4gbWlzc2VkIGR1ZSB0byBpbGxuZXNzLCBtYW5kYXRvcnkgcmVsaWdpb3VzIG9ic2VydmF0aW9ucywgb2ZmaWNpYWwgVW5pdmVyc2l0eSBhY3Rpdml0aWVzLCBvciBvdGhlciB1bmF2b2lkYWJsZSBjaXJjdW1zdGFuY2VzLgpOb3RlOiB0aGUgZm9ybWF0IG9mIHRoZSBtYWtlLXVwIGV4YW0gbWF5IGRpZmZlciBmcm9tIHRoZSBvcmlnaW5hbCBleGFtLgpJZiB5b3Uga25vdyB0aGF0IHlvdSBtdXN0IGJlIGF3YXkgYXQgdGhlIHRpbWUgb2YgYW4gZXhhbSBmb3Igb25lIG9mIHRoZXNlIHJlYXNvbnMsIFByb2Zlc3NvciBQZXRlcnNlbiBvciB0aGUgVEEgbXVzdCBiZSBjb250YWN0ZWQgaW4gYWR2YW5jZSB3aGVuZXZlciBwb3NzaWJsZSB0byBzY2hlZHVsZSBhIG1ha2UtdXAgZXhhbS4KSW4gb3JkZXIgdG8gdGFrZSBhIG1ha2UtdXAgZXhhbSwgeW91IG11c3QgcHJvdmlkZSBhY2NlcHRhYmxlIGRvY3VtZW50YXRpb24gdG8gYmUgZWxpZ2libGUgdG8gdGFrZSBpdDogaW5jbHVkaW5nIGRvY3VtZW50YXRpb24gZm9yIGFueSByZXBvcnQgb2YgaWxsbmVzczsgYW55IG90aGVyIGNpcmN1bXN0YW5jZXMgbXVzdCBiZSBkb2N1bWVudGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIElvd2EgW0Fic2VuY2UgRXhwbGFuYXRpb24gRm9ybV0oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zaXRlcy9jbGFzLnVpb3dhLmVkdS9maWxlcy8yMDI0LTA1L0FCU0VOQ0UlMjBFWFBMQU5BVElPTiUyMEZPUk0ucGRmKSAobG9jYXRlZCBpbiBJQ09OIHVuZGVyICJTdHVkZW50IFRvb2xzIikgYW5kIG11c3QgYmUgYXBwcm92ZWQgYnkgUHJvZmVzc29yIFBldGVyc2VuLgo8dT5JbiBzdW0sIHRvIGJlIGVsaWdpYmxlIGZvciBhIG1ha2UtdXAgZXhhbSwgUHJvZmVzc29yIFBldGVyc2VuIG9yIHRoZSBUQSBtdXN0IGJlIGNvbnRhY3RlZCBiZWZvcmUgdGhlIGV4YW1pbmF0aW9uIHdoZW5ldmVyIHBvc3NpYmxlLCBhbmQgeW91IG11c3Qgc2VuZCBhY2NlcHRhYmxlIGZvcm0gb2YgZG9jdW1lbnRhdGlvbiB0byBQcm9mZXNzb3IgUGV0ZXJzZW4gb3IgdGhlIFRBPC91Pi4KCiMgR3JhZGluZyBTeXN0ZW0gYW5kIHRoZSBVc2Ugb2YgKy8tIHsjZ3JhZGluZ1N5c3RlbX0KCkZpbmFsIGdyYWRlcyB3aWxsIGJlIGFzc2lnbmVkIGF0IHRoZSBlbmQgb2Ygc2VtZXN0ZXIgb24gdGhlIGJhc2lzIG9mIHlvdXIgdG90YWwgcGVyY2VudGFnZSBvZiBwb2ludHMgZWFybmVkIG9uIGV4YW1zLCBxdWl6emVzLCBhbmQgc2VjdGlvbiBwYXJ0aWNpcGF0aW9uLCBhcyBkZXRhaWxlZCBiZWxvdy4KR3JhZGVzIHdpbGwgYmUgYXNzaWduZWQgb24gYW4gYWJzb2x1dGUgc2NhbGUgKGNyaXRlcmlvbi1yZWZlcmVuY2VkIGdyYWRpbmcpOyBjb3Vyc2UgZ3JhZGVzIHdpbGwgbm90IGJlIGN1cnZlZC4KTm8gZXh0cmEtY3JlZGl0IG9wcG9ydHVuaXRpZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjb3Vyc2UuClBsZWFzZSBub3RlOiBBcyBhIG1hdHRlciBvZiBmYWlybmVzcyB0byBhbGwgc3R1ZGVudHMsIEkgYXNzaWduIGdyYWRlcyBiYXNlZCBvbiBwZXJmb3JtYW5jZSBhbmQgZG8gbm90IG5lZ290aWF0ZSBncmFkZXMuCkZpbmFsIGdyYWRlcyB3aWxsIGJlIGFzc2lnbmVkIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgcmFuZ2VzOgoKfCBHcmFkZSB8IFBlcmNlbnQgfAp8Oi0tLS0tLXw6LS0tLS0tLS18CnwgQSsgICAgfCA5N+KAkzEwMCUgfCAKfCBBICAgICB8IDkz4oCTOTYgICB8CnwgQeKIkiAgICB8IDkw4oCTOTIgICB8CnwgQisgICAgfCA4N+KAkzg5ICAgfAp8IEIgICAgIHwgODPigJM4NiAgIHwKfCBC4oiSICAgIHwgODDigJM4MiAgIHwKfCBDKyAgICB8IDc14oCTNzkgICB8CnwgQyAgICAgfCA3MOKAkzc0ICAgfAp8IEPiiJIgICAgfCA2NeKAkzY5ICAgfAp8IEQrICAgIHwgNjDigJM2NCAgIHwKfCBEICAgICB8IDU14oCTNTkgICB8CnwgROKIkiAgICB8IDUw4oCTNTQgICB8CnwgRiAgICAgfCA8IDUwJSAgIHwKCkkgcm91bmQgdXAgZnJvbSAuNSB3aGVuIGRldGVybWluaW5nIGZpbmFsIGdyYWRlcy4KRm9yIGV4YW1wbGUsIGEgY291cnNlIHBlcmNlbnQgb2YgNzkuNTAgd291bGQgcmVjZWl2ZSBhIELiiJIsIHdoZXJlYXMgYSBjb3Vyc2UgcGVyY2VudCBvZiA3OS40OSB3b3VsZCByZWNlaXZlIGEgQysuCgojIENvdXJzZSBHcmFkZXMgeyNjb3Vyc2VHcmFkZXN9CgpGaW5hbCBjb3Vyc2UgZ3JhZGVzIHdpbGwgYmUgYXNzZXNzZWQgYmFzZWQgb24geW91ciBwZXJmb3JtYW5jZSBpbiB0aGUgYWN0aXZpdGllcyBiZWxvdy4KVGhlIHJlbGF0aXZlIGNvbnRyaWJ1dGlvbiBvZiBlYWNoIGNvbXBvbmVudCB0byB5b3VyIGZpbmFsIGdyYWRlIGlzIGFzIGZvbGxvd3M6CgogLSAyOCUJRXhhbWluYXRpb24gIzEKIC0gMjglCUV4YW1pbmF0aW9uICMyCiAtIDI4JQlFeGFtaW5hdGlvbiAjMyAoYWRtaW5pc3RlcmVkIG9ubHkgZHVyaW5nIHRoZSBjbGFzcydzIEZpbmFsIEV4YW0gdGltZSBzbG90KQogLSA4JSAJRGlzY3Vzc2lvbiBBdHRlbmRhbmNlL1BhcnRpY2lwYXRpb24KIC0gOCUgCVJlYWRpbmcgUXVpenplcwoKIyBUZW50YXRpdmUgQ291cnNlIE91dGxpbmUgKGV4YW0gZGF0ZXMgZml4ZWQpIHsjb3V0bGluZX0KCiMjIFNlY3Rpb24gTm90ZXMgeyNzZWN0aW9uTm90ZXN9CgotIFNlY3Rpb25zIHdpbGwgbm90IGJlIGhlbGQgZHVyaW5nIHRoZSB3ZWVrIG9mIGV4YW1pbmF0aW9ucy4KVGhlcmVmb3JlLCBzZWN0aW9ucyBhcmUgY2FuY2VsbGVkIG9uIHRoZSBmb2xsb3dpbmcgZGF0ZXM6IE1vbmRheSAyLzI3IOKAkyBGcmlkYXkgMy8zIGFuZCBNb25kYXkgNC8zIOKAkyBGcmlkYXkgNC83LgoKIyMgVW5pdCBPbmUgeyN1bml0MX0KCioqVW5pdCBPbmU6IEZ1bmRhbWVudGFscyBvZiBTY2llbnRpZmljIENsaW5pY2FsIFBzeWNob2xvZ3kqKgoKfCBEYXRlIHwgVG9waWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IDEvMTYgfCBNTEsgRGF5IChubyBjbGFzcyEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAxLzE4IHwgSW50cm9kdWN0aW9uIGFuZCBDb250ZW1wb3JhcnkgQ2xpbmljYWwgUHN5Y2hvbG9neSAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgMS8yMyB8IENsYXNzaWZpY2F0aW9uIGFuZCBEaWFnbm9zaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDEvMjUgfCBDbGFzc2lmaWNhdGlvbiBhbmQgRGlhZ25vc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAxLzMwIHwgUmVzZWFyY2ggTWV0aG9kcyBpbiBDbGluaWNhbCBQc3ljaG9sb2d5IChjb250ZW50IGZvY3VzIG9uIHNleHVhbCBhc3NhdWx0KSB8CnwgMi8xICB8IFJlc2VhcmNoIE1ldGhvZHMgaW4gQ2xpbmljYWwgUHN5Y2hvbG9neSAoY29udGVudCBmb2N1cyBvbiBzZXh1YWwgYXNzYXVsdCkgfAp8IDIvNiAgfCBNb29kIERpc29yZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAyLzggIHwgTW9vZCBEaXNvcmRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgMi8xMyB8IE1vb2QgRGlzb3JkZXJzIGFuZCBTdWljaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDIvMTUgfCBBbnhpZXR5IERpc29yZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAyLzIwIHwgQW54aWV0eSBEaXNvcmRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgMi8yMiB8IEFsY29ob2wgVXNlIERpc29yZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDIvMjcgfCBFeGFtaW5hdGlvbiAjMSAobm8gc2VjdGlvbnMgdGhpcyB3ZWVrISkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCiMjIFVuaXQgVHdvIHsjdW5pdDJ9CgoqKlVuaXQgVHdvOiBFdmlkZW5jZS1CYXNlZCBQc3ljaG9sb2dpY2FsIEFzc2Vzc21lbnQgYW5kIFByZWRpY3Rpb24qKgoKfCBEYXRlIHwgVG9waWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IDMvMSAgfCBPdmVydmlldyBvZiBBc3Nlc3NtZW50IGFuZCBQcmVkaWN0aW9uICAgICAgICAgIHwKfCAzLzYgIHwgT3ZlcnZpZXcgb2YgQXNzZXNzbWVudCBhbmQgUHJlZGljdGlvbiAgICAgICAgICB8CnwgMy84ICB8IEludGVydmlld2luZywgT2JzZXJ2YXRpb24sIGFuZCBTZWxmLU1vbml0b3JpbmcgfAp8IDMvMTMgfCBTcHJpbmcgQnJlYWsgKG5vIGNsYXNzISkgICAgICAgICAgICAgICAgICAgICAgIHwKfCAzLzE1IHwgU3ByaW5nIEJyZWFrIChubyBjbGFzcyEpICAgICAgICAgICAgICAgICAgICAgICB8CnwgMy8yMCB8IEludGVydmlld2luZywgT2JzZXJ2YXRpb24sIGFuZCBTZWxmLU1vbml0b3JpbmcgfAp8IDMvMjIgfCBJbnRlbGxpZ2VuY2UgVGVzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAzLzI3IHwgSW50ZWxsaWdlbmNlIFRlc3RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgMy8yOSB8IFBlcnNvbmFsaXR5IEFzc2Vzc21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDQvMyAgfCBQZXJzb25hbGl0eSBBc3Nlc3NtZW50OyBXcmFwIFVwICAgICAgICAgICAgICAgIHwKfCA0LzUgIHwgRXhhbWluYXRpb24gIzIgKG5vIHNlY3Rpb25zIHRoaXMgd2VlayEpICAgICAgICB8CgojIyBVbml0IFRocmVlIHsjdW5pdDN9CgoqKlVuaXQgVGhyZWU6IEV2aWRlbmNlLUJhc2VkIFBzeWNob2xvZ2ljYWwgSW50ZXJ2ZW50aW9uKioKCnwgRGF0ZSB8IFRvcGljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8Oi0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCA0LzEwIHwgTWFqb3IgQXBwcm9hY2hlcyB0byBJbnRlcnZlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgNC8xMiB8IE1ham9yIEFwcHJvYWNoZXMgdG8gSW50ZXJ2ZW50aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDQvMTcgfCBDb2duaXRpdmUtQmVoYXZpb3JhbCBUaGVyYXB5IGZvciBQYW5pYyBEaXNvcmRlcjsgVHJhbnNkaWFnbm9zdGljIFRyZWF0bWVudCBmb3IgRW1vdGlvbmFsIERpc29yZGVycyB8CnwgNC8xOSB8IEV2YWx1YXRpb24gb2YgSW50ZXJ2ZW50aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDQvMjQgfCBFdmlkZW5jZS1CYXNlZCBUcmVhdG1lbnRzOyBJbmZsdWVuY2VzIG9uIFRyZWF0bWVudCBPdXRjb21lIHwKfCA0LzI2IHwgRGlzc2VtaW5hdGlvbiBvZiBFdmlkZW5jZS1CYXNlZCBUcmVhdG1lbnRzICAgICAgICAgICAgICAgICB8CnwgNS8xICB8IEludGVydmVudGlvbiBDb250cm92ZXJzaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDUvMyAgfCBXcmFwLVVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCiMgRGF0ZSBhbmQgVGltZSBvZiB0aGUgRmluYWwgRXhhbSB7I2ZpbmFsRXhhbX0KClRoZSBbZmluYWwgZXhhbWluYXRpb24gZGF0ZSBhbmQgdGltZV0oaHR0cHM6Ly9yZWdpc3RyYXIudWlvd2EuZWR1L2ZpbmFsLWV4YW0tc2NoZWR1bGVzKSB3aWxsIGJlIGFubm91bmNlZCBieSB0aGUgUmVnaXN0cmFyIGdlbmVyYWxseSBieSB0aGUgZmlmdGggd2VlayBvZiBjbGFzc2VzLCBhbmQgaXQgd2lsbCBiZSBhbm5vdW5jZWQgb24gdGhlIGNvdXJzZSBJQ09OIHNpdGUgb25jZSBpdCBpcyBrbm93bi4KPHU+RG8gbm90IHBsYW4geW91ciBlbmQgb2YgdGhlIHNlbWVzdGVyIHRyYXZlbCBwbGFucyB1bnRpbCB0aGUgZmluYWwgZXhhbSBzY2hlZHVsZSBpcyBtYWRlIHB1YmxpYy4KSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBrbm93IHRoZSBkYXRlLCB0aW1lLCBhbmQgcGxhY2Ugb2YgdGhlIGZpbmFsIGV4YW0uPC91PgpBY2NvcmRpbmcgdG8gdGhlIFJlZ2lzdHJhcidzIGZpbmFsIGV4YW0gcG9saWN5LCBzdHVkZW50cyA8dT5oYXZlIGEgbWF4aW11bSBvZiB0d28gd2Vla3MgYWZ0ZXIgdGhlIGFubm91bmNlZCBmaW5hbCBleGFtIHNjaGVkdWxlPC91PiB0byByZXF1ZXN0IGEgY2hhbmdlIGlmIGFuIGV4YW0gY29uZmxpY3QgZXhpc3RzIG9yIGlmIGEgc3R1ZGVudCBoYXMgbW9yZSB0aGFuIHR3byBleGFtcyBzY2hlZHVsZWQgZm9yIHRoZSBzYW1lIGRheSAoc2VlIHRoZSBbcG9saWN5XShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvbWFrZXVwLWZpbmFsLWV4YW1pbmF0aW9uLXBvbGljaWVzKSBoZXJlKS4KCiMgQ291cnNlIFJlc291cmNlcyB7I2NvdXJzZVJlc291cmNlc30KClRoZXJlIGFyZSBtYW55IGNvdXJzZSByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHN1Y2NlZWQgaW4gdGhlIGNsYXNzLCBpbmNsdWRpbmc6CgotIFBvd2VycG9pbnQgc2xpZGVzIGZvciBsZWN0dXJlCi0gUG93ZXJwb2ludCBzbGlkZXMgZm9yIGRpc2N1c3Npb24gc2VjdGlvbgotIGdldHRpbmcgYW5kIHJldmlld2luZyBtaXNzZWQgbm90ZXMgZnJvbSBhIHBlZXIKLSBbbGVjdHVyZSByZWNvcmRpbmdzXSgjcmVjb3JkaW5ncykKLSBzdHVkeSBxdWVzdGlvbnMgYWZ0ZXIgZWFjaCBsZWN0dXJlIChzZWUgdGhlICJTdHVkeSBRdWVzdGlvbnMiIGZvbGRlciB1bmRlciB0aGUgIkZpbGVzIiB0YWIgb24gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpKQotIFF1aXpsZXQgcXVlc3Rpb25zIChzZWUgdGhlICJRdWl6bGV0IiBmb2xkZXIgdW5kZXIgdGhlICJGaWxlcyIgdGFiIG9uIElDT04pCi0gcHJhY3RpY2UgZXhhbSBxdWVzdGlvbnMgdGhhdCB3ZSBwb3N0IGxlYWRpbmcgdXAgdG8gdGhlIGV4YW0gKHRoZXNlIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgaW4gdGhlICJQcmFjdGljZSBFeGFtIFF1ZXN0aW9ucyIgZm9sZGVyIHVuZGVyIHRoZSAiRmlsZXMiIHRhYiBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkpCi0gcmV2aWV3IHlvdXIgcXVpenplcyBhbmQgdGhlIGFuc3dlcnMKLSBvdXIgZ3VpZGUgb24gW2hvdyB0byBzdHVkeSBmb3IgdGhlIGNsYXNzXShob3dUb1N0dWR5Lmh0bWwpCi0gVEEgb2ZmaWNlIGhvdXJzCi0gaW5zdHJ1Y3RvciBvZmZpY2UgaG91cnMKLSBbcGVlciBzdHVkeSBncm91cHNdKCNyZXF1ZXN0cykKLSBUdXRvciBJb3dhOiBodHRwczovL3R1dG9yLnVpb3dhLmVkdQoKIyBEcm9wIERlYWRsaW5lIGZvciB0aGlzIENvdXJzZSB7I2Ryb3BEZWFkbGluZX0KCllvdSBtYXkgZHJvcCBhbiBpbmRpdmlkdWFsIGNvdXJzZSBiZWZvcmUgdGhlIGRyb3AgZGVhZGxpbmU7IGFmdGVyIHRoaXMgZGVhZGxpbmUgeW91IHdpbGwgbmVlZCBjb2xsZWdpYXRlIGFwcHJvdmFsLgpZb3UgY2FuIGxvb2sgdXAgdGhlIGRyb3AgZGVhZGxpbmUgZm9yIHRoaXMgY291cnNlIFtoZXJlXShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvY291cnNlLWRlYWRsaW5lcykuCldoZW4geW91IGRyb3AgYSBjb3Vyc2UsIGEgIlciIHdpbGwgYXBwZWFyIG9uIHlvdXIgdHJhbnNjcmlwdC4KVGhlIG1hcmsgb2YgIlciIGlzIGEgbmV1dHJhbCBtYXJrIHRoYXQgZG9lcyBub3QgYWZmZWN0IHlvdXIgR1BBLgpUbyBkaXNjdXNzIGhvdyBkcm9wcGluZyAob3Igc3RheWluZyBpbikgYSBjb3Vyc2UgbWlnaHQgYWZmZWN0IHlvdXIgYWNhZGVtaWMgZ29hbHMsIHBsZWFzZSBjb250YWN0IHlvdXIgQWNhZGVtaWMgQWR2aXNvci4KRGlyZWN0aW9ucyBmb3IgYWRkaW5nIG9yIGRyb3BwaW5nIGEgY291cnNlIGFuZCBvdGhlciByZWdpc3RyYXRpb24gY2hhbmdlcyBjYW4gYmUgZm91bmQgb24gdGhlIFtSZWdpc3RyYXIncyB3ZWJzaXRlXShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvY2hhbmdlLXJlZ2lzdHJhdGlvbi1teXVpKS4KU3R1ZGVudHMgY2FuIGZpbmQgcG9saWNpZXMgb24gZHJvcHBpbmcgQ0xBUyBjb3Vyc2VzIFtoZXJlXShodHRwczovL2NsYXMudWlvd2EuZWR1L3N0dWRlbnRzL3N0dWRlbnRzLWFjYWRlbWljLXBvbGljaWVzL3JlZ2lzdHJhdGlvbi1wb2xpY2llcyNkcm9wcGluZykuCgojIEZlZWRiYWNrIGFib3V0IHRoZSBDb3Vyc2UgeyNmZWVkYmFja30KCkkgd2VsY29tZSBmZWVkYmFjayBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoZSBjbGFzcy4KSWYgeW91IGhhdmUgY29tbWVudHMgb24gdGhlIGNsYXNzIG9yIG15IHRlYWNoaW5nLCBwbGVhc2UgZmVlbCBmcmVlIHRvIG1lZXQgd2l0aCBtZSBkdXJpbmcgb2ZmaWNlIGhvdXJzLgoKIyMgU3R1ZGVudCBDb21wbGFpbnRzIHsjY29tcGxhaW50c30KClN0dWRlbnRzIHdpdGggYSBjb21wbGFpbnQgYWJvdXQgYSBncmFkZSBvciBhIHJlbGF0ZWQgbWF0dGVyIHNob3VsZCBmaXJzdCBkaXNjdXNzIHRoZSBzaXR1YXRpb24gd2l0aCB0aGUgaW5zdHJ1Y3RvciwgYW5kIGZpbmFsbHkgd2l0aCB0aGUgREVPIChDaGFpcikgb2YgdGhlIGRlcGFydG1lbnQsIHNjaG9vbCwgb3IgcHJvZ3JhbSBvZmZlcmluZyB0aGUgY291cnNlLgpTb21ldGltZXMgc3R1ZGVudHMgd2lsbCBiZSByZWZlcnJlZCB0byB0aGUgZGVwYXJ0bWVudCBvciBwcm9ncmFtJ3MgRGlyZWN0b3Igb2YgVW5kZXJncmFkdWF0ZSBTdHVkaWVzIChEVVMpIG9yIERpcmVjdG9yIG9mIEdyYWR1YXRlIFN0dWRpZXMgKERHUykuClN0dWRlbnRzIHNob3VsZCBjb250YWN0IFtDTEFTIFVuZGVyZ3JhZHVhdGUgUHJvZ3JhbXNdKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvc3R1ZGVudHMvaGFuZGJvb2svc3R1ZGVudC1yaWdodHMtcmVzcG9uc2liaWxpdGllcyNyaWdodHMpIGZvciBzdXBwb3J0IHdoZW4gdGhlIG1hdHRlciBpcyBub3QgcmVzb2x2ZWQgYXQgdGhlIHByZXZpb3VzIGxldmVsLgoKIyBDb21tdW5pY2F0aW9uOiBVSSBFbWFpbCB7I2VtYWlsfQoKU3R1ZGVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBhbGwgb2ZmaWNpYWwgY29ycmVzcG9uZGVuY2VzIHNlbnQgdG8gdGhlaXIgVUkgZW1haWwgYWRkcmVzcyAodWlvd2EuZWR1KSBhbmQgbXVzdCB1c2UgdGhpcyBhZGRyZXNzIGZvciBhbnkgY29tbXVuaWNhdGlvbiB3aXRoIGluc3RydWN0b3JzIG9yIHN0YWZmIGluIHRoZSBVSSBjb21tdW5pdHkuCkZvciB0aGUgcHJpdmFjeSBhbmQgdGhlIHByb3RlY3Rpb24gb2Ygc3R1ZGVudCByZWNvcmRzLCBVSSBmYWN1bHR5IGFuZCBzdGFmZiBjYW4gb25seSBjb3JyZXNwb25kIHdpdGggVUkgZW1haWwgYWRkcmVzc2VzLgoKIyMgT3RoZXIgRXhwZWN0YXRpb25zIG9mIFN0dWRlbnQgUGVyZm9ybWFuY2UgeyNvdGhlckV4cGVjdGF0aW9uc30KClN0dWRlbnRzIGhhdmUgdGhlIHJpZ2h0IHRvIGEgZGlzdHJhY3Rpb24tZnJlZSBsZWFybmluZyBlbnZpcm9ubWVudC4KWW91IGhhdmUgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIGhlbHAgY3JlYXRlIHN1Y2ggYSBjbGFzc3Jvb20gZW52aXJvbm1lbnQuClBsZWFzZSB0cmVhdCBvdGhlciBzdHVkZW50cyBpbiB0aGUgY2xhc3MsIHRoZSBUQXMsIGFuZCB0aGUgaW5zdHJ1Y3RvciB3aXRoIHJlc3BlY3QuClN0dWRlbnRzIGFyZSBleHBlY3RlZCB0byBoZWxwIGVhY2ggb3RoZXIgbGVhcm4gYW5kIHRvIGNvbnRyaWJ1dGUgb3ZlcmFsbCB0byB0aGUgbGVhcm5pbmcgZW52aXJvbm1lbnQgb2YgdGhlIGNvdXJzZS4KQXJyaXZpbmcgcHJlcGFyZWQgZm9yIGNsYXNzIGlzIHBhcnQgb2YgdGhpcyBleHBlY3RhdGlvbi4KCiMgVW5pdmVyc2l0eSBQb2xpY2llcyB7I1VJb3dhUG9saWNpZXN9CgpbVW5pdmVyc2l0eSBQb2xpY2llc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKCltBY2NvbW1vZGF0aW9ucyBmb3IgU3R1ZGVudHMgd2l0aCBEaXNhYmlsaXRpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpXApUaGUgVW5pdmVyc2l0eSBpcyBjb21taXR0ZWQgdG8gcHJvdmlkaW5nIGFuIGVkdWNhdGlvbmFsIGV4cGVyaWVuY2UgdGhhdCBpcyBhY2Nlc3NpYmxlIHRvIGFsbCBzdHVkZW50cy4KSWYgYSBzdHVkZW50IGhhcyBhIGRpYWdub3NlZCBkaXNhYmlsaXR5IG9yIG90aGVyIGRpc2FibGluZyBjb25kaXRpb24gdGhhdCBtYXkgaW1wYWN0IHRoZSBzdHVkZW50J3MgYWJpbGl0eSB0byBjb21wbGV0ZSB0aGUgY291cnNlIHJlcXVpcmVtZW50cyBhcyBzdGF0ZWQgaW4gdGhlIHN5bGxhYnVzLCB0aGUgc3R1ZGVudCBtYXkgc2VlayBhY2NvbW1vZGF0aW9ucyB0aHJvdWdoIFtTdHVkZW50IERpc2FiaWxpdHkgU2VydmljZXNdKGh0dHBzOi8vc2RzLnN0dWRlbnRsaWZlLnVpb3dhLmVkdS9zdHVkZW50cykgKFNEUykuClNEUyBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIFtMZXR0ZXJzIG9mIEFjY29tbW9kYXRpb24gKExPQSldKGh0dHBzOi8vc2RzLnN0dWRlbnRsaWZlLnVpb3dhLmVkdS9zdHVkZW50cy9sZXR0ZXItYWNjb21tb2RhdGlvbnMtbG9hKSBhdmFpbGFibGUgdG8gdGhlIHN0dWRlbnQuCjx1PlRoZSBzdHVkZW50IG11c3QgcHJvdmlkZSBhIExPQSB0byB0aGUgaW5zdHJ1Y3RvciBhcyBlYXJseSBpbiB0aGUgc2VtZXN0ZXIgYXMgcG9zc2libGUsIGJ1dCByZXF1ZXN0cyBub3QgbWFkZSBhdCBsZWFzdCB0d28gd2Vla3MgcHJpb3IgdG8gdGhlIHNjaGVkdWxlZCBhY3Rpdml0eSBmb3Igd2hpY2ggYW4gYWNjb21tb2RhdGlvbiBpcyBzb3VnaHQgbWF5IG5vdCBiZSBhY2NvbW1vZGF0ZWQuPC91PgpUaGUgTE9BIHdpbGwgc3BlY2lmeSB3aGF0IHJlYXNvbmFibGUgY291cnNlIGFjY29tbW9kYXRpb25zIHRoZSBzdHVkZW50IGlzIGVsaWdpYmxlIGZvciBhbmQgdGhvc2UgdGhlIGluc3RydWN0b3Igc2hvdWxkIHByb3ZpZGUuCkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSBbU0RTIHdlYnNpdGVdKGh0dHBzOi8vc2RzLnN0dWRlbnRsaWZlLnVpb3dhLmVkdS9zdHVkZW50cy9hcHBseSkuCgpbQ2xhc3MgUmVjb3JkaW5nc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcylcClN0dWRlbnRzIG1heSBiZSBlbnJvbGxlZCBpbiBhIGNsYXNzIHdoZXJlIHNvbWUgc2Vzc2lvbnMgd2lsbCBiZSByZWNvcmRlZCBvciBsaXZlLXN0cmVhbWVkLgpTdWNoIHJlY29yZGluZ3Mvc3RyZWFtaW5nIHdpbGwgb25seSBiZSBhdmFpbGFibGUgdG8gc3R1ZGVudHMgcmVnaXN0ZXJlZCBmb3IgdGhlIGNsYXNzLgpUaGVzZSByZWNvcmRpbmdzIGFyZSB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIHRoZSBpbnN0cnVjdG9yIGFuZCB0aGV5IG1heSBub3QgYmUgc2hhcmVkIG9yIHJlcHJvZHVjZWQgd2l0aG91dCB0aGUgZXhwbGljaXQsIHdyaXR0ZW4gY29uc2VudCBvZiB0aGUgaW5zdHJ1Y3Rvci4KRnVydGhlciwgc3R1ZGVudHMgbWF5IG5vdCBzaGFyZSB0aGVzZSBzZXNzaW9ucyB3aXRoIHRob3NlIG5vdCBpbiB0aGUgY2xhc3Mgb3IgdXBsb2FkIHRoZW0gdG8gYW55IG90aGVyIG9ubGluZSBlbnZpcm9ubWVudC4KRG9pbmcgc28gd291bGQgYmUgYSBicmVhY2ggb2YgdGhlIENvZGUgb2YgU3R1ZGVudCBDb25kdWN0LCBhbmQsIGluIHNvbWUgY2FzZXMsIGEgdmlvbGF0aW9uIG9mIHN0YXRlIGFuZCBmZWRlcmFsIGxhdywgaW5jbHVkaW5nIHRoZSBGZWRlcmFsIEVkdWNhdGlvbiBSaWdodHMgYW5kIFByaXZhY3kgQWN0IChGRVJQQSkuCgpUaGUgdW5hdXRob3JpemVkIHZpZGVvIG9yIGF1ZGlvIHJlY29yZGluZyBvZiBhY2FkZW1pYyBhY3Rpdml0aWVzIChlLmcuLCBsZWN0dXJlcywgY291cnNlIGRpc2N1c3Npb25zLCBvZmZpY2UgaG91cnMsIGV0Yy4pIGJ5IGEgc3R1ZGVudCBpcyBwcm9oaWJpdGVkLgpTdHVkZW50cyB3aXRoIGEgcmVhc29uYWJsZSBhY2NvbW1vZGF0aW9uIGZvciByZWNvcmRpbmcgYXBwcm92ZWQgYnkgU3R1ZGVudCBEaXNhYmlsaXR5IFNlcnZpY2VzIHNob3VsZCBub3RpZnkgZWFjaCBpbnN0cnVjdG9yIGFuZCBwcm92aWRlIHRoZSBMZXR0ZXIgb2YgQWNjb21tb2RhdGlvbiBwcmlvciB0byB1c2luZyB0aGUgYWNjb21tb2RhdGlvbi4KQSBzdHVkZW50IG1heSByZWNvcmQgY2xhc3Nyb29tIGFjdGl2aXRpZXMgd2l0aCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSB0aGUgaW5zdHJ1Y3RvciBhbmQgbm90aWNlIHRvIG90aGVyIHN0dWRlbnRzIGluIHRoZSBjbGFzcyB0aGF0IGF1ZGlvIG9yIHZpZGVvIHJlY29yZGluZyBtYXkgb2NjdXIuCkFueSBhbmQgYWxsIGNsYXNzcm9vbSByZWNvcmRpbmcgbXVzdCBiZSBmb3IgcGVyc29uYWwgYWNhZGVtaWMgdXNlIG9ubHkuClRoZSBkaXN0cmlidXRpb24sIHNoYXJpbmcsIHNhbGUsIG9yIHBvc3Rpbmcgb2YgcmVjb3JkaW5ncyBvbiB0aGUgaW50ZXJuZXQgKGluY2x1ZGluZyBzb2NpYWwgbWVkaWEpLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBpcyBwcm9oaWJpdGVkIGFuZCBkb2luZyBzbyBtYXkgYmUgYSB2aW9sYXRpb24gb2YgdGhlIENvZGUgb2YgU3R1ZGVudCBMaWZlIGFuZC9vciBzdGF0ZSBvciBmZWRlcmFsIHByaXZhY3ksIGNvcHlyaWdodCwgb3Igb3RoZXIgbGF3cy4KCi0gW0ZyZWUgU3BlZWNoIGFuZCBFeHByZXNzaW9uXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtOb24tRGlzY3JpbWluYXRpb25dKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCi0gW0FjY29tbW9kYXRpb25zIGZvciBTdHVkZW50cyB3aXRoIERpc2FiaWxpdGllc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQWJzZW5jZXMgZnJvbSBDbGFzc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQWJzZW5jZXMgZm9yIFJlbGlnaW91cyBIb2x5IERheXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCi0gW0Fic2VuY2VzIGZvciBNaWxpdGFyeSBTZXJ2aWNlIE9ibGlnYXRpb25zXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtDbGFzc3Jvb20gRXhwZWN0YXRpb25zXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtTZXh1YWwgSGFyYXNzbWVudC9NaXNjb25kdWN0IGFuZCBTdXBwb3J0aXZlIE1lYXN1cmVzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtDb25mbGljdCBSZXNvbHV0aW9uXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtNZW50YWwgSGVhbHRoXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtCYXNpYyBOZWVkcyBhbmQgU3R1ZGVudCBTdXBwb3J0XShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtDbGFzcyBSZWNvcmRpbmdzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQoKIyBDb3Vyc2UgUmVxdWVzdHMgeyNyZXF1ZXN0c30KCldlIGhhdmUgYSBjZW50cmFsaXplZCBsb2NhdGlvbiB0byBrZWVwIHRyYWNrIG9mIHJlcXVlc3RzLCBmb3JtcywgZXRjLiwgc28gd2UgY2FuIG1ha2Ugc3VyZSB3ZSBtZWV0IHlvdXIgbmVlZHMuCkNvdXJzZSByZXF1ZXN0cyBpbmNsdWRlLCBmb3IgaW5zdGFuY2UsIHJlcXVlc3RzIHRvIGpvaW4gYSBwZWVyIHN0dWR5IGdyb3VwLCBzZXR0aW5nIHVwIGEgdGltZSB0byByZXZpZXcgeW91ciBleGFtLCByZXF1ZXN0aW5nIGFjY29tbW9kYXRpb25zLCBldGMuClBsZWFzZSBzdWJtaXQgY291cnNlIHJlcXVlc3RzIChlLmcuLCB0byBqb2luIGEgcGVlciBzdHVkeSBncm91cCkgaGVyZTogW1VQREFURSBMSU5LIV0gaHR0cHM6Ly91aW93YS5xdWFsdHJpY3MuY29tL2pmZS9mb3JtL1NWXzFIVXlnNlphUjRDY2pXdS4KSWYgeW91IGhhdmUgYWNjZXNzaWJpbGl0eSBhY2NvbW1vZGF0aW9ucyBmcm9tIFN0dWRlbnQgRGlzYWJpbGl0eSBTZXJ2aWNlcyAoU0RTKSwgcGxlYXNlIHN1Ym1pdCB5b3VyIFNEUyBhY2NvbW1vZGF0aW9ucyBsZXR0ZXJzIGF0IHRoaXMgbGluay4KCiMgV2hlcmUgdG8gR2V0IEFjYWRlbWljIFN1cHBvcnQgZm9yIFRoaXMgQ291cnNlIHsjYWNhZGVtaWMtc3VwcG9ydH0KCi0gRHJvcC1pbiBzdHVkeSBncm91cHMgYW5kIG9uZS1vbi1vbmUgdHV0b3Jpbmc6IHN0dWRlbnQgZHJvcC1pbiBob3VycyBvZiB0aGUgZ3JhZHVhdGUgVEFzIGFuZCBpbnN0cnVjdG9yCi0gRm9ybWFsIHR1dG9yaW5nOiBUdXRvciBJb3dhOiBodHRwczovL3R1dG9yLnVpb3dhLmVkdQotIEFjYWRlbWljIGFjY29tbW9kYXRpb25zOiBodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUKCiMgTWVudGFsIEhlYWx0aCBSZXNvdXJjZXMgYW5kIFN0dWRlbnQgU3VwcG9ydCB7I21lbnRhbC1oZWFsdGh9CgpTdHVkZW50cyBhcmUgZW5jb3VyYWdlZCB0byBiZSBtaW5kZnVsIG9mIHRoZWlyIG1lbnRhbCBoZWFsdGggYW5kIHNlZWsgaGVscCBhcyBhIHByZXZlbnRpdmUgbWVhc3VyZSBvciBpZiBmZWVsaW5nIG92ZXJ3aGVsbWVkIGFuZC9vciBzdHJ1Z2dsaW5nIHRvIG1lZXQgY291cnNlIGV4cGVjdGF0aW9ucy4KU3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gdGFsayB0byB0aGVpciBpbnN0cnVjdG9yIGZvciBhc3Npc3RhbmNlIHdpdGggc3BlY2lmaWMgY2xhc3MtcmVsYXRlZCBjb25jZXJucy4KRm9yIGFkZGl0aW9uYWwgc3VwcG9ydCBhbmQgY291bnNlbGluZywgc3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gY29udGFjdCBVbml2ZXJzaXR5IENvdW5zZWxpbmcgU2VydmljZSAoVUNTKS4KSW5mb3JtYXRpb24gYWJvdXQgVUNTLCBpbmNsdWRpbmcgcmVzb3VyY2VzIGFuZCBob3cgdG8gc2NoZWR1bGUgYW4gYXBwb2ludG1lbnQsIGNhbiBiZSBmb3VuZCBhdCBbY291bnNlbGluZy51aW93YS5lZHVdKGh0dHA6Ly9jb3Vuc2VsaW5nLnVpb3dhLmVkdSkuCkZpbmQgb3V0IG1vcmUgYWJvdXQgVUkgbWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBhdDogW21lbnRhbGhlYWx0aC51aW93YS5lZHVdKGh0dHA6Ly9tZW50YWxoZWFsdGgudWlvd2EuZWR1KSwgaW5jbHVkaW5nIHRoZSAyNC03IFtVSSBTdXBwb3J0IGFuZCBDcmlzaXMgTGluZV0oaHR0cHM6Ly9tZW50YWxoZWFsdGgudWlvd2EuZWR1L3VpLXN1cHBvcnQtYW5kLWNyaXNpcy1saW5lKS4KCkFkZGl0aW9uYWxseSwgdGhlIE9mZmljZSBvZiB0aGUgRGVhbiBvZiBTdHVkZW50cyBjYW4gaGVscCBzdHVkZW50cyBuYXZpZ2F0ZSBwZXJzb25hbCBjcmlzaXMgc2l0dWF0aW9ucy4KVGhleSBjYW4gcHJvdmlkZSBvbmUtb24tb25lIHN1cHBvcnQsIGhlbHAgd2l0aCBpZGVudGlmeWluZyBvcHRpb25zLCBhbmQgYWNjZXNzIHRvIFtiYXNpYyBuZWVkcyByZXNvdXJjZXMgKHN1Y2ggYXMgZm9vZCwgcmVudCwgY2hpbGRjYXJlLCBldGMuKV0oaHR0cDovL2Jhc2ljbmVlZHMudWlvd2EuZWR1KS4KU3R1ZGVudCBDYXJlIGFuZCBBc3Npc3RhbmNlOiAxMzIgSU1VLCBbZG9zLWFzc2lzdGFuY2VAdWlvd2EuZWR1XShtYWlsdG86ZG9zLWFzc2lzdGFuY2VAdWlvd2EuZWR1KSwgb3IgMzE5LTMzNS0xMTYyIGFuZCBtb3JlIGluZm86IFtkb3MudWlvd2EuZWR1L2Fzc2lzdGFuY2VdKGh0dHBzOi8vZG9zLnVpb3dhLmVkdS9hc3Npc3RhbmNlKQoKU29tZSBvZiB0aGUgdG9waWNzIGNvdmVyZWQgaW4gY2xhc3MgaW52b2x2ZSBwcm9ibGVtcyB0aGF0IGNhbiBiZSBxdWl0ZSBjb21tb24gYW1vbmcgY29sbGVnZSBzdHVkZW50cy4KSWYgeW91IGZlZWwgdGhhdCB5b3Ugb3Igc29tZW9uZSB5b3Uga25vdyBtYXkgYmUgc3RydWdnbGluZyB3aXRoIGFuIGFjYWRlbWljLCBlbW90aW9uYWwsIG9yIHBzeWNob2xvZ2ljYWwgcHJvYmxlbSwgdGhlIGZvbGxvd2luZyBvcmdhbml6YXRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFzc2lzdGFuY2U6Cgp8IFNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29udGFjdCBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBVbml2ZXJzaXR5IG9mIElvd2EgQWNhZGVtaWMgQWR2aXNpbmcgQ2VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1My01NzAwLCBodHRwczovL2FkdmlzaW5nY2VudGVyLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgfAp8IFVuaXZlcnNpdHkgQ291bnNlbGluZyBTZXJ2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTcyOTQsIGh0dHBzOi8vd3d3LnVpb3dhLmVkdS91Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgU3R1ZGVudCBIZWFsdGggU2VydmljZSAtIE1lbnRhbCBIZWFsdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMzUtODM5NCwgaHR0cHM6Ly9zdHVkZW50aGVhbHRoLnVpb3dhLmVkdS9zZXJ2aWNlcy9wc3ljaGlhdHJ5ICAgIHwKfCBVbml2ZXJzaXR5IG9mIElvd2EgSG9zcGl0YWxzIGFuZCBDbGluaWNzIEFkdWx0IFBzeWNoaWF0cnkgU2VydmljZXMgQ2xpbmljICB8IDM1My02MzE0LCBodHRwczovL3d3dy51aWhlYWx0aGNhcmUub3JnL1BzeWNoaWF0cnkgICAgICAgICAgICAgICAgfAp8IFNlYXNob3JlIENsaW5pYyAoaW4gdGhlIFVJIERlcGFydG1lbnQgb2YgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMpIHwgMzM1LTI0NjcsIGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUvcmVzb3VyY2VzL3NlYXNob3JlLWNsaW5pYyB8CnwgV29tZW4ncyBSZXNvdXJjZSBhbmQgQWN0aW9uIENlbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMzUtMTQ4NiwgaHR0cHM6Ly93cmFjLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBSYXBlIFZpY3RpbSBBZHZvY2FjeSBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMxOS0zMzUtNjAwMCBvciA4MDAtMjI4LTE2MjUsIGh0dHBzOi8vd3d3LnVpb3dhLmVkdS9+cnZhcCAgICAgICAgfAp8IE9mZmljZSBvZiBTZXh1YWwgTWlzY29uZHVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzE5LTMzNS02MjAwLCBodHRwczovL29zbXJjLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgQ29tbVVuaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4NTUtMzI1LTQyOTYsIGh0dHBzOi8vYnVpbHRieWNvbW11bml0eS5vcmcvY3Jpc2lzICAgICAgICAgICAgICAgIHwKfCBDb21tdW5pdHkgJiBGYW1pbHkgUmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1MS00MzU3LCBodHRwczovL3d3dy5jZnJoZWxwcy5vcmcvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKPHU+SWYgeW91IG9yIHNvbWVvbmUgeW91IGtub3cgaXMgY29udGVtcGxhdGluZyBzdWljaWRlPC91PiwgZWl0aGVyIGNhbGwgb3IgdGV4dCB0aGUgU3VpY2lkZSBhbmQgQ3Jpc2lzIExpZmVsaW5lIGF0IDk4OCwgb3IgY2FsbCA5MTEuCgojIERpc2NsYWltZXIgeyNkaXNjbGFpbWVyfQoKVGhpcyBzeWxsYWJ1cyBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KQW55IGNoYW5nZXMgd2lsbCBiZSBkaXNjdXNzZWQgaW4gY2xhc3MsIHZpYSBlbWFpbCwgYW5kL29yIG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KS4K