Emilee Rader and Anjali Munasinghe. “Wait, Do I Know This Person?”: Understanding Misdirected Email. CHI 2019, Glasgow, UK, May 2019. DOI: 10.1145/3290605.3300520

1 Survey Overview

1.1 Data Collection

1.1.1 When did the survey take place?

Data collection for the survey took place starting on 2018-03-20 and ending on 2018-04-02.

1.1.2 How many responses were collected?

The survey was started by 943 potential respondents. After data cleaning, there were 380 respondents in the dataset.

1.1.3 How long did it take to complete the survey?

The survey took an average of 12.94 minutes for respondents to complete, including the consent and screening questions. The maximum completion time was 80.75 minutes, and the minimum was 3.25 minutes. Respondents had 24 hours from the time they began the consent form to complete the survey, and were told this in the instructions.

Completion Time Descriptives (in minutes)
Min 3.2
Median 10.5
Max 80.8
M 12.9
SD 9.9

1.2 Sample

1.2.1 How many respondents were ineligible vs. excluded?

Respondents were recruited by Qualtrics using their panel service, with quotas for gender (50% men and 50% women) and age (18-29: 25%, 30-49: 38%, 50-64: 21%, 65+: 15%). The age quota was based on information from the Pew Research Center’s Internet/Broadband Fact Sheet from Feb. 5, 2018 about the age distribution of US adults who use the internet, and data from the US Census Bureau’s 2016 American Community Survey about the age distribution of the United States population.

The Pew results tell us what proportion of different age groups use the internet (e.g., 66% of US adults who are 65+ are internet users). But that doesn’t tell us how many people in the US are 65+ years old, so we can’t calculate what proportion of our respondents should be 65+ just using the Pew data. From the Census ACS data, we know that in 2016, the most recent year for which data had been published at the time this research was conducted, 15% of the US population is 65+. So now we know that 66% of the 15% of the US population who are 65+ use the internet. The ACS also includes the information that there are about 323,127,515 people in the US, so using information from both sources we can calculate reasonable target percentages for survey recruiting.

Eligible respondents also were older than 18 and younger than 120 years old, and indicated that they had at least one email account on a popular free email service. The text of the question was, “Do you currently regularly use at least one email account from a popular free email service provider like Gmail, Outlook Mail or Hotmail, Yahoo! Mail, AOL Mail, etc.?”

Respondents who did not consent and who did not meet the age, gender, and email account screening criteria were excluded after declining consent or after providing an ineligible answer to one of the screening questions.

1.2.2 For what reasons were eligible respondents excluded?

  • duplicate name and IP address: During data cleaning, we discovered that two respondents had taken the survey multiple times, based on the IP address associated with their responses, the first and last names they provided, and their answers to demographic questions being duplicated across multiple completed surveys. We kept the first completed survey from each respondent in the dataset, and removed the duplicates.

  • failed attention check or finished too quickly: The survey included an attention check question and a check for finishing the survey too quickly. The check for “speeding” excluded responses from respondents who finished the survey in 1/3 the median time to complete, based on the “soft launch” of the survey. This works out to 3.54 minutes. The attention check consisted of asking respondents for their username (only the part before the @ sign) from their email address on a popular free email service, and then asking again for the same username later in the survey. If these did not match, they were directed to the end of the survey without being allowed to finish it. Respondents were told in the consent form and instructions that there would be “questions and other methods designed to ensure you are paying attention”. And, the first time they entered their username, they were asked to enter it and then re-enter it, and weren’t allowed to proceed until the usernames matched, to ensure that people weren’t kicked out of the survey due to a typo in the username.

  • poor quality name or username: The survey included a question asking particpants to provide their first and last name and email username only (the part before the @ sign) for the free email service they belonged to. The survey included the instruction that this information would be used only for using similarity metrics to compare their name to their username, and would then be deleted. (“This information will be used to determine how similar your username is to your name, and will be deleted as soon as the comparison is complete.”) The name and username responses were inspected by hand to identify any that did not follow the instructions, and these responses were excluded. Some examples of this are responses that were only initials, gibberish (e.g. “ggvv”, “Th”, “dslkdasklklsd”), and responses that were not names (e.g. “boobs”, “none”, “I don’t know”, “refused”).

  • poor quality short answer: The survey included two short answer questions, one asking them to explain why they would pick the new username that the entered in a previous question (variale name: “why_username”“), and the other asking them to describe an example of a wrong email that they had received (variable name:”wrongemail_example“). These responses were examined by hand and those that did not answer the question were excluded. We retained (did not exclude) cases with responses that contained an answer to the question, but then added spaces or punctuation or other text to meet the length requirement of the text entry field. Here are a few examples of excluded responses to the”why_username“” question:

    • “I wont be creating a new account, unless i want to. Man, bump these sentence. Ill make this short if i want ro.”
    • “Idk what to say and ……………………………..hsjsjsjsjsjjsnxjsjsjsjjddjndjsjsjsjdjxnxjdjsjxjjdjdn. Jenxjsnskxisnxjdj”
    • “Nothing at all don’t know nothing at all don’t know nothing at all don’t know nothing at all don’t know nothing at all don’t”
  • “good or full” familiarity with fake word: The internet literacy question consists of a set of internet-related terms. Respondents were asked to specify their level of familiarity with the terms, ranging from “None” to “Full” familiarity. One of the words in the set was a fake word that respondents should not be familiar with. Respondents who said they had “Good” or “Full” familiarity with the fake word were excluded after completing the survey.

  • incomplete survey: Respondents who started but didn’t finish the survey at the time the survey was closed and the dataset was downloaded from Qualtrics.

Here is the number of responses excluded for each reason:

excluded n
did not consent or ineligible 229
failed attention check or finished too quickly 208
attention2 fake word good or full 59
poor quality name or username 30
poor quality short answer 28
incomplete survey 4
duplicate name and IP address 3
over quota 2

1.3 Respondent Demographics

The text of the survey questions about respondent demographics are included in the Demographics Block section of this document.

1.3.1 Age, Gender, Ethnicity

The average age of respondents was 44.99 (SD=16.81). Age ranged from 18 to 85. There were 196 women 181 men who participated in the study.

Age Descriptives (in years)
Min 18
Median 43
Max 85
M 45
SD 17

A large majority of respondents were white. Note that the ethnicity question allowed respondents to “choose all that apply”; in the first “ethnicity” table below “TRUE” indicates that the respondent checked the box, and NA indicates that they did not.

ethnicity counts
white 308
hispanic 21
black 47
asian 14
native_am 7
middle_eastern 0
pacific 2
other 2

1.3.2 Region, Income, Education

Here are the characteristics of the sample in terms of region of the country, income, and education level:

1.3.3 Internet Literacy

The internet literacy variable consists of questions that are based on the Web Use Skills survey reported in Hargittai and Hsieh (2011). Respondents were asked the following question about the internet-related terms: “How familiar are you with the following Internet-related terms? Please rate your understanding of each term below from None (no understanding) to Full (full understanding)”.

We created a composite variable by averaging the self-reported responses for each respondent across the eight internet literacy items. The overall mean was 2.59 (SD = 0.89, median = 2.62). Cronbach’s alpha (a measure of internal consistency): 0.83.

The responses to each item are shown in the graphs below:

2 Survey Questions

Note: This section presents the complete survey instrument, along with descriptive statistics for each question. Formatting and pagination of the questions in the actual survey as it was administered differs from how the questions are presented in this document. Text shown in italics was not part of the survey.

2.1 Screening Block

The three questions below were asked after respondents had consented, but before starting the actual survey, to determine eligibility to participate. Respondents were ineligible if they reported being younger than 18 or older than 120 years old, and if they said “No” or “I’m not sure” to the email account question. The age and gender questions were used to meet the survey recruiting quotas.

  • What is your age in years? [fill in the blank]

  • What is your gender? [Man, Woman, Other (fill in the blank), Prefer not to disclose]

  • Do you currently regularly use at least one email account from a popular free email service provider like Gmail, Outlook Mail or Hotmail, Yahoo! Mail, AOL Mail, etc.? [No, Yes, I’m not sure]

2.2 Email Accounts Block

Instructions: The survey should take approximately 15 minutes to complete. You have up to 24 hours to finish the survey, starting from the time you started reading the consent form on the previous page. Please note that the study includes questions and other methods designed to ensure that you are paying attention. If you do not pay careful attention to every question while you are completing the survey, you will be directed to the end of the survey without being able to complete it.

2.2.1 Reasons for creating a new email account

This question is based on Bentley et al.’s CHI 2017 paper “If a person is emailing you, it just doesn’t make sense”: Exploring Changing Consumer Behaviors in Email.

For which of the following reasons have you ever created a new email account? Please select all that apply:

  • To have a more professional sounding username
  • Old account getting too much spam
  • Didn’t want to give “real” email address to a business
  • Didn’t want to give “real” email address to a person
  • To sign up for a service that requires a specific email provider such as Google Docs (gmail) or Xfinity (Comcast)
  • Wanted to keep personal emails separate
  • Problems with old account (locked out, deleted for non-use, etc.)
  • To use for giving out to websites, such as online shopping sites
  • To try something new
  • Graduated from school and needed a new email address
  • Started a new job and got a new email address from my employer
  • Created a new account for a specific project, business or hobby
  • Other (please fill in the blank)
  • None of the above
reasons count percent
Wanted to keep personal emails separate 142 37.4
Old account getting too much spam 135 35.5
To have a more professional sounding username 94 24.7
To use for giving out to websites, such as online shopping sites 86 22.6
To sign up for a service that requires a specific email provider 82 21.6
Problems with old account 74 19.5
Didn't want to give 'real' email address to a business 68 17.9
To try something new 59 15.5
None of the above 46 12.1
Created a new account for a specific project, business or hobby 46 12.1
Didn't want to give 'real' email address to a person 42 11.1
Started a new job and got a new email address 40 10.5
Other reason 16 4.2
Graduated from school and needed a new email address 15 4.0

2.2.2 How many email accounts does each respondent have?

In the space provided below, please list the email accounts that you currently frequently use, starting with the email account you use the most often. If you use several email accounts about equally, please list up to five of them. Please do NOT enter the complete email address for each account. Instead, give each email account a nickname or a short phrase that describes it. For example, “personal email I’ve had the longest”, “work email”, “school email”, etc.

  • Email account #1 (1) [fill in the blank]
  • Email account #2 (2) [fill in the blank]
  • Email account #3 (3) [fill in the blank]
  • Email account #4 (4) [fill in the blank]
  • Email account #5 (5) [fill in the blank]

Displayed only if the respondent entered something into all five blanks in the previous question:
Do you have more email accounts than the five you listed in the previous question? [No, Yes, I’m not sure]

More than Five Accounts n
No 17
Yes 8
NA 355

2.3 Email Accounts Loop Block

Note: These questions were repeated once for each email account listed above. While all respondents filled in at least one blank, not all respondents filled in more than that. The NAs are removed from the graphs below.

2.3.1 How long have respondents had each account?

How long have you had the email account “${lm://Field/1}”?

  • Less than one year
  • 1-2 years
  • 2-4 years
  • 4-6 years
  • 6-10 years
  • More than 10 years
  • I’m not sure

2.3.2 How did respondents choose their usernames?

When you created the email account “${lm://Field/1}”, how did you choose the username for that account? (The username is the part of the email address before the @ sign.) Select the response below that most closely matches your experience:

  • I created the exact username I wanted.
  • A username was assigned to me, and I kept it.
  • A username was assigned to me, but I changed it later.
  • The system suggested a username to me when I created the account, and I accepted it.
  • Most of the usernames I tried to create were already taken, so I ended up with this one.
  • I don’t remember.
  • None of the above.

2.3.3 How early on did respondents create their email accounts?

At the time you created your “${lm://Field/1}” account, about how soon was it after the email service first became available? Please choose the response that best represents what you remember:

  • Very soon after
  • Somewhat soon after
  • A while after
  • Somewhat long after
  • A long time after
  • I don’t know

2.4 Names and Naming Block

2.4.1 Characteristics of respondents’ names

Instructions: The following question asks for three pieces of information, your first name, your last name, and ONLY the username (the part before the @ sign) of your email account from a popular free email service provider like Gmail, Outlook Mail or Hotmail, Yahoo! Mail, or AOL Mail that you use most often. This information will be used to determine how similar your username is to your name, and will be deleted as soon as the comparison is complete.

Note: descriptive statistics about respondents’ names were calculated, and edit distance comparisons between names and usernames were also computed. Then the raw name data were deleted from the dataset. Only the descriptive statistics were preserved, to protect respondents’ privacy.

Please enter the requested information below, and make sure to check carefully for typos:

  • First Name [fill in the blank]
  • Last Name [fill in the blank]
  • Email Username [fill in the blank]

Please re-enter your First Name, Last Name, and the Email Username that you entered above:

  • First Name [fill in the blank]
  • Last Name [fill in the blank]
  • Email Username [fill in the blank]

First name and last name length in number of characters:

Name Length (nchars) Min Median Max M SD
firstname_lower_nchars 3 5 11 5.6 1.6
lastname_lower_nchars 2 6 14 6.4 1.8

2.4.2 Respondents’ self-report estimate of how common their name is

In your opinion, how common or uncommon is your FIRST name?

  • Extremely common
  • Moderately common
  • Slightly common
  • Neither common nor uncommon
  • Slightly uncommon
  • Moderately uncommon
  • Extremely uncommon

In your opinion, how common or uncommon is your LAST name?

  • Extremely common
  • Moderately common
  • Slightly common
  • Neither common nor uncommon
  • Slightly uncommon
  • Moderately uncommon
  • Extremely uncommon

2.4.3 Characteristics of respondents’ usernames, and suggested new username

Please imagine that you are creating a new email account on a brand new email service that currently has very few users, and you can have any email username that you want. What username would you choose? Please enter it below: [fill in the blank]

Username length (nchars), and whether usernames have digits or special characters:

variable Min Median Max M SD
username_parsed_nchars 3 11.0 32 11.57 4.73
new_username_parsed_nchars 2 9.5 25 9.96 3.85
username_digits 0 1.0 1 0.52 0.50
new_username_digits 0 0.0 1 0.42 0.49
username_specials 0 0.0 1 0.11 0.31
new_username_specials 0 0.0 1 0.06 0.23

2.4.4 Why did people say they’d choose a particular username?

Note: the text in this section describes the content analysis of respondents’ reasons for choosing their usernames. The survey question is presented below. The remaining text in this section was not part of the survey.

Survey question: Please explain why you would choose the username “${choose username/ChoiceTextEntryValue}” if you were creating an account on a brand new email service that currently has very few users? Your answer must be at least 100 characters long, which is about 2-3 sentences. [fill in the blank]

We made a first pass through the responses and developed a set of categories of reasons why they would choose a particular username. These “reasons” reflect concerns they had, potential future uses of their email account, and characteristics they wanted their username to have. Then, two coders coded the responses using these categories.

Below are the codes, and the inter-rater reliability (Fleiss’ kappa):

Name and Birthdate

  • Own Name: Their own name (kappa = 0.91)
  • Own Birthdate: Their own birth date, year, etc. (kappa = 0.91)
  • Own Nickname: Their own nickname (kappa = 0.91)

Life Characteristics

  • Friend Name: The name of a friend or family member (kappa = 0.59)
  • Location: A location, neighborhood, zip code, phone number (kappa = 0.87)
  • Proper Noun: A proper noun that is the name of something (like a pet, fictional character, sports team or band, etc.) (kappa = 0.55)

Personal Meaning

  • Meaningful: Some kind of personal meaning (like about their life, activities, interests or personality) (kappa = 0.53)
  • Fits Me: I just like it, it just fits me, it just came to mind, etc. (kappa = 0.49)
  • Catchy: It’s catchy, creative, fun, etc. (kappa = 0.72)
  • Unique: It’s unique, uncommon, unusual, unlikely, etc. (kappa = 0.77)

Future Uses

  • Memorable: Easy to recognize or remember (kappa = 0.81)
  • Same ad Before: It’s the same username as they used in the past, or on other systems (kappa = 0.7)
  • Professional: Professional or business related (kappa = 0.55)
  • Security: Mentions privacy, identity theft, hacking, anonymity, spammers (kappa = 0.79)

None of the above (mutually exclusive) (kappa = 0.43)

The table and graph below show counts for each of the codes which had inter-rater reliability above 0.5, and on which either one of the coders said yes, that motivation was present.

code n
Memorable 198
Own Name 114
Meaningful 112
Unique 65
Same as Before 56
Professional 39
Proper Noun 34
Security 27
Own Birthdate 27
Own Nickname 27
Catchy 19
Friend Name 14
Location 9

The categories were not mutually exclusive, except where indicated in the list of categories, above (fake response or none of the above). The categories were further grouped into four high-level sets of categories as shown in the bar chart. The tables below present counts of how many distinct respondents gave reasons that fell into each category.

Future Uses n
TRUE 238
FALSE 142
Name and Birthdate n
TRUE 144
FALSE 236
Life Characteristics n
TRUE 56
FALSE 324
Personal Meaning n
TRUE 171
FALSE 209
Name and Birthdate, Personal Meaning n
TRUE 307
FALSE 73

2.4.5 What respondents consider when creating a new username

What is the most important thing for you to consider when creating a new email username? Please drag the following options to put them in order according to how important they would be for you:

  • My new username should be easy for others to remember
  • My new username should be similar to my real name
  • My new username should be the same as my username on other accounts
  • My new username should be unique compared to other people’s email usernames
  • My new username should represent some aspect of my interests or personality
  • My new username should sound professional
  • My new username should be hard for spammers to guess
Question Min Median Max M SD
My new username should be hard for spammers to guess 1 4 7 4.1 2.0
My new username should sound professional 1 5 7 4.5 2.0
My new username should be similar to my real name 1 4 7 3.9 2.0
My new username should be easy for others to remember 1 4 7 3.7 1.9
My new username should represent some aspect of my interests or personality 1 4 7 3.9 2.0
My new username should be the same as my username on other accounts 1 4 7 4.3 2.0
My new username should be unique compared to other people's email usernames 1 3 7 3.6 2.0

Bar charts of the ranks assigned to each item:

2.5 Misdirected Email Block

2.5.1 Questions about prevalence of misdirected email

The response items in the question below are our speculations based on piloting our interview protocol about possible symptoms of misdirected email, and reasons why misdirected email may happen. These were also screening questions for the interview study. Respondents were asked, “Which of the following statements describe you?” and instructed to select all that apply.

Which of the following statements describe you? Please check all that apply:

  • I have received an email message that seemed like it was intended for someone else
  • I have been asked in an email to confirm an account that I don’t remember creating
  • I have sent an email message to the wrong person by mistake
  • I have given out a “throwaway” email address that was fake or did not belong to me to a website, store, or restaurant, or in exchange for a service like free wifi
  • I have used a “throwaway” email address that was fake or did not belong to me after being asked to sign up for an online account, mailing list, or other online service
  • None of the above
Response n percent
None of the above 152 28
I have received an email message that seemed like it was intended for someone else 104 19
I have been asked in an email to confirm an account that I don’t remember creating 103 19
I have sent an email message to the wrong person by mistake 89 16
I have used a 'throwaway' email address that was fake or did not belong to me to sign up for an online account 50 9
I have given out a 'throwaway' email address that was fake or did not belong to me to a website... 47 9

2.5.1.1 I have received an email message that seemed like it was intended for someone else

Display if “I have received an email message that seemed like it was intended for someone else” was selected:
When was the last time you received an email message that seemed like it was intended for someone else?

  • Today
  • Within the past few days
  • Within the past week
  • Within the past month
  • More than a month ago
  • I’m not sure

How often do you receive email messages that seem like they are intended for someone else?

  • Several times per day
  • About once per day
  • A few times per week
  • About once per week
  • About once per month
  • Less than once per month
  • I’m not sure

2.5.1.2 I have been asked in an email to confirm an account that I don’t remember creating

Display if “I have been asked in an email to confirm an account that I don’t remember creating” was selected:
When was the last time you remember being asked in an email to confirm an account that you didn’t remember creating?

  • Today
  • Within the past few days
  • Within the past week
  • Within the past month
  • More than a month ago
  • I’m not sure

How often are you asked in email to confirm an account that you don’t remember creating?

  • Several times per day
  • About once per day
  • A few times per week
  • About once per week
  • About once per month
  • Less than once per month
  • I’m not sure

How many distinct respondents answered yes to the two misdirected email questions (“I have received…” and “I have been asked…”)?

Received Misdirected Email n
TRUE 164
FALSE 216

2.5.1.3 I have given out a “throwaway” email address that was fake or did not belong to me to a website, store, or restaurant, or in exchange for a service like free wifi

Display if “I have given out a ‘throwaway’ email address that was fake or did not belong to me to a website, store, or restaurant, or in exchange for a service like free wifi” was selected:
When was the last time you gave out a “throwaway” email address that was fake or did not belong to you to a website, store, or restaurant, or in exchange for a service like free wifi?

  • Today
  • Within the past few days
  • Within the past week
  • Within the past month
  • More than a month ago
  • I’m not sure

How often have you given out a “throwaway” email address that was fake or did not belong to you to a website, store, or restaurant, or in exchange for a service like free wifi?

  • Several times per day
  • About once per day
  • A few times per week
  • About once per week
  • About once per month
  • Less than once per month
  • I’m not sure

2.5.1.4 I have used a “throwaway” email address that was fake or did not belong to me after being asked to sign up for an online account, mailing list, or other online service

Display if “I have used a”throwaway" email address that was fake or did not belong to me after being asked to sign up for an online account, mailing list, or other online service" was selected:
When was the last time you remember using a “throwaway” email address that was fake or did not belong to you when you were asked to sign up for an online account, mailing list, or other online service?

  • Today
  • Within the past few days
  • Within the past week
  • Within the past month
  • More than a month ago
  • I’m not sure

How often have you used a “throwaway” email address that was fake or did not belong to you when signing up for an online account, mailing list, or other online service?

  • Several times per day
  • About once per day
  • A few times per week
  • About once per week
  • About once per month
  • Less than once per month
  • I’m not sure

How many distinct respondents answered yes to the two “throwaway email address” questions (“I have used…” and “I have given out…”)?

Given out throwaway address n
TRUE 69
FALSE 311

2.5.1.5 I have sent an email message to the wrong person by mistake

Display if “I have sent an email message to the wrong person by mistake” was selected:
When was the last time you sent an email message to the wrong person by mistake?

  • Today
  • Within the past few days
  • Within the past week
  • Within the past month
  • More than a month ago
  • I’m not sure

How often do you send email messages to the wrong person by mistake?

  • Several times per day
  • About once per day
  • A few times per week
  • About once per week
  • About once per month
  • Less than once per month
  • I’m not sure

2.5.2 Have you ever received a “misdirected email”?

Display if “I have received an email message that seemed like it was intended for someone else” was selected:
We use the phrase “misdirected emails” to refer to email messages that are not spam, but are authentic email messages that just seem like they were meant for someone else. Have you ever received a “misdirected email”?

  • Yes, I have received a “misdirected email”
  • No, I have not received a “misdirected email”
  • I’m not sure
Received Misdirected Email n
Yes 54
No 28
I'm not sure 22
NA 276

2.5.3 Senders of misdirected email

Display if Yes, I have received a misdirected email was selected:
Who have you received “misdirected emails” from? Please select all that apply:

  • Someone I know personally
  • A person I don’t know who is from an organization I belong to, like work, school, or a volunteer group
  • Someone who is a complete stranger
  • A business, bank, online store, or other organization
  • Other: (please fill in the blank)
  • None of the above
Sender of misdirected email message is... n
Someone who is a complete stranger 28
A business, bank, online store, or other organization 19
A person I don't know who is from an organization I belong to, like work, school, or a volunteer group 13
Someone I know personally 10
None of the above 1

2.5.4 Attention check question

Note: this question was used as an attention check question. If the usernames did not match, the respondent was excluded, and the following message was displayed: “You are seeing this message because you chose an incorrect answer to a question designed to ensure you are reading every question carefully. This means that you cannot complete the rest of the survey. If you have any questions or concerns, please contact Dr. Emilee Rader at emilee@msu.edu.”

In an earlier question, you were asked to enter your first name, last name, and ONLY the username (the part before the @ sign) of your email account from a popular free email service provider like Gmail, Outlook Mail or Hotmail, Yahoo! Mail, or AOL Mail. Please enter that same Email Username again below (be sure not to include any extra spaces or characters): [fill in the blank]

2.5.5 Types of misdirected email

Display if Yes, I have received a misdirected email was selected:
Below are different types of “misdirected emails” that you may have received. Please select all of the types of “misdirected emails” that you remember receiving in the past:

  • Email from a children’s website asking for parental consent, for a child that you don’t know
  • Email containing a statement or bill from an account that does not belong to you
  • Email from someone you know in real life that was sent to you by mistake
  • Account activation, registration or confirmation email for something you did not sign up for
  • An email that contains a personal message meant for someone else
  • Email related to an online dating profile that you did not create
  • Email about a password reset or account recovery that you did not initiate
  • Email reminder for an appointment or reservation that you did not create
  • An email purchase confirmation or receipt for something you did not buy
  • Other (please fill in the blank)
  • None of the above
Type of misdirected email message n
An email that contains a personal message meant for someone else 26
Account activation, registration or confirmation email for something you did not sign up for 18
Email related to an online dating profile that you did not create 15
Email from someone you know in real life that was sent to you by mistake 12
Email containing a statement or bill from an account that does not belong to you 11
An email purchase confirmation or receipt for something you did not buy 10
Email about a password reset or account recovery that you did not initiate 9
Email reminder for an appointment or reservation that you did not create 7
Email from a children's website asking for parental consent, for a child that you don't know 5
Other misdirected email 3
None of the above 2

Display if Yes, I have received a misdirected email was selected:
Please briefly describe one example of a “misdirected email” that you have received in the past. Your answer must be at least 150 characters long, which is about three sentences. [fill in the blank]

2.6 Demographics Block

The descriptive statistics for these questions are included in the Respondent Demographics section of this document. The text of the questions are included below for reference.

Please rate your understanding of each term below from None (no understanding) to Full (full understanding): [None, Little, Some, Good, Full] Note: “filtibly” below is a fake word used as an attention check; respondents were excluded in data cleaning phase of analysis if they answered “Good” or “Full” familiarity for this made-up word.

  • Wiki
  • Meme
  • Phishing
  • Bookmark
  • Cache
  • SSL
  • AJAX
  • RSS
  • Filtibly

What is the last grade or class you completed in school?

  • None, or grades 1-8
  • Some high school
  • High school graduate or GED certificate
  • Technical, trade, or vocational school AFTER high school
  • Some college, no 4-year degree
  • 4-year college degree
  • Some postgraduate or professional schooling, no postgraduate degree
  • Postgraduate or professional degree, including master’s, doctorate, medical or law degree

What is your current employment status?

  • Employed full time
  • Employed part time
  • Unemployed looking for work
  • Unemployed not looking for work
  • Retired
  • Student
  • Disabled

What was your total household income before taxes during the past 12 months?

  • Less than $25,000
  • $25,000 to $34,999
  • $35,000 to $49,999
  • $50,000 to $74,999
  • $75,000 to $99,999
  • $100,000 to $149,999
  • $150,000 to $199,999
  • $200,000 or more

Which categories below best describe you? Select all that apply:

  • White
  • Hispanic, Latino or Spanish
  • Black or African American
  • Asian
  • American Indian or Alaska Native
  • Middle Eastern or North African
  • Native Hawaiian or Other Pacific Islander
  • Some Other Race, Ethnicity or Origin (please specify)

Which region of the country do you live in?

  • New England - Connecticut, Maine, Massachusetts, New Hampshire, Rhode Island, Vermont
  • Middle Atlantic - New Jersey, New York, Pennsylvania
  • East North Central - Illinois, Indiana, Michigan, Ohio, Wisconsin
  • West North Central - Iowa, Kansas, Minnesota, Missouri, Nebraska, North Dakota, South Dakota
  • South Atlantic - Delaware, District of Columbia, Florida, Georgia, Maryland, North Carolina, South Carolina, Virginia, West Virginia
  • East South Central - Alabama, Kentucky, Mississippi, Tennessee
  • West South Central - Arkansas, Louisiana, Oklahoma, Texas
  • Mountain - Arizona, Colorado, Idaho, Montana, Nevada, New Mexico, Utah, Wyoming
  • Pacific - Alaska, California, Hawaii, Oregon, Washington
  • Other region (please specify)

3 Interviews Overview

3.1 Participant Descriptives

We conducted 22 semi-structured interviews during October 2017.

Participants were recruited in two ways. 12 participants (7 women and 5 men) were recruited via snowball sampling starting from a study advertisement on Facebook. 10 (5 women and 5 men) came from a paid subject pool consisting of members of the community surrounding Michigan State University. 3 participants were affiliated in some way with the university.

The average age of participants was 36.82 years (minimum: 23, maximum: 63). This study was approved as exempt by the university’s institutional review board.

The interviews ranged from about 14 to 49 minutes (average 28 min) and took place over the phone so that we could recruit a more geographically diverse sample. Interview length varied based on how many examples of misdirected email each participant mentioned.

The data from which the numbers in this document were generated came from participants’ end-of-interview questionnaires, and from things they said during the interview. For example, the number of email accounts they used came from being asked during the interview to list the different email accounts they used, and what they said was subsequently coded and then entered in NVivo as a case attribute.

Participant Age Descriptives
Min 23
Median 34
MaxAge 63
MeanAge 37
StDevAge 11
Interview Duration Descriptives (minutes)
Min 13.8
Median 26.6
Max 49.3
Mean 28.3
StDev 9.7
Email Accounts Per Participant
Min 1.0
Median 3.0
Max 9.0
Mean 3.2
StDev 1.6

3.2 Types of misdirected email per participant

This is a heatmap of the types of misdirected email mentioned, by participant. The categories were determined in an inductive fashion during the interview analysis phase of the project. The horizontal lines delineate four groups of participants with similar patterns of receiving misdirected email, based on the number and diversity of the different types of misdirected email they mentioned in the interviews.

4 Interview Protocol

We used a semi-structured interview method. This means that the interview protocol is a guide, not a script to be followed. The interviews touched on all aspects of the protocol, and the sections of the interview took place roughly in the order presented below. However, the questions were not necessarily asked verbatim, not all of the questions were asked of every participant, and follow-up questions/probes were used extensively.

4.1 Interview Questions

Questions about general email use (warm-up):

I’d like to start the interview by getting to know a little bit about the how you use email in general.

The first thing I would like to do is to have you think about all the different email addresses or accounts that you have, that you can remember, and just list them for me off the top of your head – you don’t need to go look them up.

Which email account(s) do you use most? How long have you had those accounts? How often do you check your email? When was the last time you checked your mail from those accounts?

Tell me about your process the last time you checked your mail before now – where were you? What device did you use? What did you do first? Then what?

Questions about spam:

Next, I have some general questions about spam email. What kinds of emails does the word “spam” bring to mind for you?

If I showed you a bunch of emails, what would you look for to help you decide if a message is spam or not?

Can you think of a specific example of a spam message that you’ve received recently? Describe it. What is it about this message that makes it “spam”?

Questions about receiving misdirected email:

Next, I want to talk about emails that you may receive, that may or may not seem like spam to you. [this depends on what the person said about spam]

The best way I can describe this is, these emails seem like the person who sent them intended for them to go to someone who is not you. They could come from someone you already know, or from a complete stranger, or from a business or website you have never been to. But the key thing is these are legitimate emails, but they just seem like they are meant for someone else.

Can you think of an example where you have received a mail like this? [if they can’t think of an example, review what they said had happened to them, from the screening questionnaire, skip to that part of the interview protocol instead. “You said in the screening questionnaire that… tell me about that…”]

Tell me more about that. Can you find the email now? Describe it. What was it about, who was it from, how long ago? What did you do after you received the email? Etc.

Can you think of another example? Tell me about it. [Keep going if they have lots of examples, up to about 5-6 examples.]

Sometimes people tell us that they’ve received an email asking them to confirm a new account that they don’t remember creating. If this has happened to you, can you tell us about it? Can you find the email now? Describe it. What was it about, who was it from, how long ago? What did you do after you received the email?

Have you ever tried to create an account on a website, but you couldn’t because it said your email address was already being used on another account? Tell me more about that. When did this happen? What website was it? What did you do next?

What other examples can you think of that are similar to what we’ve been talking about? Which ones stand out most in your mind? Tell me more about that, etc.

Why do you think these kinds of things happen? What do you think you could do to prevent this?

Questions about reasons/causes for receiving unwanted email:

Can you think of a time when you sent an email to the wrong person by mistake? Tell me about that time. What was the email about? Who did you mean to send it to? How did it end up going to the wrong person? How did you realize what happened? What happened next?

Have you ever made up an email address, or given out someone else’s email address, when some person or website asked you for an email address? When was the last time this happened? How did you decide what email address to give out? What happened next?

Ask if the participant has any questions:

If the participant has asked any questions about the study or about how email works, now is the time to answer them. If you don’t know the answer, write it down and tell them Dr. Rader will get back to them.

Final Online Questionnaire:

We’re almost done. I just have a very short online questionnaire with a few basic demographic questions for you to fill out. The last page of the questionnaire will ask you for the email address you would like us to use to send you your $15 Amazon.com gift card. As soon as you submit the questionnaire, Dr. Rader will be notified, and she will go to Amazon to purchase and send you the gift card.

4.2 End of Interview Questionnaire

This questionnaire was completed by each participant after the interview, mainly as a way to collect the email address where they wanted the study incentive sent.

  1. Participant ID number [Fill in the blank, given to the subject by the interviewer at the end of the interview]
  2. What is your primary occupation? [Fill in the blank]
  3. How old are you? [Fill in the blank]
  4. What is your gender? [Fill in the blank]
  5. In what city and state do you currently live? [Fill in the blank]
  6. How did you hear about this study? [Fill in the blank]

After completing the above questions, participants were automatically redirected to a separate survey so their name and email address will not be associated with the questionnaire data.

Thank you for participating! Please enter your name below, along with the email address where you want to receive the $15 Amazon gift card. This information is being gathered separately from the questions you just answered. We are doing this so your survey responses cannot be associated with any information that could identify you.

After you submit this information, the researchers will be notified, and Dr. Emilee Rader will go to Amazon.com to purchase the gift card and send it to the email address you provide. If you do not receive a gift card within 24 hours, please email us at wrong.email@bitlab.cas.msu.edu

Your Name: [Fill in the blank, required]
Your email address: [Fill in the blank, required]

LS0tCnRpdGxlOiBTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIGZvciAiV2FpdCwgRG8gSSBLbm93IFRoaXMgUGVyc29uPyIgVW5kZXJzdGFuZGluZyBNaXNkaXJlY3RlZCBFbWFpbApkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCkpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKPCEtLSB0aGUgc3R5bGUgY29kZSBiZWxvdyBjaGFuZ2VzIHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSBybWFya2Rvd24gb3V0cHV0LCBhbmQgYWRkcyB3aGl0ZXNwYWNlIGJlbG93IHVub3JkZXJlZCBsaXN0IGl0ZW1zIC0tPgo8c3R5bGU+CiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LXdpZHRoOiAxNTAwcHg7CiAgICB9CiAgICBsaSA+IHVsIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMC41ZW07CiAgICB9Cjwvc3R5bGU+CgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShpcnIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQoKb3B0aW9ucyhkaWdpdHM9MikKCiMgbG9hZCB0aGUgZGF0YQpzb3VyY2UoImRhdGFfc2V0dXAuUiIpCgojIGxvYWQgZnVuY3Rpb24gdG8gdHJhbnNwb3NlIGEgZGF0YSBmcmFtZSwgZm91bmQgaGVyZToKIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc5MDIxOS9ob3ctZG8taS10cmFuc3Bvc2UtYS10aWJibGUtaW4tci80Mjc5MTE3Nwp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsKICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikKICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikKICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikKICB0X2RmIDwtIHRfZGYgJT4lCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbihkZiA9IC4pICU+JQogICAgdGliYmxlOjphc19kYXRhX2ZyYW1lKHggPSAuKQogIHJldHVybih0X2RmKQp9CmBgYAoKRW1pbGVlIFJhZGVyIGFuZCBBbmphbGkgTXVuYXNpbmdoZS4gIldhaXQsIERvIEkgS25vdyBUaGlzIFBlcnNvbj8iOiBVbmRlcnN0YW5kaW5nIE1pc2RpcmVjdGVkIEVtYWlsLiAqQ0hJIDIwMTkqLCBHbGFzZ293LCBVSywgTWF5IDIwMTkuIERPSTogWzEwLjExNDUvMzI5MDYwNS4zMzAwNTIwXShodHRwOi8vZHguZG9pLm9yZy8xMC4xMTQ1LzMyOTA2MDUuMzMwMDUyMCkKCgojIFN1cnZleSBPdmVydmlldwoKIyMgRGF0YSBDb2xsZWN0aW9uCgojIyMgV2hlbiBkaWQgdGhlIHN1cnZleSB0YWtlIHBsYWNlPwoKRGF0YSBjb2xsZWN0aW9uIGZvciB0aGUgc3VydmV5IHRvb2sgcGxhY2Ugc3RhcnRpbmcgb24gYHIgbWluKGRhdGUoZCRTdGFydERhdGUpKWAgYW5kIGVuZGluZyBvbiBgciBtYXgoZGF0ZShkJFN0YXJ0RGF0ZSkpYC4KCiMjIyBIb3cgbWFueSByZXNwb25zZXMgd2VyZSBjb2xsZWN0ZWQ/CgpUaGUgc3VydmV5IHdhcyBzdGFydGVkIGJ5IGByIGxlbmd0aChkJFJlc3BvbnNlSUQpICsgbGVuZ3RoKGQuZXhjbHVkZWQkUmVzcG9uc2VJRClgIHBvdGVudGlhbCByZXNwb25kZW50cy4gQWZ0ZXIgZGF0YSBjbGVhbmluZywgdGhlcmUgd2VyZSBgciBsZW5ndGgoZCRSZXNwb25zZUlEKWAgcmVzcG9uZGVudHMgaW4gdGhlIGRhdGFzZXQuIAoKIyMjIEhvdyBsb25nIGRpZCBpdCB0YWtlIHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXk/CgoKVGhlIHN1cnZleSB0b29rIGFuIGF2ZXJhZ2Ugb2YgYHIgbWVhbihkJER1cmF0aW9uLzYwKWAgbWludXRlcyBmb3IgcmVzcG9uZGVudHMgdG8gY29tcGxldGUsIGluY2x1ZGluZyB0aGUgY29uc2VudCBhbmQgc2NyZWVuaW5nIHF1ZXN0aW9ucy4gVGhlIG1heGltdW0gY29tcGxldGlvbiB0aW1lIHdhcyBgciBtYXgoZCREdXJhdGlvbi82MClgIG1pbnV0ZXMsIGFuZCB0aGUgbWluaW11bSB3YXMgYHIgbWluKGQkRHVyYXRpb24vNjApYCBtaW51dGVzLiBSZXNwb25kZW50cyBoYWQgMjQgaG91cnMgZnJvbSB0aGUgdGltZSB0aGV5IGJlZ2FuIHRoZSBjb25zZW50IGZvcm0gdG8gY29tcGxldGUgdGhlIHN1cnZleSwgYW5kIHdlcmUgdG9sZCB0aGlzIGluIHRoZSBpbnN0cnVjdGlvbnMuCmBgYHtyIGR1cmF0aW9uIGRlc2NyaXB0aXZlcywgZWNobz1GQUxTRX0KIyBob3cgbG9uZyBkaWQgdGhlIHN1cnZleSB0YWtlIHRvIGNvbXBsZXRlPyBEdXJhdGlvbgprYWJsZSh0cmFuc3Bvc2VfZGYoZCAlPiUgc3VtbWFyaXplKE1pbj1taW4oRHVyYXRpb24vNjAsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE1lZGlhbj1tZWRpYW4oRHVyYXRpb24vNjAsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE1heD1tYXgoRHVyYXRpb24vNjAsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE09bWVhbihEdXJhdGlvbi82MCwgbmEucm09VCksIAogICAgICAgICAgICAgICAgU0Q9c2QoRHVyYXRpb24vNjAsIG5hLnJtPVQpKSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoYENvbXBsZXRpb24gVGltZSBEZXNjcmlwdGl2ZXMgKGluIG1pbnV0ZXMpYCA9IHJvd25hbWUsIGAgYD1gMWApKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKQpgYGAKCgpgYGB7ciBkdXJhdGlvbiBoaXN0b2dyYW0sIGVjaG89RkFMU0V9CmQgJT4lIGdncGxvdChhZXMoeD1EdXJhdGlvbi82MCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MSkgKyAjIGJpbndpZHRoIGlzIDEgbWludXRlCiAgbGFicyh0aXRsZT0iSGlzdG9ncmFtIG9mIHN0dWR5IGNvbXBsZXRpb24gdGltZXMgaW4gbWludXRlcyIsIAogICAgICAgc3VidGl0bGU9IihtZWRpYW4gPSBkb3R0ZWQgbGluZSwgbWVhbiA9IHNvbGlkIGxpbmUpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKyAKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArIAogICMgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgNjUsIDUpKSArIAogICMgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMjUsIDUpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVhbigoZCREdXJhdGlvbikvNjApLCBjb2xvcj0icmVkIiwgc2l6ZT0xKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbigoZCREdXJhdGlvbikvNjApLCBjb2xvcj0icmVkIiwgbGluZXR5cGU9ImRvdHRlZCIsIHNpemU9MSkKYGBgCgoKIyMgU2FtcGxlCgojIyMgSG93IG1hbnkgcmVzcG9uZGVudHMgd2VyZSBpbmVsaWdpYmxlIHZzLiBleGNsdWRlZD8KClJlc3BvbmRlbnRzIHdlcmUgcmVjcnVpdGVkIGJ5IFF1YWx0cmljcyB1c2luZyB0aGVpciBwYW5lbCBzZXJ2aWNlLCB3aXRoIHF1b3RhcyBmb3IgZ2VuZGVyICg1MCUgbWVuIGFuZCA1MCUgd29tZW4pIGFuZCBhZ2UgKDE4LTI5OiAyNSUsIDMwLTQ5OiAzOCUsIDUwLTY0OiAyMSUsIDY1KzogMTUlKS4gVGhlIGFnZSBxdW90YSB3YXMgYmFzZWQgb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgUGV3IFJlc2VhcmNoIENlbnRlcidzIFtJbnRlcm5ldC9Ccm9hZGJhbmQgRmFjdCBTaGVldCBmcm9tIEZlYi4gNSwgMjAxOF0oaHR0cDovL3d3dy5wZXdpbnRlcm5ldC5vcmcvZmFjdC1zaGVldC9pbnRlcm5ldC1icm9hZGJhbmQvKSBhYm91dCB0aGUgYWdlIGRpc3RyaWJ1dGlvbiBvZiBVUyBhZHVsdHMgd2hvIHVzZSB0aGUgaW50ZXJuZXQsIGFuZCBkYXRhIGZyb20gdGhlIFtVUyBDZW5zdXMgQnVyZWF1J3MgMjAxNiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5XShodHRwczovL2NlbnN1c3JlcG9ydGVyLm9yZy9wcm9maWxlcy8wMTAwMFVTLXVuaXRlZC1zdGF0ZXMvKSBhYm91dCB0aGUgYWdlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgVW5pdGVkIFN0YXRlcyBwb3B1bGF0aW9uLiAKClRoZSBQZXcgcmVzdWx0cyB0ZWxsIHVzIHdoYXQgcHJvcG9ydGlvbiBvZiBkaWZmZXJlbnQgYWdlIGdyb3VwcyB1c2UgdGhlIGludGVybmV0IChlLmcuLCA2NiUgb2YgVVMgYWR1bHRzIHdobyBhcmUgNjUrIGFyZSBpbnRlcm5ldCB1c2VycykuIEJ1dCB0aGF0IGRvZXNuJ3QgdGVsbCB1cyBob3cgbWFueSBwZW9wbGUgaW4gdGhlIFVTIGFyZSA2NSsgeWVhcnMgb2xkLCBzbyB3ZSBjYW4ndCBjYWxjdWxhdGUgd2hhdCBwcm9wb3J0aW9uIG9mIG91ciByZXNwb25kZW50cyBzaG91bGQgYmUgNjUrIGp1c3QgdXNpbmcgdGhlIFBldyBkYXRhLiBGcm9tIHRoZSBDZW5zdXMgQUNTIGRhdGEsIHdlIGtub3cgdGhhdCBpbiAyMDE2LCB0aGUgbW9zdCByZWNlbnQgeWVhciBmb3Igd2hpY2ggZGF0YSBoYWQgYmVlbiBwdWJsaXNoZWQgYXQgdGhlIHRpbWUgdGhpcyByZXNlYXJjaCB3YXMgY29uZHVjdGVkLCAxNSUgb2YgdGhlIFVTIHBvcHVsYXRpb24gaXMgNjUrLiBTbyBub3cgd2Uga25vdyB0aGF0IDY2JSBvZiB0aGUgMTUlIG9mIHRoZSBVUyBwb3B1bGF0aW9uIHdobyBhcmUgNjUrIHVzZSB0aGUgaW50ZXJuZXQuIFRoZSBBQ1MgYWxzbyBpbmNsdWRlcyB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGVyZSBhcmUgYWJvdXQgMzIzLDEyNyw1MTUgcGVvcGxlIGluIHRoZSBVUywgc28gdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBib3RoIHNvdXJjZXMgd2UgY2FuIGNhbGN1bGF0ZSByZWFzb25hYmxlIHRhcmdldCBwZXJjZW50YWdlcyBmb3Igc3VydmV5IHJlY3J1aXRpbmcuCgpFbGlnaWJsZSByZXNwb25kZW50cyBhbHNvIHdlcmUgb2xkZXIgdGhhbiAxOCBhbmQgeW91bmdlciB0aGFuIDEyMCB5ZWFycyBvbGQsIGFuZCBpbmRpY2F0ZWQgdGhhdCB0aGV5IGhhZCBhdCBsZWFzdCBvbmUgZW1haWwgYWNjb3VudCBvbiBhIHBvcHVsYXIgZnJlZSBlbWFpbCBzZXJ2aWNlLiBUaGUgdGV4dCBvZiB0aGUgcXVlc3Rpb24gd2FzLCAiRG8geW91IGN1cnJlbnRseSByZWd1bGFybHkgdXNlIGF0IGxlYXN0IG9uZSBlbWFpbCBhY2NvdW50IGZyb20gYSBwb3B1bGFyIGZyZWUgZW1haWwgc2VydmljZSBwcm92aWRlciBsaWtlIEdtYWlsLCBPdXRsb29rIE1haWwgb3IgSG90bWFpbCwgWWFob28hIE1haWwsIEFPTCBNYWlsLCBldGMuPyIKClJlc3BvbmRlbnRzIHdobyBkaWQgbm90IGNvbnNlbnQgYW5kIHdobyBkaWQgbm90IG1lZXQgdGhlIGFnZSwgZ2VuZGVyLCBhbmQgZW1haWwgYWNjb3VudCBzY3JlZW5pbmcgY3JpdGVyaWEgd2VyZSBleGNsdWRlZCBhZnRlciBkZWNsaW5pbmcgY29uc2VudCBvciBhZnRlciBwcm92aWRpbmcgYW4gaW5lbGlnaWJsZSBhbnN3ZXIgdG8gb25lIG9mIHRoZSBzY3JlZW5pbmcgcXVlc3Rpb25zLgoKCiMjIyBGb3Igd2hhdCByZWFzb25zIHdlcmUgZWxpZ2libGUgcmVzcG9uZGVudHMgZXhjbHVkZWQ/CgotICoqZHVwbGljYXRlIG5hbWUgYW5kIElQIGFkZHJlc3MqKjogRHVyaW5nIGRhdGEgY2xlYW5pbmcsIHdlIGRpc2NvdmVyZWQgdGhhdCB0d28gcmVzcG9uZGVudHMgaGFkIHRha2VuIHRoZSBzdXJ2ZXkgbXVsdGlwbGUgdGltZXMsIGJhc2VkIG9uIHRoZSBJUCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGVpciByZXNwb25zZXMsIHRoZSBmaXJzdCBhbmQgbGFzdCBuYW1lcyB0aGV5IHByb3ZpZGVkLCBhbmQgdGhlaXIgYW5zd2VycyB0byBkZW1vZ3JhcGhpYyBxdWVzdGlvbnMgYmVpbmcgZHVwbGljYXRlZCBhY3Jvc3MgbXVsdGlwbGUgY29tcGxldGVkIHN1cnZleXMuIFdlIGtlcHQgdGhlIGZpcnN0IGNvbXBsZXRlZCBzdXJ2ZXkgZnJvbSBlYWNoIHJlc3BvbmRlbnQgaW4gdGhlIGRhdGFzZXQsIGFuZCByZW1vdmVkIHRoZSBkdXBsaWNhdGVzLgoKLSAqKmZhaWxlZCBhdHRlbnRpb24gY2hlY2sgb3IgZmluaXNoZWQgdG9vIHF1aWNrbHkqKjogVGhlIHN1cnZleSBpbmNsdWRlZCBhbiBhdHRlbnRpb24gY2hlY2sgcXVlc3Rpb24gYW5kIGEgY2hlY2sgZm9yIGZpbmlzaGluZyB0aGUgc3VydmV5IHRvbyBxdWlja2x5LiBUaGUgY2hlY2sgZm9yICJzcGVlZGluZyIgZXhjbHVkZWQgcmVzcG9uc2VzIGZyb20gcmVzcG9uZGVudHMgd2hvIGZpbmlzaGVkIHRoZSBzdXJ2ZXkgaW4gMS8zIHRoZSBtZWRpYW4gdGltZSB0byBjb21wbGV0ZSwgYmFzZWQgb24gdGhlICJzb2Z0IGxhdW5jaCIgb2YgdGhlIHN1cnZleS4gVGhpcyB3b3JrcyBvdXQgdG8gYHIgYXMubnVtZXJpYyhkICU+JSBmaWx0ZXIoU3RhcnREYXRlIDwgIjIwMTgtMDMtMjYgMjM6MzE6NDciKSAlPiUgc3VtbWFyaXplKG1lZGlhbihEdXJhdGlvbi82MCkgKiAuMzMpKWAgbWludXRlcy4gVGhlIGF0dGVudGlvbiBjaGVjayBjb25zaXN0ZWQgb2YgYXNraW5nIHJlc3BvbmRlbnRzIGZvciB0aGVpciB1c2VybmFtZSAob25seSB0aGUgcGFydCBiZWZvcmUgdGhlIEAgc2lnbikgZnJvbSB0aGVpciBlbWFpbCBhZGRyZXNzIG9uIGEgcG9wdWxhciBmcmVlIGVtYWlsIHNlcnZpY2UsIGFuZCB0aGVuIGFza2luZyBhZ2FpbiBmb3IgdGhlIHNhbWUgdXNlcm5hbWUgbGF0ZXIgaW4gdGhlIHN1cnZleS4gSWYgdGhlc2UgZGlkIG5vdCBtYXRjaCwgdGhleSB3ZXJlIGRpcmVjdGVkIHRvIHRoZSBlbmQgb2YgdGhlIHN1cnZleSB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gZmluaXNoIGl0LiBSZXNwb25kZW50cyB3ZXJlIHRvbGQgaW4gdGhlIGNvbnNlbnQgZm9ybSBhbmQgaW5zdHJ1Y3Rpb25zIHRoYXQgdGhlcmUgd291bGQgYmUgInF1ZXN0aW9ucyBhbmQgb3RoZXIgbWV0aG9kcyBkZXNpZ25lZCB0byBlbnN1cmUgeW91IGFyZSBwYXlpbmcgYXR0ZW50aW9uIi4gQW5kLCB0aGUgZmlyc3QgdGltZSB0aGV5IGVudGVyZWQgdGhlaXIgdXNlcm5hbWUsIHRoZXkgd2VyZSBhc2tlZCB0byBlbnRlciBpdCBhbmQgdGhlbiByZS1lbnRlciBpdCwgYW5kIHdlcmVuJ3QgYWxsb3dlZCB0byBwcm9jZWVkIHVudGlsIHRoZSB1c2VybmFtZXMgbWF0Y2hlZCwgdG8gZW5zdXJlIHRoYXQgcGVvcGxlIHdlcmVuJ3Qga2lja2VkIG91dCBvZiB0aGUgc3VydmV5IGR1ZSB0byBhIHR5cG8gaW4gdGhlIHVzZXJuYW1lLgoKLSAqKnBvb3IgcXVhbGl0eSBuYW1lIG9yIHVzZXJuYW1lKio6IFRoZSBzdXJ2ZXkgaW5jbHVkZWQgYSBxdWVzdGlvbiBhc2tpbmcgcGFydGljcGFudHMgdG8gcHJvdmlkZSB0aGVpciBmaXJzdCBhbmQgbGFzdCBuYW1lIGFuZCBlbWFpbCB1c2VybmFtZSBvbmx5ICh0aGUgcGFydCBiZWZvcmUgdGhlIEAgc2lnbikgZm9yIHRoZSBmcmVlIGVtYWlsIHNlcnZpY2UgdGhleSBiZWxvbmdlZCB0by4gVGhlIHN1cnZleSBpbmNsdWRlZCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB0aGlzIGluZm9ybWF0aW9uIHdvdWxkIGJlIHVzZWQgb25seSBmb3IgdXNpbmcgc2ltaWxhcml0eSBtZXRyaWNzIHRvIGNvbXBhcmUgdGhlaXIgbmFtZSB0byB0aGVpciB1c2VybmFtZSwgYW5kIHdvdWxkIHRoZW4gYmUgZGVsZXRlZC4gKCJUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaG93IHNpbWlsYXIgeW91ciB1c2VybmFtZSBpcyB0byB5b3VyIG5hbWUsIGFuZCB3aWxsIGJlIGRlbGV0ZWQgYXMgc29vbiBhcyB0aGUgY29tcGFyaXNvbiBpcyBjb21wbGV0ZS4iKSBUaGUgbmFtZSBhbmQgdXNlcm5hbWUgcmVzcG9uc2VzIHdlcmUgaW5zcGVjdGVkIGJ5IGhhbmQgdG8gaWRlbnRpZnkgYW55IHRoYXQgZGlkIG5vdCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucywgYW5kIHRoZXNlIHJlc3BvbnNlcyB3ZXJlIGV4Y2x1ZGVkLiBTb21lIGV4YW1wbGVzIG9mIHRoaXMgYXJlIHJlc3BvbnNlcyB0aGF0IHdlcmUgb25seSBpbml0aWFscywgZ2liYmVyaXNoIChlLmcuICJnZ3Z2IiwgIlRoIiwgImRzbGtkYXNrbGtsc2QiKSwgYW5kIHJlc3BvbnNlcyB0aGF0IHdlcmUgbm90IG5hbWVzIChlLmcuICJib29icyIsICJub25lIiwgIkkgZG9uJ3Qga25vdyIsICJyZWZ1c2VkIikuCgotICoqcG9vciBxdWFsaXR5IHNob3J0IGFuc3dlcioqOiBUaGUgc3VydmV5IGluY2x1ZGVkIHR3byBzaG9ydCBhbnN3ZXIgcXVlc3Rpb25zLCBvbmUgYXNraW5nIHRoZW0gdG8gZXhwbGFpbiB3aHkgdGhleSB3b3VsZCBwaWNrIHRoZSBuZXcgdXNlcm5hbWUgdGhhdCB0aGUgZW50ZXJlZCBpbiBhIHByZXZpb3VzIHF1ZXN0aW9uICh2YXJpYWxlIG5hbWU6ICJ3aHlfdXNlcm5hbWUiIiksIGFuZCB0aGUgb3RoZXIgYXNraW5nIHRoZW0gdG8gZGVzY3JpYmUgYW4gZXhhbXBsZSBvZiBhIHdyb25nIGVtYWlsIHRoYXQgdGhleSBoYWQgcmVjZWl2ZWQgKHZhcmlhYmxlIG5hbWU6ICJ3cm9uZ2VtYWlsX2V4YW1wbGUiKS4gVGhlc2UgcmVzcG9uc2VzIHdlcmUgZXhhbWluZWQgYnkgaGFuZCBhbmQgdGhvc2UgdGhhdCBkaWQgbm90IGFuc3dlciB0aGUgcXVlc3Rpb24gd2VyZSBleGNsdWRlZC4gV2UgcmV0YWluZWQgKGRpZCBub3QgZXhjbHVkZSkgY2FzZXMgd2l0aCByZXNwb25zZXMgdGhhdCBjb250YWluZWQgYW4gYW5zd2VyIHRvIHRoZSBxdWVzdGlvbiwgYnV0IHRoZW4gYWRkZWQgc3BhY2VzIG9yIHB1bmN0dWF0aW9uIG9yIG90aGVyIHRleHQgdG8gbWVldCB0aGUgbGVuZ3RoIHJlcXVpcmVtZW50IG9mIHRoZSB0ZXh0IGVudHJ5IGZpZWxkLiBIZXJlIGFyZSBhIGZldyBleGFtcGxlcyBvZiBleGNsdWRlZCByZXNwb25zZXMgdG8gdGhlICJ3aHlfdXNlcm5hbWUiIiBxdWVzdGlvbjoKCiAgICArICJgciBhcy5jaGFyYWN0ZXIoZC5leGNsdWRlZCAlPiUgZmlsdGVyKFJlc3BvbnNlSUQ9PSJSXzJyQzdia2ZrMHd4V0E4byIpICU+JSBzZWxlY3Qod2h5X3VzZXJuYW1lKSlgIgogICAgKyAiYHIgYXMuY2hhcmFjdGVyKGQuZXhjbHVkZWQgJT4lIGZpbHRlcihSZXNwb25zZUlEPT0iUl9xUG5McGZqekpTT0RQNlYiKSAlPiUgc2VsZWN0KHdoeV91c2VybmFtZSkpYCIgIAogICAgKyAiYHIgYXMuY2hhcmFjdGVyKGQuZXhjbHVkZWQgJT4lIGZpbHRlcihSZXNwb25zZUlEPT0iUl8yMzliMmlzYVAxeXp1dkIiKSAlPiUgc2VsZWN0KHdoeV91c2VybmFtZSkpYCIgICA8YnIgLz4gIAoKLSAqKiJnb29kIG9yIGZ1bGwiIGZhbWlsaWFyaXR5IHdpdGggZmFrZSB3b3JkKio6IFRoZSBpbnRlcm5ldCBsaXRlcmFjeSBxdWVzdGlvbiBjb25zaXN0cyBvZiBhIHNldCBvZiBpbnRlcm5ldC1yZWxhdGVkIHRlcm1zLiBSZXNwb25kZW50cyB3ZXJlIGFza2VkIHRvIHNwZWNpZnkgdGhlaXIgbGV2ZWwgb2YgZmFtaWxpYXJpdHkgd2l0aCB0aGUgdGVybXMsIHJhbmdpbmcgZnJvbSAiTm9uZSIgdG8gIkZ1bGwiIGZhbWlsaWFyaXR5LiBPbmUgb2YgdGhlIHdvcmRzIGluIHRoZSBzZXQgd2FzIGEgZmFrZSB3b3JkIHRoYXQgcmVzcG9uZGVudHMgc2hvdWxkIG5vdCBiZSBmYW1pbGlhciB3aXRoLiBSZXNwb25kZW50cyB3aG8gc2FpZCB0aGV5IGhhZCAiR29vZCIgb3IgIkZ1bGwiIGZhbWlsaWFyaXR5IHdpdGggdGhlIGZha2Ugd29yZCB3ZXJlIGV4Y2x1ZGVkIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHN1cnZleS4KCi0gKippbmNvbXBsZXRlIHN1cnZleSoqOiBSZXNwb25kZW50cyB3aG8gc3RhcnRlZCBidXQgZGlkbid0IGZpbmlzaCB0aGUgc3VydmV5IGF0IHRoZSB0aW1lIHRoZSBzdXJ2ZXkgd2FzIGNsb3NlZCBhbmQgdGhlIGRhdGFzZXQgd2FzIGRvd25sb2FkZWQgZnJvbSBRdWFsdHJpY3MuCgpIZXJlIGlzIHRoZSBudW1iZXIgb2YgcmVzcG9uc2VzIGV4Y2x1ZGVkIGZvciBlYWNoIHJlYXNvbjoKYGBge3IgZXhjbHVkZWQgY291bnQsIGVjaG89RkFMU0V9CiMgaG93IG1hbnkgcmVzcG9uZGVudHMgd2VyZSBleGNsdWRlZCBmb3IgdGhlIHZhcmlvdXMgcmVhc29ucz8Ka2FibGUoZC5leGNsdWRlZCAlPiUgCiAgZmlsdGVyKGV4Y2x1ZGVkICE9IEZBTFNFKSAlPiUgCiAgY291bnQoZXhjbHVkZWQpICU+JSAKICBhcnJhbmdlKGRlc2MobikpKSAlPiUKa2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMzBlbSIpCmBgYAoKCiMjIFJlc3BvbmRlbnQgRGVtb2dyYXBoaWNzIHsjZGVtb2dyYXBoaWNzLnN0YXRzfQoKVGhlIHRleHQgb2YgdGhlIHN1cnZleSBxdWVzdGlvbnMgYWJvdXQgcmVzcG9uZGVudCBkZW1vZ3JhcGhpY3MgYXJlIGluY2x1ZGVkIGluIHRoZSBbRGVtb2dyYXBoaWNzIEJsb2NrIHNlY3Rpb25dKCNkZW1vZ3JhcGhpY3MucXVlc3Rpb25zKSBvZiB0aGlzIGRvY3VtZW50LgoKIyMjIEFnZSwgR2VuZGVyLCBFdGhuaWNpdHkKClRoZSBhdmVyYWdlIGFnZSBvZiByZXNwb25kZW50cyB3YXMgYHIgbWVhbihkJGFnZSlgIChTRD1gciBzZChkJGFnZSlgKS4gQWdlIHJhbmdlZCBmcm9tIGByIG1pbihkJGFnZSlgIHRvIGByIG1heChkJGFnZSlgLiBUaGVyZSB3ZXJlIGByIGFzLmNoYXJhY3RlcihkICU+JSBmaWx0ZXIoZ2VuZGVyPT0iV29tYW4iKSAlPiUgY291bnQoZ2VuZGVyKSlbMl1gIHdvbWVuIGByIGFzLmNoYXJhY3RlcihkICU+JSBmaWx0ZXIoZ2VuZGVyPT0iTWFuIikgJT4lIGNvdW50KGdlbmRlcikpWzJdYCBtZW4gd2hvIHBhcnRpY2lwYXRlZCBpbiB0aGUgc3R1ZHkuIAoKYGBge3IgYWdlIGdlbmRlciwgZWNobz1GQUxTRX0KIyBhZ2UKa2FibGUodHJhbnNwb3NlX2RmKGQgJT4lIHN1bW1hcml6ZShNaW49bWluKGFnZSwgbmEucm09VCksIAogICAgICAgICAgICAgICAgTWVkaWFuPW1lZGlhbihhZ2UsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE1heD1tYXgoYWdlLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBNPW1lYW4oYWdlLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBTRD1zZChhZ2UsIG5hLnJtPVQpKSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoYEFnZSBEZXNjcmlwdGl2ZXMgKGluIHllYXJzKWAgPSByb3duYW1lLCBgIGA9YDFgKSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikKCmQgJT4lIGdncGxvdChhZXMoeD1hZ2UpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTUpICsgCiAgZ2d0aXRsZSgiQWdlIEhpc3RvZ3JhbSIpICsgCiAgbGFicyh0aXRsZSA9ICIiLAogICAgICAgc3VidGl0bGU9IihtZWRpYW4gPSBkb3R0ZWQgbGluZSwgbWVhbiA9IHNvbGlkIGxpbmUpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtZWFuKGQkYWdlKSwgY29sb3I9InJlZCIsIGxpbmV0eXBlPSJzb2xpZCIsIHNpemU9MSkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtZWRpYW4oZCRhZ2UpLCBjb2xvcj0icmVkIiwgbGluZXR5cGU9ImRvdHRlZCIsIHNpemU9MSkKCiMgZ2VuZGVyCmQgJT4lCiAgY291bnQoZ2VuZGVyKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgbXV0YXRlKGdlbmRlciA9IGZhY3RvcihnZW5kZXIsIGxldmVscz1nZW5kZXIpKSAlPiUgICMgb3JkZXJzIHRoZSBiYXJzIGZyb20gbW9zdCB0byBsZWFzdAogIGdncGxvdChhZXMoeD1nZW5kZXIsIHk9bikpICsgCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgCiAgICBnZ3RpdGxlKCJHZW5kZXIgSGlzdG9ncmFtIikgKyBsYWJzKHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKyAKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIAogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCwyMTApCmBgYAoKQSBsYXJnZSBtYWpvcml0eSBvZiByZXNwb25kZW50cyB3ZXJlIHdoaXRlLiBOb3RlIHRoYXQgdGhlIGV0aG5pY2l0eSBxdWVzdGlvbiBhbGxvd2VkIHJlc3BvbmRlbnRzIHRvICJjaG9vc2UgYWxsIHRoYXQgYXBwbHkiOyBpbiB0aGUgZmlyc3QgImV0aG5pY2l0eSIgdGFibGUgYmVsb3cgIlRSVUUiIGluZGljYXRlcyB0aGF0IHRoZSByZXNwb25kZW50IGNoZWNrZWQgdGhlIGJveCwgYW5kIE5BIGluZGljYXRlcyB0aGF0IHRoZXkgZGlkIG5vdC4KYGBge3IgZXRobmljaXR5LCBlY2hvPUZBTFNFfQojIGV0aG5pY2l0eQpkICU+JSAKICBkcGx5cjo6cmVuYW1lKCB3aGl0ZSA9IGV0aG5pY2l0eV93aGl0ZSwgCiAgICAgICAgICAgICAgICAgaGlzcGFuaWMgPSBldGhuaWNpdHlfaGlzcGFuaWMsIAogICAgICAgICAgICAgICAgIGJsYWNrID0gZXRobmljaXR5X2JsYWNrLCAKICAgICAgICAgICAgICAgICBhc2lhbiA9IGV0aG5pY2l0eV9hc2lhbiwgCiAgICAgICAgICAgICAgICAgbmF0aXZlX2FtID0gZXRobmljaXR5X25hdGl2ZV9hbSwgCiAgICAgICAgICAgICAgICAgbWlkZGxlX2Vhc3Rlcm4gPSBldGhuaWNpdHlfbWlkZGxlX2Vhc3Rlcm4sIAogICAgICAgICAgICAgICAgIHBhY2lmaWMgPSBldGhuaWNpdHlfcGFjaWZpYywgCiAgICAgICAgICAgICAgICAgb3RoZXIgPSBldGhuaWNpdHlfb3RoZXIpICU+JSAKICAgIHNlbGVjdCh3aGl0ZSwgaGlzcGFuaWMsIGJsYWNrLCBhc2lhbiwgbmF0aXZlX2FtLCBtaWRkbGVfZWFzdGVybiwgcGFjaWZpYywgb3RoZXIpICU+JSAKICAgIGNvdW50KHdoaXRlLCBoaXNwYW5pYywgYmxhY2ssIGFzaWFuLCBuYXRpdmVfYW0sIG1pZGRsZV9lYXN0ZXJuLCBwYWNpZmljLCBvdGhlcikgJT4lIAogICAgc2VsZWN0KG4sIHdoaXRlLCBoaXNwYW5pYywgYmxhY2ssIGFzaWFuLCBuYXRpdmVfYW0sIG1pZGRsZV9lYXN0ZXJuLCBwYWNpZmljLCBvdGhlcikgJT4lCiAgICBtdXRhdGVfYWxsKGZ1bnMoaWZlbHNlKC4gPT0gRkFMU0UsIE5BLCAuKSkpICU+JSAKICAgIGFycmFuZ2UoZGVzYyhuKSkKICAKCmV0aG5pY2l0eV9jb3VudHMgPC0gZCAlPiUgc2VsZWN0KGV0aG5pY2l0eV93aGl0ZSwgZXRobmljaXR5X2hpc3BhbmljLCBldGhuaWNpdHlfYmxhY2ssIGV0aG5pY2l0eV9hc2lhbiwgZXRobmljaXR5X25hdGl2ZV9hbSwgZXRobmljaXR5X21pZGRsZV9lYXN0ZXJuLCBldGhuaWNpdHlfcGFjaWZpYywgZXRobmljaXR5X290aGVyKSAlPiUgc3VtbWFyaXplKHdoaXRlID0gc3VtKGV0aG5pY2l0eV93aGl0ZSksIGhpc3BhbmljID0gc3VtKGV0aG5pY2l0eV9oaXNwYW5pYyksIGJsYWNrID0gc3VtKGV0aG5pY2l0eV9ibGFjayksIGFzaWFuID0gc3VtKGV0aG5pY2l0eV9hc2lhbiksIG5hdGl2ZV9hbSA9IHN1bShldGhuaWNpdHlfbmF0aXZlX2FtKSwgbWlkZGxlX2Vhc3Rlcm4gPSBzdW0oZXRobmljaXR5X21pZGRsZV9lYXN0ZXJuKSwgcGFjaWZpYyA9IHN1bShldGhuaWNpdHlfcGFjaWZpYyksIG90aGVyID0gc3VtKGV0aG5pY2l0eV9vdGhlcikpCmV0aG5pY2l0eV9jb3VudHMgPC0gYXMuZGF0YS5mcmFtZSh0KGV0aG5pY2l0eV9jb3VudHMpKQpldGhuaWNpdHlfY291bnRzJGV0aG5pY2l0eSA8LSByb3cubmFtZXMoZXRobmljaXR5X2NvdW50cykKZXRobmljaXR5X2NvdW50cyRjb3VudHMgPC0gZXRobmljaXR5X2NvdW50cyRWMQpyb3cubmFtZXMoZXRobmljaXR5X2NvdW50cykgPC0gTlVMTApldGhuaWNpdHlfY291bnRzJFYxIDwtIE5VTEwKCmthYmxlKGV0aG5pY2l0eV9jb3VudHMgPC0gYXMudGliYmxlKGV0aG5pY2l0eV9jb3VudHMpKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxMmVtIikKYGBgCgoKIyMjIFJlZ2lvbiwgSW5jb21lLCBFZHVjYXRpb24KCkhlcmUgYXJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHNhbXBsZSBpbiB0ZXJtcyBvZiByZWdpb24gb2YgdGhlIGNvdW50cnksIGluY29tZSwgYW5kIGVkdWNhdGlvbiBsZXZlbDoKCmBgYHtyIHJlZ2lvbiBpbmNvbWUgZWR1Y2F0aW9uLCBlY2hvPUZBTFNFfQojIHJlZ2lvbgpkICU+JSBjb3VudChyZWdpb24pICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVnaW9uLCB5PW4pKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSkpICArIAogIGdndGl0bGUoIlJlZ2lvbiBvZiB0aGUgVVNBIikgKyBsYWJzKHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDg1KQoKIyBpbmNvbWUKZCAlPiUgY291bnQoaW5jb21lKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWluY29tZSwgeT1uKSkgKyAKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgCiAgZ2d0aXRsZSgiSW5jb21lIikgKyBsYWJzKHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDEwNSkKCiMgZWR1Y2F0aW9uCmQgJT4lIG11dGF0ZShlZHVjYXRpb249ZmFjdG9yKGVkdWNhdGlvbiwgbGFiZWxzPWMoIk5vbmUsIG9yIGdyYWRlcyAxLTgiLCAiU29tZSBIaWdoIHNjaG9vbCIsICJIUyBHcmFkIG9yIEdFRCIsICJUZWNobmljYWwsIFRyYWRlIG9yIFZvY2F0aW9uYWwiLCAiU29tZSBDb2xsZWdlIiwgIkNvbGxlZ2UgRGVncmVlIiwgIlNvbWUgUG9zdGdyYWR1YXRlIiwgIlBvc3RncmFkdWF0ZSBEZWdyZWUiKSkpICU+JQogIGNvdW50KGVkdWNhdGlvbikgJT4lIAogIGdncGxvdChhZXMoeD1lZHVjYXRpb24sIHk9bikpICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArIAogIGdndGl0bGUoIkVkdWNhdGlvbiIpICsgbGFicyh5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCwxMjUpCmBgYAoKCiMjIyBJbnRlcm5ldCBMaXRlcmFjeQoKVGhlIGludGVybmV0IGxpdGVyYWN5IHZhcmlhYmxlIGNvbnNpc3RzIG9mIHF1ZXN0aW9ucyB0aGF0IGFyZSBiYXNlZCBvbiB0aGUgV2ViIFVzZSBTa2lsbHMgc3VydmV5IHJlcG9ydGVkIGluIFtIYXJnaXR0YWkgYW5kIEhzaWVoICgyMDExKV0oaHR0cHM6Ly9qb3VybmFscy5zYWdlcHViLmNvbS9kb2kvMTAuMTE3Ny8wODk0NDM5MzEwMzk3MTQ2KS4gUmVzcG9uZGVudHMgd2VyZSBhc2tlZCB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uIGFib3V0IHRoZSBpbnRlcm5ldC1yZWxhdGVkIHRlcm1zOiAiSG93IGZhbWlsaWFyIGFyZSB5b3Ugd2l0aCB0aGUgZm9sbG93aW5nIEludGVybmV0LXJlbGF0ZWQgdGVybXM/IFBsZWFzZSByYXRlIHlvdXIgdW5kZXJzdGFuZGluZyBvZiBlYWNoIHRlcm0gYmVsb3cgZnJvbSBOb25lIChubyB1bmRlcnN0YW5kaW5nKSB0byBGdWxsIChmdWxsIHVuZGVyc3RhbmRpbmcpIi4gCgpXZSBjcmVhdGVkIGEgY29tcG9zaXRlIHZhcmlhYmxlIGJ5IGF2ZXJhZ2luZyB0aGUgc2VsZi1yZXBvcnRlZCByZXNwb25zZXMgZm9yIGVhY2ggcmVzcG9uZGVudCBhY3Jvc3MgdGhlIGVpZ2h0IGludGVybmV0IGxpdGVyYWN5IGl0ZW1zLiBUaGUgb3ZlcmFsbCBtZWFuIHdhcyBgciBtZWFuKGQkaW50ZXJuZXRfbGl0ZXJhY3ksIG5hLnJtPVQpYCAoU0QgPSBgciBzZChkJGludGVybmV0X2xpdGVyYWN5LCBuYS5ybT1UKWAsIG1lZGlhbiA9IGByIG1lZGlhbihkJGludGVybmV0X2xpdGVyYWN5LCBuYS5ybT1UKWApLiBDcm9uYmFjaCdzIGFscGhhIChhIG1lYXN1cmUgb2YgaW50ZXJuYWwgY29uc2lzdGVuY3kpOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3Qod2lraSwgbWVtZSwgcGhpc2hpbmcsIGJvb2ttYXJrLCBjYWNoZSwgc3NsLCBhamF4LCByc3MpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4KClRoZSByZXNwb25zZXMgdG8gZWFjaCBpdGVtIGFyZSBzaG93biBpbiB0aGUgZ3JhcGhzIGJlbG93OgpgYGB7ciBpbnRlcm5ldCBsaXRlcmFjeSwgZWNobz1GQUxTRX0KIyBib29rbWFyawpkICU+JSBjb3VudChib29rbWFyaykgJT4lIGdncGxvdChhZXMoeD1ib29rbWFyaywgeT1uKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgZ2d0aXRsZSgiSW50ZXJuZXQgbGl0ZXJhY3k6IGJvb2ttYXJrIikgKyBsYWJzKHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArIGdlb21fdGV4dChhZXMobGFiZWw9biksIHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIGZvbnRmYWNlPSJib2xkIikgIysgeWxpbSgwLDE2MCkKIyBtZW1lCmQgJT4lIGNvdW50KG1lbWUpICU+JSBnZ3Bsb3QoYWVzKHg9bWVtZSwgeT1uKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgZ2d0aXRsZSgiSW50ZXJuZXQgbGl0ZXJhY3k6IG1lbWUiKSArIGxhYnMoeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiKSArIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSAjKyB5bGltKDAsMTYwKQojIHdpa2kKZCAlPiUgY291bnQod2lraSkgJT4lIGdncGxvdChhZXMoeD13aWtpLCB5PW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyBnZ3RpdGxlKCJJbnRlcm5ldCBsaXRlcmFjeTogd2lraSIpICsgbGFicyh5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICMrIHlsaW0oMCwxNjApCiMgcGhpc2hpbmcKZCAlPiUgY291bnQocGhpc2hpbmcpICU+JSBnZ3Bsb3QoYWVzKHg9cGhpc2hpbmcsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIGdndGl0bGUoIkludGVybmV0IGxpdGVyYWN5OiBwaGlzaGluZyIpICsgbGFicyh5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICMrIHlsaW0oMCwxNjApCiMgY2FjaGUKZCAlPiUgY291bnQoY2FjaGUpICU+JSBnZ3Bsb3QoYWVzKHg9Y2FjaGUsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIGdndGl0bGUoIkludGVybmV0IGxpdGVyYWN5OiBjYWNoZSIpICsgbGFicyh5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICMrIHlsaW0oMCwxNjApCiMgc3NsCmQgJT4lIGNvdW50KHNzbCkgJT4lIGdncGxvdChhZXMoeD1zc2wsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIGdndGl0bGUoIkludGVybmV0IGxpdGVyYWN5OiBTU0wiKSArIGxhYnMoeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiKSArIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSAjKyB5bGltKDAsMTYwKQojIHJzcwpkICU+JSBjb3VudChyc3MpICU+JSBnZ3Bsb3QoYWVzKHg9cnNzLCB5PW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgICsgZ2d0aXRsZSgiSW50ZXJuZXQgbGl0ZXJhY3k6IFJTUyIpICsgbGFicyh5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICMrIHlsaW0oMCwxNjApCiMgYWpheApkICU+JSBjb3VudChhamF4KSAlPiUgZ2dwbG90KGFlcyh4PWFqYXgsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSAgKyBnZ3RpdGxlKCJJbnRlcm5ldCBsaXRlcmFjeTogQUpBWCIpICsgbGFicyh5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICMrIHlsaW0oMCwxNjApCmBgYAoKCiMgU3VydmV5IFF1ZXN0aW9ucwoKKk5vdGU6IFRoaXMgc2VjdGlvbiBwcmVzZW50cyB0aGUgY29tcGxldGUgc3VydmV5IGluc3RydW1lbnQsIGFsb25nIHdpdGggZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgZWFjaCBxdWVzdGlvbi4gRm9ybWF0dGluZyBhbmQgcGFnaW5hdGlvbiBvZiB0aGUgcXVlc3Rpb25zIGluIHRoZSBhY3R1YWwgc3VydmV5IGFzIGl0IHdhcyBhZG1pbmlzdGVyZWQgZGlmZmVycyBmcm9tIGhvdyB0aGUgcXVlc3Rpb25zIGFyZSBwcmVzZW50ZWQgaW4gdGhpcyBkb2N1bWVudC4gVGV4dCBzaG93biBpbiBpdGFsaWNzIHdhcyBub3QgcGFydCBvZiB0aGUgc3VydmV5LioKCiMjIFNjcmVlbmluZyBCbG9jawoKKlRoZSB0aHJlZSBxdWVzdGlvbnMgYmVsb3cgd2VyZSBhc2tlZCBhZnRlciByZXNwb25kZW50cyBoYWQgY29uc2VudGVkLCBidXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhY3R1YWwgc3VydmV5LCB0byBkZXRlcm1pbmUgZWxpZ2liaWxpdHkgdG8gcGFydGljaXBhdGUuIFJlc3BvbmRlbnRzIHdlcmUgaW5lbGlnaWJsZSBpZiB0aGV5IHJlcG9ydGVkIGJlaW5nIHlvdW5nZXIgdGhhbiAxOCBvciBvbGRlciB0aGFuIDEyMCB5ZWFycyBvbGQsIGFuZCBpZiB0aGV5IHNhaWQgIk5vIiBvciAiSSdtIG5vdCBzdXJlIiB0byB0aGUgZW1haWwgYWNjb3VudCBxdWVzdGlvbi4gVGhlIGFnZSBhbmQgZ2VuZGVyIHF1ZXN0aW9ucyB3ZXJlIHVzZWQgdG8gbWVldCB0aGUgc3VydmV5IHJlY3J1aXRpbmcgcXVvdGFzLioKCiogV2hhdCBpcyB5b3VyIGFnZSBpbiB5ZWFycz8gKltmaWxsIGluIHRoZSBibGFua10qIAoKKiBXaGF0IGlzIHlvdXIgZ2VuZGVyPyBbTWFuLCBXb21hbiwgT3RoZXIgKGZpbGwgaW4gdGhlIGJsYW5rKSwgUHJlZmVyIG5vdCB0byBkaXNjbG9zZV0gCgoqIERvIHlvdSBjdXJyZW50bHkgcmVndWxhcmx5IHVzZSBhdCBsZWFzdCBvbmUgZW1haWwgYWNjb3VudCBmcm9tIGEgcG9wdWxhciBmcmVlIGVtYWlsIHNlcnZpY2UgcHJvdmlkZXIgbGlrZSBHbWFpbCwgT3V0bG9vayBNYWlsIG9yIEhvdG1haWwsIFlhaG9vISBNYWlsLCBBT0wgTWFpbCwgZXRjLj8gW05vLCBZZXMsIEknbSBub3Qgc3VyZV0gCgoKCiMjIEVtYWlsIEFjY291bnRzIEJsb2NrCgpJbnN0cnVjdGlvbnM6IFRoZSBzdXJ2ZXkgc2hvdWxkIHRha2UgYXBwcm94aW1hdGVseSAxNSBtaW51dGVzIHRvIGNvbXBsZXRlLiBZb3UgaGF2ZSB1cCB0byAyNCBob3VycyB0byBmaW5pc2ggdGhlIHN1cnZleSwgc3RhcnRpbmcgZnJvbSB0aGUgdGltZSB5b3Ugc3RhcnRlZCByZWFkaW5nIHRoZSBjb25zZW50IGZvcm0gb24gdGhlIHByZXZpb3VzIHBhZ2UuIFBsZWFzZSBub3RlIHRoYXQgdGhlIHN0dWR5IGluY2x1ZGVzIHF1ZXN0aW9ucyBhbmQgb3RoZXIgbWV0aG9kcyBkZXNpZ25lZCB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIHBheWluZyBhdHRlbnRpb24uIElmIHlvdSBkbyBub3QgcGF5IGNhcmVmdWwgYXR0ZW50aW9uIHRvIGV2ZXJ5IHF1ZXN0aW9uIHdoaWxlIHlvdSBhcmUgY29tcGxldGluZyB0aGUgc3VydmV5LCB5b3Ugd2lsbCBiZSBkaXJlY3RlZCB0byB0aGUgZW5kIG9mIHRoZSBzdXJ2ZXkgd2l0aG91dCBiZWluZyBhYmxlIHRvIGNvbXBsZXRlIGl0LgoKIyMjIFJlYXNvbnMgZm9yIGNyZWF0aW5nIGEgbmV3IGVtYWlsIGFjY291bnQKCipUaGlzIHF1ZXN0aW9uIGlzIGJhc2VkIG9uIEJlbnRsZXkgZXQgYWwuJ3MgQ0hJIDIwMTcgcGFwZXIgWyJJZiBhIHBlcnNvbiBpcyBlbWFpbGluZyB5b3UsIGl0IGp1c3QgZG9lc24ndCBtYWtlIHNlbnNlIjogRXhwbG9yaW5nIENoYW5naW5nIENvbnN1bWVyIEJlaGF2aW9ycyBpbiBFbWFpbF0oaHR0cHM6Ly9kbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD0zMDI1NjEzKS4qCgpGb3Igd2hpY2ggb2YgdGhlIGZvbGxvd2luZyByZWFzb25zIGhhdmUgeW91IGV2ZXIgY3JlYXRlZCBhIG5ldyBlbWFpbCBhY2NvdW50PyBQbGVhc2Ugc2VsZWN0IGFsbCB0aGF0IGFwcGx5OgoKKiBUbyBoYXZlIGEgbW9yZSBwcm9mZXNzaW9uYWwgc291bmRpbmcgdXNlcm5hbWUKKiBPbGQgYWNjb3VudCBnZXR0aW5nIHRvbyBtdWNoIHNwYW0KKiBEaWRuJ3Qgd2FudCB0byBnaXZlICJyZWFsIiBlbWFpbCBhZGRyZXNzIHRvIGEgYnVzaW5lc3MKKiBEaWRuJ3Qgd2FudCB0byBnaXZlICJyZWFsIiBlbWFpbCBhZGRyZXNzIHRvIGEgcGVyc29uCiogVG8gc2lnbiB1cCBmb3IgYSBzZXJ2aWNlIHRoYXQgcmVxdWlyZXMgYSBzcGVjaWZpYyBlbWFpbCBwcm92aWRlciBzdWNoIGFzIEdvb2dsZSBEb2NzIChnbWFpbCkgb3IgWGZpbml0eSAoQ29tY2FzdCkKKiBXYW50ZWQgdG8ga2VlcCBwZXJzb25hbCBlbWFpbHMgc2VwYXJhdGUKKiBQcm9ibGVtcyB3aXRoIG9sZCBhY2NvdW50IChsb2NrZWQgb3V0LCBkZWxldGVkIGZvciBub24tdXNlLCBldGMuKQoqIFRvIHVzZSBmb3IgZ2l2aW5nIG91dCB0byB3ZWJzaXRlcywgc3VjaCBhcyBvbmxpbmUgc2hvcHBpbmcgc2l0ZXMKKiBUbyB0cnkgc29tZXRoaW5nIG5ldwoqIEdyYWR1YXRlZCBmcm9tIHNjaG9vbCBhbmQgbmVlZGVkIGEgbmV3IGVtYWlsIGFkZHJlc3MKKiBTdGFydGVkIGEgbmV3IGpvYiBhbmQgZ290IGEgbmV3IGVtYWlsIGFkZHJlc3MgZnJvbSBteSBlbXBsb3llcgoqIENyZWF0ZWQgYSBuZXcgYWNjb3VudCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0LCBidXNpbmVzcyBvciBob2JieQoqIE90aGVyIChwbGVhc2UgZmlsbCBpbiB0aGUgYmxhbmspCiogTm9uZSBvZiB0aGUgYWJvdmUKCmBgYHtyIGNyZWF0ZV9hY2N0LCBlY2hvPUZBTFNFLCByb3dzLnByaW50PTE1fQprYWJsZShkICU+JSBzZWxlY3QoUmVzcG9uc2VJRCwgY3JlYXRlX2FjY3RfbW9yZV9wcm9mZXNzaW9uYWw6Y3JlYXRlX2FjY3Rfbm9uZSkgJT4lCiAgZ2F0aGVyKGtleT1yZWFzb25zLCB2YWx1ZT1jaGVja2VkLCBjcmVhdGVfYWNjdF9tb3JlX3Byb2Zlc3Npb25hbDpjcmVhdGVfYWNjdF9ub25lKSAlPiUKICBtdXRhdGUocmVhc29ucyA9IGZjdF9yZWNvZGUocmVhc29ucywKICAgICJXYW50ZWQgdG8ga2VlcCBwZXJzb25hbCBlbWFpbHMgc2VwYXJhdGUiID0gImNyZWF0ZV9hY2N0X3NlcGFyYXRlIiwKICAgICJPbGQgYWNjb3VudCBnZXR0aW5nIHRvbyBtdWNoIHNwYW0iID0gImNyZWF0ZV9hY2N0X3NwYW0iLAogICAgIlRvIGhhdmUgYSBtb3JlIHByb2Zlc3Npb25hbCBzb3VuZGluZyB1c2VybmFtZSIgPSAiY3JlYXRlX2FjY3RfbW9yZV9wcm9mZXNzaW9uYWwiLAogICAgIlRvIHVzZSBmb3IgZ2l2aW5nIG91dCB0byB3ZWJzaXRlcywgc3VjaCBhcyBvbmxpbmUgc2hvcHBpbmcgc2l0ZXMiID0gImNyZWF0ZV9hY2N0X3Nob3BwaW5nIiwKICAgICJUbyBzaWduIHVwIGZvciBhIHNlcnZpY2UgdGhhdCByZXF1aXJlcyBhIHNwZWNpZmljIGVtYWlsIHByb3ZpZGVyIiA9ICJjcmVhdGVfYWNjdF9zaWdudXAiLAogICAgIlByb2JsZW1zIHdpdGggb2xkIGFjY291bnQiID0gImNyZWF0ZV9hY2N0X3Byb2JsZW0iLAogICAgIkRpZG4ndCB3YW50IHRvIGdpdmUgJ3JlYWwnIGVtYWlsIGFkZHJlc3MgdG8gYSBidXNpbmVzcyIgPSAiY3JlYXRlX2FjY3RfZmFrZV9idXNpbmVzcyIsCiAgICAiVG8gdHJ5IHNvbWV0aGluZyBuZXciID0gImNyZWF0ZV9hY2N0X25ldyIsCiAgICAiTm9uZSBvZiB0aGUgYWJvdmUiID0gImNyZWF0ZV9hY2N0X25vbmUiLAogICAgIkNyZWF0ZWQgYSBuZXcgYWNjb3VudCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0LCBidXNpbmVzcyBvciBob2JieSIgPSAiY3JlYXRlX2FjY3RfcHJvamVjdCIsCiAgICAiRGlkbid0IHdhbnQgdG8gZ2l2ZSAncmVhbCcgZW1haWwgYWRkcmVzcyB0byBhIHBlcnNvbiIgPSAiY3JlYXRlX2FjY3RfZmFrZV9wZXJzb24iLAogICAgIlN0YXJ0ZWQgYSBuZXcgam9iIGFuZCBnb3QgYSBuZXcgZW1haWwgYWRkcmVzcyIgPSAiY3JlYXRlX2FjY3RfbmV3X2pvYiIsCiAgICAiT3RoZXIgcmVhc29uIiA9ICJjcmVhdGVfYWNjdF9vdGhlciIsCiAgICAiR3JhZHVhdGVkIGZyb20gc2Nob29sIGFuZCBuZWVkZWQgYSBuZXcgZW1haWwgYWRkcmVzcyIgPSAiY3JlYXRlX2FjY3RfZ3JhZHVhdGVkIikpICU+JQogIGZpbHRlcihjaGVja2VkID09IFQpICU+JSAKICBtdXRhdGUobiA9IG5fZGlzdGluY3QoUmVzcG9uc2VJRCkpICU+JSAKICBncm91cF9ieShyZWFzb25zLCBuKSAlPiUKICBzdW1tYXJpemUoY291bnQ9bigpKSAlPiUgCiAgbXV0YXRlKHBlcmNlbnQgPSBjb3VudC9uKjEwMCkgJT4lCiAgc2VsZWN0KHJlYXNvbnMsIGNvdW50LCBwZXJjZW50KSAlPiUKICBhcnJhbmdlKGRlc2MoY291bnQpKSkgJT4lIAprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKQpgYGAKCgojIyMgSG93IG1hbnkgZW1haWwgYWNjb3VudHMgZG9lcyBlYWNoIHJlc3BvbmRlbnQgaGF2ZT8KCkluIHRoZSBzcGFjZSBwcm92aWRlZCBiZWxvdywgcGxlYXNlIGxpc3QgdGhlIGVtYWlsIGFjY291bnRzIHRoYXQgeW91IGN1cnJlbnRseSBmcmVxdWVudGx5IHVzZSwgc3RhcnRpbmcgd2l0aCB0aGUgZW1haWwgYWNjb3VudCB5b3UgdXNlIHRoZSBtb3N0IG9mdGVuLiBJZiB5b3UgdXNlIHNldmVyYWwgZW1haWwgYWNjb3VudHMgYWJvdXQgZXF1YWxseSwgcGxlYXNlIGxpc3QgdXAgdG8gZml2ZSBvZiB0aGVtLiBQbGVhc2UgZG8gTk9UIGVudGVyIHRoZSBjb21wbGV0ZSBlbWFpbCBhZGRyZXNzIGZvciBlYWNoIGFjY291bnQuIEluc3RlYWQsIGdpdmUgZWFjaCBlbWFpbCBhY2NvdW50IGEgbmlja25hbWUgb3IgYSBzaG9ydCBwaHJhc2UgdGhhdCBkZXNjcmliZXMgaXQuIEZvciBleGFtcGxlLCAicGVyc29uYWwgZW1haWwgSSd2ZSBoYWQgdGhlIGxvbmdlc3QiLCAid29yayBlbWFpbCIsICJzY2hvb2wgZW1haWwiLCBldGMuCgoqIEVtYWlsIGFjY291bnQgIzEgICgxKSAqW2ZpbGwgaW4gdGhlIGJsYW5rXSogCiogRW1haWwgYWNjb3VudCAjMiAgKDIpICpbZmlsbCBpbiB0aGUgYmxhbmtdKiAKKiBFbWFpbCBhY2NvdW50ICMzICAoMykgKltmaWxsIGluIHRoZSBibGFua10qIAoqIEVtYWlsIGFjY291bnQgIzQgICg0KSAqW2ZpbGwgaW4gdGhlIGJsYW5rXSogCiogRW1haWwgYWNjb3VudCAjNSAgKDUpICpbZmlsbCBpbiB0aGUgYmxhbmtdKiAKCmBgYHtyIG51bV9hY2NvdW50cywgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LjUsIGZpZy53aWR0aD04fQpwbG90KCBnIDwtIGQgJT4lIGNvdW50KG51bV9hY2NvdW50cykgJT4lIAogIGdncGxvdChhZXMoeD1udW1fYWNjb3VudHMsIHk9bikpICsgCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHNpemU9NSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIAogICAgdGhlbWVfYncoKSArIAogICAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTE1KSwKICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0xNSksCiAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMiksIAogICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTEpKSArIAogICAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgZW1haWwgYWNjb3VudHMgbGlzdGVkIGJ5IGVhY2ggc3VydmV5IHJlc3BvbmRlbnQiLCAKICAgICAgICAgeT0iTnVtYmVyIG9mIFJlc3BvbmRlbnRzIiwgCiAgICAgICAgIHggPSAiTnVtYmVyIG9mIGVtYWlsIGFjY291bnRzIikgKyAKICAgIHlsaW0oMCwxMzIpICkKYGBgCgoqRGlzcGxheWVkIG9ubHkgaWYgdGhlIHJlc3BvbmRlbnQgZW50ZXJlZCBzb21ldGhpbmcgaW50byBhbGwgZml2ZSBibGFua3MgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uOiogICAKRG8geW91IGhhdmUgbW9yZSBlbWFpbCBhY2NvdW50cyB0aGFuIHRoZSBmaXZlIHlvdSBsaXN0ZWQgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uPyBbTm8sIFllcywgSSdtIG5vdCBzdXJlXQoKYGBge3IgbW9yZV9hY2NvdW50cywgZWNobz1GQUxTRX0Ka2FibGUoZCAlPiUgY291bnQobW9yZV9hY2NvdW50cykgJT4lIGRwbHlyOjpyZW5hbWUoYE1vcmUgdGhhbiBGaXZlIEFjY291bnRzYD1tb3JlX2FjY291bnRzKSkgJT4lCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjE1ZW0iKQpgYGAKCgoKIyMgRW1haWwgQWNjb3VudHMgTG9vcCBCbG9jawoKKk5vdGU6IFRoZXNlIHF1ZXN0aW9ucyB3ZXJlIHJlcGVhdGVkIG9uY2UgZm9yIGVhY2ggZW1haWwgYWNjb3VudCBsaXN0ZWQgYWJvdmUuIFdoaWxlIGFsbCByZXNwb25kZW50cyBmaWxsZWQgaW4gYXQgbGVhc3Qgb25lIGJsYW5rLCBub3QgYWxsIHJlc3BvbmRlbnRzIGZpbGxlZCBpbiBtb3JlIHRoYW4gdGhhdC4gVGhlIE5BcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaHMgYmVsb3cuKgoKIyMjIEhvdyBsb25nIGhhdmUgcmVzcG9uZGVudHMgaGFkIGVhY2ggYWNjb3VudD8gCgpIb3cgbG9uZyBoYXZlIHlvdSBoYWQgdGhlIGVtYWlsIGFjY291bnQgIiR7bG06Ly9GaWVsZC8xfSI/CgoqIExlc3MgdGhhbiBvbmUgeWVhcgoqIDEtMiB5ZWFycwoqIDItNCB5ZWFycwoqIDQtNiB5ZWFycwoqIDYtMTAgeWVhcnMKKiBNb3JlIHRoYW4gMTAgeWVhcnMKKiBJJ20gbm90IHN1cmUKCmBgYHtyIGhvd2xvbmdfYWNjb3VudCwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LjUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90KCBnIDwtIGQgJT4lIHNlbGVjdChSZXNwb25zZUlELCBob3dsb25nX2FjY291bnQxLCBob3dsb25nX2FjY291bnQyLCBob3dsb25nX2FjY291bnQzLCBob3dsb25nX2FjY291bnQ0LCBob3dsb25nX2FjY291bnQ1KSAlPiUKICBnYXRoZXIoa2V5PWFjY291bnQsIHZhbHVlPWhvd19sb25nLCBob3dsb25nX2FjY291bnQxLCBob3dsb25nX2FjY291bnQyLCBob3dsb25nX2FjY291bnQzLCBob3dsb25nX2FjY291bnQ0LCBob3dsb25nX2FjY291bnQ1KSAlPiUgCiAgbXV0YXRlKGhvd19sb25nID0gZmN0X3JlbGV2ZWwoaG93X2xvbmcsIGxldmVscz1jKCJMZXNzIHRoYW4gb25lIHllYXIiLCAiMS0yIHllYXJzIiwgIjItNCB5ZWFycyIsICI0LTYgeWVhcnMiLCAiNi0xMCB5ZWFycyIsICJNb3JlIHRoYW4gMTAgeWVhcnMiLCAiSSdtIG5vdCBzdXJlIikpLAogICAgICAgICBob3dfbG9uZyA9IGZjdF9yZWNvZGUoaG93X2xvbmcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwgMSB5ZWFyIiA9ICJMZXNzIHRoYW4gb25lIHllYXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxLTIgeWVhcnMiID0gIjEtMiB5ZWFycyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjItNCB5ZWFycyIgPSAiMi00IHllYXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNC02IHllYXJzIiA9ICI0LTYgeWVhcnMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2LTEwIHllYXJzIiA9ICI2LTEwIHllYXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTArIHllYXJzIiA9ICJNb3JlIHRoYW4gMTAgeWVhcnMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VyZSIgPSAiSSdtIG5vdCBzdXJlIikpICU+JQogIGZpbHRlcighaXMubmEoaG93X2xvbmcpKSAlPiUgCiAgbXV0YXRlKGFjY291bnQgPSBmY3RfcmVjb2RlKGFjY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlyc3QiID0gImhvd2xvbmdfYWNjb3VudDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlY29uZCIgPSAiaG93bG9uZ19hY2NvdW50MiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcmQiID0gImhvd2xvbmdfYWNjb3VudDMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdXJ0aCIgPSAiaG93bG9uZ19hY2NvdW50NCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlmdGgiID0gImhvd2xvbmdfYWNjb3VudDUiKSkgJT4lIAogIGdyb3VwX2J5KGFjY291bnQsIGhvd19sb25nKSAlPiUgCiAgY291bnQoKSAlPiUgIAogIGdncGxvdChhZXMoeD1ob3dfbG9uZywgeT1uLCBmaWxsPWFjY291bnQpKSArIAogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiLCBjb2xvcj0iZ3JheTIwIikgKyAKICAgIGdlb21fdGV4dChhZXMobGFiZWw9biksIHNpemU9NCwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgIyBmb250ZmFjZT0iYm9sZCIsIAogICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSkpICsgCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIsIGRpcmVjdGlvbj0tMSkgKyAKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0xNSksCiAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMiksIAogICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTEpKSArIAogICAgbGFicyh0aXRsZSA9ICJIb3cgbG9uZyBzdXJ2ZXkgcmVzcG9uZGVudHMgcmVwb3J0ZWQgaGF2aW5nIGVhY2ggYWNjb3VudCBsaXN0ZWQiLCAKICAgICAgICAgeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiLAogICAgICAgICBmaWxsPSJSZXNwb25kZW50IGxpc3RlZCB0aGUgYWNjb3VudDoiKSArIAogICAgeWxpbSgwLDE0MCkgKQoKYGBgCgojIyMgSG93IGRpZCByZXNwb25kZW50cyBjaG9vc2UgdGhlaXIgdXNlcm5hbWVzPwoKV2hlbiB5b3UgY3JlYXRlZCB0aGUgZW1haWwgYWNjb3VudCAiJHtsbTovL0ZpZWxkLzF9IiwgaG93IGRpZCB5b3UgY2hvb3NlIHRoZSB1c2VybmFtZSBmb3IgdGhhdCBhY2NvdW50PyAoVGhlIHVzZXJuYW1lIGlzIHRoZSBwYXJ0IG9mIHRoZSBlbWFpbCBhZGRyZXNzIGJlZm9yZSB0aGUgQCBzaWduLikgU2VsZWN0IHRoZSByZXNwb25zZSBiZWxvdyB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaGVzIHlvdXIgZXhwZXJpZW5jZToKCiogSSBjcmVhdGVkIHRoZSBleGFjdCB1c2VybmFtZSBJIHdhbnRlZC4KKiBBIHVzZXJuYW1lIHdhcyBhc3NpZ25lZCB0byBtZSwgYW5kIEkga2VwdCBpdC4KKiBBIHVzZXJuYW1lIHdhcyBhc3NpZ25lZCB0byBtZSwgYnV0IEkgY2hhbmdlZCBpdCBsYXRlci4KKiBUaGUgc3lzdGVtIHN1Z2dlc3RlZCBhIHVzZXJuYW1lIHRvIG1lIHdoZW4gSSBjcmVhdGVkIHRoZSBhY2NvdW50LCBhbmQgSSBhY2NlcHRlZCBpdC4gCiogTW9zdCBvZiB0aGUgdXNlcm5hbWVzIEkgdHJpZWQgdG8gY3JlYXRlIHdlcmUgYWxyZWFkeSB0YWtlbiwgc28gSSBlbmRlZCB1cCB3aXRoIHRoaXMgb25lLgoqIEkgZG9uJ3QgcmVtZW1iZXIuIAoqIE5vbmUgb2YgdGhlIGFib3ZlLgoKYGBge3IgY2hvb3NlX3VzZXJuYW1lX2FjY291bnQsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9Cm51bV9hY2NvdW50MSA8LSB1bmxpc3QoZCAlPiUgZmlsdGVyKGFjY291bnQxKSAlPiUgY291bnQpCm51bV9hY2NvdW50MiA8LSB1bmxpc3QoZCAlPiUgZmlsdGVyKGFjY291bnQyKSAlPiUgY291bnQpCm51bV9hY2NvdW50MyA8LSB1bmxpc3QoZCAlPiUgZmlsdGVyKGFjY291bnQzKSAlPiUgY291bnQpCm51bV9hY2NvdW50NCA8LSB1bmxpc3QoZCAlPiUgZmlsdGVyKGFjY291bnQ0KSAlPiUgY291bnQpCm51bV9hY2NvdW50NSA8LSB1bmxpc3QoZCAlPiUgZmlsdGVyKGFjY291bnQ1KSAlPiUgY291bnQpCgpnLmRhdGEgPC0gZCAlPiUgc2VsZWN0KFJlc3BvbnNlSUQsIGNob29zZV91c2VybmFtZV9hY2NvdW50MSwgY2hvb3NlX3VzZXJuYW1lX2FjY291bnQyLCBjaG9vc2VfdXNlcm5hbWVfYWNjb3VudDMsIGNob29zZV91c2VybmFtZV9hY2NvdW50NCwgY2hvb3NlX3VzZXJuYW1lX2FjY291bnQ1KSAlPiUKICBnYXRoZXIoa2V5PWFjY291bnQsIHZhbHVlPWNob29zZV91c2VybmFtZSwgY2hvb3NlX3VzZXJuYW1lX2FjY291bnQxLCBjaG9vc2VfdXNlcm5hbWVfYWNjb3VudDIsIGNob29zZV91c2VybmFtZV9hY2NvdW50MywgY2hvb3NlX3VzZXJuYW1lX2FjY291bnQ0LCBjaG9vc2VfdXNlcm5hbWVfYWNjb3VudDUpICU+JSAKICBtdXRhdGUoY2hvb3NlX3VzZXJuYW1lID0gZmN0X3JlY29kZShjaG9vc2VfdXNlcm5hbWUsCiAgICAiY3JlYXRlZCIgPSAiSSBjcmVhdGVkIHRoZSBleGFjdCB1c2VybmFtZSBJIHdhbnRlZC4iLAogICAgImFzc2lnbmVkIGFuZCBrZXB0IiA9ICJBIHVzZXJuYW1lIHdhcyBhc3NpZ25lZCB0byBtZSwgYW5kIEkga2VwdCBpdC4iLAogICAgImFzc2lnbmVkIGFuZCBjaGFuZ2VkIiA9ICJBIHVzZXJuYW1lIHdhcyBhc3NpZ25lZCB0byBtZSwgYnV0IEkgY2hhbmdlZCBpdCBsYXRlci4iLAogICAgImFjY2VwZWQgc3VnZ2VzdGlvbiIgPSAiVGhlIHN5c3RlbSBzdWdnZXN0ZWQgYSB1c2VybmFtZSB0byBtZSB3aGVuIEkgY3JlYXRlZCB0aGUgYWNjb3VudCwgYW5kIEkgYWNjZXB0ZWQgaXQuIiwKICAgICJhbHJlYWR5IHRha2VuIiA9ICJNb3N0IG9mIHRoZSB1c2VybmFtZXMgSSB0cmllZCB0byBjcmVhdGUgd2VyZSBhbHJlYWR5IHRha2VuLCBzbyBJIGVuZGVkIHVwIHdpdGggdGhpcyBvbmUuIiwKICAgICJkb24ndCByZW1lbWJlciIgPSAiSSBkb24ndCByZW1lbWJlci4iLAogICAgIm5vbmUiID0gIk5vbmUgb2YgdGhlIGFib3ZlLiIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGNob29zZV91c2VybmFtZSkpICU+JSAKICBncm91cF9ieShhY2NvdW50LCBjaG9vc2VfdXNlcm5hbWUpICU+JSAKICBjb3VudCgpICU+JSAKICBtdXRhdGUocGVyY2VudCA9IGNhc2Vfd2hlbigKICAgIGFjY291bnQgPT0gImNob29zZV91c2VybmFtZV9hY2NvdW50MSIgfiBuL251bV9hY2NvdW50MSwKICAgIGFjY291bnQgPT0gImNob29zZV91c2VybmFtZV9hY2NvdW50MiIgfiBuL251bV9hY2NvdW50MiwKICAgIGFjY291bnQgPT0gImNob29zZV91c2VybmFtZV9hY2NvdW50MyIgfiBuL251bV9hY2NvdW50MywKICAgIGFjY291bnQgPT0gImNob29zZV91c2VybmFtZV9hY2NvdW50NCIgfiBuL251bV9hY2NvdW50NCwKICAgIGFjY291bnQgPT0gImNob29zZV91c2VybmFtZV9hY2NvdW50NSIgfiBuL251bV9hY2NvdW50NQogICkpICU+JSAKICBtdXRhdGUocGVyY2VudCA9IHJvdW5kKHBlcmNlbnQgKiAxMDApKQoKcGxvdCggZyA8LSBnZ3Bsb3QoZy5kYXRhLCBhZXMoeD1jaG9vc2VfdXNlcm5hbWUsIHk9cGVyY2VudCkpICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIAogIGZhY2V0X3dyYXAofmFjY291bnQsIG5jb2w9MykgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT04MCwgaGp1c3Q9MSkpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHRpdGxlID0gIkhvdyBkaWQgeW91IGNob29zZSB0aGUgdXNlcm5hbWUgZm9yIHRoYXQgYWNjb3VudD8iLCAKICAgICAgIHN1YnRpdGxlID0gInBlcmNlbnRhZ2VzIGluIGVhY2ggZmFjZXQgdG90YWwgdG8gMTAwJSIsCiAgICAgICB5PSJQZXJjZW50IG9mIHJlc3BvbmRlbnRzIiwgCiAgICAgICB4ID0gIlJlYXNvbnMgZm9yIGNob29zaW5nIGEgdXNlcm5hbWUiKSArIAogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocGVyY2VudCwgIiUiLCBzZXA9IiIpKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArCiAgeWxpbSgwLDEwMCkgKQpgYGAKCiMjIyBIb3cgZWFybHkgb24gZGlkIHJlc3BvbmRlbnRzIGNyZWF0ZSB0aGVpciBlbWFpbCBhY2NvdW50cz8KCkF0IHRoZSB0aW1lIHlvdSBjcmVhdGVkIHlvdXIgIiR7bG06Ly9GaWVsZC8xfSIgYWNjb3VudCwgYWJvdXQgaG93IHNvb24gd2FzIGl0IGFmdGVyIHRoZSBlbWFpbCBzZXJ2aWNlIGZpcnN0IGJlY2FtZSBhdmFpbGFibGU/IFBsZWFzZSBjaG9vc2UgdGhlIHJlc3BvbnNlIHRoYXQgYmVzdCByZXByZXNlbnRzIHdoYXQgeW91IHJlbWVtYmVyOgoKKiBWZXJ5IHNvb24gYWZ0ZXIgCiogU29tZXdoYXQgc29vbiBhZnRlcgoqIEEgd2hpbGUgYWZ0ZXIKKiBTb21ld2hhdCBsb25nIGFmdGVyCiogQSBsb25nIHRpbWUgYWZ0ZXIKKiBJIGRvbid0IGtub3cKCmBgYHtyIGVhcmx5X3VzZXJfYWNjb3VudCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KbnVtX2FjY291bnQxIDwtIHVubGlzdChkICU+JSBmaWx0ZXIoYWNjb3VudDEpICU+JSBjb3VudCkKbnVtX2FjY291bnQyIDwtIHVubGlzdChkICU+JSBmaWx0ZXIoYWNjb3VudDIpICU+JSBjb3VudCkKbnVtX2FjY291bnQzIDwtIHVubGlzdChkICU+JSBmaWx0ZXIoYWNjb3VudDMpICU+JSBjb3VudCkKbnVtX2FjY291bnQ0IDwtIHVubGlzdChkICU+JSBmaWx0ZXIoYWNjb3VudDQpICU+JSBjb3VudCkKbnVtX2FjY291bnQ1IDwtIHVubGlzdChkICU+JSBmaWx0ZXIoYWNjb3VudDUpICU+JSBjb3VudCkKCnBsb3QoZyA8LSBkICU+JSBzZWxlY3QoUmVzcG9uc2VJRCwgZWFybHlfdXNlcl9hY2NvdW50MSwgZWFybHlfdXNlcl9hY2NvdW50MiwgZWFybHlfdXNlcl9hY2NvdW50MywgZWFybHlfdXNlcl9hY2NvdW50NCwgZWFybHlfdXNlcl9hY2NvdW50NSkgJT4lCiAgZ2F0aGVyKGtleT1hY2NvdW50LCB2YWx1ZT1ob3dfc29vbiwgZWFybHlfdXNlcl9hY2NvdW50MSwgZWFybHlfdXNlcl9hY2NvdW50MiwgZWFybHlfdXNlcl9hY2NvdW50MywgZWFybHlfdXNlcl9hY2NvdW50NCwgZWFybHlfdXNlcl9hY2NvdW50NSkgJT4lIAogIG11dGF0ZShob3dfc29vbiA9IGZjdF9yZWxldmVsKGhvd19zb29uLCBsZXZlbHM9YygiVmVyeSBzb29uIGFmdGVyIiwgIlNvbWV3aGF0IHNvb24gYWZ0ZXIiLCAiQSB3aGlsZSBhZnRlciIsICJTb21ld2hhdCBsb25nIGFmdGVyIiwgIkEgbG9uZyB0aW1lIGFmdGVyIiwgIkkgZG9uJ3Qga25vdyIpKSkgJT4lIAogIGZpbHRlcighaXMubmEoaG93X3Nvb24pKSAlPiUgCiAgZ3JvdXBfYnkoYWNjb3VudCwgaG93X3Nvb24pICU+JSAKICBjb3VudCgpICU+JSAKICBtdXRhdGUocGVyY2VudCA9IGNhc2Vfd2hlbigKICAgIGFjY291bnQgPT0gImVhcmx5X3VzZXJfYWNjb3VudDEiIH4gbi9udW1fYWNjb3VudDEsCiAgICBhY2NvdW50ID09ICJlYXJseV91c2VyX2FjY291bnQyIiB+IG4vbnVtX2FjY291bnQyLAogICAgYWNjb3VudCA9PSAiZWFybHlfdXNlcl9hY2NvdW50MyIgfiBuL251bV9hY2NvdW50MywKICAgIGFjY291bnQgPT0gImVhcmx5X3VzZXJfYWNjb3VudDQiIH4gbi9udW1fYWNjb3VudDQsCiAgICBhY2NvdW50ID09ICJlYXJseV91c2VyX2FjY291bnQ1IiB+IG4vbnVtX2FjY291bnQ1CiAgKSkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChwZXJjZW50ICogMTAwKSkgJT4lIAogIGdncGxvdChhZXMoeD1ob3dfc29vbiwgeT1wZXJjZW50KSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyAKICAgIGZhY2V0X3dyYXAofmFjY291bnQsIG5jb2w9MykgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTgwLCBoanVzdD0xKSkgKyAKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9ODAsIGhqdXN0PTEpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgCiAgbGFicyh0aXRsZSA9ICJIb3cgc29vbiB3YXMgYWNjb3VudCBjcmVhdGVkIGFmdGVyIHRoZSBlbWFpbCBzZXJ2aWNlIGJlY2FtZSBhdmFpbGFibGU/IiwgCiAgICAgICBzdWJ0aXRsZSA9ICIocGVyY2VudGFnZXMgaW4gZWFjaCBmYWNldCB0b3RhbCB0byAxMDAlKSIsCiAgICAgICB5PSJQZXJjZW50IG9mIHJlc3BvbmRlbnRzIiwgCiAgICAgICB4ID0gIkhvdyBzb29uIHdhcyBhY2NvdW50IGNyZWF0ZWQiKSArIAogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocGVyY2VudCwgIiUiLCBzZXA9IiIpKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIAogIHlsaW0oMCwxMDApICkKYGBgCgoKCiMjIE5hbWVzIGFuZCBOYW1pbmcgQmxvY2sKCiMjIyBDaGFyYWN0ZXJpc3RpY3Mgb2YgcmVzcG9uZGVudHMnIG5hbWVzCgpJbnN0cnVjdGlvbnM6IFRoZSBmb2xsb3dpbmcgcXVlc3Rpb24gYXNrcyBmb3IgdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uLCB5b3VyIGZpcnN0IG5hbWUsIHlvdXIgbGFzdCBuYW1lLCBhbmQgT05MWSB0aGUgdXNlcm5hbWUgKHRoZSBwYXJ0IGJlZm9yZSB0aGUgQCBzaWduKSBvZiB5b3VyIGVtYWlsIGFjY291bnQgZnJvbSBhIHBvcHVsYXIgZnJlZSBlbWFpbCBzZXJ2aWNlIHByb3ZpZGVyIGxpa2UgR21haWwsIE91dGxvb2sgTWFpbCBvciBIb3RtYWlsLCBZYWhvbyEgTWFpbCwgb3IgQU9MIE1haWwgdGhhdCB5b3UgdXNlIG1vc3Qgb2Z0ZW4uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBob3cgc2ltaWxhciB5b3VyIHVzZXJuYW1lIGlzIHRvIHlvdXIgbmFtZSwgYW5kIHdpbGwgYmUgZGVsZXRlZCBhcyBzb29uIGFzIHRoZSBjb21wYXJpc29uIGlzIGNvbXBsZXRlLgoKKk5vdGU6IGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYWJvdXQgcmVzcG9uZGVudHMnIG5hbWVzIHdlcmUgY2FsY3VsYXRlZCwgYW5kIGVkaXQgZGlzdGFuY2UgY29tcGFyaXNvbnMgYmV0d2VlbiBuYW1lcyBhbmQgdXNlcm5hbWVzIHdlcmUgYWxzbyBjb21wdXRlZC4gVGhlbiB0aGUgcmF3IG5hbWUgZGF0YSB3ZXJlIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YXNldC4gT25seSB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB3ZXJlIHByZXNlcnZlZCwgdG8gcHJvdGVjdCByZXNwb25kZW50cycgcHJpdmFjeS4qCgpQbGVhc2UgZW50ZXIgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiBiZWxvdywgYW5kIG1ha2Ugc3VyZSB0byBjaGVjayBjYXJlZnVsbHkgZm9yIHR5cG9zOgoKKiBGaXJzdCBOYW1lICpbZmlsbCBpbiB0aGUgYmxhbmtdKgoqIExhc3QgTmFtZSAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKKiBFbWFpbCBVc2VybmFtZSAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKClBsZWFzZSByZS1lbnRlciB5b3VyIEZpcnN0IE5hbWUsIExhc3QgTmFtZSwgYW5kIHRoZSBFbWFpbCBVc2VybmFtZSB0aGF0IHlvdSBlbnRlcmVkIGFib3ZlOgoKKiBGaXJzdCBOYW1lICpbZmlsbCBpbiB0aGUgYmxhbmtdKgoqIExhc3QgTmFtZSAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKKiBFbWFpbCBVc2VybmFtZSAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKCipGaXJzdCBuYW1lIGFuZCBsYXN0IG5hbWUgbGVuZ3RoIGluIG51bWJlciBvZiBjaGFyYWN0ZXJzOioKYGBge3IgbmFtZSBsZW5ndGgsIGVjaG89RkFMU0V9CmthYmxlKGQgJT4lIHNlbGVjdChSZXNwb25zZUlELCBmaXJzdG5hbWVfbG93ZXJfbmNoYXJzLCBsYXN0bmFtZV9sb3dlcl9uY2hhcnMpICU+JSAKICBnYXRoZXIoa2V5PW5hbWUsIHZhbHVlPW5jaGFycywgZmlyc3RuYW1lX2xvd2VyX25jaGFycywgbGFzdG5hbWVfbG93ZXJfbmNoYXJzKSAlPiUgCiAgZ3JvdXBfYnkobmFtZSkgJT4lIAogIHN1bW1hcml6ZShNaW49bWluKG5jaGFycywgbmEucm09VCksIAogICAgICAgICAgICAgICAgTWVkaWFuPW1lZGlhbihuY2hhcnMsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE1heD1tYXgobmNoYXJzLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBNPW1lYW4obmNoYXJzLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBTRD1zZChuY2hhcnMsIG5hLnJtPVQpKSAlPiUgZHBseXI6OnJlbmFtZShgTmFtZSBMZW5ndGggKG5jaGFycylgID0gbmFtZSkpICU+JSAKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxNWVtIikKYGBgCgoKIyMjIFJlc3BvbmRlbnRzJyBzZWxmLXJlcG9ydCBlc3RpbWF0ZSBvZiBob3cgY29tbW9uIHRoZWlyIG5hbWUgaXMKCkluIHlvdXIgb3BpbmlvbiwgaG93IGNvbW1vbiBvciB1bmNvbW1vbiBpcyB5b3VyIEZJUlNUIG5hbWU/CgoqIEV4dHJlbWVseSBjb21tb24KKiBNb2RlcmF0ZWx5IGNvbW1vbgoqIFNsaWdodGx5IGNvbW1vbgoqIE5laXRoZXIgY29tbW9uIG5vciB1bmNvbW1vbgoqIFNsaWdodGx5IHVuY29tbW9uCiogTW9kZXJhdGVseSB1bmNvbW1vbgoqIEV4dHJlbWVseSB1bmNvbW1vbgoKSW4geW91ciBvcGluaW9uLCBob3cgY29tbW9uIG9yIHVuY29tbW9uIGlzIHlvdXIgTEFTVCBuYW1lPwoKKiBFeHRyZW1lbHkgY29tbW9uCiogTW9kZXJhdGVseSBjb21tb24KKiBTbGlnaHRseSBjb21tb24KKiBOZWl0aGVyIGNvbW1vbiBub3IgdW5jb21tb24KKiBTbGlnaHRseSB1bmNvbW1vbgoqIE1vZGVyYXRlbHkgdW5jb21tb24KKiBFeHRyZW1lbHkgdW5jb21tb24KCmBgYHtyIG5hbWUgY29tbW9uIHNlbGYtcmVwb3J0LCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQpkICU+JSBjb3VudChmaXJzdG5hbWVfY29tbW9uKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9Zmlyc3RuYW1lX2NvbW1vbiwgeT1uKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyAKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgCiAgICBnZ3RpdGxlKCJJbiB5b3VyIG9waW5pb24sIGhvdyBjb21tb24gb3IgdW5jb21tb24gaXMgeW91ciBGSVJTVCBuYW1lPyIpICsgCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDE0NSkKCmQgJT4lIGNvdW50KGxhc3RuYW1lX2NvbW1vbikgJT4lIAogICAgZ2dwbG90KGFlcyh4PWxhc3RuYW1lX2NvbW1vbiwgeT1uKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyAKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgCiAgICBnZ3RpdGxlKCJJbiB5b3VyIG9waW5pb24sIGhvdyBjb21tb24gb3IgdW5jb21tb24gaXMgeW91ciBMQVNUIG5hbWU/IikgKyAKICAgIGdlb21fdGV4dChhZXMobGFiZWw9biksIHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIGZvbnRmYWNlPSJib2xkIikgKyB5bGltKDAsODUpCmBgYAoKCiMjIyBDaGFyYWN0ZXJpc3RpY3Mgb2YgcmVzcG9uZGVudHMnIHVzZXJuYW1lcywgYW5kIHN1Z2dlc3RlZCBuZXcgdXNlcm5hbWUKClBsZWFzZSBpbWFnaW5lIHRoYXQgeW91IGFyZSBjcmVhdGluZyBhIG5ldyBlbWFpbCBhY2NvdW50IG9uIGEgYnJhbmQgbmV3IGVtYWlsIHNlcnZpY2UgdGhhdCBjdXJyZW50bHkgaGFzIHZlcnkgZmV3IHVzZXJzLCBhbmQgeW91IGNhbiBoYXZlIGFueSBlbWFpbCB1c2VybmFtZSB0aGF0IHlvdSB3YW50LiBXaGF0IHVzZXJuYW1lIHdvdWxkIHlvdSBjaG9vc2U/IFBsZWFzZSBlbnRlciBpdCBiZWxvdzogKltmaWxsIGluIHRoZSBibGFua10qCgoqVXNlcm5hbWUgbGVuZ3RoIChuY2hhcnMpLCBhbmQgd2hldGhlciB1c2VybmFtZXMgaGF2ZSBkaWdpdHMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzOioKYGBge3IgdXNlcm5hbWUgY2hhcmFjdGVyaXN0aWNzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprYWJsZShkICU+JSBzZWxlY3QoUmVzcG9uc2VJRCwgdXNlcm5hbWVfcGFyc2VkX25jaGFycywgbmV3X3VzZXJuYW1lX3BhcnNlZF9uY2hhcnMsIHVzZXJuYW1lX2RpZ2l0cywgCiAgICAgICAgICAgICB1c2VybmFtZV9zcGVjaWFscywgbmV3X3VzZXJuYW1lX2RpZ2l0cywgbmV3X3VzZXJuYW1lX3NwZWNpYWxzKSAlPiUgCiAgZ2F0aGVyKGtleT12YXJpYWJsZSwgdmFsdWU9dmFsdWUsIHVzZXJuYW1lX3BhcnNlZF9uY2hhcnMsIG5ld191c2VybmFtZV9wYXJzZWRfbmNoYXJzLCAKICAgICAgICAgdXNlcm5hbWVfZGlnaXRzLCB1c2VybmFtZV9zcGVjaWFscywgbmV3X3VzZXJuYW1lX2RpZ2l0cywgbmV3X3VzZXJuYW1lX3NwZWNpYWxzKSAlPiUgCiAgbXV0YXRlKHZhcmlhYmxlID0gZmN0X3JlbGV2ZWwodmFyaWFibGUsIGxldmVscz1jKCJ1c2VybmFtZV9wYXJzZWRfbmNoYXJzIiwgIm5ld191c2VybmFtZV9wYXJzZWRfbmNoYXJzIiwgInVzZXJuYW1lX2RpZ2l0cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3X3VzZXJuYW1lX2RpZ2l0cyIsICJ1c2VybmFtZV9zcGVjaWFscyIsICJuZXdfdXNlcm5hbWVfc3BlY2lhbHMiKSkpICU+JQogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgCiAgc3VtbWFyaXplKE1pbj1taW4odmFsdWUsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE1lZGlhbj1tZWRpYW4odmFsdWUsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE1heD1tYXgodmFsdWUsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIE09bWVhbih2YWx1ZSwgbmEucm09VCksIAogICAgICAgICAgICAgICAgU0Q9c2QodmFsdWUsIG5hLnJtPVQpKSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjBlbSIpCmBgYAoKCgojIyMgV2h5IGRpZCBwZW9wbGUgc2F5IHRoZXknZCBjaG9vc2UgYSBwYXJ0aWN1bGFyIHVzZXJuYW1lPwoKKk5vdGU6IHRoZSB0ZXh0IGluIHRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGNvbnRlbnQgYW5hbHlzaXMgb2YgcmVzcG9uZGVudHMnIHJlYXNvbnMgZm9yIGNob29zaW5nIHRoZWlyIHVzZXJuYW1lcy4gVGhlIHN1cnZleSBxdWVzdGlvbiBpcyBwcmVzZW50ZWQgYmVsb3cuIFRoZSByZW1haW5pbmcgdGV4dCBpbiB0aGlzIHNlY3Rpb24gd2FzIG5vdCBwYXJ0IG9mIHRoZSBzdXJ2ZXkuKgoKU3VydmV5IHF1ZXN0aW9uOiBQbGVhc2UgZXhwbGFpbiB3aHkgeW91IHdvdWxkIGNob29zZSB0aGUgdXNlcm5hbWUgIiR7Y2hvb3NlIHVzZXJuYW1lL0Nob2ljZVRleHRFbnRyeVZhbHVlfSIgaWYgeW91IHdlcmUgY3JlYXRpbmcgYW4gYWNjb3VudCBvbiBhIGJyYW5kIG5ldyBlbWFpbCBzZXJ2aWNlIHRoYXQgY3VycmVudGx5IGhhcyB2ZXJ5IGZldyB1c2Vycz8gWW91ciBhbnN3ZXIgbXVzdCBiZSBhdCBsZWFzdCAxMDAgY2hhcmFjdGVycyBsb25nLCB3aGljaCBpcyBhYm91dCAyLTMgc2VudGVuY2VzLiAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKCldlIG1hZGUgYSBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIHJlc3BvbnNlcyBhbmQgZGV2ZWxvcGVkIGEgc2V0IG9mIGNhdGVnb3JpZXMgb2YgcmVhc29ucyB3aHkgdGhleSB3b3VsZCBjaG9vc2UgYSBwYXJ0aWN1bGFyIHVzZXJuYW1lLiBUaGVzZSAicmVhc29ucyIgcmVmbGVjdCBjb25jZXJucyB0aGV5IGhhZCwgcG90ZW50aWFsIGZ1dHVyZSB1c2VzIG9mIHRoZWlyIGVtYWlsIGFjY291bnQsIGFuZCBjaGFyYWN0ZXJpc3RpY3MgdGhleSB3YW50ZWQgdGhlaXIgdXNlcm5hbWUgdG8gaGF2ZS4gVGhlbiwgdHdvIGNvZGVycyBjb2RlZCB0aGUgcmVzcG9uc2VzIHVzaW5nIHRoZXNlIGNhdGVnb3JpZXMuIAoKQmVsb3cgYXJlIHRoZSBjb2RlcywgYW5kIHRoZSBpbnRlci1yYXRlciByZWxpYWJpbGl0eSAoRmxlaXNzJyBrYXBwYSk6CgoqKk5hbWUgYW5kIEJpcnRoZGF0ZSoqCgoqIE93biBOYW1lOiBUaGVpciBvd24gbmFtZSAqKGthcHBhID0gYHIgYXMubnVtZXJpYyhrYXBwYW0uZmxlaXNzKGNiaW5kKGNhJG93bl9uYW1lX2EsIGNhJG93bl9uYW1lX2MpLCBleGFjdD1UUlVFKVs1XSlgKSoKKiBPd24gQmlydGhkYXRlOiBUaGVpciBvd24gYmlydGggZGF0ZSwgeWVhciwgZXRjLiAqKGthcHBhID0gYHIgYXMubnVtZXJpYyhrYXBwYW0uZmxlaXNzKGNiaW5kKGNhJG93bl9iaXJ0aGRhdGVfYSwgY2Ekb3duX2JpcnRoZGF0ZV9jKSwgZXhhY3Q9VFJVRSlbNV0pYCkqCiogT3duIE5pY2tuYW1lOiBUaGVpciBvd24gbmlja25hbWUgKihrYXBwYSA9IGByIGFzLm51bWVyaWMoa2FwcGFtLmZsZWlzcyhjYmluZChjYSRvd25fbmlja25hbWVfYSwgY2Ekb3duX25pY2tuYW1lX2MpLCBleGFjdD1UUlVFKVs1XSlgKSoKCioqTGlmZSBDaGFyYWN0ZXJpc3RpY3MqKgoKKiBGcmllbmQgTmFtZTogVGhlIG5hbWUgb2YgYSBmcmllbmQgb3IgZmFtaWx5IG1lbWJlciAqKGthcHBhID0gYHIgYXMubnVtZXJpYyhrYXBwYW0uZmxlaXNzKGNiaW5kKGNhJGZyaWVuZF9uYW1lX2EsIGNhJGZyaWVuZF9uYW1lX2MpLCBleGFjdD1UUlVFKVs1XSlgKSoKKiBMb2NhdGlvbjogQSBsb2NhdGlvbiwgbmVpZ2hib3Job29kLCB6aXAgY29kZSwgcGhvbmUgbnVtYmVyICooa2FwcGEgPSBgciBhcy5udW1lcmljKGthcHBhbS5mbGVpc3MoY2JpbmQoY2EkbG9jYXRpb25fYSwgY2EkbG9jYXRpb25fYyksIGV4YWN0PVRSVUUpWzVdKWApKgoqIFByb3BlciBOb3VuOiBBIHByb3BlciBub3VuIHRoYXQgaXMgdGhlIG5hbWUgb2Ygc29tZXRoaW5nIChsaWtlIGEgcGV0LCBmaWN0aW9uYWwgY2hhcmFjdGVyLCBzcG9ydHMgdGVhbSBvciBiYW5kLCBldGMuKSAqKGthcHBhID0gYHIgYXMubnVtZXJpYyhrYXBwYW0uZmxlaXNzKGNiaW5kKGNhJHByb2Zlc3Npb25hbF9hLCBjYSRwcm9mZXNzaW9uYWxfYyksIGV4YWN0PVRSVUUpWzVdKWApKgoKKipQZXJzb25hbCBNZWFuaW5nKioKCiogTWVhbmluZ2Z1bDogU29tZSBraW5kIG9mIHBlcnNvbmFsIG1lYW5pbmcgKGxpa2UgYWJvdXQgdGhlaXIgbGlmZSwgYWN0aXZpdGllcywgaW50ZXJlc3RzIG9yIHBlcnNvbmFsaXR5KSAqKGthcHBhID0gYHIgYXMubnVtZXJpYyhrYXBwYW0uZmxlaXNzKGNiaW5kKGNhJHBlcnNvbmFsX21lYW5pbmdfYSwgY2EkcGVyc29uYWxfbWVhbmluZ19jKSwgZXhhY3Q9VFJVRSlbNV0pYCkqCiogRml0cyBNZTogSSBqdXN0IGxpa2UgaXQsIGl0IGp1c3QgZml0cyBtZSwgaXQganVzdCBjYW1lIHRvIG1pbmQsIGV0Yy4gKihrYXBwYSA9IGByIGFzLm51bWVyaWMoa2FwcGFtLmZsZWlzcyhjYmluZChjYSRsaWtlX2l0X2EsIGNhJGxpa2VfaXRfYyksIGV4YWN0PVRSVUUpWzVdKWApKgoqIENhdGNoeTogSXQncyBjYXRjaHksIGNyZWF0aXZlLCBmdW4sIGV0Yy4gKihrYXBwYSA9IGByIGFzLm51bWVyaWMoa2FwcGFtLmZsZWlzcyhjYmluZChjYSRjYXRjaHlfYSwgY2EkY2F0Y2h5X2MpLCBleGFjdD1UUlVFKVs1XSlgKSoKKiBVbmlxdWU6IEl0J3MgdW5pcXVlLCB1bmNvbW1vbiwgdW51c3VhbCwgdW5saWtlbHksIGV0Yy4gKihrYXBwYSA9IGByIGFzLm51bWVyaWMoa2FwcGFtLmZsZWlzcyhjYmluZChjYSR1bmlxdWVfYSwgY2EkdW5pcXVlX2MpLCBleGFjdD1UUlVFKVs1XSlgKSoKCioqRnV0dXJlIFVzZXMqKgoKKiBNZW1vcmFibGU6IEVhc3kgdG8gcmVjb2duaXplIG9yIHJlbWVtYmVyICooa2FwcGEgPSBgciBhcy5udW1lcmljKGthcHBhbS5mbGVpc3MoY2JpbmQoY2EkbWVtb3JhYmxlX2EsIGNhJG1lbW9yYWJsZV9jKSwgZXhhY3Q9VFJVRSlbNV0pYCkqCiogU2FtZSBhZCBCZWZvcmU6IEl0J3MgdGhlIHNhbWUgdXNlcm5hbWUgYXMgdGhleSB1c2VkIGluIHRoZSBwYXN0LCBvciBvbiBvdGhlciBzeXN0ZW1zICooa2FwcGEgPSBgciBhcy5udW1lcmljKGthcHBhbS5mbGVpc3MoY2JpbmQoY2Ekc2FtZV9hLCBjYSRzYW1lX2MpLCBleGFjdD1UUlVFKVs1XSlgKSoKKiBQcm9mZXNzaW9uYWw6IFByb2Zlc3Npb25hbCBvciBidXNpbmVzcyByZWxhdGVkICooa2FwcGEgPSBgciBhcy5udW1lcmljKGthcHBhbS5mbGVpc3MoY2JpbmQoY2EkcHJvZmVzc2lvbmFsX2EsIGNhJHByb2Zlc3Npb25hbF9jKSwgZXhhY3Q9VFJVRSlbNV0pYCkqCiogU2VjdXJpdHk6IE1lbnRpb25zIHByaXZhY3ksIGlkZW50aXR5IHRoZWZ0LCBoYWNraW5nLCBhbm9ueW1pdHksIHNwYW1tZXJzICooa2FwcGEgPSBgciBhcy5udW1lcmljKGthcHBhbS5mbGVpc3MoY2JpbmQoY2Ekc2VjdXJpdHlfYSwgY2Ekc2VjdXJpdHlfYyksIGV4YWN0PVRSVUUpWzVdKWApKgoKTm9uZSBvZiB0aGUgYWJvdmUgKG11dHVhbGx5IGV4Y2x1c2l2ZSkgKihrYXBwYSA9IGByIGFzLm51bWVyaWMoa2FwcGFtLmZsZWlzcyhjYmluZChjYSRub25lX2EsIGNhJG5vbmVfYyksIGV4YWN0PVRSVUUpWzVdKWApKgoKVGhlIHRhYmxlIGFuZCBncmFwaCBiZWxvdyBzaG93IGNvdW50cyBmb3IgZWFjaCBvZiB0aGUgY29kZXMgd2hpY2ggaGFkIGludGVyLXJhdGVyIHJlbGlhYmlsaXR5IGFib3ZlIDAuNSwgYW5kIG9uIHdoaWNoIGVpdGhlciBvbmUgb2YgdGhlIGNvZGVycyBzYWlkIHllcywgdGhhdCBtb3RpdmF0aW9uIHdhcyBwcmVzZW50LgoKYGBge3Igd2h5X3VzZXJuYW1lIGNvZGVkLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQuNSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmthYmxlKHdoeV91c2VybmFtZV9jb2RlZCA8LSBkICU+JSBzZWxlY3QoUmVzcG9uc2VJRCwgZW5kc193aXRoKCJfZWl0aGVyIikpICU+JQogIGdhdGhlcihrZXk9Y29kZSwgdmFsdWU9Y2hlY2tlZCwgZW5kc193aXRoKCJfZWl0aGVyIikpICU+JSAKICBtdXRhdGUoY29kZSA9IGZjdF9yZWNvZGUoY29kZSwKICAgICJPd24gTmFtZSIgPSAib3duX25hbWVfZWl0aGVyIiwKICAgICJPd24gQmlydGhkYXRlIiA9ICJvd25fYmlydGhkYXRlX2VpdGhlciIsCiAgICAiT3duIE5pY2tuYW1lIiA9ICJvd25fbmlja25hbWVfZWl0aGVyIiwKICAgICJGcmllbmQgTmFtZSIgPSAiZnJpZW5kX25hbWVfZWl0aGVyIiwKICAgICJMb2NhdGlvbiIgPSAibG9jYXRpb25fZWl0aGVyIiwKICAgICJQcm9wZXIgTm91biIgPSAicHJvcGVyX25vdW5fZWl0aGVyIiwKICAgICJNZWFuaW5nZnVsIiA9ICJwZXJzb25hbF9tZWFuaW5nX2VpdGhlciIsCiAgICAiQ2F0Y2h5IiA9ICJjYXRjaHlfZWl0aGVyIiwKICAgICJVbmlxdWUiID0gInVuaXF1ZV9laXRoZXIiLAogICAgIk1lbW9yYWJsZSIgPSAibWVtb3JhYmxlX2VpdGhlciIsCiAgICAiU2FtZSBhcyBCZWZvcmUiID0gInNhbWVfZWl0aGVyIiwKICAgICJQcm9mZXNzaW9uYWwiID0gInByb2Zlc3Npb25hbF9laXRoZXIiLAogICAgIlNlY3VyaXR5IiA9ICJzZWN1cml0eV9laXRoZXIiKSwKICAgIGNvZGUgPSBmY3RfcmVsZXZlbChjb2RlLCBsZXZlbHM9YygiTWVtb3JhYmxlIiwiU2FtZSBhcyBCZWZvcmUiLCJQcm9mZXNzaW9uYWwiLCJTZWN1cml0eSIsCiAgICAgICJPd24gTmFtZSIsIk93biBCaXJ0aGRhdGUiLCJPd24gTmlja25hbWUiLAogICAgICAiUHJvcGVyIE5vdW4iLCJGcmllbmQgTmFtZSIsIkxvY2F0aW9uIiwKICAgICAgIk1lYW5pbmdmdWwiLCJVbmlxdWUiLCJDYXRjaHkiKSkpICU+JSAKICBmaWx0ZXIoY2hlY2tlZCA9PSBUKSAlPiUKICBncm91cF9ieShjb2RlKSAlPiUgCiAgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSkgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjIwZW0iKQoKcGxvdCggZyA8LSB3aHlfdXNlcm5hbWVfY29kZWQgJT4lIAogIG11dGF0ZSh0eXBlID0gaWZlbHNlKGNvZGUgJWluJSBjKCJPd24gTmFtZSIsIk93biBCaXJ0aGRhdGUiLCJPd24gTmlja25hbWUiKSwgIk5hbWUgYW5kIEJpcnRoZGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb2RlICVpbiUgYygiRnJpZW5kIE5hbWUiLCJMb2NhdGlvbiIsIlByb3BlciBOb3VuIiksICJMaWZlIENoYXJhY3RlcmlzdGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29kZSAlaW4lIGMoIk1lYW5pbmdmdWwiLCJDYXRjaHkiLCJVbmlxdWUiKSwgIlBlcnNvbmFsIE1lYW5pbmciLCAiRnV0dXJlIFVzZXMiKSkpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWNvZGUsIHk9biwgZmlsbD10eXBlKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIiwgY29sb3I9ImdyYXkyMCIpICsgCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIsIGRpcmVjdGlvbj0tMSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsCiAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTE1KSwKICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0yNSwgaGp1c3Q9MSksCiAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMiksIAogICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTEpKSArIAogICAgbGFicyh0aXRsZT0iVXNlcm5hbWUgY2hhcmFjdGVyaXN0aWNzIGltcG9ydGFudCB0byBzdXJ2ZXkgcmVzcG9uZGVudHMiLAogICAgICAgICB5PSJOdW1iZXIgb2Ygc3VydmV5IHJlc3BvbmRlbnRzIiwKICAgICAgICAgZmlsbD0iIikgKyAKICAgIHlsaW0oMCwyMDUpICkKYGBgCgpUaGUgY2F0ZWdvcmllcyB3ZXJlIG5vdCBtdXR1YWxseSBleGNsdXNpdmUsIGV4Y2VwdCB3aGVyZSBpbmRpY2F0ZWQgaW4gdGhlIGxpc3Qgb2YgY2F0ZWdvcmllcywgYWJvdmUgKGZha2UgcmVzcG9uc2Ugb3Igbm9uZSBvZiB0aGUgYWJvdmUpLiBUaGUgY2F0ZWdvcmllcyB3ZXJlIGZ1cnRoZXIgZ3JvdXBlZCBpbnRvIGZvdXIgaGlnaC1sZXZlbCBzZXRzIG9mIGNhdGVnb3JpZXMgYXMgc2hvd24gaW4gdGhlIGJhciBjaGFydC4gVGhlIHRhYmxlcyBiZWxvdyBwcmVzZW50IGNvdW50cyBvZiBob3cgbWFueSBkaXN0aW5jdCByZXNwb25kZW50cyBnYXZlIHJlYXNvbnMgdGhhdCBmZWxsIGludG8gZWFjaCBjYXRlZ29yeS4KYGBge3IgZWNobz1GQUxTRX0KIyB0byBmaW5kIG91dCBob3cgbWFueSByZXNwb25kZW50cyBoYWQgcmVzcG9uc2VzIGNvZGVkIGluIGVhY2ggY2F0ZWdvcnkKd2h5X3VzZXJuYW1lX2NhdGVnb3J5X3N1bXMgPC0gZCAlPiUgc2VsZWN0KFJlc3BvbnNlSUQsIGVuZHNfd2l0aCgiX2VpdGhlciIpKSAlPiUgCiAgZHBseXI6OnJlbmFtZSgibmFtZV9vd25fbmFtZSIgPSAib3duX25hbWVfZWl0aGVyIiwKICAgICJuYW1lX293bl9iaXJ0aGRhdGUiID0gIm93bl9iaXJ0aGRhdGVfZWl0aGVyIiwKICAgICJuYW1lX293bl9uaWNrbmFtZSIgPSAib3duX25pY2tuYW1lX2VpdGhlciIsCiAgICAibGlmZV9mcmllbmRfbmFtZSIgPSAiZnJpZW5kX25hbWVfZWl0aGVyIiwKICAgICJsaWZlX2xvY2F0aW9uIiA9ICJsb2NhdGlvbl9laXRoZXIiLAogICAgImxpZmVfcHJvcGVyX25vdW4iID0gInByb3Blcl9ub3VuX2VpdGhlciIsCiAgICAibWVhbmluZ19wZXJzb25hbCIgPSAicGVyc29uYWxfbWVhbmluZ19laXRoZXIiLAogICAgIm1lYW5pbmdfY2F0Y2h5IiA9ICJjYXRjaHlfZWl0aGVyIiwKICAgICJtZWFuaW5nX3VuaXF1ZSIgPSAidW5pcXVlX2VpdGhlciIsCiAgICAiZnV0dXJlX21lbW9yYWJsZSIgPSAibWVtb3JhYmxlX2VpdGhlciIsCiAgICAiZnV0dXJlX3NhbWUiID0gInNhbWVfZWl0aGVyIiwKICAgICJmdXR1cmVfcHJvZmVzc2lvbmFsIiA9ICJwcm9mZXNzaW9uYWxfZWl0aGVyIiwKICAgICJmdXR1cmVfc2VjdXJpdHkiID0gInNlY3VyaXR5X2VpdGhlciIpICU+JSAKICBtdXRhdGUoZnV0dXJlX3N1bSA9IGZ1dHVyZV9tZW1vcmFibGUgKyBmdXR1cmVfc2FtZSArIGZ1dHVyZV9wcm9mZXNzaW9uYWwgKyBmdXR1cmVfc2VjdXJpdHksCiAgICAgICAgIG5hbWVfc3VtID0gbmFtZV9vd25fbmFtZSArIG5hbWVfb3duX25pY2tuYW1lICsgbmFtZV9vd25fYmlydGhkYXRlLAogICAgICAgICBsaWZlX3N1bSA9IGxpZmVfZnJpZW5kX25hbWUgKyBsaWZlX2xvY2F0aW9uICsgbGlmZV9wcm9wZXJfbm91biwKICAgICAgICAgbWVhbmluZ19zdW0gPSBtZWFuaW5nX3BlcnNvbmFsICsgbWVhbmluZ19jYXRjaHkgKyBtZWFuaW5nX3VuaXF1ZSwKICAgICAgICAgbmFtZV9tZW1vcmFibGVfcGVyc29uYWxfc3VtID0gZnV0dXJlX21lbW9yYWJsZSArIG1lYW5pbmdfcGVyc29uYWwgKyBuYW1lX293bl9uYW1lKSAlPiUgCiAgc2VsZWN0KFJlc3BvbnNlSUQsIGVuZHNfd2l0aCgiX3N1bSIpKQoKa2FibGUod2h5X3VzZXJuYW1lX2NhdGVnb3J5X3N1bXMgJT4lIGNvdW50KGZ1dHVyZV9zdW0gPiAwKSAlPiUgCiAgICAgICBkcGx5cjo6cmVuYW1lKGBGdXR1cmUgVXNlc2AgPSBgZnV0dXJlX3N1bSA+IDBgKSAlPiUgYXJyYW5nZShkZXNjKGBGdXR1cmUgVXNlc2ApKSkgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjIxZW0iKQoKa2FibGUod2h5X3VzZXJuYW1lX2NhdGVnb3J5X3N1bXMgJT4lIGNvdW50KG5hbWVfc3VtID4gMCkgJT4lIGRwbHlyOjpyZW5hbWUoYE5hbWUgYW5kIEJpcnRoZGF0ZWAgPSBgbmFtZV9zdW0gPiAwYCkgJT4lIGFycmFuZ2UoZGVzYyhgTmFtZSBhbmQgQmlydGhkYXRlYCkpKSAlPiUgCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjFlbSIpCgprYWJsZSh3aHlfdXNlcm5hbWVfY2F0ZWdvcnlfc3VtcyAlPiUgY291bnQobGlmZV9zdW0gPiAwKSAlPiUgZHBseXI6OnJlbmFtZShgTGlmZSBDaGFyYWN0ZXJpc3RpY3NgID0gYGxpZmVfc3VtID4gMGApICU+JSBhcnJhbmdlKGRlc2MoYExpZmUgQ2hhcmFjdGVyaXN0aWNzYCkpKSAlPiUgCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjFlbSIpCgprYWJsZSh3aHlfdXNlcm5hbWVfY2F0ZWdvcnlfc3VtcyAlPiUgY291bnQobWVhbmluZ19zdW0gPiAwKSAlPiUgZHBseXI6OnJlbmFtZShgUGVyc29uYWwgTWVhbmluZ2AgPSBgbWVhbmluZ19zdW0gPiAwYCkgJT4lIGFycmFuZ2UoZGVzYyhgUGVyc29uYWwgTWVhbmluZ2ApKSkgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjIxZW0iKQoKa2FibGUod2h5X3VzZXJuYW1lX2NhdGVnb3J5X3N1bXMgJT4lIGNvdW50KG5hbWVfbWVtb3JhYmxlX3BlcnNvbmFsX3N1bSA+IDApICU+JSBkcGx5cjo6cmVuYW1lKGBOYW1lIGFuZCBCaXJ0aGRhdGUsIFBlcnNvbmFsIE1lYW5pbmdgID0gYG5hbWVfbWVtb3JhYmxlX3BlcnNvbmFsX3N1bSA+IDBgKSAlPiUgYXJyYW5nZShkZXNjKGBOYW1lIGFuZCBCaXJ0aGRhdGUsIFBlcnNvbmFsIE1lYW5pbmdgKSkpICU+JSAKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIyMWVtIikKYGBgCgoKCiMjIyBXaGF0IHJlc3BvbmRlbnRzIGNvbnNpZGVyIHdoZW4gY3JlYXRpbmcgYSBuZXcgdXNlcm5hbWUKCldoYXQgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nIGZvciB5b3UgdG8gY29uc2lkZXIgd2hlbiBjcmVhdGluZyBhIG5ldyBlbWFpbCB1c2VybmFtZT8gUGxlYXNlIGRyYWcgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIHB1dCB0aGVtIGluIG9yZGVyIGFjY29yZGluZyB0byBob3cgaW1wb3J0YW50IHRoZXkgd291bGQgYmUgZm9yIHlvdToKCiogTXkgbmV3IHVzZXJuYW1lIHNob3VsZCBiZSBlYXN5IGZvciBvdGhlcnMgdG8gcmVtZW1iZXIKKiBNeSBuZXcgdXNlcm5hbWUgc2hvdWxkIGJlIHNpbWlsYXIgdG8gbXkgcmVhbCBuYW1lCiogTXkgbmV3IHVzZXJuYW1lIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBteSB1c2VybmFtZSBvbiBvdGhlciBhY2NvdW50cwoqIE15IG5ldyB1c2VybmFtZSBzaG91bGQgYmUgdW5pcXVlIGNvbXBhcmVkIHRvIG90aGVyIHBlb3BsZSdzIGVtYWlsIHVzZXJuYW1lcwoqIE15IG5ldyB1c2VybmFtZSBzaG91bGQgcmVwcmVzZW50IHNvbWUgYXNwZWN0IG9mIG15IGludGVyZXN0cyBvciBwZXJzb25hbGl0eQoqIE15IG5ldyB1c2VybmFtZSBzaG91bGQgc291bmQgcHJvZmVzc2lvbmFsCiogTXkgbmV3IHVzZXJuYW1lIHNob3VsZCBiZSBoYXJkIGZvciBzcGFtbWVycyB0byBndWVzcwoKYGBge3IgbW90aXZhdGlvbiBkZXNjcmlwdGl2ZXMsIGVjaG89RkFMU0V9CmthYmxlKGQgJT4lIHNlbGVjdChSZXNwb25zZUlELCBtb3RpdmF0aW9uX3JlbWVtYmVyOm1vdGl2YXRpb25faGFyZF90b19ndWVzcykgJT4lIAogIGdhdGhlcihrZXk9dmFyaWFibGUsIHZhbHVlPXZhbHVlLCBtb3RpdmF0aW9uX3JlbWVtYmVyOm1vdGl2YXRpb25faGFyZF90b19ndWVzcykgJT4lIAogIG11dGF0ZSh2YXJpYWJsZSA9IGZjdF9yZWNvZGUodmFyaWFibGUsCiAgICAiTXkgbmV3IHVzZXJuYW1lIHNob3VsZCBiZSBlYXN5IGZvciBvdGhlcnMgdG8gcmVtZW1iZXIiID0gIm1vdGl2YXRpb25fcmVtZW1iZXIiLAogICAgIk15IG5ldyB1c2VybmFtZSBzaG91bGQgYmUgc2ltaWxhciB0byBteSByZWFsIG5hbWUiID0gIm1vdGl2YXRpb25fcmVhbCIsCiAgICAiTXkgbmV3IHVzZXJuYW1lIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBteSB1c2VybmFtZSBvbiBvdGhlciBhY2NvdW50cyIgPSAibW90aXZhdGlvbl9zYW1lIiwKICAgICJNeSBuZXcgdXNlcm5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBjb21wYXJlZCB0byBvdGhlciBwZW9wbGUncyBlbWFpbCB1c2VybmFtZXMiID0gIm1vdGl2YXRpb25fdW5pcXVlIiwKICAgICJNeSBuZXcgdXNlcm5hbWUgc2hvdWxkIHJlcHJlc2VudCBzb21lIGFzcGVjdCBvZiBteSBpbnRlcmVzdHMgb3IgcGVyc29uYWxpdHkiID0gIm1vdGl2YXRpb25fcmVwcmVzZW50X21lIiwKICAgICJNeSBuZXcgdXNlcm5hbWUgc2hvdWxkIHNvdW5kIHByb2Zlc3Npb25hbCIgPSAibW90aXZhdGlvbl9wcm9mZXNzaW9uYWwiLAogICAgIk15IG5ldyB1c2VybmFtZSBzaG91bGQgYmUgaGFyZCBmb3Igc3BhbW1lcnMgdG8gZ3Vlc3MiID0gIm1vdGl2YXRpb25faGFyZF90b19ndWVzcyIpKSAlPiUKICBncm91cF9ieSh2YXJpYWJsZSkgJT4lIAogIHN1bW1hcml6ZShNaW49bWluKHZhbHVlLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBNZWRpYW49bWVkaWFuKHZhbHVlLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBNYXg9bWF4KHZhbHVlLCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICBNPW1lYW4odmFsdWUsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgIFNEPXNkKHZhbHVlLCBuYS5ybT1UKSkgJT4lIHVuZ3JvdXAoKSAlPiUgCiAgZHBseXI6OnJlbmFtZShRdWVzdGlvbiA9IHZhcmlhYmxlKSkgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjM4ZW0iKQpgYGAKCipCYXIgY2hhcnRzIG9mIHRoZSByYW5rcyBhc3NpZ25lZCB0byBlYWNoIGl0ZW06KgpgYGB7ciBtb3RpdmF0aW9uIGdyYXBocywgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KZCAlPiUgc2VsZWN0KFJlc3BvbnNlSUQsIG1vdGl2YXRpb25fcmVtZW1iZXI6bW90aXZhdGlvbl9oYXJkX3RvX2d1ZXNzKSAlPiUKICBnYXRoZXIoa2V5PW1vdGl2YXRpb24sIHZhbHVlPXJhbmssIG1vdGl2YXRpb25fcmVtZW1iZXI6bW90aXZhdGlvbl9oYXJkX3RvX2d1ZXNzKSAlPiUgCiAgZ3JvdXBfYnkobW90aXZhdGlvbiwgcmFuaykgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoeD1yYW5rLCB5PW4pKSArIAogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIAogICAgZmFjZXRfd3JhcCh+bW90aXZhdGlvbiwgbmNvbD00KSArIAogICAgIyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT04MCwgaGp1c3Q9MSkpICsgCiAgICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArIAogICAgZ2d0aXRsZSgiV2hhdCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcgdG8gY29uc2lkZXIgd2hlbiBjcmVhdGluZyBhIG5ldyBlbWFpbCB1c2VybmFtZT8iKSArIAogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCw5MCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgxOjcpKQoKZCAlPiUgc2VsZWN0KFJlc3BvbnNlSUQsIG1vdGl2YXRpb25fcmVtZW1iZXI6bW90aXZhdGlvbl9oYXJkX3RvX2d1ZXNzKSAlPiUKICBnYXRoZXIoa2V5PW1vdGl2YXRpb24sIHZhbHVlPXJhbmssIG1vdGl2YXRpb25fcmVtZW1iZXI6bW90aXZhdGlvbl9oYXJkX3RvX2d1ZXNzKSAlPiUgCiAgbXV0YXRlKG1vdGl2YXRpb24gPSBmY3RfcmVjb2RlKG1vdGl2YXRpb24sCiAgICAicmVtZW1iZXIiID0gIm1vdGl2YXRpb25fcmVtZW1iZXIiLAogICAgInJlYWwgbmFtZSIgPSAibW90aXZhdGlvbl9yZWFsIiwKICAgICJzYW1lIiA9ICJtb3RpdmF0aW9uX3NhbWUiLAogICAgInVuaXF1ZSIgPSAibW90aXZhdGlvbl91bmlxdWUiLAogICAgInJlcHJlc2VudCBtZSIgPSAibW90aXZhdGlvbl9yZXByZXNlbnRfbWUiLAogICAgInByb2Zlc3Npb25hbCIgPSAibW90aXZhdGlvbl9wcm9mZXNzaW9uYWwiLAogICAgImhhcmQgdG8gZ3Vlc3MiID0gIm1vdGl2YXRpb25faGFyZF90b19ndWVzcyIpKSAlPiUKICBncm91cF9ieShtb3RpdmF0aW9uLCByYW5rKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PW1vdGl2YXRpb24sIHk9bikpICsgCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgCiAgICBmYWNldF93cmFwKH5yYW5rLCBuY29sPTQpICsgCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT04MCwgaGp1c3Q9MSkpICsgCiAgICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArIAogICAgZ2d0aXRsZSgiV2hhdCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcgdG8gY29uc2lkZXIgd2hlbiBjcmVhdGluZyBhIG5ldyBlbWFpbCB1c2VybmFtZT8iKSArIAogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCw5MCkKYGBgCgoKCiMjIE1pc2RpcmVjdGVkIEVtYWlsIEJsb2NrCgojIyMgUXVlc3Rpb25zIGFib3V0IHByZXZhbGVuY2Ugb2YgbWlzZGlyZWN0ZWQgZW1haWwKCipUaGUgcmVzcG9uc2UgaXRlbXMgaW4gdGhlIHF1ZXN0aW9uIGJlbG93IGFyZSBvdXIgc3BlY3VsYXRpb25zIGJhc2VkIG9uIHBpbG90aW5nIG91ciBpbnRlcnZpZXcgcHJvdG9jb2wgYWJvdXQgcG9zc2libGUgc3ltcHRvbXMgb2YgbWlzZGlyZWN0ZWQgZW1haWwsIGFuZCByZWFzb25zIHdoeSBtaXNkaXJlY3RlZCBlbWFpbCBtYXkgaGFwcGVuLiBUaGVzZSB3ZXJlIGFsc28gc2NyZWVuaW5nIHF1ZXN0aW9ucyBmb3IgdGhlIGludGVydmlldyBzdHVkeS4gUmVzcG9uZGVudHMgd2VyZSBhc2tlZCwgIldoaWNoIG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBkZXNjcmliZSB5b3U/IiBhbmQgaW5zdHJ1Y3RlZCB0byBzZWxlY3QgYWxsIHRoYXQgYXBwbHkuKgoKV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGRlc2NyaWJlIHlvdT8gUGxlYXNlIGNoZWNrIGFsbCB0aGF0IGFwcGx5OiAKCiogSSBoYXZlIHJlY2VpdmVkIGFuIGVtYWlsIG1lc3NhZ2UgdGhhdCBzZWVtZWQgbGlrZSBpdCB3YXMgaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZQoqIEkgaGF2ZSBiZWVuIGFza2VkIGluIGFuIGVtYWlsIHRvIGNvbmZpcm0gYW4gYWNjb3VudCB0aGF0IEkgZG9u4oCZdCByZW1lbWJlciBjcmVhdGluZwoqIEkgaGF2ZSBzZW50IGFuIGVtYWlsIG1lc3NhZ2UgdG8gdGhlIHdyb25nIHBlcnNvbiBieSBtaXN0YWtlCiogSSBoYXZlIGdpdmVuIG91dCBhICJ0aHJvd2F3YXkiIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgZmFrZSBvciBkaWQgbm90IGJlbG9uZyB0byBtZSB0byBhIHdlYnNpdGUsIHN0b3JlLCBvciByZXN0YXVyYW50LCBvciBpbiBleGNoYW5nZSBmb3IgYSBzZXJ2aWNlIGxpa2UgZnJlZSB3aWZpCiogSSBoYXZlIHVzZWQgYSAidGhyb3dhd2F5IiBlbWFpbCBhZGRyZXNzIHRoYXQgd2FzIGZha2Ugb3IgZGlkIG5vdCBiZWxvbmcgdG8gbWUgYWZ0ZXIgYmVpbmcgYXNrZWQgdG8gc2lnbiB1cCBmb3IgYW4gb25saW5lIGFjY291bnQsIG1haWxpbmcgbGlzdCwgb3Igb3RoZXIgb25saW5lIHNlcnZpY2UKKiBOb25lIG9mIHRoZSBhYm92ZQoKYGBge3Igd3JvbmdfZW1haWwsIGVjaG89RkFMU0V9CmthYmxlKGQgJT4lIHNlbGVjdChSZXNwb25zZUlELCB3cm9uZ2VtYWlsOndyb25nZW1haWxfbm9uZSkgJT4lCiAgZ2F0aGVyKGtleT13cm9uZ19lbWFpbCwgdmFsdWU9Y2hlY2tlZCwgd3JvbmdlbWFpbDp3cm9uZ2VtYWlsX25vbmUpICU+JQogIG11dGF0ZSh3cm9uZ19lbWFpbCA9IGZjdF9yZWNvZGUod3JvbmdfZW1haWwsCiAgICAiSSBoYXZlIHJlY2VpdmVkIGFuIGVtYWlsIG1lc3NhZ2UgdGhhdCBzZWVtZWQgbGlrZSBpdCB3YXMgaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZSIgPSAid3JvbmdlbWFpbCIsCiAgICAiSSBoYXZlIGJlZW4gYXNrZWQgaW4gYW4gZW1haWwgdG8gY29uZmlybSBhbiBhY2NvdW50IHRoYXQgSSBkb27igJl0IHJlbWVtYmVyIGNyZWF0aW5nIiA9ICJ3cm9uZ2VtYWlsX2NvbmZpcm0iLAogICAgIkkgaGF2ZSBzZW50IGFuIGVtYWlsIG1lc3NhZ2UgdG8gdGhlIHdyb25nIHBlcnNvbiBieSBtaXN0YWtlIiA9ICJ3cm9uZ2VtYWlsX3NlbnQiLAogICAgIkkgaGF2ZSBnaXZlbiBvdXQgYSAndGhyb3dhd2F5JyBlbWFpbCBhZGRyZXNzIHRoYXQgd2FzIGZha2Ugb3IgZGlkIG5vdCBiZWxvbmcgdG8gbWUgdG8gYSB3ZWJzaXRlLi4uIiA9ICJ3cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UiLAogICAgIkkgaGF2ZSB1c2VkIGEgJ3Rocm93YXdheScgZW1haWwgYWRkcmVzcyB0aGF0IHdhcyBmYWtlIG9yIGRpZCBub3QgYmVsb25nIHRvIG1lIHRvIHNpZ24gdXAgZm9yIGFuIG9ubGluZSBhY2NvdW50IiA9ICJ3cm9uZ2VtYWlsX2Zha2Vfc2lnbnVwIiwKICAgICJOb25lIG9mIHRoZSBhYm92ZSIgPSAid3JvbmdlbWFpbF9ub25lIikpICU+JQogIGZpbHRlcihjaGVja2VkID09IFQpICU+JSAKICAgIGdyb3VwX2J5KHdyb25nX2VtYWlsKSAlPiUgCiAgICBzdW1tYXJpemUobiA9IG4oKSkgJT4lIAogICAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChuL3N1bShuKSAqIDEwMCkpICU+JQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIGRwbHlyOjpyZW5hbWUoYFJlc3BvbnNlYCA9IHdyb25nX2VtYWlsKSkgJT4lIAprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI0MGVtIikKYGBgCgoKIyMjIyBJIGhhdmUgcmVjZWl2ZWQgYW4gZW1haWwgbWVzc2FnZSB0aGF0IHNlZW1lZCBsaWtlIGl0IHdhcyBpbnRlbmRlZCBmb3Igc29tZW9uZSBlbHNlCgoqRGlzcGxheSBpZiAiSSBoYXZlIHJlY2VpdmVkIGFuIGVtYWlsIG1lc3NhZ2UgdGhhdCBzZWVtZWQgbGlrZSBpdCB3YXMgaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZSIgd2FzIHNlbGVjdGVkOiogIApXaGVuIHdhcyB0aGUgbGFzdCB0aW1lIHlvdSByZWNlaXZlZCBhbiBlbWFpbCBtZXNzYWdlIHRoYXQgc2VlbWVkIGxpa2UgaXQgd2FzIGludGVuZGVkIGZvciBzb21lb25lIGVsc2U/CgoqIFRvZGF5CiogV2l0aGluIHRoZSBwYXN0IGZldyBkYXlzCiogV2l0aGluIHRoZSBwYXN0IHdlZWsKKiBXaXRoaW4gdGhlIHBhc3QgbW9udGgKKiBNb3JlIHRoYW4gYSBtb250aCBhZ28KKiBJJ20gbm90IHN1cmUKCmBgYHtyIHdyb25nZW1haWwgLSBsYXN0IHRpbWUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CiMgbGFzdF90aW1lX3dyb25nZW1haWwKZCAlPiUgZmlsdGVyKCFpcy5uYShsYXN0X3RpbWVfd3JvbmdlbWFpbCkpICU+JSBjb3VudChsYXN0X3RpbWVfd3JvbmdlbWFpbCkgJT4lIGdncGxvdChhZXMoeD1sYXN0X3RpbWVfd3JvbmdlbWFpbCwgeT1uKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEpKSArIGdlb21fdGV4dChhZXMobGFiZWw9biksIHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIGZvbnRmYWNlPSJib2xkIikgKyB5bGltKDAsNDUpICsgZ2d0aXRsZSgiV2hlbiB3YXMgdGhlIGxhc3QgdGltZS4uLiBpbnRlbmRlZCBmb3Igc29tZW9uZSBlbHNlIikgKyBsYWJzKHg9IiIsIHk9Ik51bWJlciBvZiBSZXNwb25kZW50cyIpCmBgYAoKSG93IG9mdGVuIGRvIHlvdSByZWNlaXZlIGVtYWlsIG1lc3NhZ2VzIHRoYXQgc2VlbSBsaWtlIHRoZXkgYXJlIGludGVuZGVkIGZvciBzb21lb25lIGVsc2U/CgoqIFNldmVyYWwgdGltZXMgcGVyIGRheQoqIEFib3V0IG9uY2UgcGVyIGRheQoqIEEgZmV3IHRpbWVzIHBlciB3ZWVrCiogQWJvdXQgb25jZSBwZXIgd2VlawoqIEFib3V0IG9uY2UgcGVyIG1vbnRoCiogTGVzcyB0aGFuIG9uY2UgcGVyIG1vbnRoCiogSSdtIG5vdCBzdXJlCgpgYGB7ciB3cm9uZ2VtYWlsIC0gaG93b2Z0ZW4sIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CiMgaG93b2Z0ZW5fd3JvbmdlbWFpbApkICU+JSBmaWx0ZXIoIWlzLm5hKGhvd29mdGVuX3dyb25nZW1haWwpKSAlPiUgY291bnQoaG93b2Z0ZW5fd3JvbmdlbWFpbCkgJT4lIGdncGxvdChhZXMoeD1ob3dvZnRlbl93cm9uZ2VtYWlsLCB5PW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSkpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCw0NSkgKyBnZ3RpdGxlKCJIb3cgb2Z0ZW4uLi4gaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZSIpICsgbGFicyh4PSIiLCB5PSJOdW1iZXIgb2YgUmVzcG9uZGVudHMiKQpgYGAKCgojIyMjIEkgaGF2ZSBiZWVuIGFza2VkIGluIGFuIGVtYWlsIHRvIGNvbmZpcm0gYW4gYWNjb3VudCB0aGF0IEkgZG9u4oCZdCByZW1lbWJlciBjcmVhdGluZwoKKkRpc3BsYXkgaWYgIkkgaGF2ZSBiZWVuIGFza2VkIGluIGFuIGVtYWlsIHRvIGNvbmZpcm0gYW4gYWNjb3VudCB0aGF0IEkgZG9u4oCZdCByZW1lbWJlciBjcmVhdGluZyIgd2FzIHNlbGVjdGVkOiogIApXaGVuIHdhcyB0aGUgbGFzdCB0aW1lIHlvdSByZW1lbWJlciBiZWluZyBhc2tlZCBpbiBhbiBlbWFpbCB0byBjb25maXJtIGFuIGFjY291bnQgdGhhdCB5b3UgZGlkbid0IHJlbWVtYmVyIGNyZWF0aW5nPwoKKiBUb2RheQoqIFdpdGhpbiB0aGUgcGFzdCBmZXcgZGF5cwoqIFdpdGhpbiB0aGUgcGFzdCB3ZWVrCiogV2l0aGluIHRoZSBwYXN0IG1vbnRoCiogTW9yZSB0aGFuIGEgbW9udGggYWdvCiogSSdtIG5vdCBzdXJlCgpgYGB7ciB3cm9uZ2VtYWlsX2NvbmZpcm0gLSBsYXN0IHRpbWUsICBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQojIGxhc3RfdGltZV93cm9uZ2VtYWlsX2NvbmZpcm0KZCAlPiUgZmlsdGVyKCFpcy5uYShsYXN0X3RpbWVfd3JvbmdlbWFpbF9jb25maXJtKSkgJT4lIGNvdW50KGxhc3RfdGltZV93cm9uZ2VtYWlsX2NvbmZpcm0pICU+JSBnZ3Bsb3QoYWVzKHg9bGFzdF90aW1lX3dyb25nZW1haWxfY29uZmlybSwgeT1uKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEpKSArIGdlb21fdGV4dChhZXMobGFiZWw9biksIHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIGZvbnRmYWNlPSJib2xkIikgKyB5bGltKDAsMzApICsgZ2d0aXRsZSgiV2hlbiB3YXMgdGhlIGxhc3QgdGltZS4uLiBjb25maXJtIGFuIGFjY291bnQiKSArIGxhYnMoeD0iIiwgeT0iTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikKYGBgCgpIb3cgb2Z0ZW4gYXJlIHlvdSBhc2tlZCBpbiBlbWFpbCB0byBjb25maXJtIGFuIGFjY291bnQgdGhhdCB5b3UgZG9uJ3QgcmVtZW1iZXIgY3JlYXRpbmc/CgoqIFNldmVyYWwgdGltZXMgcGVyIGRheQoqIEFib3V0IG9uY2UgcGVyIGRheQoqIEEgZmV3IHRpbWVzIHBlciB3ZWVrCiogQWJvdXQgb25jZSBwZXIgd2VlawoqIEFib3V0IG9uY2UgcGVyIG1vbnRoCiogTGVzcyB0aGFuIG9uY2UgcGVyIG1vbnRoCiogSSdtIG5vdCBzdXJlCgpgYGB7ciB3cm9uZ2VtYWlsX2NvbmZpcm0gLSBob3cgb2Z0ZW4sICBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQojIGhvd29mdGVuX3dyb25nZW1haWxfY29uZmlybQpkICU+JSBmaWx0ZXIoIWlzLm5hKGhvd29mdGVuX3dyb25nZW1haWxfY29uZmlybSkpICU+JSBjb3VudChob3dvZnRlbl93cm9uZ2VtYWlsX2NvbmZpcm0pICU+JSBnZ3Bsb3QoYWVzKHg9aG93b2Z0ZW5fd3JvbmdlbWFpbF9jb25maXJtLCB5PW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSkpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCwzMCkgKyBnZ3RpdGxlKCJIb3cgb2Z0ZW4uLi4gY29uZmlybSBhbiBhY2NvdW50IikgKyBsYWJzKHg9IiIsIHk9Ik51bWJlciBvZiBSZXNwb25kZW50cyIpCmBgYAoKKkhvdyBtYW55IGRpc3RpbmN0IHJlc3BvbmRlbnRzIGFuc3dlcmVkIHllcyB0byB0aGUgdHdvIG1pc2RpcmVjdGVkIGVtYWlsIHF1ZXN0aW9ucyAoIkkgaGF2ZSByZWNlaXZlZC4uLiIgYW5kICJJIGhhdmUgYmVlbiBhc2tlZC4uLiIpPyoKYGBge3IsIGVjaG89RkFMU0V9CmthYmxlKGQgJT4lIHNlbGVjdChSZXNwb25zZUlELCB3cm9uZ2VtYWlsLCB3cm9uZ2VtYWlsX2NvbmZpcm0pICU+JSAKICAgICAgICBtdXRhdGUod3JvbmdlbWFpbF9zdW0gPSB3cm9uZ2VtYWlsICsgd3JvbmdlbWFpbF9jb25maXJtKSAlPiUgCiAgICAgICAgY291bnQod3JvbmdlbWFpbF9zdW0gPiAwKSAlPiUgCiAgICAgICAgZHBseXI6OnJlbmFtZShgUmVjZWl2ZWQgTWlzZGlyZWN0ZWQgRW1haWxgID0gYHdyb25nZW1haWxfc3VtID4gMGApICU+JSAKICAgICAgICBhcnJhbmdlKGRlc2MoYFJlY2VpdmVkIE1pc2RpcmVjdGVkIEVtYWlsYCkpKSAlPiUgCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjFlbSIpCmBgYAoKCiMjIyMgSSBoYXZlIGdpdmVuIG91dCBhICJ0aHJvd2F3YXkiIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgZmFrZSBvciBkaWQgbm90IGJlbG9uZyB0byBtZSB0byBhIHdlYnNpdGUsIHN0b3JlLCBvciByZXN0YXVyYW50LCBvciBpbiBleGNoYW5nZSBmb3IgYSBzZXJ2aWNlIGxpa2UgZnJlZSB3aWZpCgoqRGlzcGxheSBpZiAiSSBoYXZlIGdpdmVuIG91dCBhICd0aHJvd2F3YXknIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgZmFrZSBvciBkaWQgbm90IGJlbG9uZyB0byBtZSB0byBhIHdlYnNpdGUsIHN0b3JlLCBvciByZXN0YXVyYW50LCBvciBpbiBleGNoYW5nZSBmb3IgYSBzZXJ2aWNlIGxpa2UgZnJlZSB3aWZpIiB3YXMgc2VsZWN0ZWQ6KiAgCldoZW4gd2FzIHRoZSBsYXN0IHRpbWUgeW91IGdhdmUgb3V0IGEgInRocm93YXdheSIgZW1haWwgYWRkcmVzcyB0aGF0IHdhcyBmYWtlIG9yIGRpZCBub3QgYmVsb25nIHRvIHlvdSB0byBhIHdlYnNpdGUsIHN0b3JlLCBvciByZXN0YXVyYW50LCBvciBpbiBleGNoYW5nZSBmb3IgYSBzZXJ2aWNlIGxpa2UgZnJlZSB3aWZpPwoKKiBUb2RheQoqIFdpdGhpbiB0aGUgcGFzdCBmZXcgZGF5cwoqIFdpdGhpbiB0aGUgcGFzdCB3ZWVrCiogV2l0aGluIHRoZSBwYXN0IG1vbnRoCiogTW9yZSB0aGFuIGEgbW9udGggYWdvCiogSSdtIG5vdCBzdXJlCgpgYGB7ciB3cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UgLSBsYXN0IHRpbWUsICBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQojIGxhc3RfdGltZV93cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UKZCAlPiUgZmlsdGVyKCFpcy5uYShsYXN0X3RpbWVfd3JvbmdlbWFpbF9mYWtlX2V4Y2hhbmdlKSkgJT4lIGNvdW50KGxhc3RfdGltZV93cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UpICU+JSBnZ3Bsb3QoYWVzKHg9bGFzdF90aW1lX3dyb25nZW1haWxfZmFrZV9leGNoYW5nZSwgeT1uKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEpKSArIGdlb21fdGV4dChhZXMobGFiZWw9biksIHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIGZvbnRmYWNlPSJib2xkIikgKyB5bGltKDAsMzApICsgZ2d0aXRsZSgiV2hlbiB3YXMgdGhlIGxhc3QgdGltZS4uLiB3ZWJzaXRlLCBzdG9yZSBvciByZXN0YXVyYW50IikgKyBsYWJzKHg9IiIsIHk9Ik51bWJlciBvZiBSZXNwb25kZW50cyIpCmBgYAoKSG93IG9mdGVuIGhhdmUgeW91IGdpdmVuIG91dCBhICJ0aHJvd2F3YXkiIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgZmFrZSBvciBkaWQgbm90IGJlbG9uZyB0byB5b3UgdG8gYSB3ZWJzaXRlLCBzdG9yZSwgb3IgcmVzdGF1cmFudCwgb3IgaW4gZXhjaGFuZ2UgZm9yIGEgc2VydmljZSBsaWtlIGZyZWUgd2lmaT8KCiogU2V2ZXJhbCB0aW1lcyBwZXIgZGF5CiogQWJvdXQgb25jZSBwZXIgZGF5CiogQSBmZXcgdGltZXMgcGVyIHdlZWsKKiBBYm91dCBvbmNlIHBlciB3ZWVrCiogQWJvdXQgb25jZSBwZXIgbW9udGgKKiBMZXNzIHRoYW4gb25jZSBwZXIgbW9udGgKKiBJJ20gbm90IHN1cmUKCgpgYGB7ciB3cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UgLSBob3cgb2Z0ZW4sICBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQojIGhvd29mdGVuX3dyb25nZW1haWxfZmFrZV9leGNoYW5nZQpkICU+JSBmaWx0ZXIoIWlzLm5hKGhvd29mdGVuX3dyb25nZW1haWxfZmFrZV9leGNoYW5nZSkpICU+JSBjb3VudChob3dvZnRlbl93cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UpICU+JSBnZ3Bsb3QoYWVzKHg9aG93b2Z0ZW5fd3JvbmdlbWFpbF9mYWtlX2V4Y2hhbmdlLCB5PW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSkpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9LTAuNSwgY29sb3I9ImJsYWNrIiwgZm9udGZhY2U9ImJvbGQiKSArIHlsaW0oMCwzMCkgKyBnZ3RpdGxlKCJIb3cgb2Z0ZW4uLi4gd2Vic2l0ZSwgc3RvcmUgb3IgcmVzdGF1cmFudCIpICsgbGFicyh4PSIiLCB5PSJOdW1iZXIgb2YgUmVzcG9uZGVudHMiKQpgYGAKCgojIyMjIEkgaGF2ZSB1c2VkIGEgInRocm93YXdheSIgZW1haWwgYWRkcmVzcyB0aGF0IHdhcyBmYWtlIG9yIGRpZCBub3QgYmVsb25nIHRvIG1lIGFmdGVyIGJlaW5nIGFza2VkIHRvIHNpZ24gdXAgZm9yIGFuIG9ubGluZSBhY2NvdW50LCBtYWlsaW5nIGxpc3QsIG9yIG90aGVyIG9ubGluZSBzZXJ2aWNlCgoqRGlzcGxheSBpZiAiSSBoYXZlIHVzZWQgYSAidGhyb3dhd2F5IiBlbWFpbCBhZGRyZXNzIHRoYXQgd2FzIGZha2Ugb3IgZGlkIG5vdCBiZWxvbmcgdG8gbWUgYWZ0ZXIgYmVpbmcgYXNrZWQgdG8gc2lnbiB1cCBmb3IgYW4gb25saW5lIGFjY291bnQsIG1haWxpbmcgbGlzdCwgb3Igb3RoZXIgb25saW5lIHNlcnZpY2UiIHdhcyBzZWxlY3RlZDoqICAKV2hlbiB3YXMgdGhlIGxhc3QgdGltZSB5b3UgcmVtZW1iZXIgdXNpbmcgYSAidGhyb3dhd2F5IiBlbWFpbCBhZGRyZXNzIHRoYXQgd2FzIGZha2Ugb3IgZGlkIG5vdCBiZWxvbmcgdG8geW91IHdoZW4geW91IHdlcmUgYXNrZWQgdG8gc2lnbiB1cCBmb3IgYW4gb25saW5lIGFjY291bnQsIG1haWxpbmcgbGlzdCwgb3Igb3RoZXIgb25saW5lIHNlcnZpY2U/CgoqIFRvZGF5CiogV2l0aGluIHRoZSBwYXN0IGZldyBkYXlzCiogV2l0aGluIHRoZSBwYXN0IHdlZWsKKiBXaXRoaW4gdGhlIHBhc3QgbW9udGgKKiBNb3JlIHRoYW4gYSBtb250aCBhZ28KKiBJJ20gbm90IHN1cmUKCmBgYHtyIHdyb25nZW1haWxfZmFrZV9zaWdudXAgLSBsYXN0IHRpbWUsICBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQojIGxhc3RfdGltZV93cm9uZ2VtYWlsX2Zha2Vfc2lnbnVwCmQgJT4lIGZpbHRlcighaXMubmEobGFzdF90aW1lX3dyb25nZW1haWxfZmFrZV9zaWdudXApKSAlPiUgY291bnQobGFzdF90aW1lX3dyb25nZW1haWxfZmFrZV9zaWdudXApICU+JSBnZ3Bsb3QoYWVzKHg9bGFzdF90aW1lX3dyb25nZW1haWxfZmFrZV9zaWdudXAsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDMwKSArIGdndGl0bGUoIldoZW4gd2FzIHRoZSBsYXN0IHRpbWUuLi4gb25saW5lIGFjY291bnQsIG1haWxpbmcgbGlzdCIpICsgbGFicyh4PSIiLCB5PSJOdW1iZXIgb2YgUmVzcG9uZGVudHMiKQpgYGAKCgpIb3cgb2Z0ZW4gaGF2ZSB5b3UgdXNlZCBhICJ0aHJvd2F3YXkiIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgZmFrZSBvciBkaWQgbm90IGJlbG9uZyB0byB5b3Ugd2hlbiBzaWduaW5nIHVwIGZvciBhbiBvbmxpbmUgYWNjb3VudCwgbWFpbGluZyBsaXN0LCBvciBvdGhlciBvbmxpbmUgc2VydmljZT8KCiogU2V2ZXJhbCB0aW1lcyBwZXIgZGF5CiogQWJvdXQgb25jZSBwZXIgZGF5CiogQSBmZXcgdGltZXMgcGVyIHdlZWsKKiBBYm91dCBvbmNlIHBlciB3ZWVrCiogQWJvdXQgb25jZSBwZXIgbW9udGgKKiBMZXNzIHRoYW4gb25jZSBwZXIgbW9udGgKKiBJJ20gbm90IHN1cmUKCgpgYGB7ciB3cm9uZ2VtYWlsX2Zha2Vfc2lnbnVwIC0gaG93IG9mdGVuLCAgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KIyBob3dvZnRlbl93cm9uZ2VtYWlsX2Zha2Vfc2lnbnVwCmQgJT4lIGZpbHRlcighaXMubmEoaG93b2Z0ZW5fd3JvbmdlbWFpbF9mYWtlX3NpZ251cCkpICU+JSBjb3VudChob3dvZnRlbl93cm9uZ2VtYWlsX2Zha2Vfc2lnbnVwKSAlPiUgZ2dwbG90KGFlcyh4PWhvd29mdGVuX3dyb25nZW1haWxfZmFrZV9zaWdudXAsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDMwKSArIGdndGl0bGUoIkhvdyBvZnRlbi4uLiBvbmxpbmUgYWNjb3VudCwgbWFpbGluZyBsaXN0IikgKyBsYWJzKHg9IiIsIHk9Ik51bWJlciBvZiBSZXNwb25kZW50cyIpCmBgYAoKKkhvdyBtYW55IGRpc3RpbmN0IHJlc3BvbmRlbnRzIGFuc3dlcmVkIHllcyB0byB0aGUgdHdvICJ0aHJvd2F3YXkgZW1haWwgYWRkcmVzcyIgcXVlc3Rpb25zICgiSSBoYXZlIHVzZWQuLi4iIGFuZCAiSSBoYXZlIGdpdmVuIG91dC4uLiIpPyoKYGBge3IsIGVjaG89RkFMU0V9CmthYmxlKGQgJT4lIHNlbGVjdChSZXNwb25zZUlELCBzdGFydHNfd2l0aCgid3JvbmdlbWFpbF9mYWtlIikpICU+JSAKICBtdXRhdGUoZmFrZV9zdW0gPSB3cm9uZ2VtYWlsX2Zha2VfZXhjaGFuZ2UgKyB3cm9uZ2VtYWlsX2Zha2Vfc2lnbnVwKSAlPiUgCiAgY291bnQoZmFrZV9zdW0gPiAwKSAlPiUgCiAgZHBseXI6OnJlbmFtZShgR2l2ZW4gb3V0IHRocm93YXdheSBhZGRyZXNzYCA9IGBmYWtlX3N1bSA+IDBgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGBHaXZlbiBvdXQgdGhyb3dhd2F5IGFkZHJlc3NgKSkpICU+JSAKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIyMWVtIikKYGBgCgoKIyMjIyBJIGhhdmUgc2VudCBhbiBlbWFpbCBtZXNzYWdlIHRvIHRoZSB3cm9uZyBwZXJzb24gYnkgbWlzdGFrZQoKKkRpc3BsYXkgaWYgIkkgaGF2ZSBzZW50IGFuIGVtYWlsIG1lc3NhZ2UgdG8gdGhlIHdyb25nIHBlcnNvbiBieSBtaXN0YWtlIiB3YXMgc2VsZWN0ZWQ6KiAgCldoZW4gd2FzIHRoZSBsYXN0IHRpbWUgeW91IHNlbnQgYW4gZW1haWwgbWVzc2FnZSB0byB0aGUgd3JvbmcgcGVyc29uIGJ5IG1pc3Rha2U/CgoqIFRvZGF5CiogV2l0aGluIHRoZSBwYXN0IGZldyBkYXlzCiogV2l0aGluIHRoZSBwYXN0IHdlZWsKKiBXaXRoaW4gdGhlIHBhc3QgbW9udGgKKiBNb3JlIHRoYW4gYSBtb250aCBhZ28KKiBJJ20gbm90IHN1cmUKCmBgYHtyIHdyb25nZW1haWxfc2VudCAtIGxhc3QgdGltZSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KIyBsYXN0X3RpbWVfd3JvbmdlbWFpbF9zZW50CmQgJT4lIGZpbHRlcighaXMubmEobGFzdF90aW1lX3dyb25nZW1haWxfc2VudCkpICU+JSBjb3VudChsYXN0X3RpbWVfd3JvbmdlbWFpbF9zZW50KSAlPiUgZ2dwbG90KGFlcyh4PWxhc3RfdGltZV93cm9uZ2VtYWlsX3NlbnQsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDMwKSArIGdndGl0bGUoIldoZW4gd2FzIHRoZSBsYXN0IHRpbWUuLi4gd3JvbmcgcGVyc29uIikgKyBsYWJzKHg9IiIsIHk9Ik51bWJlciBvZiBSZXNwb25kZW50cyIpCmBgYAoKSG93IG9mdGVuIGRvIHlvdSBzZW5kIGVtYWlsIG1lc3NhZ2VzIHRvIHRoZSB3cm9uZyBwZXJzb24gYnkgbWlzdGFrZT8KCiogU2V2ZXJhbCB0aW1lcyBwZXIgZGF5CiogQWJvdXQgb25jZSBwZXIgZGF5CiogQSBmZXcgdGltZXMgcGVyIHdlZWsKKiBBYm91dCBvbmNlIHBlciB3ZWVrCiogQWJvdXQgb25jZSBwZXIgbW9udGgKKiBMZXNzIHRoYW4gb25jZSBwZXIgbW9udGgKKiBJJ20gbm90IHN1cmUKCgpgYGB7ciB3cm9uZ2VtYWlsX3NlbnQgLSBob3cgb2Z0ZW4sIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CiMgaG93b2Z0ZW5fd3JvbmdlbWFpbF9zZW50CmQgJT4lIGZpbHRlcighaXMubmEoaG93b2Z0ZW5fd3JvbmdlbWFpbF9zZW50KSkgJT4lIGNvdW50KGhvd29mdGVuX3dyb25nZW1haWxfc2VudCkgJT4lIGdncGxvdChhZXMoeD1ob3dvZnRlbl93cm9uZ2VtYWlsX3NlbnQsIHk9bikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBmb250ZmFjZT0iYm9sZCIpICsgeWxpbSgwLDMwKSArIGdndGl0bGUoIkhvdyBvZnRlbi4uLiB3cm9uZyBwZXJzb24iKSArIGxhYnMoeD0iIiwgeT0iTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikKYGBgCgoKCgojIyMgSGF2ZSB5b3UgZXZlciByZWNlaXZlZCBhICJtaXNkaXJlY3RlZCBlbWFpbCI/CgoqRGlzcGxheSBpZiAiSSBoYXZlIHJlY2VpdmVkIGFuIGVtYWlsIG1lc3NhZ2UgdGhhdCBzZWVtZWQgbGlrZSBpdCB3YXMgaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZSIgd2FzIHNlbGVjdGVkOiogIApXZSB1c2UgdGhlIHBocmFzZSAibWlzZGlyZWN0ZWQgZW1haWxzIiB0byByZWZlciB0byBlbWFpbCBtZXNzYWdlcyB0aGF0IGFyZSBub3Qgc3BhbSwgYnV0IGFyZSBhdXRoZW50aWMgZW1haWwgbWVzc2FnZXMgdGhhdCBqdXN0IHNlZW0gbGlrZSB0aGV5IHdlcmUgbWVhbnQgZm9yIHNvbWVvbmUgZWxzZS4gSGF2ZSB5b3UgZXZlciByZWNlaXZlZCBhICJtaXNkaXJlY3RlZCBlbWFpbCI/CgoqIFllcywgSSBoYXZlIHJlY2VpdmVkIGEgIm1pc2RpcmVjdGVkIGVtYWlsIgoqIE5vLCBJIGhhdmUgbm90IHJlY2VpdmVkIGEgIm1pc2RpcmVjdGVkIGVtYWlsIgoqIEknbSBub3Qgc3VyZQoKYGBge3IgZWNobz1GQUxTRX0Ka2FibGUoZCAlPiUgY291bnQobWlzZGlyZWN0ZWRfZW1haWwpICU+JSBkcGx5cjo6cmVuYW1lKGBSZWNlaXZlZCBNaXNkaXJlY3RlZCBFbWFpbGAgPSBtaXNkaXJlY3RlZF9lbWFpbCkpICU+JSAKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIyMWVtIikKYGBgCgoKCiMjIyBTZW5kZXJzIG9mIG1pc2RpcmVjdGVkIGVtYWlsCgoqRGlzcGxheSBpZiBZZXMsIEkgaGF2ZSByZWNlaXZlZCBhIG1pc2RpcmVjdGVkIGVtYWlsIHdhcyBzZWxlY3RlZDoqICAKV2hvIGhhdmUgeW91IHJlY2VpdmVkICJtaXNkaXJlY3RlZCBlbWFpbHMiIGZyb20/IFBsZWFzZSBzZWxlY3QgYWxsIHRoYXQgYXBwbHk6IAoKKiBTb21lb25lIEkga25vdyBwZXJzb25hbGx5CiogQSBwZXJzb24gSSBkb24ndCBrbm93IHdobyBpcyBmcm9tIGFuIG9yZ2FuaXphdGlvbiBJIGJlbG9uZyB0bywgbGlrZSB3b3JrLCBzY2hvb2wsIG9yIGEgdm9sdW50ZWVyIGdyb3VwCiogU29tZW9uZSB3aG8gaXMgYSBjb21wbGV0ZSBzdHJhbmdlcgoqIEEgYnVzaW5lc3MsIGJhbmssIG9ubGluZSBzdG9yZSwgb3Igb3RoZXIgb3JnYW5pemF0aW9uCiogT3RoZXI6IChwbGVhc2UgZmlsbCBpbiB0aGUgYmxhbmspCiogTm9uZSBvZiB0aGUgYWJvdmUKCmBgYHtyIHdyb25nZW1haWxfc2VuZGVyLCBlY2hvPUZBTFNFfQprYWJsZShkICU+JSBzZWxlY3QoUmVzcG9uc2VJRCwgd3JvbmdlbWFpbF9zZW5kZXJfa25vd246d3JvbmdlbWFpbF9zZW5kZXJfb3RoZXIpICU+JQogIGdhdGhlcihrZXk9d3JvbmdlbWFpbF9zZW5kZXIsIHZhbHVlPWNoZWNrZWQsIHdyb25nZW1haWxfc2VuZGVyX2tub3duOndyb25nZW1haWxfc2VuZGVyX290aGVyKSAlPiUKICBtdXRhdGUod3JvbmdlbWFpbF9zZW5kZXIgPSBmY3RfcmVjb2RlKHdyb25nZW1haWxfc2VuZGVyLAogICAgIlNvbWVvbmUgSSBrbm93IHBlcnNvbmFsbHkiID0gIndyb25nZW1haWxfc2VuZGVyX2tub3duIiwKICAgICJBIHBlcnNvbiBJIGRvbid0IGtub3cgd2hvIGlzIGZyb20gYW4gb3JnYW5pemF0aW9uIEkgYmVsb25nIHRvLCBsaWtlIHdvcmssIHNjaG9vbCwgb3IgYSB2b2x1bnRlZXIgZ3JvdXAiID0gIndyb25nZW1haWxfc2VuZGVyX2Nvbm5lY3Rpb24iLAogICAgIlNvbWVvbmUgd2hvIGlzIGEgY29tcGxldGUgc3RyYW5nZXIiID0gIndyb25nZW1haWxfc2VuZGVyX3Vua25vd24iLAogICAgIkEgYnVzaW5lc3MsIGJhbmssIG9ubGluZSBzdG9yZSwgb3Igb3RoZXIgb3JnYW5pemF0aW9uIiA9ICJ3cm9uZ2VtYWlsX3NlbmRlcl9idXNpbmVzcyIsCiAgICAiTm9uZSBvZiB0aGUgYWJvdmUiID0gIndyb25nZW1haWxfc2VuZGVyX25vbmUiLAogICAgIk90aGVyIHNlbmRlciIgPSAid3JvbmdlbWFpbF9zZW5kZXJfb3RoZXIiKSkgJT4lCiAgZmlsdGVyKGNoZWNrZWQgPT0gVCkgJT4lCiAgY291bnQod3JvbmdlbWFpbF9zZW5kZXIpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JSBkcGx5cjo6cmVuYW1lKGBTZW5kZXIgb2YgbWlzZGlyZWN0ZWQgZW1haWwgbWVzc2FnZSBpcy4uLmAgPSB3cm9uZ2VtYWlsX3NlbmRlcikpICU+JSAKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUKICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI0MmVtIikKYGBgCgoKIyMjIEF0dGVudGlvbiBjaGVjayBxdWVzdGlvbgoKKk5vdGU6IHRoaXMgcXVlc3Rpb24gd2FzIHVzZWQgYXMgYW4gYXR0ZW50aW9uIGNoZWNrIHF1ZXN0aW9uLiBJZiB0aGUgdXNlcm5hbWVzIGRpZCBub3QgbWF0Y2gsIHRoZSByZXNwb25kZW50IHdhcyBleGNsdWRlZCwgYW5kIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3YXMgZGlzcGxheWVkOiAiWW91IGFyZSBzZWVpbmcgdGhpcyBtZXNzYWdlIGJlY2F1c2UgeW91IGNob3NlIGFuIGluY29ycmVjdCBhbnN3ZXIgdG8gYSBxdWVzdGlvbiBkZXNpZ25lZCB0byBlbnN1cmUgeW91IGFyZSByZWFkaW5nIGV2ZXJ5IHF1ZXN0aW9uIGNhcmVmdWxseS4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW5ub3QgY29tcGxldGUgdGhlIHJlc3Qgb2YgdGhlIHN1cnZleS4gSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciBjb25jZXJucywgcGxlYXNlIGNvbnRhY3QgRHIuIEVtaWxlZSBSYWRlciBhdCBlbWlsZWVAbXN1LmVkdS4iKgoKSW4gYW4gZWFybGllciBxdWVzdGlvbiwgeW91IHdlcmUgYXNrZWQgdG8gZW50ZXIgeW91ciBmaXJzdCBuYW1lLCBsYXN0IG5hbWUsIGFuZCBPTkxZIHRoZSB1c2VybmFtZSAodGhlIHBhcnQgYmVmb3JlIHRoZSBAIHNpZ24pIG9mIHlvdXIgZW1haWwgYWNjb3VudCBmcm9tIGEgcG9wdWxhciBmcmVlIGVtYWlsIHNlcnZpY2UgcHJvdmlkZXIgbGlrZSBHbWFpbCwgT3V0bG9vayBNYWlsIG9yIEhvdG1haWwsIFlhaG9vISBNYWlsLCBvciBBT0wgTWFpbC4gUGxlYXNlIGVudGVyIHRoYXQgc2FtZSBFbWFpbCBVc2VybmFtZSBhZ2FpbiBiZWxvdyAoYmUgc3VyZSBub3QgdG8gaW5jbHVkZSBhbnkgZXh0cmEgc3BhY2VzIG9yIGNoYXJhY3RlcnMpOiAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKCgoKIyMjIFR5cGVzIG9mIG1pc2RpcmVjdGVkIGVtYWlsCgoqRGlzcGxheSBpZiBZZXMsIEkgaGF2ZSByZWNlaXZlZCBhIG1pc2RpcmVjdGVkIGVtYWlsIHdhcyBzZWxlY3RlZDoqICAKQmVsb3cgYXJlIGRpZmZlcmVudCB0eXBlcyBvZiAibWlzZGlyZWN0ZWQgZW1haWxzIiB0aGF0IHlvdSBtYXkgaGF2ZSByZWNlaXZlZC4gUGxlYXNlIHNlbGVjdCBhbGwgb2YgdGhlIHR5cGVzIG9mICJtaXNkaXJlY3RlZCBlbWFpbHMiIHRoYXQgeW91IHJlbWVtYmVyIHJlY2VpdmluZyBpbiB0aGUgcGFzdDoKCiogRW1haWwgZnJvbSBhIGNoaWxkcmVuJ3Mgd2Vic2l0ZSBhc2tpbmcgZm9yIHBhcmVudGFsIGNvbnNlbnQsIGZvciBhIGNoaWxkIHRoYXQgeW91IGRvbid0IGtub3cKKiBFbWFpbCBjb250YWluaW5nIGEgc3RhdGVtZW50IG9yIGJpbGwgZnJvbSBhbiBhY2NvdW50IHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHlvdQoqIEVtYWlsIGZyb20gc29tZW9uZSB5b3Uga25vdyBpbiByZWFsIGxpZmUgdGhhdCB3YXMgc2VudCB0byB5b3UgYnkgbWlzdGFrZQoqIEFjY291bnQgYWN0aXZhdGlvbiwgcmVnaXN0cmF0aW9uIG9yIGNvbmZpcm1hdGlvbiBlbWFpbCBmb3Igc29tZXRoaW5nIHlvdSBkaWQgbm90IHNpZ24gdXAgZm9yCiogQW4gZW1haWwgdGhhdCBjb250YWlucyBhIHBlcnNvbmFsIG1lc3NhZ2UgbWVhbnQgZm9yIHNvbWVvbmUgZWxzZQoqIEVtYWlsIHJlbGF0ZWQgdG8gYW4gb25saW5lIGRhdGluZyBwcm9maWxlIHRoYXQgeW91IGRpZCBub3QgY3JlYXRlCiogRW1haWwgYWJvdXQgYSBwYXNzd29yZCByZXNldCBvciBhY2NvdW50IHJlY292ZXJ5IHRoYXQgeW91IGRpZCBub3QgaW5pdGlhdGUKKiBFbWFpbCByZW1pbmRlciBmb3IgYW4gYXBwb2ludG1lbnQgb3IgcmVzZXJ2YXRpb24gdGhhdCB5b3UgZGlkIG5vdCBjcmVhdGUKKiBBbiBlbWFpbCBwdXJjaGFzZSBjb25maXJtYXRpb24gb3IgcmVjZWlwdCBmb3Igc29tZXRoaW5nIHlvdSBkaWQgbm90IGJ1eQoqIE90aGVyIChwbGVhc2UgZmlsbCBpbiB0aGUgYmxhbmspCiogTm9uZSBvZiB0aGUgYWJvdmUKCmBgYHtyIHdyb25nIGVtYWlsIHR5cGVzLCBlY2hvPUZBTFNFfQprYWJsZShkICU+JSBzZWxlY3QoUmVzcG9uc2VJRCwgd3JvbmdlbWFpbF90eXBlX2tpZF93ZWJzaXRlOndyb25nZW1haWxfdHlwZV9ub25lKSAlPiUKICBnYXRoZXIoa2V5PXdyb25nZW1haWxfdHlwZSwgdmFsdWU9Y2hlY2tlZCwgd3JvbmdlbWFpbF90eXBlX2tpZF93ZWJzaXRlOndyb25nZW1haWxfdHlwZV9ub25lKSAlPiUKICBtdXRhdGUod3JvbmdlbWFpbF90eXBlID0gZmN0X3JlY29kZSh3cm9uZ2VtYWlsX3R5cGUsCiAgICAiRW1haWwgZnJvbSBhIGNoaWxkcmVuJ3Mgd2Vic2l0ZSBhc2tpbmcgZm9yIHBhcmVudGFsIGNvbnNlbnQsIGZvciBhIGNoaWxkIHRoYXQgeW91IGRvbid0IGtub3ciID0gIndyb25nZW1haWxfdHlwZV9raWRfd2Vic2l0ZSIsCiAgICAiRW1haWwgY29udGFpbmluZyBhIHN0YXRlbWVudCBvciBiaWxsIGZyb20gYW4gYWNjb3VudCB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB5b3UiID0gIndyb25nZW1haWxfdHlwZV9hY2NvdW50IiwKICAgICJFbWFpbCBmcm9tIHNvbWVvbmUgeW91IGtub3cgaW4gcmVhbCBsaWZlIHRoYXQgd2FzIHNlbnQgdG8geW91IGJ5IG1pc3Rha2UiID0gIndyb25nZW1haWxfdHlwZV9taXN0YWtlIiwKICAgICJBY2NvdW50IGFjdGl2YXRpb24sIHJlZ2lzdHJhdGlvbiBvciBjb25maXJtYXRpb24gZW1haWwgZm9yIHNvbWV0aGluZyB5b3UgZGlkIG5vdCBzaWduIHVwIGZvciIgPSAid3JvbmdlbWFpbF90eXBlX2NvbmZpcm1hdGlvbiIsCiAgICAiQW4gZW1haWwgdGhhdCBjb250YWlucyBhIHBlcnNvbmFsIG1lc3NhZ2UgbWVhbnQgZm9yIHNvbWVvbmUgZWxzZSIgPSAid3JvbmdlbWFpbF90eXBlX3BlcnNvbmFsIiwKICAgICJFbWFpbCByZWxhdGVkIHRvIGFuIG9ubGluZSBkYXRpbmcgcHJvZmlsZSB0aGF0IHlvdSBkaWQgbm90IGNyZWF0ZSIgPSAid3JvbmdlbWFpbF90eXBlX2RhdGluZyIsCiAgICAiRW1haWwgYWJvdXQgYSBwYXNzd29yZCByZXNldCBvciBhY2NvdW50IHJlY292ZXJ5IHRoYXQgeW91IGRpZCBub3QgaW5pdGlhdGUiID0gIndyb25nZW1haWxfdHlwZV9yZXNldCIsCiAgICAiRW1haWwgcmVtaW5kZXIgZm9yIGFuIGFwcG9pbnRtZW50IG9yIHJlc2VydmF0aW9uIHRoYXQgeW91IGRpZCBub3QgY3JlYXRlIiA9ICJ3cm9uZ2VtYWlsX3R5cGVfcmVtaW5kZXIiLAogICAgIkFuIGVtYWlsIHB1cmNoYXNlIGNvbmZpcm1hdGlvbiBvciByZWNlaXB0IGZvciBzb21ldGhpbmcgeW91IGRpZCBub3QgYnV5IiA9ICJ3cm9uZ2VtYWlsX3R5cGVfcHVyY2hhc2UiLAogICAgIk90aGVyIG1pc2RpcmVjdGVkIGVtYWlsIiA9ICJ3cm9uZ2VtYWlsX3R5cGVfb3RoZXIiLAogICAgIk5vbmUgb2YgdGhlIGFib3ZlIiA9ICJ3cm9uZ2VtYWlsX3R5cGVfbm9uZSIpKSAlPiUKICBmaWx0ZXIoY2hlY2tlZCA9PSBUKSAlPiUKICBjb3VudCh3cm9uZ2VtYWlsX3R5cGUpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JSBkcGx5cjo6cmVuYW1lKGBUeXBlIG9mIG1pc2RpcmVjdGVkIGVtYWlsIG1lc3NhZ2VgID0gd3JvbmdlbWFpbF90eXBlKSkgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjQyZW0iKQpgYGAKCgoqRGlzcGxheSBpZiBZZXMsIEkgaGF2ZSByZWNlaXZlZCBhIG1pc2RpcmVjdGVkIGVtYWlsIHdhcyBzZWxlY3RlZDoqICAKUGxlYXNlIGJyaWVmbHkgZGVzY3JpYmUgb25lIGV4YW1wbGUgb2YgYSAibWlzZGlyZWN0ZWQgZW1haWwiIHRoYXQgeW91IGhhdmUgcmVjZWl2ZWQgaW4gdGhlIHBhc3QuIFlvdXIgYW5zd2VyIG11c3QgYmUgYXQgbGVhc3QgMTUwIGNoYXJhY3RlcnMgbG9uZywgd2hpY2ggaXMgYWJvdXQgdGhyZWUgc2VudGVuY2VzLiAqW2ZpbGwgaW4gdGhlIGJsYW5rXSoKCgoKIyMgRGVtb2dyYXBoaWNzIEJsb2NrIHsjZGVtb2dyYXBoaWNzLnF1ZXN0aW9uc30KCipUaGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgdGhlc2UgcXVlc3Rpb25zIGFyZSBpbmNsdWRlZCBpbiB0aGUgW1Jlc3BvbmRlbnQgRGVtb2dyYXBoaWNzIHNlY3Rpb25dKCNkZW1vZ3JhcGhpY3Muc3RhdHMpIG9mIHRoaXMgZG9jdW1lbnQuIFRoZSB0ZXh0IG9mIHRoZSBxdWVzdGlvbnMgYXJlIGluY2x1ZGVkIGJlbG93IGZvciByZWZlcmVuY2UuKgoKUGxlYXNlIHJhdGUgeW91ciB1bmRlcnN0YW5kaW5nIG9mIGVhY2ggdGVybSBiZWxvdyBmcm9tIE5vbmUgKG5vIHVuZGVyc3RhbmRpbmcpIHRvIEZ1bGwgKGZ1bGwgdW5kZXJzdGFuZGluZyk6IFtOb25lLCBMaXR0bGUsIFNvbWUsIEdvb2QsIEZ1bGxdICpOb3RlOiAiZmlsdGlibHkiIGJlbG93IGlzIGEgZmFrZSB3b3JkIHVzZWQgYXMgYW4gYXR0ZW50aW9uIGNoZWNrOyByZXNwb25kZW50cyB3ZXJlIGV4Y2x1ZGVkIGluIGRhdGEgY2xlYW5pbmcgcGhhc2Ugb2YgYW5hbHlzaXMgaWYgdGhleSBhbnN3ZXJlZCAiR29vZCIgb3IgIkZ1bGwiIGZhbWlsaWFyaXR5IGZvciB0aGlzIG1hZGUtdXAgd29yZC4qCgoqIFdpa2kgIAoqIE1lbWUgIAoqIFBoaXNoaW5nICAKKiBCb29rbWFyayAgCiogQ2FjaGUgIAoqIFNTTCAgCiogQUpBWCAgCiogUlNTICAKKiBGaWx0aWJseSAgCgoKV2hhdCBpcyB0aGUgbGFzdCBncmFkZSBvciBjbGFzcyB5b3UgY29tcGxldGVkIGluIHNjaG9vbD8gIAoKKiBOb25lLCBvciBncmFkZXMgMS04ICAKKiBTb21lIGhpZ2ggc2Nob29sICAKKiBIaWdoIHNjaG9vbCBncmFkdWF0ZSBvciBHRUQgY2VydGlmaWNhdGUgIAoqIFRlY2huaWNhbCwgdHJhZGUsIG9yIHZvY2F0aW9uYWwgc2Nob29sIEFGVEVSIGhpZ2ggc2Nob29sICAKKiBTb21lIGNvbGxlZ2UsIG5vIDQteWVhciBkZWdyZWUgIAoqIDQteWVhciBjb2xsZWdlIGRlZ3JlZSAgCiogU29tZSBwb3N0Z3JhZHVhdGUgb3IgcHJvZmVzc2lvbmFsIHNjaG9vbGluZywgbm8gcG9zdGdyYWR1YXRlIGRlZ3JlZSAgCiogUG9zdGdyYWR1YXRlIG9yIHByb2Zlc3Npb25hbCBkZWdyZWUsIGluY2x1ZGluZyBtYXN0ZXLigJlzLCBkb2N0b3JhdGUsIG1lZGljYWwgb3IgbGF3IGRlZ3JlZSAgCgpXaGF0IGlzIHlvdXIgY3VycmVudCBlbXBsb3ltZW50IHN0YXR1cz8gIAoKKiBFbXBsb3llZCBmdWxsIHRpbWUgIAoqIEVtcGxveWVkIHBhcnQgdGltZSAgCiogVW5lbXBsb3llZCBsb29raW5nIGZvciB3b3JrICAKKiBVbmVtcGxveWVkIG5vdCBsb29raW5nIGZvciB3b3JrICAKKiBSZXRpcmVkICAKKiBTdHVkZW50ICAKKiBEaXNhYmxlZCAgCgpXaGF0IHdhcyB5b3VyIHRvdGFsIGhvdXNlaG9sZCBpbmNvbWUgYmVmb3JlIHRheGVzIGR1cmluZyB0aGUgcGFzdCAxMiBtb250aHM/ICAKCiogTGVzcyB0aGFuICQyNSwwMDAgIAoqICQyNSwwMDAgdG8gJDM0LDk5OSAgCiogJDM1LDAwMCB0byAkNDksOTk5ICAKKiAkNTAsMDAwIHRvICQ3NCw5OTkgIAoqICQ3NSwwMDAgdG8gJDk5LDk5OSAgCiogJDEwMCwwMDAgdG8gJDE0OSw5OTkgIAoqICQxNTAsMDAwIHRvICQxOTksOTk5ICAKKiAkMjAwLDAwMCBvciBtb3JlICAKCldoaWNoIGNhdGVnb3JpZXMgYmVsb3cgYmVzdCBkZXNjcmliZSB5b3U/IFNlbGVjdCBhbGwgdGhhdCBhcHBseTogIAoKKiBXaGl0ZSAgCiogSGlzcGFuaWMsIExhdGlubyBvciBTcGFuaXNoICAKKiBCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuICAKKiBBc2lhbiAgCiogQW1lcmljYW4gSW5kaWFuIG9yIEFsYXNrYSBOYXRpdmUgIAoqIE1pZGRsZSBFYXN0ZXJuIG9yIE5vcnRoIEFmcmljYW4gIAoqIE5hdGl2ZSBIYXdhaWlhbiBvciBPdGhlciBQYWNpZmljIElzbGFuZGVyICAKKiBTb21lIE90aGVyIFJhY2UsIEV0aG5pY2l0eSBvciBPcmlnaW4gKHBsZWFzZSBzcGVjaWZ5KSAgCgpXaGljaCByZWdpb24gb2YgdGhlIGNvdW50cnkgZG8geW91IGxpdmUgaW4/ICAKCiogKipOZXcgRW5nbGFuZCoqIC0gQ29ubmVjdGljdXQsIE1haW5lLCBNYXNzYWNodXNldHRzLCBOZXcgSGFtcHNoaXJlLCBSaG9kZSBJc2xhbmQsIFZlcm1vbnQgIAoqICoqTWlkZGxlIEF0bGFudGljKiogLSBOZXcgSmVyc2V5LCBOZXcgWW9yaywgUGVubnN5bHZhbmlhICAKKiAqKkVhc3QgTm9ydGggQ2VudHJhbCoqIC0gSWxsaW5vaXMsIEluZGlhbmEsIE1pY2hpZ2FuLCBPaGlvLCBXaXNjb25zaW4gIAoqICoqV2VzdCBOb3J0aCBDZW50cmFsKiogLSBJb3dhLCBLYW5zYXMsIE1pbm5lc290YSwgTWlzc291cmksIE5lYnJhc2thLCBOb3J0aCBEYWtvdGEsIFNvdXRoIERha290YSAgCiogKipTb3V0aCBBdGxhbnRpYyoqIC0gRGVsYXdhcmUsIERpc3RyaWN0IG9mIENvbHVtYmlhLCBGbG9yaWRhLCBHZW9yZ2lhLCBNYXJ5bGFuZCwgTm9ydGggQ2Fyb2xpbmEsIFNvdXRoIENhcm9saW5hLCBWaXJnaW5pYSwgV2VzdCBWaXJnaW5pYSAgCiogKipFYXN0IFNvdXRoIENlbnRyYWwqKiAtIEFsYWJhbWEsIEtlbnR1Y2t5LCBNaXNzaXNzaXBwaSwgVGVubmVzc2VlICAKKiAqKldlc3QgU291dGggQ2VudHJhbCoqIC0gQXJrYW5zYXMsIExvdWlzaWFuYSwgT2tsYWhvbWEsIFRleGFzICAKKiAqKk1vdW50YWluKiogLSBBcml6b25hLCBDb2xvcmFkbywgSWRhaG8sIE1vbnRhbmEsIE5ldmFkYSwgTmV3IE1leGljbywgVXRhaCwgV3lvbWluZyAgCiogKipQYWNpZmljKiogLSBBbGFza2EsIENhbGlmb3JuaWEsIEhhd2FpaSwgT3JlZ29uLCBXYXNoaW5ndG9uICAKKiAqKk90aGVyIHJlZ2lvbioqIChwbGVhc2Ugc3BlY2lmeSkgIAoKCgojIEludGVydmlld3MgT3ZlcnZpZXcKCiMjIFBhcnRpY2lwYW50IERlc2NyaXB0aXZlcwoKV2UgY29uZHVjdGVkIGByIGxlbmd0aChkLnBhcnRpY2lwYW50cyRwYXJ0aWNpcGFudF9pZClgIHNlbWktc3RydWN0dXJlZCBpbnRlcnZpZXdzIGR1cmluZyBgciBtb250aChtZHkobWluKGQucGFydGljaXBhbnRzJEludGVydmlld0RhdGUpKSwgbGFiZWwgPSBULCBhYmJyID0gRilgIGByIHllYXIobWR5KG1pbihkLnBhcnRpY2lwYW50cyRJbnRlcnZpZXdEYXRlKSkpYC4gCgpQYXJ0aWNpcGFudHMgd2VyZSByZWNydWl0ZWQgaW4gdHdvIHdheXMuIGByIHVubGlzdChkLnBhcnRpY2lwYW50cyAlPiUgY291bnQoSG93UmVjcnVpdGVkKSAlPiUgZmlsdGVyKEhvd1JlY3J1aXRlZD09IkZhY2Vib29rIikgJT4lIGRwbHlyOjpzZWxlY3QobikpYCBwYXJ0aWNpcGFudHMgKGByIHVubGlzdChkLnBhcnRpY2lwYW50cyAlPiUgY291bnQoR2VuZGVyLCBIb3dSZWNydWl0ZWQpICU+JSBmaWx0ZXIoR2VuZGVyPT0iV29tYW4iLCBIb3dSZWNydWl0ZWQ9PSJGYWNlYm9vayIpICU+JSBkcGx5cjo6c2VsZWN0KG4pKWAgd29tZW4gYW5kIGByIHVubGlzdChkLnBhcnRpY2lwYW50cyAlPiUgY291bnQoR2VuZGVyLCBIb3dSZWNydWl0ZWQpICU+JSBmaWx0ZXIoR2VuZGVyPT0iTWFuIiwgSG93UmVjcnVpdGVkPT0iRmFjZWJvb2siKSAlPiUgZHBseXI6OnNlbGVjdChuKSlgIG1lbikgd2VyZSByZWNydWl0ZWQgdmlhIHNub3diYWxsIHNhbXBsaW5nIHN0YXJ0aW5nIGZyb20gYSBzdHVkeSBhZHZlcnRpc2VtZW50IG9uIEZhY2Vib29rLiBgciB1bmxpc3QoZC5wYXJ0aWNpcGFudHMgJT4lIGNvdW50KEhvd1JlY3J1aXRlZCkgJT4lIGZpbHRlcihIb3dSZWNydWl0ZWQ9PSJTT05BIikgJT4lIGRwbHlyOjpzZWxlY3QobikpYCAoYHIgdW5saXN0KGQucGFydGljaXBhbnRzICU+JSBjb3VudChHZW5kZXIsIEhvd1JlY3J1aXRlZCkgJT4lIGZpbHRlcihHZW5kZXI9PSJXb21hbiIsIEhvd1JlY3J1aXRlZD09IlNPTkEiKSAlPiUgZHBseXI6OnNlbGVjdChuKSlgIHdvbWVuIGFuZCBgciB1bmxpc3QoZC5wYXJ0aWNpcGFudHMgJT4lIGNvdW50KEdlbmRlciwgSG93UmVjcnVpdGVkKSAlPiUgZmlsdGVyKEdlbmRlcj09Ik1hbiIsIEhvd1JlY3J1aXRlZD09IlNPTkEiKSAlPiUgZHBseXI6OnNlbGVjdChuKSlgIG1lbikgY2FtZSBmcm9tIGEgcGFpZCBzdWJqZWN0IHBvb2wgY29uc2lzdGluZyBvZiBtZW1iZXJzIG9mIHRoZSBjb21tdW5pdHkgc3Vycm91bmRpbmcgTWljaGlnYW4gU3RhdGUgVW5pdmVyc2l0eS4gYHIgdW5saXN0KGQucGFydGljaXBhbnRzICU+JSBjb3VudChNaWNoaWdhblN0YXRlKSAlPiUgZmlsdGVyKE1pY2hpZ2FuU3RhdGU9PSJZZXMiKSAlPiUgZHBseXI6OnNlbGVjdChuKSlgIHBhcnRpY2lwYW50cyB3ZXJlIGFmZmlsaWF0ZWQgaW4gc29tZSB3YXkgd2l0aCB0aGUgdW5pdmVyc2l0eS4KClRoZSBhdmVyYWdlIGFnZSBvZiBwYXJ0aWNpcGFudHMgd2FzIGByIHJvdW5kKG1lYW4oZC5wYXJ0aWNpcGFudHMkQWdlKSwgZGlnaXRzPTIpYCB5ZWFycyAobWluaW11bTogYHIgbWluKGQucGFydGljaXBhbnRzJEFnZSlgLCBtYXhpbXVtOiBgciBtYXgoZC5wYXJ0aWNpcGFudHMkQWdlKWApLiBUaGlzIHN0dWR5IHdhcyBhcHByb3ZlZCBhcyBleGVtcHQgYnkgdGhlIHVuaXZlcnNpdHkncyBpbnN0aXR1dGlvbmFsIHJldmlldyBib2FyZC4KClRoZSBpbnRlcnZpZXdzIHJhbmdlZCBmcm9tIGFib3V0IGByIHJvdW5kKG1pbihkLnBhcnRpY2lwYW50cyRJbnRlcnZpZXdEdXJhdGlvbikpYCB0byBgciByb3VuZChtYXgoZC5wYXJ0aWNpcGFudHMkSW50ZXJ2aWV3RHVyYXRpb24pKWAgbWludXRlcyAoYXZlcmFnZSBgciByb3VuZChtZWFuKGQucGFydGljaXBhbnRzJEludGVydmlld0R1cmF0aW9uKSlgIG1pbikgYW5kIHRvb2sgcGxhY2Ugb3ZlciB0aGUgcGhvbmUgc28gdGhhdCB3ZSBjb3VsZCByZWNydWl0IGEgbW9yZSBnZW9ncmFwaGljYWxseSBkaXZlcnNlIHNhbXBsZS4gSW50ZXJ2aWV3IGxlbmd0aCB2YXJpZWQgYmFzZWQgb24gaG93IG1hbnkgZXhhbXBsZXMgb2YgbWlzZGlyZWN0ZWQgZW1haWwgZWFjaCBwYXJ0aWNpcGFudCBtZW50aW9uZWQuCgpUaGUgZGF0YSBmcm9tIHdoaWNoIHRoZSBudW1iZXJzIGluIHRoaXMgZG9jdW1lbnQgd2VyZSBnZW5lcmF0ZWQgY2FtZSBmcm9tIHBhcnRpY2lwYW50cycgZW5kLW9mLWludGVydmlldyBxdWVzdGlvbm5haXJlcywgYW5kIGZyb20gdGhpbmdzIHRoZXkgc2FpZCBkdXJpbmcgdGhlIGludGVydmlldy4gRm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZW1haWwgYWNjb3VudHMgdGhleSB1c2VkIGNhbWUgZnJvbSBiZWluZyBhc2tlZCBkdXJpbmcgdGhlIGludGVydmlldyB0byBsaXN0IHRoZSBkaWZmZXJlbnQgZW1haWwgYWNjb3VudHMgdGhleSB1c2VkLCBhbmQgd2hhdCB0aGV5IHNhaWQgd2FzIHN1YnNlcXVlbnRseSBjb2RlZCBhbmQgdGhlbiBlbnRlcmVkIGluIE5WaXZvIGFzIGEgY2FzZSBhdHRyaWJ1dGUuIAoKYGBge3IgcGFydGljaXBhbnQgZGVzY3JpcHRpdmVzLCBlY2hvPUZBTFNFfQojIE5PVEU6IHRoaXMgY2h1bmsgdXNlcyB0aGUgZnVuY3Rpb24gInRyYW5zcG9zZV9kZiIgdGhhdCBpcyBsb2FkZWQgaW4gdGhlIHNldHVwIGNodW5rCmthYmxlKHRyYW5zcG9zZV9kZihkLnBhcnRpY2lwYW50cyAlPiUgc3VtbWFyaXplKE1pbj1taW4oQWdlKSwgCiAgICAgICAgICAgICAgICBNZWRpYW49bWVkaWFuKEFnZSksIAogICAgICAgICAgICAgICAgTWF4QWdlPW1heChBZ2UpLCAKICAgICAgICAgICAgICAgIE1lYW5BZ2U9bWVhbihBZ2UpLCAKICAgICAgICAgICAgICAgIFN0RGV2QWdlPXNkKEFnZSkpKSAlPiUgZHBseXI6OnJlbmFtZShgUGFydGljaXBhbnQgQWdlIERlc2NyaXB0aXZlc2AgPSByb3duYW1lLCBgIGA9YDFgKSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjVlbSIpCgprYWJsZSh0cmFuc3Bvc2VfZGYoZC5wYXJ0aWNpcGFudHMgJT4lIHN1bW1hcml6ZShNaW49bWluKEludGVydmlld0R1cmF0aW9uKSwgCiAgICAgICAgICAgICAgICBNZWRpYW49bWVkaWFuKEludGVydmlld0R1cmF0aW9uKSwgCiAgICAgICAgICAgICAgICBNYXg9bWF4KEludGVydmlld0R1cmF0aW9uKSwgCiAgICAgICAgICAgICAgICBNZWFuPW1lYW4oSW50ZXJ2aWV3RHVyYXRpb24pLCAKICAgICAgICAgICAgICAgIFN0RGV2PXNkKEludGVydmlld0R1cmF0aW9uKSkpICU+JSBkcGx5cjo6cmVuYW1lKGBJbnRlcnZpZXcgRHVyYXRpb24gRGVzY3JpcHRpdmVzIChtaW51dGVzKWAgPSByb3duYW1lLCBgIGA9YDFgKSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjVlbSIpCgprYWJsZSh0cmFuc3Bvc2VfZGYoZC5wYXJ0aWNpcGFudHMgJT4lIHN1bW1hcml6ZShNaW49bWluKE51bUVtYWlsQWRkcmVzc2VzKSwgCiAgICAgICAgICAgICAgICBNZWRpYW49bWVkaWFuKE51bUVtYWlsQWRkcmVzc2VzKSwgCiAgICAgICAgICAgICAgICBNYXg9bWF4KE51bUVtYWlsQWRkcmVzc2VzKSwgCiAgICAgICAgICAgICAgICBNZWFuPW1lYW4oTnVtRW1haWxBZGRyZXNzZXMpLCAKICAgICAgICAgICAgICAgIFN0RGV2PXNkKE51bUVtYWlsQWRkcmVzc2VzKSkpICU+JSBkcGx5cjo6cmVuYW1lKGBFbWFpbCBBY2NvdW50cyBQZXIgUGFydGljaXBhbnRgID0gcm93bmFtZSwgYCBgPWAxYCkpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JQogIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjI1ZW0iKQpgYGAKCgojIyBUeXBlcyBvZiBtaXNkaXJlY3RlZCBlbWFpbCBwZXIgcGFydGljaXBhbnQKClRoaXMgaXMgYSBoZWF0bWFwIG9mIHRoZSB0eXBlcyBvZiBtaXNkaXJlY3RlZCBlbWFpbCBtZW50aW9uZWQsIGJ5IHBhcnRpY2lwYW50LiBUaGUgY2F0ZWdvcmllcyB3ZXJlIGRldGVybWluZWQgaW4gYW4gaW5kdWN0aXZlIGZhc2hpb24gZHVyaW5nIHRoZSBpbnRlcnZpZXcgYW5hbHlzaXMgcGhhc2Ugb2YgdGhlIHByb2plY3QuIFRoZSBob3Jpem9udGFsIGxpbmVzIGRlbGluZWF0ZSBmb3VyIGdyb3VwcyBvZiBwYXJ0aWNpcGFudHMgd2l0aCBzaW1pbGFyIHBhdHRlcm5zIG9mIHJlY2VpdmluZyBtaXNkaXJlY3RlZCBlbWFpbCwgYmFzZWQgb24gdGhlIG51bWJlciBhbmQgZGl2ZXJzaXR5IG9mIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWlzZGlyZWN0ZWQgZW1haWwgdGhleSBtZW50aW9uZWQgaW4gdGhlIGludGVydmlld3MuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD02fQojIGFkZCB0aGUgZ3JvdXAgY29sdW1uIHRvIHRoZSBkLnBhcnRpY2lwYW50cyBkYXRhIGZyYW1lCmQucGFydGljaXBhbnRzIDwtIGQucGFydGljaXBhbnRzICU+JSBtdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oCiAgcGFydGljaXBhbnRfaWQgJWluJSBjKCJQMDEiLCAiUDAyIiwgIlAwMyIsICJQMTMiLCAiUDE0IiwgIlAxNSIsICJQMTgiLCAiUDIwIikgfiAiZ3JvdXAxIiwKICBwYXJ0aWNpcGFudF9pZCAlaW4lIGMoIlAwNSIsICJQMTYiLCAiUDIxIikgfiAiZ3JvdXAyIiwgCiAgcGFydGljaXBhbnRfaWQgJWluJSBjKCJQMDQiLCAiUDA2IiwgIlAwNyIsICJQMDkiLCAiUDEwIiwgIlAxMSIsICJQMTIiLCAiUDE3IiwgIlAxOSIsICJQMjIiKSB+ICJncm91cDMiLAogIHBhcnRpY2lwYW50X2lkICVpbiUgYygiUDA4IiwgIlAxMSIsICJQMTkiKSB+ICJncm91cDQiCikpCgpoIDwtIGQuY29kZXMgJT4lIAogIHNlbGVjdChwYXJ0aWNpcGFudF9pZCwgc3RhcnRzX3dpdGgoInJlY2VpdmluZ18iKSkgJT4lIAogIGlubmVyX2pvaW4oZC5wYXJ0aWNpcGFudHMgJT4lIAogICAgICAgICAgICAgICBzZWxlY3QocGFydGljaXBhbnRfaWQsIGdyb3VwKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJyZWNlaXZpbmdfIikpLCBhcy5sb2dpY2FsKSAlPiUgCiAgbWVsdChpZC52YXJzID0gYygicGFydGljaXBhbnRfaWQiLCAiZ3JvdXAiKSkgJT4lIAogIGRwbHlyOjpyZW5hbWUodHlwZT12YXJpYWJsZSwgcHJlc2VudD12YWx1ZSkgJT4lIAogIG11dGF0ZShwYXJ0aWNpcGFudF9pZCA9IGZhY3RvcihwYXJ0aWNpcGFudF9pZCksCiAgICAgICAgIHBhcnRpY2lwYW50X2lkID0gZmN0X3JlbGV2ZWwocGFydGljaXBhbnRfaWQsICJQMDEiLCAiUDAyIiwgIlAwMyIsICJQMTMiLCAiUDE0IiwgIlAxNSIsICJQMTgiLCAiUDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUDA1IiwgIlAxNiIsICJQMjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQMDQiLCAiUDA2IiwgIlAwNyIsICJQMDkiLCAiUDEwIiwgIlAxMiIsICJQMTciLCAiUDIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUDA4IiwgIlAxMSIsICJQMTkiKSkKICAKcGxvdChnIDwtIGdncGxvdChoLCBhZXModHlwZSwgcGFydGljaXBhbnRfaWQpKSArCiAgZ2VvbV90aWxlKGFlcyhmaWxsPXByZXNlbnQpLCBjb2xvcj0iZ3JheSIpICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvcj0iZ3JheTkwIiwgc2l6ZT0wLjI1KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNSwgaGp1c3Q9MSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJ0b3AiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIndoaXRlIiwic3RlZWxibHVlIikpICsKICBzY2FsZV95X2Rpc2NyZXRlKGxpbWl0cz1yZXYobGV2ZWxzKGgkcGFydGljaXBhbnRfaWQpKSkgKyAKICAgIGxhYnMoCiAgICB0aXRsZSA9ICJUeXBlcyBvZiBtaXNkaXJlY3RlZCBlbWFpbCBwcmVzZW50IGluIGVhY2ggcGFydGljaXBhbnQncyBpbnRlcnZpZXciLAogICAgIyBzdWJ0aXRsZT0iZGVub21pbmF0b3IgaXMgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiB0aGF0IGNsdXN0ZXIiLAogICAgeCA9ICIiLAogICAgeSA9ICIiCiAgKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdD0xNC41LCBzaXplID0gMS41LCBjb2xvcj0iZ3JheTQwIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTEuNSwgc2l6ZSA9IDEuNSwgY29sb3I9ImdyYXk0MCIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTMuNSwgc2l6ZSA9IDEuNSwgY29sb3I9ImdyYXk0MCIpKQpgYGAKCgojIEludGVydmlldyBQcm90b2NvbAoKV2UgdXNlZCBhIHNlbWktc3RydWN0dXJlZCBpbnRlcnZpZXcgbWV0aG9kLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGludGVydmlldyBwcm90b2NvbCBpcyBhIGd1aWRlLCBub3QgYSBzY3JpcHQgdG8gYmUgZm9sbG93ZWQuIFRoZSBpbnRlcnZpZXdzIHRvdWNoZWQgb24gYWxsIGFzcGVjdHMgb2YgdGhlIHByb3RvY29sLCBhbmQgdGhlIHNlY3Rpb25zIG9mIHRoZSBpbnRlcnZpZXcgdG9vayBwbGFjZSByb3VnaGx5IGluIHRoZSBvcmRlciBwcmVzZW50ZWQgYmVsb3cuIEhvd2V2ZXIsIHRoZSBxdWVzdGlvbnMgd2VyZSBub3QgbmVjZXNzYXJpbHkgYXNrZWQgdmVyYmF0aW0sIG5vdCBhbGwgb2YgdGhlIHF1ZXN0aW9ucyB3ZXJlIGFza2VkIG9mIGV2ZXJ5IHBhcnRpY2lwYW50LCBhbmQgZm9sbG93LXVwIHF1ZXN0aW9ucy9wcm9iZXMgd2VyZSB1c2VkIGV4dGVuc2l2ZWx5LgoKIyMgSW50ZXJ2aWV3IFF1ZXN0aW9ucyAKCioqUXVlc3Rpb25zIGFib3V0IGdlbmVyYWwgZW1haWwgdXNlICh3YXJtLXVwKToqKgoKSeKAmWQgbGlrZSB0byBzdGFydCB0aGUgaW50ZXJ2aWV3IGJ5IGdldHRpbmcgdG8ga25vdyBhIGxpdHRsZSBiaXQgYWJvdXQgdGhlIGhvdyB5b3UgdXNlIGVtYWlsIGluIGdlbmVyYWwuIAoKVGhlIGZpcnN0IHRoaW5nIEkgd291bGQgbGlrZSB0byBkbyBpcyB0byBoYXZlIHlvdSB0aGluayBhYm91dCBhbGwgdGhlIGRpZmZlcmVudCBlbWFpbCBhZGRyZXNzZXMgb3IgYWNjb3VudHMgdGhhdCB5b3UgaGF2ZSwgdGhhdCB5b3UgY2FuIHJlbWVtYmVyLCBhbmQganVzdCBsaXN0IHRoZW0gZm9yIG1lIG9mZiB0aGUgdG9wIG9mIHlvdXIgaGVhZCDigJMgeW91IGRvbuKAmXQgbmVlZCB0byBnbyBsb29rIHRoZW0gdXAuCgpXaGljaCBlbWFpbCBhY2NvdW50KHMpIGRvIHlvdSB1c2UgbW9zdD8gSG93IGxvbmcgaGF2ZSB5b3UgaGFkIHRob3NlIGFjY291bnRzPyBIb3cgb2Z0ZW4gZG8geW91IGNoZWNrIHlvdXIgZW1haWw/IFdoZW4gd2FzIHRoZSBsYXN0IHRpbWUgeW91IGNoZWNrZWQgeW91ciBtYWlsIGZyb20gdGhvc2UgYWNjb3VudHM/IAoKVGVsbCBtZSBhYm91dCB5b3VyIHByb2Nlc3MgdGhlIGxhc3QgdGltZSB5b3UgY2hlY2tlZCB5b3VyIG1haWwgYmVmb3JlIG5vdyDigJMgd2hlcmUgd2VyZSB5b3U/IFdoYXQgZGV2aWNlIGRpZCB5b3UgdXNlPyBXaGF0IGRpZCB5b3UgZG8gZmlyc3Q/IFRoZW4gd2hhdD8KCioqUXVlc3Rpb25zIGFib3V0IHNwYW06KioKCk5leHQsIEkgaGF2ZSBzb21lIGdlbmVyYWwgcXVlc3Rpb25zIGFib3V0IHNwYW0gZW1haWwuIFdoYXQga2luZHMgb2YgZW1haWxzIGRvZXMgdGhlIHdvcmQg4oCcc3BhbeKAnSBicmluZyB0byBtaW5kIGZvciB5b3U/IAoKSWYgSSBzaG93ZWQgeW91IGEgYnVuY2ggb2YgZW1haWxzLCB3aGF0IHdvdWxkIHlvdSBsb29rIGZvciB0byBoZWxwIHlvdSBkZWNpZGUgaWYgYSBtZXNzYWdlIGlzIHNwYW0gb3Igbm90PwoKQ2FuIHlvdSB0aGluayBvZiBhIHNwZWNpZmljIGV4YW1wbGUgb2YgYSBzcGFtIG1lc3NhZ2UgdGhhdCB5b3XigJl2ZSByZWNlaXZlZCByZWNlbnRseT8gRGVzY3JpYmUgaXQuIFdoYXQgaXMgaXQgYWJvdXQgdGhpcyBtZXNzYWdlIHRoYXQgbWFrZXMgaXQg4oCcc3BhbeKAnT8KCioqUXVlc3Rpb25zIGFib3V0IHJlY2VpdmluZyBtaXNkaXJlY3RlZCBlbWFpbDoqKgoKTmV4dCwgSSB3YW50IHRvIHRhbGsgYWJvdXQgZW1haWxzIHRoYXQgeW91IG1heSByZWNlaXZlLCB0aGF0IG1heSBvciBtYXkgbm90IHNlZW0gbGlrZSBzcGFtIHRvIHlvdS4gKlt0aGlzIGRlcGVuZHMgb24gd2hhdCB0aGUgcGVyc29uIHNhaWQgYWJvdXQgc3BhbV0qCgpUaGUgYmVzdCB3YXkgSSBjYW4gZGVzY3JpYmUgdGhpcyBpcywgdGhlc2UgZW1haWxzIHNlZW0gbGlrZSB0aGUgcGVyc29uIHdobyBzZW50IHRoZW0gaW50ZW5kZWQgZm9yIHRoZW0gdG8gZ28gdG8gc29tZW9uZSB3aG8gaXMgbm90IHlvdS4gVGhleSBjb3VsZCBjb21lIGZyb20gc29tZW9uZSB5b3UgYWxyZWFkeSBrbm93LCBvciBmcm9tIGEgY29tcGxldGUgc3RyYW5nZXIsIG9yIGZyb20gYSBidXNpbmVzcyBvciB3ZWJzaXRlIHlvdSBoYXZlIG5ldmVyIGJlZW4gdG8uIEJ1dCB0aGUga2V5IHRoaW5nIGlzIHRoZXNlIGFyZSBsZWdpdGltYXRlIGVtYWlscywgYnV0IHRoZXkganVzdCBzZWVtIGxpa2UgdGhleSBhcmUgbWVhbnQgZm9yIHNvbWVvbmUgZWxzZS4KCkNhbiB5b3UgdGhpbmsgb2YgYW4gZXhhbXBsZSB3aGVyZSB5b3UgaGF2ZSByZWNlaXZlZCBhIG1haWwgbGlrZSB0aGlzPyAqW2lmIHRoZXkgY2Fu4oCZdCB0aGluayBvZiBhbiBleGFtcGxlLCByZXZpZXcgd2hhdCB0aGV5IHNhaWQgaGFkIGhhcHBlbmVkIHRvIHRoZW0sIGZyb20gdGhlIHNjcmVlbmluZyBxdWVzdGlvbm5haXJlLCBza2lwIHRvIHRoYXQgcGFydCBvZiB0aGUgaW50ZXJ2aWV3IHByb3RvY29sIGluc3RlYWQuIOKAnFlvdSBzYWlkIGluIHRoZSBzY3JlZW5pbmcgcXVlc3Rpb25uYWlyZSB0aGF04oCmIHRlbGwgbWUgYWJvdXQgdGhhdOKApuKAnV0qCgpUZWxsIG1lIG1vcmUgYWJvdXQgdGhhdC4gQ2FuIHlvdSBmaW5kIHRoZSBlbWFpbCBub3c/IERlc2NyaWJlIGl0LiBXaGF0IHdhcyBpdCBhYm91dCwgd2hvIHdhcyBpdCBmcm9tLCBob3cgbG9uZyBhZ28/IFdoYXQgZGlkIHlvdSBkbyBhZnRlciB5b3UgcmVjZWl2ZWQgdGhlIGVtYWlsPyBFdGMuCgpDYW4geW91IHRoaW5rIG9mIGFub3RoZXIgZXhhbXBsZT8gVGVsbCBtZSBhYm91dCBpdC4gKltLZWVwIGdvaW5nIGlmIHRoZXkgaGF2ZSBsb3RzIG9mIGV4YW1wbGVzLCB1cCB0byBhYm91dCA1LTYgZXhhbXBsZXMuXSoKClNvbWV0aW1lcyBwZW9wbGUgdGVsbCB1cyB0aGF0IHRoZXnigJl2ZSByZWNlaXZlZCBhbiBlbWFpbCBhc2tpbmcgdGhlbSB0byBjb25maXJtIGEgbmV3IGFjY291bnQgdGhhdCB0aGV5IGRvbuKAmXQgcmVtZW1iZXIgY3JlYXRpbmcuCklmIHRoaXMgaGFzIGhhcHBlbmVkIHRvIHlvdSwgY2FuIHlvdSB0ZWxsIHVzIGFib3V0IGl0PyBDYW4geW91IGZpbmQgdGhlIGVtYWlsIG5vdz8gRGVzY3JpYmUgaXQuIFdoYXQgd2FzIGl0IGFib3V0LCB3aG8gd2FzIGl0IGZyb20sIGhvdyBsb25nIGFnbz8gV2hhdCBkaWQgeW91IGRvIGFmdGVyIHlvdSByZWNlaXZlZCB0aGUgZW1haWw/IAoKSGF2ZSB5b3UgZXZlciB0cmllZCB0byBjcmVhdGUgYW4gYWNjb3VudCBvbiBhIHdlYnNpdGUsIGJ1dCB5b3UgY291bGRu4oCZdCBiZWNhdXNlIGl0IHNhaWQgeW91ciBlbWFpbCBhZGRyZXNzIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQgb24gYW5vdGhlciBhY2NvdW50PyBUZWxsIG1lIG1vcmUgYWJvdXQgdGhhdC4gV2hlbiBkaWQgdGhpcyBoYXBwZW4/IFdoYXQgd2Vic2l0ZSB3YXMgaXQ/IFdoYXQgZGlkIHlvdSBkbyBuZXh0PwoKV2hhdCBvdGhlciBleGFtcGxlcyBjYW4geW91IHRoaW5rIG9mIHRoYXQgYXJlIHNpbWlsYXIgdG8gd2hhdCB3ZeKAmXZlIGJlZW4gdGFsa2luZyBhYm91dD8gV2hpY2ggb25lcyBzdGFuZCBvdXQgbW9zdCBpbiB5b3VyIG1pbmQ/IFRlbGwgbWUgbW9yZSBhYm91dCB0aGF0LCBldGMuCgpXaHkgZG8geW91IHRoaW5rIHRoZXNlIGtpbmRzIG9mIHRoaW5ncyBoYXBwZW4/IFdoYXQgZG8geW91IHRoaW5rIHlvdSBjb3VsZCBkbyB0byBwcmV2ZW50IHRoaXM/CgoqKlF1ZXN0aW9ucyBhYm91dCByZWFzb25zL2NhdXNlcyBmb3IgcmVjZWl2aW5nIHVud2FudGVkIGVtYWlsOioqCgpDYW4geW91IHRoaW5rIG9mIGEgdGltZSB3aGVuIHlvdSBzZW50IGFuIGVtYWlsIHRvIHRoZSB3cm9uZyBwZXJzb24gYnkgbWlzdGFrZT8gVGVsbCBtZSBhYm91dCB0aGF0IHRpbWUuIFdoYXQgd2FzIHRoZSBlbWFpbCBhYm91dD8gV2hvIGRpZCB5b3UgbWVhbiB0byBzZW5kIGl0IHRvPyBIb3cgZGlkIGl0IGVuZCB1cCBnb2luZyB0byB0aGUgd3JvbmcgcGVyc29uPyBIb3cgZGlkIHlvdSByZWFsaXplIHdoYXQgaGFwcGVuZWQ/IFdoYXQgaGFwcGVuZWQgbmV4dD8KCkhhdmUgeW91IGV2ZXIgbWFkZSB1cCBhbiBlbWFpbCBhZGRyZXNzLCBvciBnaXZlbiBvdXQgc29tZW9uZSBlbHNl4oCZcyBlbWFpbCBhZGRyZXNzLCB3aGVuIHNvbWUgcGVyc29uIG9yIHdlYnNpdGUgYXNrZWQgeW91IGZvciBhbiBlbWFpbCBhZGRyZXNzPyBXaGVuIHdhcyB0aGUgbGFzdCB0aW1lIHRoaXMgaGFwcGVuZWQ/IEhvdyBkaWQgeW91IGRlY2lkZSB3aGF0IGVtYWlsIGFkZHJlc3MgdG8gZ2l2ZSBvdXQ/IFdoYXQgaGFwcGVuZWQgbmV4dD8KCioqQXNrIGlmIHRoZSBwYXJ0aWNpcGFudCBoYXMgYW55IHF1ZXN0aW9uczoqKgoKSWYgdGhlIHBhcnRpY2lwYW50IGhhcyBhc2tlZCBhbnkgcXVlc3Rpb25zIGFib3V0IHRoZSBzdHVkeSBvciBhYm91dCBob3cgZW1haWwgd29ya3MsIG5vdyBpcyB0aGUgdGltZSB0byBhbnN3ZXIgdGhlbS4gSWYgeW91IGRvbuKAmXQga25vdyB0aGUgYW5zd2VyLCB3cml0ZSBpdCBkb3duIGFuZCB0ZWxsIHRoZW0gRHIuIFJhZGVyIHdpbGwgZ2V0IGJhY2sgdG8gdGhlbS4KCioqRmluYWwgT25saW5lIFF1ZXN0aW9ubmFpcmU6KioKCldl4oCZcmUgYWxtb3N0IGRvbmUuIEkganVzdCBoYXZlIGEgdmVyeSBzaG9ydCBvbmxpbmUgcXVlc3Rpb25uYWlyZSB3aXRoIGEgZmV3IGJhc2ljIGRlbW9ncmFwaGljIHF1ZXN0aW9ucyBmb3IgeW91IHRvIGZpbGwgb3V0LiBUaGUgbGFzdCBwYWdlIG9mIHRoZSBxdWVzdGlvbm5haXJlIHdpbGwgYXNrIHlvdSBmb3IgdGhlIGVtYWlsIGFkZHJlc3MgeW91IHdvdWxkIGxpa2UgdXMgdG8gdXNlIHRvIHNlbmQgeW91IHlvdXIgJDE1IEFtYXpvbi5jb20gZ2lmdCBjYXJkLiBBcyBzb29uIGFzIHlvdSBzdWJtaXQgdGhlIHF1ZXN0aW9ubmFpcmUsIERyLiBSYWRlciB3aWxsIGJlIG5vdGlmaWVkLCBhbmQgc2hlIHdpbGwgZ28gdG8gQW1hem9uIHRvIHB1cmNoYXNlIGFuZCBzZW5kIHlvdSB0aGUgZ2lmdCBjYXJkLiAKCgojIyBFbmQgb2YgSW50ZXJ2aWV3IFF1ZXN0aW9ubmFpcmUKCipUaGlzIHF1ZXN0aW9ubmFpcmUgd2FzIGNvbXBsZXRlZCBieSBlYWNoIHBhcnRpY2lwYW50IGFmdGVyIHRoZSBpbnRlcnZpZXcsIG1haW5seSBhcyBhIHdheSB0byBjb2xsZWN0IHRoZSBlbWFpbCBhZGRyZXNzIHdoZXJlIHRoZXkgd2FudGVkIHRoZSBzdHVkeSBpbmNlbnRpdmUgc2VudC4qCgoxLglQYXJ0aWNpcGFudCBJRCBudW1iZXIgKltGaWxsIGluIHRoZSBibGFuaywgZ2l2ZW4gdG8gdGhlIHN1YmplY3QgYnkgdGhlIGludGVydmlld2VyIGF0IHRoZSBlbmQgb2YgdGhlIGludGVydmlld10qICAKMi4JV2hhdCBpcyB5b3VyIHByaW1hcnkgb2NjdXBhdGlvbj8gKltGaWxsIGluIHRoZSBibGFua10qICAKMy4JSG93IG9sZCBhcmUgeW91PyAqW0ZpbGwgaW4gdGhlIGJsYW5rXSogIAo0LglXaGF0IGlzIHlvdXIgZ2VuZGVyPyAqW0ZpbGwgaW4gdGhlIGJsYW5rXSogIAo1LglJbiB3aGF0IGNpdHkgYW5kIHN0YXRlIGRvIHlvdSBjdXJyZW50bHkgbGl2ZT8gKltGaWxsIGluIHRoZSBibGFua10qICAKNi4JSG93IGRpZCB5b3UgaGVhciBhYm91dCB0aGlzIHN0dWR5PyAqW0ZpbGwgaW4gdGhlIGJsYW5rXSogIAoKKkFmdGVyIGNvbXBsZXRpbmcgdGhlIGFib3ZlIHF1ZXN0aW9ucywgcGFydGljaXBhbnRzIHdlcmUgYXV0b21hdGljYWxseSByZWRpcmVjdGVkIHRvIGEgc2VwYXJhdGUgc3VydmV5IHNvIHRoZWlyIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3Mgd2lsbCBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBxdWVzdGlvbm5haXJlIGRhdGEuKgoKVGhhbmsgeW91IGZvciBwYXJ0aWNpcGF0aW5nISBQbGVhc2UgZW50ZXIgeW91ciBuYW1lIGJlbG93LCBhbG9uZyB3aXRoIHRoZSBlbWFpbCBhZGRyZXNzIHdoZXJlIHlvdSB3YW50IHRvIHJlY2VpdmUgdGhlICQxNSBBbWF6b24gZ2lmdCBjYXJkLiBUaGlzIGluZm9ybWF0aW9uIGlzIGJlaW5nIGdhdGhlcmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcXVlc3Rpb25zIHlvdSBqdXN0IGFuc3dlcmVkLiBXZSBhcmUgZG9pbmcgdGhpcyBzbyB5b3VyIHN1cnZleSByZXNwb25zZXMgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBpZGVudGlmeSB5b3UuCiAKQWZ0ZXIgeW91IHN1Ym1pdCB0aGlzIGluZm9ybWF0aW9uLCB0aGUgcmVzZWFyY2hlcnMgd2lsbCBiZSBub3RpZmllZCwgYW5kIERyLiBFbWlsZWUgUmFkZXIgd2lsbCBnbyB0byBBbWF6b24uY29tIHRvIHB1cmNoYXNlIHRoZSBnaWZ0IGNhcmQgYW5kIHNlbmQgaXQgdG8gdGhlIGVtYWlsIGFkZHJlc3MgeW91IHByb3ZpZGUuIElmIHlvdSBkbyBub3QgcmVjZWl2ZSBhIGdpZnQgY2FyZCB3aXRoaW4gMjQgaG91cnMsIHBsZWFzZSBlbWFpbCB1cyBhdCB3cm9uZy5lbWFpbEBiaXRsYWIuY2FzLm1zdS5lZHUKCllvdXIgTmFtZTogKltGaWxsIGluIHRoZSBibGFuaywgcmVxdWlyZWRdKiAgCllvdXIgZW1haWwgYWRkcmVzczogKltGaWxsIGluIHRoZSBibGFuaywgcmVxdWlyZWRdKiAgCgoKCg==