Emilee Rader, Kelley Cotter and Janghee Cho. “Explanations as Mechanisms for Supporting Algorithmic Transparency” CHI 2018. Montreal, Quebec, Canada. April 2018. doi: 10.1145/3173574.3173677

1 Data Collection Overview

1.1 When did the study take place?

Data collection took place on 2017-08-10 through 2017-08-24. Participants were recruited by Qualtrics using their panel service, targeting US Facebook users who are 18+ years old, and a sample that is 52% female and 35% over 55 years old.

1.2 How many responses were collected?

The survey was started by 6842 potential participants. After data cleaning, there are 681 participants in the dataset. The number of participants in each condition is reported here:

1.3 How long did it take to complete the study?

The study took an average of 21.57 minutes for participants to complete, after they had finished the consent and screening questions. The maximum completion time (capped at 60 minutes by a limit placed in the survey which participants were informed about in the consent form and instructions) was 59.14 minutes, and the minimum was 6.07 minutes.

2 Survey Questions and Descriptive Statistics

2.1 Screening Questions

  • Do you use Facebook? [Yes/No]

  • What is your age in years? (variable name: age)

  • How many Facebook friends do you have? (variable name: fb_friends)

  • How long have you been a user of Facebook? (variable name: fb_how_long) [Less than one month / A couple of months / 6 months or so / About a year / 1-2 years / 3-5 years / More than 5 years]

  • How often do you usually visit Facebook? (variable name: fb_visit) [Several times per day / About once per day / A few times per week / About once per week / A few times per month / About once per month / Less than once per month / Never]

  • Do you now, or have you ever managed a Page on Facebook? [Yes/No]

  • Do you now, or have you ever worked in a job where your responsibilities included: ‘posting content on social media’, ‘communicating with clients, customers, etc. via social media’, or ‘working on the social media strategy for your organization’? [Yes/No]

  • Do you now, or have you ever worked in a job where your responsibilities included computer programming, quality assurance and testing, IT security, or network administration? [Yes/No]

  • What is your gender? (variable name: gender) [Woman / Man / Fill in the blank / Prefer not to answer]

2.2 Control Variable Questions

2.2.1 Trust Propensity

A series of 6 questions was designed to measure the tendency or propensity of each participant to trust in “social media websites”. The questions were:

Please respond to the following statements by answering how much you agree or disagree with each one:

  • I feel that most social media websites act in people’s best interests.
  • Most social media websites are helpful.
  • In general, social media websites are well-managed.
  • Most social media websites are able to meet users’ needs.
  • I feel fine using social media websites since they are generally reliable.
  • I always feel confident that social media websites will do what I want them to do.

The mean of this composite variable was 4.78 (SD = 0.98, median = 4.83, Cronbach’s alpha: 0.87). (variable name: trust_propensity)

Here are the descriptive statistics for each of those trust propensity questions:

2.2.2 Internet Literacy

A series of 8 questions was designed to measure the internet literacy to be asked the following question about the internet-related terms. The questions were:

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)

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

A composite variable was created for each participant by averaging the responses for each participant across the eight internet literacy items. The mean of this composite variable was 2.69 (SD = 0.82, median = 2.75, Cronbach’s alpha: 0.81). (variable name: internet_literacy)

Here are the descriptive statistics for each of those questions:

2.3 Questions about Facebook Usage and Behaviors

2.3.1 Years on Facebook

What was the date of your very first activity on Facebook? (variable name: year_diff)

Note: In this question, we asked participants to look up the date of their first activity on Facebook, on their Activity Log page. Then we calculated the number of years they’ve been using Facebook by subtracting that date from the date they participated in the experiment.

2.3.2 Posted Story in Past Week

How many stories did you post on Facebook in the past week? (variable name: stories_postedYes)

Note: Since this variable also has a long-tail distribution, we convert it into a binary variable: “No” means 0, “Yes” means 1 or more.

2.3.3 Routine Facebook Behavior

A series of 4 questions was designed to measure the habitual/routine nature of participants’ Facebook use. The questions were:

  • Facebook has become part of my daily routine.
  • I feel out of touch when I haven’t logged onto Facebook for a while.
  • I have difficulty controlling the amount of time I spend on Facebook.
  • I think about deleting my Facebook profile. [reverse-coded]

The mean of the composite variable created from these four questions is 4.3 (SD = 1.2, median = 4.5, Cronbach’s alpha: 0.63). (variable name: fb_routine)

Here are the descriptive statistics for each of those questions:

2.3.4 Facebook Satisfaction

A series of 4 questions was designed to measure users’ overall Facebook satisfaction. The questions were:

  • How do you feel about your overall experience with the Facebook News Feed? Very Dissatisfied — Very Satisfied ( M = 4.71, SD = 1.47 )
  • How do you feel about your overall experience with the Facebook News Feed? Very Displeased — Very Pleased ( M = 4.69, SD = 1.43 )
  • How do you feel about your overall experience with the Facebook News Feed? Very Frustrated — Very Contented ( M = 4.64, SD = 1.49 )
  • How do you feel about your overall experience with the Facebook News Feed? Absolutely Terrible — Absolutely Delighted ( M = 4.54, SD = 1.29 )

The mean of the composite variable created from these four questions was 4.64 (SD = 1.3, median = 4.75, Cronbach’s alpha: 0.94). (variable name: fb_satisfaction)

2.3.5 Diversity of Friend Network

By placing your Facebook friends into a single category, what percentage of all of your Facebook friends belong to each category below? Type a number in the blank between 0 and 100 for each category; the numbers you enter must add up to 100. (variable name: network_diversity)

  • Family members
  • Friends
  • Classmates
  • Work colleagues or co-workers
  • Other

We calculated Simpson’s D, based on Beam et al. (2017). This measure ranges from 0 to 80, and lower numbers indicate greater proportions in just one or two categories:

2.4 Questions about Prior Knowledge

2.4.1 Prior Knowledge Q1 (Before Manipulation)

Before the experiment manipulation, we asked participants two questions about their knowledge about the Facebook News Feed algorithm:

  • Facebook shows me every story created by my Facebook friends and the Pages I’ve “liked”. [Strongly disagree - Strongly agree]

2.4.2 Prior Knowledge Follow-Up Questions

Follow-up question 1: You answered your answer(e.g., “Agree”) to the question “Facebook shows me every story created by my Facebook friends and the Pages I’ve ‘liked’”. How sure or unsure are you about your answer? Please indicate your answer below on a scale from 0-100, where 0 means COMPLETELY UNSURE and 100 means COMPLETELY SURE. M =66.7, SD = 25.43. (variable name: evpst_before_sure)

Follow-up question 2 (only asked BEFORE the manipulation): Please explain why you chose your answer (e.g., “Agree”) to the question “Facebook shows me every story created by my Facebook friends and the Pages I’ve ‘liked’”. Your answer must be at least 150 characters long, which is about three sentences.

2.4.3 Prior Knowledge Q2

(variable name: aware_info_new)

2.4.4 Prior Knowledge Q3

(variable name: aware_info_surprise)

2.5 Questions about Awareness

2.5.1 Awareness Q1

(variable name: aware_evpst_aft)

After the experiment manipulation, we asked participants the same question about their awareness of the algorithm as we had asked before the manipulation:

  • Facebook shows me every story created by my Facebook friends and the Pages I’ve “liked”. [Strongly disagree - Strongly agree]

Follow up question: You answered your answer(e.g., “Agree”) to the question “Facebook shows me every story created by my Facebook friends and the Pages I’ve ‘liked’”. How sure or unsure are you about your answer? Please indicate your answer below on a scale from 0-100, where 0 means COMPLETELY UNSURE and 100 means COMPLETELY SURE - M =76.27, SD = 22.17. (variable name: aware_evpst_aft_sure)

2.5.2 Awareness Q2

A series of 14 questions was designed to measure awareness with 5 different factor variables. The questions were:

Below are possible reasons why you might not see every story posted by your Facebook friends and Pages you’ve “liked” in your News Feed. Please consider the text you read about Facebook, and indicate how much you agree or disagree with each reason.

  • System Agency (variable name: system_reasons) - M = 4.14, SD = 1, Cronbach’s alpha: 0.7.
    • Facebook thinks I don’t want to see stories from some of my friends.
    • Some of my friends are not popular enough on Facebook for me to see all of stories they post.
    • Facebook doesn’t show me certain types of stories in my News Feed.
    • Facebook thinks that I’m not very close to some of my Facebook friends.
    • If I am not tagged in stories posted by certain friends, I won’t see those stories.
  • User Agency (variable name: user_reasons) - M = 4.28, SD = 1.3, Cronbach’s alpha: 0.71.
    • I don’t spend a lot of time going through my News Feed.
    • I don’t scroll down to see older stories in my News Feed.
    • I don’t visit Facebook often enough to see all of the stories my friends post.
    • I don’t interact (comment, like, share) with stories from certain friends very often.
  • Hide Reason (variable name: hide_reasons) - M = 3.86, SD = 1.46, Cronbach’s alpha: 0.4.
    • I’ve previously used the News Feed settings to hide stories from some of my friends.
    • My friends may have hidden some of their stories from me.
  • Too Many Reason (variable name: toomany_reasons) - M = 5.58, SD = 1.1, Cronbach’s alpha: 0.55.
    • I don’t always read every story when I browse my News Feed.
    • There are so many stories in my News Feed that I don’t always see every one.
  • Too New Reason (variable name: aware_reasons_too_new) - M = 3.93, SD = 1.5.
    • Some posts from my friends are too new for me to have seen them yet.

Here are the descriptive statistics for each of those questions:

2.6 Questions about Correctness

2.6.1 Correctness Q1

(variable name: correct_expect)

Follow up question: You answered your answer(e.g., “Agree”) to the question. How sure or unsure are you about your answer? Please indicate your answer below on a scale from 0-100, where 0 means COMPLETELY UNSURE and 100 means COMPLETELY SURE - M = 76.37, SD = 20.71. (variable name: correct_expect_sure)

2.6.2 Correctness Q2

(variable name: correct_missed)

2.6.3 Correctness Q3

A series of 13 questions was designed to measure correctness with 5 different factor variables. The questions were:

Below are different kinds of stories that might appear in your News Feed. Please consider the text you read about Facebook, and indicate whether you feel like you see each kind of story about as often as you should, not often enough, or too often. Choose your answer on a scale from 0-100, where 0 means NOT OFTEN ENOUGH and 100 means TOO OFTEN.

  • Wanted Stories (variable name: want_frequency) - M = 55.28, SD = 15.05, Cronbach’s alpha: 0.61.
    • stories from people I want to keep in touch with ( M = 52.82, SD = 23.52 )
    • stories that I think are interesting ( M = 54.51, SD = 22.47 )
    • stories that are informative ( M = 52.48, SD = 22.17)
    • stories that are too similar to other stories I’ve already seen ( M = 61.31, SD = 20.17 )
  • Unwanted Stories (variable name: dont_want_frequency) - M = 54.66, SD = 19.14, Cronbach’s alpha: 0.72.
    • stories from people I don’t want hear from ( M = 52.67, SD = 23.69 )
    • stories that I don’t want to see ( M = 58.31, SD = 23.19 )
    • stories posted by people I don’t know ( M = 53, SD = 25.01 )
  • Spam Stories (variable name : spam_frequency) - M = 63.97, SD = 19.36, Cronbach’s alpha: 0.7.
    • stories about false content ( M = 59.43, SD = 25.29 )
    • stories that I think are spam ( M = 61.04, SD = 26.25 )
    • stories that are “sponsored” or “suggested” ( M = 71.44, SD = 21.93 )
  • Offensive Stories (variable name : offensive_frequency) - M = 52.18, SD = 20.91, Cronbach’s alpha: 0.74.
    • stories I think are offensive ( M = 49.66, SD = 23.63 )
    • stories that are upsetting or irritating ( M = 54.7, SD = 23.39 )
  • Correct Stories (variable name : correct_frequency_liked) - M = 60.06, SD = 21.01.
    • stories that my friends have “liked” ( M = 60.06, SD = 21.01 )

2.7 Questions about Interpretability

2.7.1 Interpretability Q1

(variable name: interpret_rsns)

Follow up questions: You answered your answer(e.g., “Agree”) to the question. How sure or unsure are you about your answer? Please indicate your answer below on a scale from 0-100, where 0 means COMPLETELY UNSURE and 100 means COMPLETELY SURE - M = 78.44, SD = 19.01. (variable name: interpret_rsns_sure)

2.7.2 Interpretability Q2

(variable name: interpret_order)

2.7.3 Interpretability Q3

A series of 8 questions was designed to measure interpretability with 2 different factor variables. The questions were:

Below are some goals that different people can have for using the News Feed. Please consider the text you read about Facebook, and indicate how consistent or random the News Feed seems like it is about showing you stories that would help you achieve each goal, on a scale of 0-100 where 0 means COMPLETELY RANDOM and 100 means COMPLETELY CONSISTENT.

  • Interpersonal Goals (variable name: entertained_goals) - M = 67.29, SD = 16.7, Cronbach’s alpha: 0.79.
    • helping me keep up with friends and family ( M = 73.74, SD = 21.29 )
    • showing me a variety of content ( M = 65.8, SD = 20.09 )
    • understanding my interests and preferences ( M = 60.97, SD = 22.35 )
    • keeping me entertained ( M = 68.63, SD = 21.69 )
  • Information Goals (variable name: informed_goal) - M = 56.14, SD = 17.22, Cronbach’s alpha: 0.75.
    • keeping me well-informed ( M = 61.76, SD = 21.28 )
    • helping me catch up on the news ( M = 61.31, SD = 23.14 )
    • letting me know about future events ( M = 63.07, SD = 21.59 )
    • helping me network and find job opportunities ( M = 38.43, SD = 24.66 )

2.8 Questions about Accountability

2.8.1 Accountability Q1

(variable name: acct_influence)

Follow up question: You answered your answer(e.g., “Agree”) to the question. How sure or unsure are you about your answer? Please indicate your answer below on a scale from 0-100, where 0 means COMPLETELY UNSURE and 100 means COMPLETELY SURE - M = 8.71, SD = 2.1. (variable name: acct_influence_sure)

2.8.2 Accountability Q2

A series of 3 questions was designed to measure the concept of accountability/fairness in News Feed. The questions were:

  • The News Feed behaves the same for everyone who uses it.
  • The News Feed is unbiased about which stories it shows to people.
  • The News Feed acts in the best interest of the people who use it.

The mean of the composite variable created from these three questions is 3.86 and Cronbach’s alpha is 0.64. (variable name: acct_fairness)

Here are the descriptive statistics for each of those questions:

2.8.3 Accountability Q3

A series of 10 questions was designed to measure accountability with 4 different factor variables. The questions were:

Below are some actions related to Facebook. How likely do you think it is that if you do these actions in the future, it will affect which stories appear in your News Feed? Please consider the text you read about Facebook, and indicate your answer for each item below on a scale from 0-100, where 0 means UNLIKELY, and 100 means LIKELY.

  • Content Action (variable name: content_actions) - M = 72.01, SD = 17.14, Cronbach’s alpha: 0.75.
    • “Like” a story ( M = 74.74, SD = 19.55 )
    • Comment on a story ( M = 69.27, SD = 21.89 )
    • Follow a person or a Page ( M = 72.03, SD = 21.48 )
  • UI Control Action (variable name: ui_controls_actions) - M = 67.55, SD = 18.72, Cronbach’s alpha: 0.66.
    • Prioritize who to “see first” ( M = 68.25, SD = 24.78 )
    • Sort by “Most Recent” stories ( M = 67.69, SD = 23.54 )
    • Add a person to your “Close Friends” list ( M = 66.71, SD = 24.53 )
  • Visit Action (variable name: visit_actions) - M = 49.57, SD = 21.69, Cronbach’s alpha: 0.56.
    • Visit Facebook less often ( M = 44.04, SD = 26.36 )
    • Visit Facebook more often ( M = 55.11, SD = 25.72 )
  • Hide Action (variable name: hiding_actions) - M = 60.01, SD = 24, Cronbach’s alpha: 0.64.
    • Hide a story ( M = 57.65, SD = 26.66 )
    • Unfollow a person or a Page ( M = 62.36, SD = 29.16 )

2.9 Demographics Questions

  • What is the last grade or class you completed in school? (variable name: education) [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 was your total household income before taxes during the past 12 months? (variable name: income) [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: (variable name: ethnicity) [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? (variable name: region) [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 Ineligible & Excluded Participants

3.1 How many participants were ineligible vs. excluded?

The email that the Qualtrics project manager sends out to possible participants does not contain a description of the study. Instead, the consent form serves as the information provided to participants so they can decide whether they want to participate. 6842 started the study by clicking on the link in the recruiting email and viewing the consent form.

285 participants did not consent to participate. Another 5056 were screened out for being ineligible. 820 participants were eligible, but were excluded before they completed the survey, for other reasons (e.g., failing the attention checks or manipulation check, providing poor quality responses, etc.). After data cleaning, there were 681 participants in the final dataset for analysis.

3.2 For what reasons were participants ineligible?

This only includes participants that consented to the study, but were determined to be ineligible in the screening. The survey was configured to direct participants to the end of the survey after each screening question, if they gave an ineligible response to that question.

The table is sorted by column so that the number in the “n” column is how many people were ineligible for the reason in the right-most column having “TRUE” or “No”. (TRUE means they entered an ineligible response.)

The two largest categories of ineligible respondents were those who said they had managed a Page on Facebook, and those who said they had fewer than 50 Facebook friends.

3.3 For what reasons were eligible participants excluded?

The reasons participants were excluded after consenting and being determined eligible to participate were:

  • failed attention check: The study had four attention check questions. Three of them were of the form To help us monitor the quality of our data, please select from the choices below. If they chose a different response than the one they were directed to, they were directed to the end of the survey. The fourth one was a fake word in the block of internet-related terms. If they said they had “Good” or “Full” familiarity with the fake word, they were directed to the end of the survey.
  • failed manipulation check: The study included three questions in each condition designed to ensure that participants had read and paid attention to the explanation text. Participants were given two chances to pass all three questions. If they answered one of the questions incorrectly, they were directed back to read the explanation again a second time. If they again failed to answer all of the questions correctly, they were directed to the end of the survey.
  • finished too slowly: Participants were required to finish the study within 60 minutes of finishing the consent and screening questions. If they did not, they were excluded.
  • incomplete: These are partial responses where a participant started but did not finish the survey.
  • poor quality response: We examined the responses for four symptoms of low quality responses, including 1) answers to the open-ended question that were unrelated to the question or contained repeated characters or other text intended to fill up space that did not answer the question; 2) answes that were too similar to other answers indicating possible repeat participation; 3) very low variation in answers (“straight down” answers) across 4 different sections of the survey; and 4) a mismatch between a multiple-choice question asking people how long they had been Facebook users, and a question that asked them to enter the date (month, day and year) of their first activity on Facebook, by looking it up on their Facebook Activity Log page.

Here is the number of responses excluded for each reason (this does not include participants who were ineligible or declined consent):

4 Participant Demographics

Age
mean: 43.4
sd: 16.31
range: 18, 88

Gender
Women: 357 (52.42%)
Men: 324 (47.58%)

Ethnicity
White: 541 (79.44%)
Hispanic, Latino or Spanish: 34 (4.99%)
Black or African American: 34 (4.99%)
Asian: 31 (4.55%)
American Indian or Alaska Native: 3 (0.445)
Native Hawaiian / Pacific Islander: 1 (0.15%)
Multiracial / Other: 37 (5.43%)

Note: ethnicity category counts are adjusted to account for the participants who reported being multi-racial. Otherwise, approximately 35 people would be counted in more than one category.

Education
No high school degree: 14 (2.06%)
High school grad, or GED: 130 (19.09%)
Some college, or vocational: 278 (40.82%)
4-year college degree: 166 (24.38%)
Some grad school, or grad degree: 93 (13.66%)

Income
Less than $25,000: 151 (22.17%)
$25,000 to $34,999: 89 (13.07%)
$35,000 to $49,999: 111 (16.3%)
$50,000 to $74,999: 148 (21.73%)
$75,000 to $99,999: 88 (12.92%)
$100,000 to $149,999: 70 (10.285)
$150,000 or more: 24 (3.52%)

Number of Facebook Friends
mean: 338.61
sd: 455.55
range: 50, 4958

Frequency of Visting Facebook
Several times per day: 487 (71.51%)
About once per day: 116 (17.03%)
A few times per week: 53 (7.78%)
Once per week or less: 25 (3.67%)

Posted story in the past week?
yes: 420 (61.67%)
no: 261 (38.33%)

Years Since Creating Facebook Account
mean: 7.58
sd: 2.58
range: 0.12, 13.62

5 Experiment Manipulation

Note: Each explanation has three different manipulation check questions and the correct answers to each question are in bold type.

Pilots of the explanations: We did initial think-aloud pilots of the explanations and manipulation check questions with members of our lab, and revised the explanations. We then did two rounds of piloting using Amazon Mechanical Turk workers as participants, and revised the explanations and questions between the two rounds. We asked participants to rate how new the information was to them, the tone of the text, the clarity of the text, and the believability of the text, and compared means across conditions. Difficulty was based on time to read the explanations, and the Flesch Kincaid reading level calculation available in MS Word.

5.1 “What” Explanation

(198 words; Flesch-Kincaid Grade Level 10.6)
The stories people see in their Facebook News Feeds are only some of the stories created by their Facebook friends, people they “follow”, Pages they “like”, and groups they belong to. The News Feed does not show people every possible story. Instead, there is an algorithm (a formula or set of rules) that makes a guess about which stories people want to see, and the order that they’ll want to see them in. Each person’s News Feed is a unique list of stories created specifically for them. This means that the stories in one person’s News Feed may be completely different from the stories in another person’s News Feed.

The News Feed does not show stories in the order that they were created, unless people change a setting that causes the stories to be shown in “Most Recent” order for a little while. Instead, the stories at the top of the News Feed are the stories the algorithm has automatically chosen to show first. This means that people are more likely to see stories that the algorithm has decided to put higher up in the News Feed, and may miss stories it has decided to put lower down.

5.1.1 “What” condition manipulation check questions

  1. The text I just read discussed…
    • The types of ads Facebook allows under its advertising policy.
    • Facebook’s algorithm that personalizes the News Feed.
    • The use of Facebook for organizing events.
    • The different kinds of Facebook apps that are available.
    • None of the above.
  2. Choose the information from the list below that was in the text that you read:
    • The stories in the News Feed are all created by Facebook employees.
    • Stories about kittens are more popular than all other types of stories in the News Feed.
    • The News Feed was first available to users on September 6, 2006.
    • The stories in the News Feed are not presented in the same order that they were created.
    • None of the above.
  3. Which of the following statements is true?
    • Facebook was first created at Stanford University in California.
    • English (Pirate) and Klingon are two of the language options offered by Facebook.
    • The News Feed has a “Most Recent” setting.
    • Facebook’s main user interface color is blue, because blue is Mark Zuckerberg’s favorite color.
    • None of the above.

5.2 “How” Explanation

(194 words; Flesch-Kincaid Grade Level 10.7)
When a person visits Facebook, thousands of pieces of information called “signals” are collected about their actions while they view stories in their News Feeds. Signals provide clues about the kinds of stories people want to see. Facebook uses an algorithm (a formula or set of rules) to calculate a score for all the possible stories that could appear in a person’s News Feed. The score is based on the signals that have been collected, and it is used to put the stories in order. The stories that are higher up in the list are the ones the algorithm has guessed the person will like the most, so it shows those stories first.

For example, if a person always “likes” stories posted by a certain friend, that signal tells the algorithm that it should choose more stories from that friend to show higher up in the person’s News Feed. Another signal is the total number of “likes” a particular story has received from everyone on Facebook who saw the story. If the story has only a few “likes”, the algorithm assumes the story isn’t very popular, and most people won’t want to see it.

5.2.1 “How” condition manipulation check questions

  1. The text I just read discussed…
    • The types of ads Facebook allows under its advertising policy.
    • The signals Facebook’s News Feed algorithm considers.
    • The use of Facebook for organizing events.
    • The different kinds of Facebook apps that are available.
    • None of the above.
  2. Choose the information from the list below that was in the text that you read:
    • The stories in the News Feed are all created by Facebook employees.
    • Stories about kittens are more popular than all other types of stories in the News Feed.
    • The News Feed was first available to users on September 6, 2006.
    • The order of the stories in the News Feed is based on a score calculated by the algorithm.
    • None of the above.
  3. Which of the following statements is true?
    • Facebook was first created at Stanford University in California.
    • English (Pirate) and Klingon are two of the language options offered by Facebook.
    • “Likes” on stories indicate people’s preferences.
    • Facebook’s main user interface color is blue, because blue is Mark Zuckerberg’s favorite color.
    • None of the above.

5.3 “Why” Explanation

(202 words; Flesch-Kincaid Grade Level 10.7)
Each time a person visits Facebook, there are thousands of stories posted by the people, Pages and groups they’re connected to that could possibly be shown to them in their News Feeds. But, this is too many stories for most people to be able to see them all. Also, some of the stories may be ones that people would prefer not to see, while other stories may be more important to them. Facebook’s goal for the News Feed is to show people stories that are interesting and relevant.

To accomplish this goal, the News Feed can’t show every possible story. Instead, Facebook uses an algorithm (a formula or set of rules) to automatically choose some of the available stories for the News Feed. The algorithm chooses stories it expects to be high quality and that people may “like” or comment on or share, and not stories it has determined to be outdated, spam, or misleading. The algorithm also decides the order the stories are shown in for each person. This means that the algorithm may choose different stories to show to different people even if they have the same Facebook friends, depending on its guess about what matters most to each person.

5.3.1 “Why” condition manipulation check questions

  1. The text I just read discussed…
    • The types of ads Facebook allows under its advertising policy.
    • The goals of the Facebook News Feed algorithm.
    • The use of Facebook for organizing events.
    • The different kinds of Facebook apps that are available.
    • None of the above.
  2. Choose the information from the list below that was in the text that you read:
    • The stories in the News Feed are all created by Facebook employees.
    • Stories about kittens are more popular than all other types of stories in the News Feed.
    • The News Feed was first available to users on September 6, 2006.
    • The algorithm chooses stories that are high quality and engaging to appear in the News Feed.
    • None of the above.
  3. Which of the following statements is true?
    • Facebook was first created at Stanford University in California.
    • English (Pirate) and Klingon are two of the language options offered by Facebook.
    • There are thousands of possible stories available on every visit to Facebook.
    • Facebook’s main user interface color is blue, because blue is Mark Zuckerberg’s favorite color.
    • None of the above.

5.4 “Objective” Explanation

(207 words; Flesch-Kincaid Grade Level 10.6)
Sometimes when people visit Facebook they see stories in their News Feeds they don’t want to see, or they miss stories that are important to them. This can happen when there is a problem with how the algorithm (a formula or set of rules) guesses which stories it should put higher up in the News Feed. Facebook collects information about how people interact with stories in their News Feeds, and feedback from people about what kinds of stories they prefer. Facebook’s engineers use this information to understand which stories people are most interested in, and why. Then, the engineers make changes to improve how the algorithm chooses stories.

Facebook tests the changes to the algorithm with a small number of people to see if it is working better for them. One way Facebook can tell if things are better is by whether people spend more time looking at stories in their News Feeds after the changes, compared with before the changes. Facebook also asks people questions about how much they wanted to see certain stories. All of the information about people’s actions, preferences and opinions is used to determine whether the change is an improvement or not. The algorithm is updated like this on a regular basis.

5.4.1 “Objective” condition manipulation check questions

  1. The text I just read discussed…
    • The types of ads Facebook allows under its advertising policy.
    • The process of evaluating the Facebook News Feed algorithm.
    • The use of Facebook for organizing events.
    • The different kinds of Facebook apps that are available.
    • None of the above.
  2. Choose the information from the list below that was in the text that you read:
    • The stories in the News Feed are all created by Facebook employees.
    • Stories about kittens are more popular than all other types of stories in the News Feed.
    • The News Feed was first available to users on September 6, 2006.
    • Facebook tests changes to the News Feed algorithm with a small number of users.
    • None of the above.
  3. Which of the following statements is true?
    • Facebook was first created at Stanford University in California.
    • English (Pirate) and Klingon are two of the language options offered by Facebook.
    • Engineers regularly update the News Feed algorithm.
    • Facebook’s main user interface color is blue, because blue is Mark Zuckerberg’s favorite color.
    • None of the above.

5.5 Control Text

(189 words; Flesch-Kincaid Grade Level 10.8)
Facebook is an American company and online social media website. It is based in Menlo Park, California and has offices in 15 countries. Facebook was launched on February 4, 2004, by Mark Zuckerberg and several other Harvard University students. At first, membership was limited to Harvard students. Since 2006, anyone who is age 13 and older and has a valid email address can become a registered user.

Facebook is available in multiple languages. It may be accessed over the Internet and mobile networks using desktops, laptops, tablet computers, and smartphones. After creating an account, people typically fill out a user profile with information like their name, occupation and email address. They then use Facebook to add other users as friends, exchange messages, create events, and post stories. People interact with others by commenting on or “liking” stories. They can also join common interest groups and share photos, videos and links. People receive notifications when others they are connected to update their user profiles or post stories. Stories that have been posted by people, Pages and groups appear in the News Feed, which is a constantly updating list of stories.

5.5.1 Control condition manipulation check questions

  1. The text that I just read discussed…
    • The types of ads Facebook allows under its advertising policy.
    • How Facebook first got started.
    • The use of Facebook for organizing events.
    • The different kinds of Facebook apps that are available.
    • None of the above.
  2. Choose the information from the list below that was in the text that you read:
    • The stories in the News Feed are all created by Facebook employees.
    • Stories about kittens are more popular than all other types of stories in the News Feed.
    • The News Feed was first available to users on September 6, 2006.
    • The News Feed shows stories from people, Pages and groups.
    • None of the above.
  3. Which of the following statements is true?
    • Facebook was first created at Stanford University in California.
    • English (Pirate) and Klingon are two of the language options offered by Facebook.
    • A valid email address is required to sign up for Facebook.
    • Facebook’s main user interface color is blue, because blue is Mark Zuckerberg’s favorite color.
    • None of the above.

6 Correlations Between the Variables

7 Regression Models

7.1 Knowledge


====================================================================
                                      Dependent variable:           
                           -----------------------------------------
                                       evpst_before_num             
--------------------------------------------------------------------
age.centered                            -0.006 (0.004)              
genderWoman                             -0.130 (0.120)              
internet_literacy.centered              -0.140• (0.075)             
trust_propensity.centered               0.220** (0.075)             
fb_satisfaction.centered               0.250*** (0.055)             
fb_routine.centered                      0.019 (0.056)              
stories_postedYes                       -0.027 (0.130)              
Constant                               4.500*** (0.120)             
--------------------------------------------------------------------
Observations                                  681                   
R2                                           0.097                  
Adjusted R2                                  0.088                  
Residual Std. Error                    1.500 (df = 673)             
F Statistic                         10.000*** (df = 7; 673)         
====================================================================
Note:                      . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

=========================================================================
                                          Dependent variable:            
                               ------------------------------------------
                               aware_info_new_num aware_info_surprise_num
                                      (1)                   (2)          
-------------------------------------------------------------------------
conditionwhat                   1.100*** (0.210)     1.100*** (0.200)    
conditionhow                    1.100*** (0.210)     0.800*** (0.200)    
conditionwhy                    1.300*** (0.210)     1.100*** (0.200)    
conditionobjective              1.500*** (0.210)     1.000*** (0.200)    
evpst_before.centered           0.270*** (0.043)     0.250*** (0.041)    
age.centered                     0.006 (0.004)        0.010* (0.004)     
genderWoman                     -0.270• (0.140)       -0.200 (0.130)     
internet_literacy.centered     -0.380*** (0.085)     -0.290*** (0.080)   
trust_propensity.centered        0.070 (0.084)        -0.086 (0.079)     
fb_satisfaction.centered         -0.008 (0.062)        0.059 (0.059)     
fb_routine.centered              -0.031 (0.063)       0.150* (0.060)     
stories_postedYes                0.230 (0.140)        0.300* (0.140)     
Constant                        3.500*** (0.190)     2.700*** (0.170)    
-------------------------------------------------------------------------
Observations                          681                   681          
R2                                   0.180                 0.170         
Adjusted R2                          0.160                 0.160         
Residual Std. Error (df = 668)       1.700                 1.600         
F Statistic (df = 12; 668)         12.000***             11.000***       
=========================================================================
Note:                           . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

7.2 Awareness


======================================================================================
                                                 Dependent variable:                  
                               -------------------------------------------------------
                               aware_evpst_aft_num  system_reasons     user_reasons   
                                       (1)                (2)               (3)       
--------------------------------------------------------------------------------------
conditionwhat                   -0.870*** (0.180)  0.490*** (0.120)   -0.090 (0.140)  
conditionhow                     -0.300• (0.180)   0.480*** (0.120)    0.140 (0.140)  
conditionwhy                    -0.490** (0.180)    0.330** (0.120)    0.120 (0.140)  
conditionobjective                0.210 (0.180)     0.260* (0.120)     0.062 (0.140)  
evpst_before.centered           0.460*** (0.037)   -0.110*** (0.024)  0.067* (0.029)  
age.centered                     -0.008* (0.004)   -0.007** (0.002)    0.003 (0.003)  
genderWoman                      -0.240* (0.120)    -0.140• (0.076)   -0.099 (0.093)  
internet_literacy.centered       -0.092 (0.073)     0.130** (0.047)   -0.140* (0.057) 
trust_propensity.centered        -0.100 (0.072)    -0.130** (0.047)  -0.150** (0.057) 
fb_satisfaction.centered          0.087 (0.054)     -0.015 (0.034)    -0.072• (0.042) 
fb_routine.centered               0.014 (0.054)      0.035 (0.035)   -0.340*** (0.042)
stories_postedYes                 0.040 (0.120)      0.025 (0.079)   -0.340*** (0.096)
Constant                        3.800*** (0.160)   3.900*** (0.100)  4.500*** (0.120) 
--------------------------------------------------------------------------------------
Observations                           681                681               681       
R2                                    0.260              0.120             0.230      
Adjusted R2                           0.250              0.100             0.220      
Residual Std. Error (df = 668)        1.500              0.950             1.200      
F Statistic (df = 12; 668)          20.000***          7.500***          17.000***    
======================================================================================
Note:                                        . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

7.3 Correctness


=======================================================================================
                                                 Dependent variable:                   
                               --------------------------------------------------------
                               correct_missed_num  want_frequency   dont_want_frequency
                                      (1)                (2)                (3)        
---------------------------------------------------------------------------------------
conditionwhat                    0.410* (0.200)    -3.600* (1.800)     3.300 (2.300)   
conditionhow                     0.160 (0.200)     -3.200• (1.800)     0.330 (2.300)   
conditionwhy                     0.270 (0.200)     -2.700 (1.800)      0.830 (2.300)   
conditionobjective               0.240 (0.200)     -2.600 (1.800)      1.100 (2.300)   
evpst_before.centered           -0.100* (0.040)   1.300*** (0.360)    -0.420 (0.460)   
age.centered                    -0.013** (0.004)   -0.036 (0.036)      0.036 (0.046)   
genderWoman                      0.069 (0.130)      0.590 (1.100)     -1.900 (1.500)   
internet_literacy.centered      0.270*** (0.079)    0.011 (0.710)     -0.280 (0.910)   
trust_propensity.centered        0.190* (0.079)     0.330 (0.700)     -1.200 (0.910)   
fb_satisfaction.centered         0.006 (0.058)    1.800*** (0.520)   -2.700*** (0.670) 
fb_routine.centered             0.260*** (0.059)   1.400** (0.530)    -1.200• (0.680)  
stories_postedYes                0.260• (0.130)     1.200 (1.200)     -0.630 (1.500)   
Constant                        4.000*** (0.170)  57.000*** (1.500)  55.000*** (2.000) 
---------------------------------------------------------------------------------------
Observations                          681                681                681        
R2                                   0.130              0.120              0.089       
Adjusted R2                          0.120              0.100              0.072       
Residual Std. Error (df = 668)       1.600             14.000             18.000       
F Statistic (df = 12; 668)          8.500***          7.300***           5.400***      
=======================================================================================
Note:                                         . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

7.4 Interpretability


=====================================================================================
                                                Dependent variable:                  
                               ------------------------------------------------------
                               interpret_rsns_num entertained_goals  informed_goals  
                                      (1)                (2)               (3)       
-------------------------------------------------------------------------------------
conditionwhat                   0.620*** (0.150)   -2.000 (1.800)    -2.000 (1.800)  
conditionhow                    0.830*** (0.160)   -3.800* (1.800)  -5.400** (1.900) 
conditionwhy                    0.600*** (0.160)   -1.400 (1.800)    -2.200 (1.900)  
conditionobjective              0.540*** (0.160)   -2.600 (1.800)    -3.600• (1.900) 
evpst_before.centered            0.051 (0.032)    1.800*** (0.370)  1.900*** (0.380) 
age.centered                   -0.015*** (0.003)    0.033 (0.037)    -0.025 (0.038)  
genderWoman                      0.058 (0.100)      1.700 (1.200)    -0.870 (1.200)  
internet_literacy.centered       0.140* (0.062)     0.320 (0.720)    -0.740 (0.740)  
trust_propensity.centered        0.069 (0.062)    3.100*** (0.710)  4.000*** (0.740) 
fb_satisfaction.centered        0.170*** (0.046)  2.600*** (0.530)  2.000*** (0.550) 
fb_routine.centered              0.092* (0.046)    1.600** (0.540)   1.300* (0.550)  
stories_postedYes                -0.066 (0.110)     1.900 (1.200)    2.900* (1.300)  
Constant                        4.500*** (0.140)  67.000*** (1.600) 57.000*** (1.600)
-------------------------------------------------------------------------------------
Observations                          681                681               681       
R2                                   0.160              0.250             0.250      
Adjusted R2                          0.150              0.240             0.240      
Residual Std. Error (df = 668)       1.300             15.000            15.000      
F Statistic (df = 12; 668)         11.000***          19.000***         19.000***    
=====================================================================================
Note:                                       . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

7.5 Accountability


======================================================================================
                                                 Dependent variable:                  
                               -------------------------------------------------------
                               acct_fairness_num  content_actions  ui_controls_actions
                                      (1)               (2)                (3)        
--------------------------------------------------------------------------------------
conditionwhat                  -0.500*** (0.140)  -0.700 (2.000)      3.200 (2.100)   
conditionhow                    -0.180 (0.140)    -0.280 (2.000)     -5.300* (2.100)  
conditionwhy                    -0.140 (0.140)    -4.100* (2.100)    -3.000 (2.200)   
conditionobjective              -0.240• (0.140)   -1.600 (2.000)     -2.000 (2.100)   
evpst_before.centered          0.130*** (0.029)    0.480 (0.420)     -0.710 (0.430)   
age.centered                   -0.00000 (0.003)   -0.007 (0.042)    -0.140*** (0.043) 
genderWoman                     -0.079 (0.091)     1.900 (1.300)     2.500• (1.400)   
internet_literacy.centered     -0.240*** (0.056) 4.000*** (0.820)   5.800*** (0.850)  
trust_propensity.centered       0.170** (0.056)   1.500• (0.810)     1.600• (0.850)   
fb_satisfaction.centered       0.210*** (0.041)    0.280 (0.600)      0.260 (0.630)   
fb_routine.centered             -0.035 (0.042)     0.680 (0.610)     1.300* (0.630)   
stories_postedYes                0.120 (0.095)    2.800* (1.400)     2.500• (1.400)   
Constant                       4.000*** (0.120)  71.000*** (1.800)  66.000*** (1.900) 
--------------------------------------------------------------------------------------
Observations                          681               681                681        
R2                                   0.200             0.080              0.170       
Adjusted R2                          0.180             0.063              0.150       
Residual Std. Error (df = 668)       1.100            17.000             17.000       
F Statistic (df = 12; 668)         14.000***         4.800***           11.000***     
======================================================================================
Note:                                        . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

7.6 Heatmap of Regression Coefficients

The figure below is a heatmap showing all coefficients, including experimental conditions and controls, for the predictors in each model having p-values less than 0.05. Outcome variables were standardized so that they are directly comparable. Awareness variables = Knowledge After, System Agency, User Agency. Correctness variables = Missed Stories, Wanted Stories, Unwanted Stories. Interpretability variables = Understand Why, Interpersonal and Informational Goals. Accountability variables = Fairness, Content and User Actions.

8 Variable Names, and How the Paper Refers to Them

8.1 Control Variables

Demographics

  • age: Age
  • gender: Gender
  • internet_literacy: Internet Literacy
  • trust_propensity: Trust Propensity [towards social media]

Facebook Use

  • fb_satisfaction: FB Satisfaction
  • fb_routine: Routine FB Behavior
  • stories_posted: Posted Last Week

8.2 Outcome Variables

Prior Knowledge

  • evpst_before: Knowledge Before [about the News Feed]
  • aware_info_new: New Info [in the explanations]
  • aware_info_surprise: Surprising Info [in the explanations]

Awareness

  • aware_evpst_aft: Knowledge After [about the News Feed]
  • system_reasons: System Agency [controlling what users see]
  • user_reasons: User Agency [controlling what users see]

Correctness

  • correct_missed: Missed Stories [in the News Feed]
  • want_frequency: Wanted Stories [in the News Feed]
  • dont_want_frequency: Unwanted Stories [in the News Feed]

Interpretability

  • interpret_rsns: Understand Why [stories appear in the News Feed]
  • entertained_goals: Interpersonal Goals [that the News Feed meets]
  • informed_goals: Informational Goals [that the News Feed meets]

Accountability

  • acct_fairness: Fairness [of the News Feed]
  • content_actions: Content Actions [affect which stories appear]
  • ui_controls_actions: UI Controls [affect which stories appear]
LS0tCnRpdGxlOiBTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIGZvciBFeHBsYW5hdGlvbnMgYXMgTWVjaGFuaXNtcyBmb3IgU3VwcG9ydGluZyBBbGdvcml0aG1pYwogIFRyYW5zcGFyZW5jeQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIGh0bWxfbm90ZWJvb2s6CiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpKWAnCi0tLQoKPCEtLSAodGhpcyBpcyBhbiBodG1sIGNvbW1lbnQpIHRoZSBzdHlsZSBjb2RlIGJlbG93IGNoYW5nZXMgdGhlIGRlZmF1bHQgd2lkdGggb2YgdGhlIHJtYXJrZG93biBvdXRwdXQgLS0+CjxzdHlsZT4KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgICAgICBtYXgtd2lkdGg6IDE1MDBweDsKICAgIH0KPC9zdHlsZT4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGxvYWQgdGhlIGxpYnJhcmllcwpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShzdGFyZ2F6ZXIpCmxpYnJhcnkoc3RyaW5nZGlzdCkKbGlicmFyeShwc3ljaCkKbGlicmFyeShsc2EpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KG1vZGVscikKbGlicmFyeShicm9vbSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkodGlkeXZlcnNlKQoKc291cmNlKCJkYXRhX3NldHVwLlIiKQpvcHRpb25zKGRpZ2l0cz0yKQpgYGAKCkVtaWxlZSBSYWRlciwgS2VsbGV5IENvdHRlciBhbmQgSmFuZ2hlZSBDaG8uICJFeHBsYW5hdGlvbnMgYXMgTWVjaGFuaXNtcyBmb3IgU3VwcG9ydGluZyBBbGdvcml0aG1pYyBUcmFuc3BhcmVuY3kiIENISSAyMDE4LiBNb250cmVhbCwgUXVlYmVjLCBDYW5hZGEuIEFwcmlsIDIwMTguIGRvaTogWzEwLjExNDUvMzE3MzU3NC4zMTczNjc3XShodHRwOi8vZHguZG9pLm9yZy8xMC4xMTQ1LzMxNzM1NzQuMzE3MzY3NykKCiMgRGF0YSBDb2xsZWN0aW9uIE92ZXJ2aWV3CgojIyBXaGVuIGRpZCB0aGUgc3R1ZHkgdGFrZSBwbGFjZT8KCkRhdGEgY29sbGVjdGlvbiB0b29rIHBsYWNlIG9uIGByIG1pbihkYXRlKGQkU3RhcnREYXRlKSlgIHRocm91Z2ggYHIgbWF4KGRhdGUoZCRTdGFydERhdGUpKWAuIFBhcnRpY2lwYW50cyB3ZXJlIHJlY3J1aXRlZCBieSBRdWFsdHJpY3MgdXNpbmcgdGhlaXIgcGFuZWwgc2VydmljZSwgdGFyZ2V0aW5nIFVTIEZhY2Vib29rIHVzZXJzIHdobyBhcmUgMTgrIHllYXJzIG9sZCwgYW5kIGEgc2FtcGxlIHRoYXQgaXMgNTIlIGZlbWFsZSBhbmQgMzUlIG92ZXIgNTUgeWVhcnMgb2xkLiAKCiMjIEhvdyBtYW55IHJlc3BvbnNlcyB3ZXJlIGNvbGxlY3RlZD8KClRoZSBzdXJ2ZXkgd2FzIHN0YXJ0ZWQgYnkgYHIgbGVuZ3RoKGQkUmVzcG9uc2VJRCkgKyBsZW5ndGgoZC5leGNsdWRlZCRSZXNwb25zZUlEKWAgcG90ZW50aWFsIHBhcnRpY2lwYW50cy4gQWZ0ZXIgZGF0YSBjbGVhbmluZywgdGhlcmUgYXJlIGByIGxlbmd0aChkJFJlc3BvbnNlSUQpYCBwYXJ0aWNpcGFudHMgaW4gdGhlIGRhdGFzZXQuIFRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIGluIGVhY2ggY29uZGl0aW9uIGlzIHJlcG9ydGVkIGhlcmU6CmBgYHtyIGNvbmRpdGlvbnMsIGVjaG89RkFMU0V9CiMgcGFydGljaXBhbnRzIHBlciBjb25kaXRpb24KZCAlPiUgY291bnQoY29uZGl0aW9uKQpgYGAKCiMjIEhvdyBsb25nIGRpZCBpdCB0YWtlIHRvIGNvbXBsZXRlIHRoZSBzdHVkeT8KClRoZSBzdHVkeSB0b29rIGFuIGF2ZXJhZ2Ugb2YgYHIgbWVhbihkJGNvbXBsZXRpb25fdGltZS82MClgIG1pbnV0ZXMgZm9yIHBhcnRpY2lwYW50cyB0byBjb21wbGV0ZSwgYWZ0ZXIgdGhleSBoYWQgZmluaXNoZWQgdGhlIGNvbnNlbnQgYW5kIHNjcmVlbmluZyBxdWVzdGlvbnMuIFRoZSBtYXhpbXVtIGNvbXBsZXRpb24gdGltZSAoY2FwcGVkIGF0IDYwIG1pbnV0ZXMgYnkgYSBsaW1pdCBwbGFjZWQgaW4gdGhlIHN1cnZleSB3aGljaCBwYXJ0aWNpcGFudHMgd2VyZSBpbmZvcm1lZCBhYm91dCBpbiB0aGUgY29uc2VudCBmb3JtIGFuZCBpbnN0cnVjdGlvbnMpIHdhcyBgciBtYXgoZCRjb21wbGV0aW9uX3RpbWUvNjApYCBtaW51dGVzLCBhbmQgdGhlIG1pbmltdW0gd2FzIGByIG1pbihkJGNvbXBsZXRpb25fdGltZS82MClgIG1pbnV0ZXMuIApgYGB7ciBkdXJhdGlvbiBkZXNjcmlwdGl2ZXMsIGVjaG89RkFMU0V9CiMgaG93IGxvbmcgZGlkIHRoZSBzdXJ2ZXkgdGFrZSB0byBjb21wbGV0ZT8gRHVyYXRpb24KZCAlPiUgc3VtbWFyaXplKE1lYW49bWVhbihEdXJhdGlvbi82MCwgbmEucm09VCksIE1heD1tYXgoRHVyYXRpb24vNjAsIG5hLnJtPVQpLCBNaW49bWluKER1cmF0aW9uLzYwLCBuYS5ybT1UKSwgTWVkaWFuPW1lZGlhbihEdXJhdGlvbi82MCwgbmEucm09VCksIFNEPXNkKER1cmF0aW9uLzYwLCBuYS5ybT1UKSkKYGBgCgoKI1N1cnZleSBRdWVzdGlvbnMgYW5kIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKCiMjU2NyZWVuaW5nIFF1ZXN0aW9ucyAKCi0gKipEbyB5b3UgdXNlIEZhY2Vib29rPyoqIFtZZXMvTm9dCgotICoqV2hhdCBpcyB5b3VyIGFnZSBpbiB5ZWFycz8qKiAqKHZhcmlhYmxlIG5hbWU6IGFnZSkqCgotICoqSG93IG1hbnkgRmFjZWJvb2sgZnJpZW5kcyBkbyB5b3UgaGF2ZT8qKiAqKHZhcmlhYmxlIG5hbWU6IGZiX2ZyaWVuZHMpKgoKLSAqKkhvdyBsb25nIGhhdmUgeW91IGJlZW4gYSB1c2VyIG9mIEZhY2Vib29rPyoqICoodmFyaWFibGUgbmFtZTogZmJfaG93X2xvbmcpKiBbTGVzcyB0aGFuIG9uZSBtb250aCAvIEEgY291cGxlIG9mIG1vbnRocyAvIDYgbW9udGhzIG9yIHNvIC8gQWJvdXQgYSB5ZWFyIC8gMS0yIHllYXJzIC8gMy01IHllYXJzIC8gTW9yZSB0aGFuIDUgeWVhcnNdCgotICoqSG93IG9mdGVuIGRvIHlvdSB1c3VhbGx5IHZpc2l0IEZhY2Vib29rPyoqICoodmFyaWFibGUgbmFtZTogZmJfdmlzaXQpKiBbU2V2ZXJhbCB0aW1lcyBwZXIgZGF5IC8gQWJvdXQgb25jZSBwZXIgZGF5IC8gQSBmZXcgdGltZXMgcGVyIHdlZWsgLyBBYm91dCBvbmNlIHBlciB3ZWVrIC8gQSBmZXcgdGltZXMgcGVyIG1vbnRoIC8gQWJvdXQgb25jZSBwZXIgbW9udGggLyBMZXNzIHRoYW4gb25jZSBwZXIgbW9udGggLyBOZXZlcl0KCi0gKipEbyB5b3Ugbm93LCBvciBoYXZlIHlvdSBldmVyIG1hbmFnZWQgYSBQYWdlIG9uIEZhY2Vib29rPyoqIFtZZXMvTm9dCgotICoqRG8geW91IG5vdywgb3IgaGF2ZSB5b3UgZXZlciB3b3JrZWQgaW4gYSBqb2Igd2hlcmUgeW91ciByZXNwb25zaWJpbGl0aWVzIGluY2x1ZGVkOiAncG9zdGluZyBjb250ZW50IG9uIHNvY2lhbCBtZWRpYScsICdjb21tdW5pY2F0aW5nIHdpdGggY2xpZW50cywgY3VzdG9tZXJzLCBldGMuIHZpYSBzb2NpYWwgbWVkaWEnLCBvciAnd29ya2luZyBvbiB0aGUgc29jaWFsIG1lZGlhIHN0cmF0ZWd5IGZvciB5b3VyIG9yZ2FuaXphdGlvbic/KiogW1llcy9Ob10KCi0gKipEbyB5b3Ugbm93LCBvciBoYXZlIHlvdSBldmVyIHdvcmtlZCBpbiBhIGpvYiB3aGVyZSB5b3VyIHJlc3BvbnNpYmlsaXRpZXMgaW5jbHVkZWQgY29tcHV0ZXIgcHJvZ3JhbW1pbmcsIHF1YWxpdHkgYXNzdXJhbmNlIGFuZCB0ZXN0aW5nLCBJVCBzZWN1cml0eSwgb3IgbmV0d29yayBhZG1pbmlzdHJhdGlvbj8qKiBbWWVzL05vXQoKLSAqKldoYXQgaXMgeW91ciBnZW5kZXI/KiogKih2YXJpYWJsZSBuYW1lOiBnZW5kZXIpKiBbV29tYW4gLyBNYW4gLyBGaWxsIGluIHRoZSBibGFuayAvIFByZWZlciBub3QgdG8gYW5zd2VyXQoKIyMgQ29udHJvbCBWYXJpYWJsZSBRdWVzdGlvbnMgCgojIyMgVHJ1c3QgUHJvcGVuc2l0eSAKQSBzZXJpZXMgb2YgNiBxdWVzdGlvbnMgd2FzIGRlc2lnbmVkIHRvIG1lYXN1cmUgdGhlIHRlbmRlbmN5IG9yIHByb3BlbnNpdHkgb2YgZWFjaCBwYXJ0aWNpcGFudCB0byB0cnVzdCBpbiAic29jaWFsIG1lZGlhIHdlYnNpdGVzIi4gVGhlIHF1ZXN0aW9ucyB3ZXJlOgoKKipQbGVhc2UgcmVzcG9uZCB0byB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgYnkgYW5zd2VyaW5nIGhvdyBtdWNoIHlvdSBhZ3JlZSBvciBkaXNhZ3JlZSB3aXRoIGVhY2ggb25lOioqCgotIEkgZmVlbCB0aGF0IG1vc3Qgc29jaWFsIG1lZGlhIHdlYnNpdGVzIGFjdCBpbiBwZW9wbGUncyBiZXN0IGludGVyZXN0cy4gCi0gTW9zdCBzb2NpYWwgbWVkaWEgd2Vic2l0ZXMgYXJlIGhlbHBmdWwuIAotIEluIGdlbmVyYWwsIHNvY2lhbCBtZWRpYSB3ZWJzaXRlcyBhcmUgd2VsbC1tYW5hZ2VkLiAKLSBNb3N0IHNvY2lhbCBtZWRpYSB3ZWJzaXRlcyBhcmUgYWJsZSB0byBtZWV0IHVzZXJzJyBuZWVkcy4gCi0gSSBmZWVsIGZpbmUgdXNpbmcgc29jaWFsIG1lZGlhIHdlYnNpdGVzIHNpbmNlIHRoZXkgYXJlIGdlbmVyYWxseSByZWxpYWJsZS4gCi0gSSBhbHdheXMgZmVlbCBjb25maWRlbnQgdGhhdCBzb2NpYWwgbWVkaWEgd2Vic2l0ZXMgd2lsbCBkbyB3aGF0IEkgd2FudCB0aGVtIHRvIGRvLiAKClRoZSBtZWFuIG9mIHRoaXMgY29tcG9zaXRlIHZhcmlhYmxlIHdhcyAqKmByIG1lYW4oZCR0cnVzdF9wcm9wZW5zaXR5LCBuYS5ybT1UKWAqKiAoU0QgPSBgciBzZChkJHRydXN0X3Byb3BlbnNpdHksIG5hLnJtPVQpYCwgbWVkaWFuID0gYHIgbWVkaWFuKGQkdHJ1c3RfcHJvcGVuc2l0eSwgbmEucm09VClgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QodHAxX2Jlc3RfaW50ZXJlc3RzLCB0cDJfaGVscGZ1bCwgdHAzX3dlbGxfbWFuYWdlZCwgdHA0X21lZXRfbmVlZHMsIHRwNV9yZWxpYWJsZSwgdHA2X3dhbnQpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYCkuICoodmFyaWFibGUgbmFtZTogdHJ1c3RfcHJvcGVuc2l0eSkqCgpIZXJlIGFyZSB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgZWFjaCBvZiB0aG9zZSB0cnVzdCBwcm9wZW5zaXR5IHF1ZXN0aW9uczogICAKYGBge3IgdHJ1c3RfcHJvcGVuc2l0eV9lYWNoLCBlY2hvPUZBTFNFfQp0cCA8LSBkICU+JSBzZWxlY3QodHAxX2Jlc3RfaW50ZXJlc3RzLHRwMl9oZWxwZnVsLHRwM193ZWxsX21hbmFnZWQsdHA0X21lZXRfbmVlZHMsIHRwNV9yZWxpYWJsZSwgdHA2X3dhbnQpCgp0cDEgPC0gdHAgJT4lICBjb3VudCh0cDFfYmVzdF9pbnRlcmVzdHMpCmNvbG5hbWVzKHRwMSkgPC0gIGMoJ0kgZmVlbCB0aGF0IG1vc3Qgc29jaWFsIG1lZGlhIHdlYnNpdGVzIGFjdCBpbiBwZW9wbGVcJ3MgYmVzdCBpbnRlcmVzdHMuJywnbicpCnRwMiA8LSB0cCAlPiUgY291bnQodHAyX2hlbHBmdWwpCmNvbG5hbWVzKHRwMikgPC0gIGMoJ01vc3Qgc29jaWFsIG1lZGlhIHdlYnNpdGVzIGFyZSBoZWxwZnVsLicsICduJykKdHAzIDwtIHRwICU+JSBjb3VudCh0cDNfd2VsbF9tYW5hZ2VkKQpjb2xuYW1lcyh0cDMpIDwtIGMoJ0luIGdlbmVyYWwsIHNvY2lhbCBtZWRpYSB3ZWJzaXRlcyBhcmUgd2VsbC1tYW5hZ2VkLicsICduJykKdHA0IDwtIHRwICU+JSBjb3VudCh0cDRfbWVldF9uZWVkcykKY29sbmFtZXModHA0KSA8LSBjKCdNb3N0IHNvY2lhbCBtZWRpYSB3ZWJzaXRlcyBhcmUgYWJsZSB0byBtZWV0IHVzZXJzXCcgbmVlZHMuJywgJ24nKQp0cDUgPC0gdHAgJT4lIGNvdW50KHRwNV9yZWxpYWJsZSkKY29sbmFtZXModHA1KSA8LSBjKCdJIGZlZWwgZmluZSB1c2luZyBzb2NpYWwgbWVkaWEgd2Vic2l0ZXMgc2luY2UgdGhleSBhcmUgZ2VuZXJhbGx5IHJlbGlhYmxlLicsICduJykKdHA2IDwtIHRwICU+JSBjb3VudCh0cDZfd2FudCkKY29sbmFtZXModHA2KSA8LSBjKCdJIGFsd2F5cyBmZWVsIGNvbmZpZGVudCB0aGF0IHNvY2lhbCBtZWRpYSB3ZWJzaXRlcyB3aWxsIGRvIHdoYXQgSSB3YW50IHRoZW0gdG8gZG8uJywgJ24nKQoKdHAxCnRwMgp0cDMKdHA0CnRwNQp0cDYKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KI3RwMTwtIGQgJT4lICBjb3VudCh0cDFfYmVzdF9pbnRlcmVzdHMpCiN0cDI8LSBkICU+JSAgY291bnQodHAyX2hlbHBmdWwpCiNzdGFyZ2F6ZXIodHAxLCB0cDIsIHR5cGUgPSAiaHRtbCIsIG91dC5oZWFkZXI9VFJVRSkKYGBgCgoKIyMjIEludGVybmV0IExpdGVyYWN5IAoKQSBzZXJpZXMgb2YgOCBxdWVzdGlvbnMgd2FzIGRlc2lnbmVkIHRvIG1lYXN1cmUgdGhlIGludGVybmV0IGxpdGVyYWN5IHRvIGJlIGFza2VkIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb24gYWJvdXQgdGhlIGludGVybmV0LXJlbGF0ZWQgdGVybXMuIFRoZSBxdWVzdGlvbnMgd2VyZTogCgoqKkhvdyBmYW1pbGlhciBhcmUgeW91IHdpdGggdGhlIGZvbGxvd2luZyBJbnRlcm5ldC1yZWxhdGVkIHRlcm1zPyBQbGVhc2UgcmF0ZSB5b3VyIHVuZGVyc3RhbmRpbmcgb2YgZWFjaCB0ZXJtIGJlbG93IGZyb20gTm9uZSAobm8gdW5kZXJzdGFuZGluZykgdG8gRnVsbCAoZnVsbCB1bmRlcnN0YW5kaW5nKSoqCgotIFdpa2kuIAotIE1lbWUuIAotIFBoaXNoaW5nLiAKLSBCb29rbWFyay4gIAotIENhY2hlLiAKLSBTU0wuCi0gQUpBWC4gCi0gUlNTLiAKICAgIApBIGNvbXBvc2l0ZSB2YXJpYWJsZSB3YXMgY3JlYXRlZCBmb3IgZWFjaCBwYXJ0aWNpcGFudCBieSBhdmVyYWdpbmcgdGhlIHJlc3BvbnNlcyBmb3IgZWFjaCBwYXJ0aWNpcGFudCBhY3Jvc3MgdGhlIGVpZ2h0IGludGVybmV0IGxpdGVyYWN5IGl0ZW1zLiBUaGUgbWVhbiBvZiB0aGlzIGNvbXBvc2l0ZSB2YXJpYWJsZSB3YXMgKioyLjY5KiogKFNEID0gMC44MiwgbWVkaWFuID0gMi43NSwgQ3JvbmJhY2gncyBhbHBoYTogYHIgc3VtbWFyeShwc3ljaDo6YWxwaGEoZCAlPiUgc2VsZWN0KHdpa2ksIG1lbWUsIHBoaXNoaW5nLCBib29rbWFyaywgY2FjaGUsIHNzbCwgYWpheCwgcnNzKSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKSkpJHJhd19hbHBoYWApLiAqKHZhcmlhYmxlIG5hbWU6IGludGVybmV0X2xpdGVyYWN5KSoKCkhlcmUgYXJlIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBlYWNoIG9mIHRob3NlIHF1ZXN0aW9uczogIApgYGB7ciBpbnRlcm5ldF9saXRlcmFjeSwgZWNobz1GQUxTRX0KaWwgPC0gZCAlPiUgc2VsZWN0KHdpa2ksIG1lbWUsIHBoaXNoaW5nLCBib29rbWFyaywgY2FjaGUsIHNzbCwgYWpheCwgcnNzICkKd2lraSA8LSBpbCAlPiUgY291bnQod2lraSkKY29sbmFtZXMod2lraSkgPC0gYygnV2lraScsICduJykKbWVtZSA8LSBpbCAlPiUgY291bnQobWVtZSkKY29sbmFtZXMobWVtZSkgPC0gYygnTWVtZScsICduJykKUGhpc2hpbmcgPC0gaWwgJT4lIGNvdW50KHBoaXNoaW5nKQpjb2xuYW1lcyhQaGlzaGluZykgPC0gYygnUGhpc2hpbmcnLCAnbicpCkJvb2ttYXJrIDwtIGlsICU+JSBjb3VudChib29rbWFyaykKY29sbmFtZXMoQm9va21hcmspIDwtICBjKCdCb29rbWFyaycsICduJykKQ2FjaGUgPC0gaWwgJT4lIGNvdW50KGNhY2hlKQpjb2xuYW1lcyhDYWNoZSkgPC0gYygnQ2FjaGUnLCAnbicpClNTTCA8LSBpbCAlPiUgY291bnQoc3NsKQpjb2xuYW1lcyhTU0wpIDwtIGMoJ1NTTCcsICduJykKYWpheCA8LSBpbCAlPiUgY291bnQoYWpheCkKY29sbmFtZXMoYWpheCkgPC0gYygnQUpBWCcsICduJykKcnNzIDwtIGlsICU+JSBjb3VudChyc3MpCmNvbG5hbWVzKHJzcykgPC0gYygnUlNTJywgJ24nKQoKd2lraQptZW1lClBoaXNoaW5nCkJvb2ttYXJrCkNhY2hlClNTTAphamF4CnJzcwpgYGAKCiMjIFF1ZXN0aW9ucyBhYm91dCBGYWNlYm9vayBVc2FnZSBhbmQgQmVoYXZpb3JzIAoKIyMjIFllYXJzIG9uIEZhY2Vib29rIAoKKipXaGF0IHdhcyB0aGUgZGF0ZSBvZiB5b3VyIHZlcnkgZmlyc3QgYWN0aXZpdHkgb24gRmFjZWJvb2s/ICoqICoodmFyaWFibGUgbmFtZTogeWVhcl9kaWZmKSoKYGBge3IgeWVhcl9kaWZmLCBlY2hvPUZBTFNFfQojbGVuZ3RoIDwtIGQgJT4lIHN1bW1hcml6ZShNZWFuPW1lYW4oeWVhcl9kaWZmKSwgTWVkaWFuPW1lZGlhbih5ZWFyX2RpZmYpLCBTRD1zZCh5ZWFyX2RpZmYpLCBNaW49bWluKHllYXJfZGlmZiksIE1heD1tYXgoeWVhcl9kaWZmKSkKI2NvbG5hbWVzKGxlbmd0aCkgPC0gYygnTWVhbihZZWFyKScsICdNZWRpYW4oWWVhciknLCAnU0QoWWVhciknLCAnTWluKFllYXIpJywgJ01heChZZWFyKScpCiNyb3VuZChsZW5ndGgsIGRpZ2l0cyA9IDEpCmBgYAoqTm90ZTogSW4gdGhpcyBxdWVzdGlvbiwgd2UgYXNrZWQgcGFydGljaXBhbnRzIHRvIGxvb2sgdXAgdGhlIGRhdGUgb2YgdGhlaXIgZmlyc3QgYWN0aXZpdHkgb24gRmFjZWJvb2ssIG9uIHRoZWlyIEFjdGl2aXR5IExvZyBwYWdlLiBUaGVuIHdlIGNhbGN1bGF0ZWQgdGhlIG51bWJlciBvZiB5ZWFycyB0aGV5J3ZlIGJlZW4gdXNpbmcgRmFjZWJvb2sgYnkgc3VidHJhY3RpbmcgdGhhdCBkYXRlIGZyb20gdGhlIGRhdGUgdGhleSBwYXJ0aWNpcGF0ZWQgaW4gdGhlIGV4cGVyaW1lbnQuKiAKCiMjIyBQb3N0ZWQgU3RvcnkgaW4gUGFzdCBXZWVrCgoqKkhvdyBtYW55IHN0b3JpZXMgZGlkIHlvdSBwb3N0IG9uIEZhY2Vib29rIGluIHRoZSBwYXN0IHdlZWs/ICAqKiAqKHZhcmlhYmxlIG5hbWU6IHN0b3JpZXNfcG9zdGVkWWVzKSogCgoqTm90ZTogU2luY2UgdGhpcyB2YXJpYWJsZSBhbHNvIGhhcyBhIGxvbmctdGFpbCBkaXN0cmlidXRpb24sIHdlIGNvbnZlcnQgaXQgaW50byBhIGJpbmFyeSB2YXJpYWJsZTogIk5vIiBtZWFucyAwLCAiWWVzIiBtZWFucyAxIG9yIG1vcmUuKiAKCiMjIyBSb3V0aW5lIEZhY2Vib29rIEJlaGF2aW9yCkEgc2VyaWVzIG9mIDQgcXVlc3Rpb25zIHdhcyBkZXNpZ25lZCB0byBtZWFzdXJlIHRoZSBoYWJpdHVhbC9yb3V0aW5lIG5hdHVyZSBvZiBwYXJ0aWNpcGFudHMnIEZhY2Vib29rIHVzZS4gVGhlIHF1ZXN0aW9ucyB3ZXJlOiAKCi0gRmFjZWJvb2sgaGFzIGJlY29tZSBwYXJ0IG9mIG15IGRhaWx5IHJvdXRpbmUuIAotIEkgZmVlbCBvdXQgb2YgdG91Y2ggd2hlbiBJIGhhdmVu4oCZdCBsb2dnZWQgb250byBGYWNlYm9vayBmb3IgYSB3aGlsZS4gCi0gSSBoYXZlIGRpZmZpY3VsdHkgY29udHJvbGxpbmcgdGhlIGFtb3VudCBvZiB0aW1lIEkgc3BlbmQgb24gRmFjZWJvb2suIAotIEkgdGhpbmsgYWJvdXQgZGVsZXRpbmcgbXkgRmFjZWJvb2sgcHJvZmlsZS4gW3JldmVyc2UtY29kZWRdCgpUaGUgbWVhbiBvZiB0aGUgY29tcG9zaXRlIHZhcmlhYmxlIGNyZWF0ZWQgZnJvbSB0aGVzZSBmb3VyIHF1ZXN0aW9ucyBpcyAgKipgciBtZWFuKGFzLm51bWVyaWMoZCRmYl9yb3V0aW5lKSlgKiogKFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGZiX3JvdXRpbmUpLCBuYS5ybT1UKWAsIG1lZGlhbiA9IGByIG1lZGlhbihhcy5udW1lcmljKGQkZmJfcm91dGluZSksIG5hLnJtPVQpYCwgQ3JvbmJhY2gncyBhbHBoYTogYHIgc3VtbWFyeShwc3ljaDo6YWxwaGEoZCAlPiUgc2VsZWN0KGZiX3JvdXRpbmVfZGFpbHksIGZiX3JvdXRpbmVfb3V0X29mX3RvdWNoLCBmYl9yb3V0aW5lX2RpZmZpY3VsdHksIGZiX3JvdXRpbmVfZGVsZXRpbmcpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYCkuICoodmFyaWFibGUgbmFtZTogZmJfcm91dGluZSkqCgpIZXJlIGFyZSB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgZWFjaCBvZiB0aG9zZSBxdWVzdGlvbnM6ICAKYGBge3Igcm91dGluZSwgZWNobz1GQUxTRX0Kcm91dGluZTEgPC0gZCAlPiUgY291bnQoZmJfcm91dGluZV9kYWlseSkKY29sbmFtZXMocm91dGluZTEpIDwtICBjKCdGYWNlYm9vayBoYXMgYmVjb21lIHBhcnQgb2YgbXkgZGFpbHkgcm91dGluZS4nLCduJykKcm91dGluZTIgPC0gZCAlPiUgY291bnQoZmJfcm91dGluZV9vdXRfb2ZfdG91Y2gpCmNvbG5hbWVzKHJvdXRpbmUyKSA8LSAgYygnSSBmZWVsIG91dCBvZiB0b3VjaCB3aGVuIEkgaGF2ZW5cJ3QgbG9nZ2VkIG9udG8gRmFjZWJvb2sgZm9yIGEgd2hpbGUuJywgJ24nKQpyb3V0aW5lMyA8LSAgZCAlPiUgY291bnQoZmJfcm91dGluZV9kaWZmaWN1bHR5KQpjb2xuYW1lcyhyb3V0aW5lMykgPC0gYygnSSBoYXZlIGRpZmZpY3VsdHkgY29udHJvbGxpbmcgdGhlIGFtb3VudCBvZiB0aW1lIEkgc3BlbmQgb24gRmFjZWJvb2suJywgJ24nKQpyb3V0aW5lNCA8LSAgZCAlPiUgY291bnQoZmJfcm91dGluZV9kZWxldGluZykKY29sbmFtZXMocm91dGluZTQpIDwtIGMoJ0kgdGhpbmsgYWJvdXQgZGVsZXRpbmcgbXkgRmFjZWJvb2sgcHJvZmlsZS4nLCAnbicpCgpyb3V0aW5lMQpyb3V0aW5lMgpyb3V0aW5lMwpyb3V0aW5lNApgYGAKCiMjIyBGYWNlYm9vayBTYXRpc2ZhY3Rpb24gCgpBIHNlcmllcyBvZiA0IHF1ZXN0aW9ucyB3YXMgZGVzaWduZWQgdG8gbWVhc3VyZSB1c2Vyc+KAmSBvdmVyYWxsIEZhY2Vib29rIHNhdGlzZmFjdGlvbi4gVGhlIHF1ZXN0aW9ucyB3ZXJlOiAKCi0gSG93IGRvIHlvdSBmZWVsIGFib3V0IHlvdXIgb3ZlcmFsbCBleHBlcmllbmNlIHdpdGggdGhlIEZhY2Vib29rIE5ld3MgRmVlZD8gVmVyeSBEaXNzYXRpc2ZpZWQg4oCUIFZlcnkgU2F0aXNmaWVkICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGZiX3NhdGlzZmFjdGlvbl9zYXRpc2ZpZWQpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGZiX3NhdGlzZmFjdGlvbl9zYXRpc2ZpZWQpKWAgKQotIEhvdyBkbyB5b3UgZmVlbCBhYm91dCB5b3VyIG92ZXJhbGwgZXhwZXJpZW5jZSB3aXRoIHRoZSBGYWNlYm9vayBOZXdzIEZlZWQ/IFZlcnkgRGlzcGxlYXNlZCDigJQgVmVyeSBQbGVhc2VkICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGZiX3NhdGlzZmFjdGlvbl9wbGVhc2VkKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRmYl9zYXRpc2ZhY3Rpb25fcGxlYXNlZCkpYCApCi0gSG93IGRvIHlvdSBmZWVsIGFib3V0IHlvdXIgb3ZlcmFsbCBleHBlcmllbmNlIHdpdGggdGhlIEZhY2Vib29rIE5ld3MgRmVlZD8gVmVyeSBGcnVzdHJhdGVkIOKAlCBWZXJ5IENvbnRlbnRlZCAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRmYl9zYXRpc2ZhY3Rpb25fY29udGVudGVkKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRmYl9zYXRpc2ZhY3Rpb25fY29udGVudGVkKSlgICkKLSBIb3cgZG8geW91IGZlZWwgYWJvdXQgeW91ciBvdmVyYWxsIGV4cGVyaWVuY2Ugd2l0aCB0aGUgRmFjZWJvb2sgTmV3cyBGZWVkPyBBYnNvbHV0ZWx5IFRlcnJpYmxlIOKAlCBBYnNvbHV0ZWx5IERlbGlnaHRlZCAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRmYl9zYXRpc2ZhY3Rpb25fZGVsaWdodGVkKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRmYl9zYXRpc2ZhY3Rpb25fZGVsaWdodGVkKSlgICkKClRoZSBtZWFuIG9mIHRoZSBjb21wb3NpdGUgdmFyaWFibGUgY3JlYXRlZCBmcm9tIHRoZXNlIGZvdXIgcXVlc3Rpb25zIHdhcyAqKmByIG1lYW4oZCRmYl9zYXRpc2ZhY3Rpb24sIG5hLnJtPVQpYCoqIChTRCA9IGByIHNkKGQkZmJfc2F0aXNmYWN0aW9uLCBuYS5ybT1UKWAsIG1lZGlhbiA9IGByIG1lZGlhbihkJGZiX3NhdGlzZmFjdGlvbiwgbmEucm09VClgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoZmJfc2F0aXNmYWN0aW9uX3NhdGlzZmllZCwgZmJfc2F0aXNmYWN0aW9uX3BsZWFzZWQsIGZiX3NhdGlzZmFjdGlvbl9jb250ZW50ZWQsIGZiX3NhdGlzZmFjdGlvbl9kZWxpZ2h0ZWQpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYCkuICoodmFyaWFibGUgbmFtZTogZmJfc2F0aXNmYWN0aW9uKSoKCiMjIyBEaXZlcnNpdHkgb2YgRnJpZW5kIE5ldHdvcmsgCgoqKkJ5IHBsYWNpbmcgeW91ciBGYWNlYm9vayBmcmllbmRzIGludG8gYSBzaW5nbGUgY2F0ZWdvcnksIHdoYXQgcGVyY2VudGFnZSBvZiBhbGwgb2YgeW91ciBGYWNlYm9vayBmcmllbmRzIGJlbG9uZyB0byBlYWNoIGNhdGVnb3J5IGJlbG93PyBUeXBlIGEgbnVtYmVyIGluIHRoZSBibGFuayBiZXR3ZWVuIDAgYW5kIDEwMCBmb3IgZWFjaCBjYXRlZ29yeTsgdGhlIG51bWJlcnMgeW91IGVudGVyIG11c3QgYWRkIHVwIHRvIDEwMC4qKiAqKHZhcmlhYmxlIG5hbWU6IG5ldHdvcmtfZGl2ZXJzaXR5KSoKCi0gRmFtaWx5IG1lbWJlcnMgCi0gRnJpZW5kcyAKLSBDbGFzc21hdGVzIAotIFdvcmsgY29sbGVhZ3VlcyBvciBjby13b3JrZXJzCi0gT3RoZXIKCldlIGNhbGN1bGF0ZWQgU2ltcHNvbidzIEQsIGJhc2VkIG9uIFtCZWFtIGV0IGFsLiAoMjAxNyldKGh0dHA6Ly9qb3VybmFscy5zYWdlcHViLmNvbS9kb2kvYWJzLzEwLjExNzcvMTQ2MTQ0NDgxNzcxNDc5MCkuIFRoaXMgbWVhc3VyZSByYW5nZXMgZnJvbSAwIHRvIDgwLCBhbmQgbG93ZXIgbnVtYmVycyBpbmRpY2F0ZSBncmVhdGVyIHByb3BvcnRpb25zIGluIGp1c3Qgb25lIG9yIHR3byBjYXRlZ29yaWVzOgoKYGBge3IgbmV0d29ya19kaXZlcnNpdHksIGVjaG89RkFMU0V9CiMgbmV0d29ya19kaXZlcnNpdHkKZCAlPiUgc3VtbWFyaXplKE1lYW5fZnJpZW5kX2RpdmVyc2l0eT1tZWFuKG5ldHdvcmtfZGl2ZXJzaXR5KSwgTWVkaWFuX2ZyaWVuZF9kaXZlcnNpdHk9bWVkaWFuKG5ldHdvcmtfZGl2ZXJzaXR5KSwgU0RfZnJpZW5kX2RpdmVyc2l0eT1zZChuZXR3b3JrX2RpdmVyc2l0eSksIE1pbl9mcmllbmRfZGl2ZXJzaXR5PW1pbihuZXR3b3JrX2RpdmVyc2l0eSksIE1heF9mcmllbmRfZGl2ZXJzaXR5PW1heChuZXR3b3JrX2RpdmVyc2l0eSkpCmBgYAoKCiMjIFF1ZXN0aW9ucyBhYm91dCBQcmlvciBLbm93bGVkZ2UgCgojIyMgUHJpb3IgS25vd2xlZGdlIFExIChCZWZvcmUgTWFuaXB1bGF0aW9uKQoKQmVmb3JlIHRoZSBleHBlcmltZW50IG1hbmlwdWxhdGlvbiwgd2UgYXNrZWQgcGFydGljaXBhbnRzIHR3byBxdWVzdGlvbnMgYWJvdXQgdGhlaXIga25vd2xlZGdlIGFib3V0IHRoZSBGYWNlYm9vayBOZXdzIEZlZWQgYWxnb3JpdGhtOgoKLSBGYWNlYm9vayBzaG93cyBtZSBldmVyeSBzdG9yeSBjcmVhdGVkIGJ5IG15IEZhY2Vib29rIGZyaWVuZHMgYW5kIHRoZSBQYWdlcyBJJ3ZlICJsaWtlZCIuIFtTdHJvbmdseSBkaXNhZ3JlZSAtIFN0cm9uZ2x5IGFncmVlXQoKYGBge3Iga25vd2xlZGdlIGJlZm9yZSwgZWNobz1GQUxTRX0KIyBldnBzdF9iZWZvcmUKcHJpb3Jfa25vd2xlZGdlX3ExIDwtIGQgJT4lIGNvdW50KGV2cHN0X2JlZm9yZSkKY29sbmFtZXMocHJpb3Jfa25vd2xlZGdlX3ExKSA8LSAgYygnRmFjZWJvb2sgc2hvd3MgbWUgZXZlcnkgc3RvcnkuLi4gKGJlZm9yZSknLCduJykKcHJpb3Jfa25vd2xlZGdlX3ExCmBgYAoKCiMjIyBQcmlvciBLbm93bGVkZ2UgRm9sbG93LVVwIFF1ZXN0aW9ucwoKRm9sbG93LXVwIHF1ZXN0aW9uIDE6IFlvdSBhbnN3ZXJlZCAqeW91ciBhbnN3ZXIoZS5nLiwgIkFncmVlIikqIHRvIHRoZSBxdWVzdGlvbiAiRmFjZWJvb2sgc2hvd3MgbWUgZXZlcnkgc3RvcnkgY3JlYXRlZCBieSBteSBGYWNlYm9vayBmcmllbmRzIGFuZCB0aGUgUGFnZXMgSSd2ZSAnbGlrZWQnIi4gSG93IHN1cmUgb3IgdW5zdXJlIGFyZSB5b3UgYWJvdXQgeW91ciBhbnN3ZXI/IFBsZWFzZSBpbmRpY2F0ZSB5b3VyIGFuc3dlciBiZWxvdyBvbiBhIHNjYWxlIGZyb20gMC0xMDAsIHdoZXJlIDAgbWVhbnMgQ09NUExFVEVMWSBVTlNVUkUgYW5kIDEwMCBtZWFucyBDT01QTEVURUxZIFNVUkUuICoqTSA9YHIgbWVhbihkJGV2cHN0X2JlZm9yZV9zdXJlKWAsIFNEID0gYHIgc2QoZCRldnBzdF9iZWZvcmVfc3VyZSlgKiouICoodmFyaWFibGUgbmFtZTogZXZwc3RfYmVmb3JlX3N1cmUpKgoKRm9sbG93LXVwIHF1ZXN0aW9uIDIgKihvbmx5IGFza2VkIEJFRk9SRSB0aGUgbWFuaXB1bGF0aW9uKSo6IFBsZWFzZSBleHBsYWluIHdoeSB5b3UgY2hvc2UgKnlvdXIgYW5zd2VyIChlLmcuLCAiQWdyZWUiKSogdG8gdGhlIHF1ZXN0aW9uICJGYWNlYm9vayBzaG93cyBtZSBldmVyeSBzdG9yeSBjcmVhdGVkIGJ5IG15IEZhY2Vib29rIGZyaWVuZHMgYW5kIHRoZSBQYWdlcyBJJ3ZlICdsaWtlZCciLiBZb3VyIGFuc3dlciBtdXN0IGJlIGF0IGxlYXN0IDE1MCBjaGFyYWN0ZXJzIGxvbmcsIHdoaWNoIGlzIGFib3V0IHRocmVlIHNlbnRlbmNlcy4KCgojIyMgUHJpb3IgS25vd2xlZGdlIFEyCioodmFyaWFibGUgbmFtZTogYXdhcmVfaW5mb19uZXcpKgpgYGB7ciBQcmlvciBLbm93bGVkZ2UxLCBlY2hvPUZBTFNFfQpuZXdfaW5mbyA8LSBkICU+JSBjb3VudChhd2FyZV9pbmZvX25ldykKY29sbmFtZXMobmV3X2luZm8pIDwtIGMoJ1RoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGV4dCBJIHJlYWQgd2FzIG5ldyB0byBtZS4nLCAnbicpCm5ld19pbmZvCmBgYAoKIyMjUHJpb3IgS25vd2xlZGdlIFEzCioodmFyaWFibGUgbmFtZTogYXdhcmVfaW5mb19zdXJwcmlzZSkqCmBgYHtyIFByaW9yIEtub3dsZWRnZTIsIGVjaG89RkFMU0V9CnN1cnByaXNlIDwtIGQgJT4lIGNvdW50KGF3YXJlX2luZm9fc3VycHJpc2UpCmNvbG5hbWVzKHN1cnByaXNlKSA8LSAgYygnVGhlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IEkgcmVhZCBzdXJwcmlzZWQgbWUuJywgJ24nKQpzdXJwcmlzZQpgYGAKCiMjUXVlc3Rpb25zIGFib3V0IEF3YXJlbmVzcwoKIyMjQXdhcmVuZXNzIFExCioodmFyaWFibGUgbmFtZTogYXdhcmVfZXZwc3RfYWZ0KSoKCkFmdGVyIHRoZSBleHBlcmltZW50IG1hbmlwdWxhdGlvbiwgd2UgYXNrZWQgcGFydGljaXBhbnRzIHRoZSBzYW1lIHF1ZXN0aW9uIGFib3V0IHRoZWlyIGF3YXJlbmVzcyBvZiB0aGUgYWxnb3JpdGhtIGFzIHdlIGhhZCBhc2tlZCBiZWZvcmUgdGhlIG1hbmlwdWxhdGlvbjoKCi0gRmFjZWJvb2sgc2hvd3MgbWUgZXZlcnkgc3RvcnkgY3JlYXRlZCBieSBteSBGYWNlYm9vayBmcmllbmRzIGFuZCB0aGUgUGFnZXMgSSd2ZSAibGlrZWQiLiBbU3Ryb25nbHkgZGlzYWdyZWUgLSBTdHJvbmdseSBhZ3JlZV0KCmBgYHtyIGtub3dsZWRnZSBhZnRlciwgZWNobz1GQUxTRX0KIyBhd2FyZV9ldnBzdF9hZnQKYXdhcmVuZXNzX3ExIDwtIGQgJT4lIGNvdW50KGV2cHN0X2JlZm9yZSkKY29sbmFtZXMoYXdhcmVuZXNzX3ExKSA8LSAgYygnRmFjZWJvb2sgc2hvd3MgbWUgZXZlcnkgc3RvcnkuLi4gKGFmdGVyKScsJ24nKQphd2FyZW5lc3NfcTEKCmBgYAoKRm9sbG93IHVwIHF1ZXN0aW9uOiBZb3UgYW5zd2VyZWQgKnlvdXIgYW5zd2VyKGUuZy4sICJBZ3JlZSIpKiB0byB0aGUgcXVlc3Rpb24gIkZhY2Vib29rIHNob3dzIG1lIGV2ZXJ5IHN0b3J5IGNyZWF0ZWQgYnkgbXkgRmFjZWJvb2sgZnJpZW5kcyBhbmQgdGhlIFBhZ2VzIEkndmUgJ2xpa2VkJyIuIEhvdyBzdXJlIG9yIHVuc3VyZSBhcmUgeW91IGFib3V0IHlvdXIgYW5zd2VyPyBQbGVhc2UgaW5kaWNhdGUgeW91ciBhbnN3ZXIgYmVsb3cgb24gYSBzY2FsZSBmcm9tIDAtMTAwLCB3aGVyZSAwIG1lYW5zIENPTVBMRVRFTFkgVU5TVVJFIGFuZCAxMDAgbWVhbnMgQ09NUExFVEVMWSBTVVJFIC0gKipNID1gciBtZWFuKGQkYXdhcmVfZXZwc3RfYWZ0X3N1cmUpYCwgU0QgPSBgciBzZChkJGF3YXJlX2V2cHN0X2FmdF9zdXJlKWAqKi4gKih2YXJpYWJsZSBuYW1lOiBhd2FyZV9ldnBzdF9hZnRfc3VyZSkqCgojIyNBd2FyZW5lc3MgUTIgIAoKQSBzZXJpZXMgb2YgMTQgcXVlc3Rpb25zIHdhcyBkZXNpZ25lZCB0byBtZWFzdXJlIGF3YXJlbmVzcyB3aXRoIDUgZGlmZmVyZW50IGZhY3RvciB2YXJpYWJsZXMuIFRoZSBxdWVzdGlvbnMgd2VyZTogCgoqKkJlbG93IGFyZSBwb3NzaWJsZSByZWFzb25zIHdoeSB5b3UgbWlnaHQgbm90IHNlZSBldmVyeSBzdG9yeSBwb3N0ZWQgYnkgeW91ciBGYWNlYm9vayBmcmllbmRzIGFuZCBQYWdlcyB5b3UndmUgImxpa2VkIiBpbiB5b3VyIE5ld3MgRmVlZC4gUGxlYXNlIGNvbnNpZGVyIHRoZSB0ZXh0IHlvdSByZWFkIGFib3V0IEZhY2Vib29rLCBhbmQgaW5kaWNhdGUgaG93IG11Y2ggeW91IGFncmVlIG9yIGRpc2FncmVlIHdpdGggZWFjaCByZWFzb24uKiogCgotIFN5c3RlbSBBZ2VuY3kgKih2YXJpYWJsZSBuYW1lOiBzeXN0ZW1fcmVhc29ucykqICAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJHN5c3RlbV9yZWFzb25zKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRzeXN0ZW1fcmVhc29ucykpYCwgQ3JvbmJhY2gncyBhbHBoYTogYHIgc3VtbWFyeShwc3ljaDo6YWxwaGEoZCAlPiUgc2VsZWN0KGF3YXJlX3JlYXNvbnNfZG9udF93YW50LCBhd2FyZV9yZWFzb25zX25vdF9jbG9zZSwgYXdhcmVfcmVhc29uc19ub3RfcG9wdWxhciwgYXdhcmVfcmVhc29uc19kb2VzbnRfc2hvdywgYXdhcmVfcmVhc29uc19ub3RfdGFnZ2VkKSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKSkpJHJhd19hbHBoYWAuKioKICAgIC0gRmFjZWJvb2sgdGhpbmtzIEkgZG9uJ3Qgd2FudCB0byBzZWUgc3RvcmllcyBmcm9tIHNvbWUgb2YgbXkgZnJpZW5kcy4KICAgIC0gU29tZSBvZiBteSBmcmllbmRzIGFyZSBub3QgcG9wdWxhciBlbm91Z2ggb24gRmFjZWJvb2sgZm9yIG1lIHRvIHNlZSBhbGwgb2Ygc3RvcmllcyB0aGV5IHBvc3QuIAogICAgLSBGYWNlYm9vayBkb2Vzbid0IHNob3cgbWUgY2VydGFpbiB0eXBlcyBvZiBzdG9yaWVzIGluIG15IE5ld3MgRmVlZC4gCiAgICAtIEZhY2Vib29rIHRoaW5rcyB0aGF0IEknbSBub3QgdmVyeSBjbG9zZSB0byBzb21lIG9mIG15IEZhY2Vib29rIGZyaWVuZHMuIAogICAgLSBJZiBJIGFtIG5vdCB0YWdnZWQgaW4gc3RvcmllcyBwb3N0ZWQgYnkgY2VydGFpbiBmcmllbmRzLCBJIHdvbid0IHNlZSB0aG9zZSBzdG9yaWVzLiAKLSBVc2VyIEFnZW5jeSAqKHZhcmlhYmxlIG5hbWU6IHVzZXJfcmVhc29ucykqIC0gKipNID0gYHIgbWVhbihhcy5udW1lcmljKGQkdXNlcl9yZWFzb25zKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCR1c2VyX3JlYXNvbnMpKWAsIENyb25iYWNoJ3MgYWxwaGE6IGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChhd2FyZV9yZWFzb25zX3RpbWUsIGF3YXJlX3JlYXNvbnNfZG9udF9zY3JvbGwsIGF3YXJlX3JlYXNvbnNfZG9udF92aXNpdCwgYXdhcmVfcmVhc29uc19pbnRlcmFjdCkgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykpKSRyYXdfYWxwaGFgLioqCiAgICAtIEkgZG9u4oCZdCBzcGVuZCBhIGxvdCBvZiB0aW1lIGdvaW5nIHRocm91Z2ggbXkgTmV3cyBGZWVkLiAKICAgIC0gSSBkb27igJl0IHNjcm9sbCBkb3duIHRvIHNlZSBvbGRlciBzdG9yaWVzIGluIG15IE5ld3MgRmVlZC4gCiAgICAtIEkgZG9u4oCZdCB2aXNpdCBGYWNlYm9vayBvZnRlbiBlbm91Z2ggdG8gc2VlIGFsbCBvZiB0aGUgc3RvcmllcyBteSBmcmllbmRzIHBvc3QuIAogICAgLSBJIGRvbuKAmXQgaW50ZXJhY3QgKGNvbW1lbnQsIGxpa2UsIHNoYXJlKSB3aXRoIHN0b3JpZXMgZnJvbSBjZXJ0YWluIGZyaWVuZHMgdmVyeSBvZnRlbi4gCi0gSGlkZSBSZWFzb24gKih2YXJpYWJsZSBuYW1lOiBoaWRlX3JlYXNvbnMpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGhpZGVfcmVhc29ucykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkaGlkZV9yZWFzb25zKSlgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoYXdhcmVfcmVhc29uc19oaWRlX21lLCBhd2FyZV9yZWFzb25zX2hpZGRlbl9mcmllbmRzKSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKSkpJHJhd19hbHBoYWAuKioKICAgIC0gSeKAmXZlIHByZXZpb3VzbHkgdXNlZCB0aGUgTmV3cyBGZWVkIHNldHRpbmdzIHRvIGhpZGUgc3RvcmllcyBmcm9tIHNvbWUgb2YgbXkgZnJpZW5kcy4gCiAgICAtIE15IGZyaWVuZHMgbWF5IGhhdmUgaGlkZGVuIHNvbWUgb2YgdGhlaXIgc3RvcmllcyBmcm9tIG1lLiAKLSBUb28gTWFueSBSZWFzb24gKih2YXJpYWJsZSBuYW1lOiB0b29tYW55X3JlYXNvbnMpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJHRvb21hbnlfcmVhc29ucykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkdG9vbWFueV9yZWFzb25zKSlgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoYXdhcmVfcmVhc29uc19kb250X3JlYWQsIGF3YXJlX3JlYXNvbnNfdG9vX21hbnkpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4qKgogICAgLSBJIGRvbuKAmXQgYWx3YXlzIHJlYWQgZXZlcnkgc3Rvcnkgd2hlbiBJIGJyb3dzZSBteSBOZXdzIEZlZWQuIAogICAgLSBUaGVyZSBhcmUgc28gbWFueSBzdG9yaWVzIGluIG15IE5ld3MgRmVlZCB0aGF0IEkgZG9u4oCZdCBhbHdheXMgc2VlIGV2ZXJ5IG9uZS4gCi0gVG9vIE5ldyBSZWFzb24gKih2YXJpYWJsZSBuYW1lOiBhd2FyZV9yZWFzb25zX3Rvb19uZXcpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGF3YXJlX3JlYXNvbnNfdG9vX25ldykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkYXdhcmVfcmVhc29uc190b29fbmV3KSlgKiouIAogICAgLSBTb21lIHBvc3RzIGZyb20gbXkgZnJpZW5kcyBhcmUgdG9vIG5ldyBmb3IgbWUgdG8gaGF2ZSBzZWVuIHRoZW0geWV0LiAKCkhlcmUgYXJlIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBlYWNoIG9mIHRob3NlIHF1ZXN0aW9uczogIApgYGB7ciBzeXN0ZW0gcmVhc29uczEsIGVjaG89RkFMU0V9CnNyMSA8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX2RvbnRfd2FudCkKY29sbmFtZXMoc3IxKSA8LSAgYygnc3lzdGVtIGFnZW5jeSAxLiBGYWNlYm9vayB0aGlua3MgdGhhdCBJXCdtIG5vdCB2ZXJ5IGNsb3NlIHRvIHNvbWUgb2YgbXkgRmFjZWJvb2sgZnJpZW5kcy4nLCAnbicpCnNyMQpgYGAKCmBgYHtyIHN5c3RlbSByZWFzb24yLCBlY2hvPUZBTFNFfQpzcjIgPC0gZCAlPiUgY291bnQoYXdhcmVfcmVhc29uc19ub3RfcG9wdWxhcikKY29sbmFtZXMoc3IyKSA8LSAgYygnc3lzdGVtIGFnZW5jeSAyLiBTb21lIG9mIG15IGZyaWVuZHMgYXJlIG5vdCBwb3B1bGFyIGVub3VnaCBvbiBGYWNlYm9vayBmb3IgbWUgdG8gc2VlIGFsbCBvZiBzdG9yaWVzIHRoZXkgcG9zdC4nLCAnbicpCnNyMgpgYGAKCmBgYHtyIHN5c3RlbSByZWFzb24zLCBlY2hvPUZBTFNFfQpzcjMgPC0gZCAlPiUgY291bnQoYXdhcmVfcmVhc29uc19kb2VzbnRfc2hvdykKY29sbmFtZXMoc3IzKSA8LSAgYygnc3lzdGVtIGFnZW5jeSAzLiBGYWNlYm9vayBkb2VzbuKAmXQgc2hvdyBtZSBjZXJ0YWluIHR5cGVzIG9mIHN0b3JpZXMgaW4gbXkgTmV3cyBGZWVkLicsICduJykKc3IzCmBgYAoKYGBge3Igc3lzdGVtIHJlYXNvbjQsIGVjaG89RkFMU0V9CnNyNCA8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX25vdF9jbG9zZSkKY29sbmFtZXMoc3I0KSA8LSAgYygnc3lzdGVtIGFnZW5jeSA0LiBGYWNlYm9vayB0aGlua3MgdGhhdCBJ4oCZbSBub3QgdmVyeSBjbG9zZSB0byBzb21lIG9mIG15IEZhY2Vib29rIGZyaWVuZHMuJywgJ24nKQpzcjQKYGBgCiAKYGBge3Igc3lzdGVtIHJlYXNvbjUsIGVjaG89RkFMU0V9CnNyNSA8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX25vdF90YWdnZWQpCmNvbG5hbWVzKHNyNSkgPC0gIGMoJ3N5c3RlbSBhZ2VuY3kgNS4gSWYgSSBhbSBub3QgdGFnZ2VkIGluIHN0b3JpZXMgcG9zdGVkIGJ5IGNlcnRhaW4gZnJpZW5kcywgSSB3b27igJl0IHNlZSB0aG9zZSBzdG9yaWVzLiAnLCAnbicpCnNyNQpgYGAKCmBgYHtyIHVzZXIgcmVhc29uMSwgZWNobz1GQUxTRX0KdXIxPC0gZCAlPiUgY291bnQoYXdhcmVfcmVhc29uc190aW1lKQpjb2xuYW1lcyh1cjEpIDwtICBjKCd1c2VyIGFnZW5jeSAxLiBJIGRvbuKAmXQgc3BlbmQgYSBsb3Qgb2YgdGltZSBnb2luZyB0aHJvdWdoIG15IE5ld3MgRmVlZC4nLCAnbicpCnVyMQpgYGAKICAKYGBge3IgdXNlciByZWFzb24yLCBlY2hvPUZBTFNFfQp1cjI8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX2RvbnRfc2Nyb2xsKQpjb2xuYW1lcyh1cjIpIDwtICBjKCd1c2VyIGFnZW5jeSAyLiBJIGRvbuKAmXQgc2Nyb2xsIGRvd24gdG8gc2VlIG9sZGVyIHN0b3JpZXMgaW4gbXkgTmV3cyBGZWVkLicsICduJykKdXIyCmBgYAoKYGBge3IgdXNlciByZWFzb24zLCBlY2hvPUZBTFNFfQp1cjM8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX2RvbnRfdmlzaXQpCmNvbG5hbWVzKHVyMykgPC0gIGMoJyB1c2VyIGFnZW5jeSAzLiBJIGRvbuKAmXQgdmlzaXQgRmFjZWJvb2sgb2Z0ZW4gZW5vdWdoIHRvIHNlZSBhbGwgb2YgdGhlIHN0b3JpZXMgbXkgZnJpZW5kcyBwb3N0LicsICduJykKdXIzCmBgYAoKYGBge3IgdXNlciByZWFzb240LCBlY2hvPUZBTFNFfQp1cjQ8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX2ludGVyYWN0KQpjb2xuYW1lcyh1cjQpIDwtICBjKCd1c2VyIGFnZW5jeSA0LiBJIGRvbuKAmXQgaW50ZXJhY3QgKGNvbW1lbnQsIGxpa2UsIHNoYXJlKSB3aXRoIHN0b3JpZXMgZnJvbSBjZXJ0YWluIGZyaWVuZHMgdmVyeSBvZnRlbi4gJywgJ24nKQp1cjQKYGBgCiAgCmBgYHtyIGhpZGUgcmVhc29uczEsIGVjaG89RkFMU0V9CmhyMTwtIGQgJT4lIGNvdW50KGF3YXJlX3JlYXNvbnNfaGlkZV9tZSkKY29sbmFtZXMoaHIxKSA8LSAgYygnaGlkZSByZWFzb24gMS4gSeKAmXZlIHByZXZpb3VzbHkgdXNlZCB0aGUgTmV3cyBGZWVkIHNldHRpbmdzIHRvIGhpZGUgc3RvcmllcyBmcm9tIHNvbWUgb2YgbXkgZnJpZW5kcy4nLCAnbicpCmhyMQpgYGAKICAgCmBgYHtyIGhpZGUgcmVhc29uczIsIGVjaG89RkFMU0V9CmhyMjwtIGQgJT4lIGNvdW50KGF3YXJlX3JlYXNvbnNfaGlkZGVuX2ZyaWVuZHMpCmNvbG5hbWVzKGhyMikgPC0gIGMoJ2hpZGUgcmVhc29uIDIuIE15IGZyaWVuZHMgbWF5IGhhdmUgaGlkZGVuIHNvbWUgb2YgdGhlaXIgc3RvcmllcyBmcm9tIG1lLicsICduJykKaHIyCmBgYAogICAgCmBgYHtyIHRvb21hbnkgcmVhc29uczEsIGVjaG89RkFMU0V9CnRtcjE8LSBkICU+JSBjb3VudChhd2FyZV9yZWFzb25zX2RvbnRfcmVhZCkKY29sbmFtZXModG1yMSkgPC0gIGMoJ3RvbyBtYW55IHJlYXNvbiAxLiBJIGRvbuKAmXQgYWx3YXlzIHJlYWQgZXZlcnkgc3Rvcnkgd2hlbiBJIGJyb3dzZSBteSBOZXdzIEZlZWQuJywgJ24nKQp0bXIxCmBgYAogICAKYGBge3IgdG9vbWFueSByZWFzb25zMiwgZWNobz1GQUxTRX0KdG1yMjwtIGQgJT4lIGNvdW50KGF3YXJlX3JlYXNvbnNfdG9vX21hbnkpCmNvbG5hbWVzKHRtcjIpIDwtICBjKCd0b28gbWFueSByZWFzb24gMi4gVGhlcmUgYXJlIHNvIG1hbnkgc3RvcmllcyBpbiBteSBOZXdzIEZlZWQgdGhhdCBJIGRvbuKAmXQgYWx3YXlzIHNlZSBldmVyeSBvbmUuJywgJ24nKQp0bXIyCmBgYAogICAgCmBgYHtyIHRvb25ldywgZWNobz1GQUxTRX0KdG5yIDwtIGQgJT4lIGNvdW50KGF3YXJlX3JlYXNvbnNfdG9vX25ldykKY29sbmFtZXModG5yKSA8LSBjKCd0b28gbmV3IHJlYXNvbnMuIFNvbWUgcG9zdHMgZnJvbSBteSBmcmllbmRzIGFyZSB0b28gbmV3IGZvciBtZSB0byBoYXZlIHNlZW4gdGhlbSB5ZXQuJywgJ24nKQp0bnIKYGBgCgoKIyNRdWVzdGlvbnMgYWJvdXQgQ29ycmVjdG5lc3MKCiMjI0NvcnJlY3RuZXNzIFExCioodmFyaWFibGUgbmFtZTogY29ycmVjdF9leHBlY3QpKiAKYGBge3IgY29ycmVjdG5lc3MxLCBlY2hvPUZBTFNFfQpleHBlY3QgPC0gZCAlPiUgY291bnQoY29ycmVjdF9leHBlY3QpCmNvbG5hbWVzKGV4cGVjdCkgPC0gIGMoJ1RoZSBzdG9yaWVzIHRoYXQgYXBwZWFyIGluIG15IE5ld3MgRmVlZCBhcmUgbm90IHdoYXQgSSBleHBlY3QgdG8gc2VlIHdoZW4gSSB2aXNpdCBGYWNlYm9vay4nLCAnbicpCmV4cGVjdApgYGAKCkZvbGxvdyB1cCBxdWVzdGlvbjogWW91IGFuc3dlcmVkICp5b3VyIGFuc3dlcihlLmcuLCAiQWdyZWUiKSogdG8gdGhlIHF1ZXN0aW9uLiBIb3cgc3VyZSBvciB1bnN1cmUgYXJlIHlvdSBhYm91dCB5b3VyIGFuc3dlcj8gUGxlYXNlIGluZGljYXRlIHlvdXIgYW5zd2VyIGJlbG93IG9uIGEgc2NhbGUgZnJvbSAwLTEwMCwgd2hlcmUgMCBtZWFucyBDT01QTEVURUxZIFVOU1VSRSBhbmQgMTAwIG1lYW5zIENPTVBMRVRFTFkgU1VSRSAtICoqTSA9IGByIG1lYW4oZCRjb3JyZWN0X2V4cGVjdF9zdXJlKWAsIFNEID0gYHIgc2QoZCRjb3JyZWN0X2V4cGVjdF9zdXJlKWAqKi4gKih2YXJpYWJsZSBuYW1lOiBjb3JyZWN0X2V4cGVjdF9zdXJlKSoKCiMjI0NvcnJlY3RuZXNzIFEyCioodmFyaWFibGUgbmFtZTogY29ycmVjdF9taXNzZWQpKgpgYGB7ciBjb3JyZWN0bmVzczIsIGVjaG89RkFMU0V9Cm1pc3NlZCA8LSBkICU+JSBjb3VudChjb3JyZWN0X21pc3NlZCkKY29sbmFtZXMobWlzc2VkKSA8LSAgYygnSW4gdGhlIGZ1dHVyZSwgSSBhbSBsaWtlbHkgdG8gZ28gdG8gYSBmcmllbmRcJ3MgRmFjZWJvb2sgVGltZWxpbmUgdG8gZmluZCBvdXQgaWYgSSBtaXNzZWQgYW55IG9mIHRoZSBzdG9yaWVzIHRoZXkgcG9zdGVkLicsICduJykKbWlzc2VkCmBgYAoKCiMjI0NvcnJlY3RuZXNzIFEzCgpBIHNlcmllcyBvZiAxMyBxdWVzdGlvbnMgd2FzIGRlc2lnbmVkIHRvIG1lYXN1cmUgY29ycmVjdG5lc3Mgd2l0aCA1IGRpZmZlcmVudCBmYWN0b3IgdmFyaWFibGVzLiBUaGUgcXVlc3Rpb25zIHdlcmU6CgoqKkJlbG93IGFyZSBkaWZmZXJlbnQga2luZHMgb2Ygc3RvcmllcyB0aGF0IG1pZ2h0IGFwcGVhciBpbiB5b3VyIE5ld3MgRmVlZC4gUGxlYXNlIGNvbnNpZGVyIHRoZSB0ZXh0IHlvdSByZWFkIGFib3V0IEZhY2Vib29rLCBhbmQgaW5kaWNhdGUgd2hldGhlciB5b3UgZmVlbCBsaWtlIHlvdSBzZWUgZWFjaCBraW5kIG9mIHN0b3J5IGFib3V0IGFzIG9mdGVuIGFzIHlvdSBzaG91bGQsIG5vdCBvZnRlbiBlbm91Z2gsIG9yIHRvbyBvZnRlbi4gQ2hvb3NlIHlvdXIgYW5zd2VyIG9uIGEgc2NhbGUgZnJvbSAwLTEwMCwgd2hlcmUgMCBtZWFucyBOT1QgT0ZURU4gRU5PVUdIIGFuZCAxMDAgbWVhbnMgVE9PIE9GVEVOLioqIAoKLSBXYW50ZWQgU3RvcmllcyAqKHZhcmlhYmxlIG5hbWU6IHdhbnRfZnJlcXVlbmN5KSogLSAqKk0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCR3YW50X2ZyZXF1ZW5jeSkpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkd2FudF9mcmVxdWVuY3kpKWAsIENyb25iYWNoJ3MgYWxwaGE6IGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChjb3JyZWN0X2ZyZXF1ZW5jeV9wcGxfaW5fdG91Y2gsICBjb3JyZWN0X2ZyZXF1ZW5jeV9pbnRlcmVzdGluZywgIGNvcnJlY3RfZnJlcXVlbmN5X2luZm9ybWF0aXZlLCAgY29ycmVjdF9mcmVxdWVuY3lfc2ltaWxhcikgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykpKSRyYXdfYWxwaGFgLioqCiAgICAtIHN0b3JpZXMgZnJvbSBwZW9wbGUgSSB3YW50IHRvIGtlZXAgaW4gdG91Y2ggd2l0aCAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9wcGxfaW5fdG91Y2gpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X3BwbF9pbl90b3VjaCkpYCApCiAgICAtIHN0b3JpZXMgdGhhdCBJIHRoaW5rIGFyZSBpbnRlcmVzdGluZyAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9pbnRlcmVzdGluZykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfaW50ZXJlc3RpbmcpKWAgKQogICAgLSBzdG9yaWVzIHRoYXQgYXJlIGluZm9ybWF0aXZlICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X2luZm9ybWF0aXZlKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9pbmZvcm1hdGl2ZSkpYCkKICAgIC0gc3RvcmllcyB0aGF0IGFyZSB0b28gc2ltaWxhciB0byBvdGhlciBzdG9yaWVzIEnigJl2ZSBhbHJlYWR5IHNlZW4gKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfc2ltaWxhcikpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfc2ltaWxhcikpYCApCi0gVW53YW50ZWQgU3RvcmllcyAqKHZhcmlhYmxlIG5hbWU6IGRvbnRfd2FudF9mcmVxdWVuY3kpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGRvbnRfd2FudF9mcmVxdWVuY3kpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGRvbnRfd2FudF9mcmVxdWVuY3kpKWAsIENyb25iYWNoJ3MgYWxwaGE6IGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChjb3JyZWN0X2ZyZXF1ZW5jeV9wcGxfZG9udF9saWtlLCBjb3JyZWN0X2ZyZXF1ZW5jeV9zdG9yaWVzLCBjb3JyZWN0X2ZyZXF1ZW5jeV9wcGxfZG9udF9rbm93KSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKSkpJHJhd19hbHBoYWAuKioKICAgIC0gc3RvcmllcyBmcm9tIHBlb3BsZSBJIGRvbuKAmXQgd2FudCBoZWFyIGZyb20gKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfcHBsX2RvbnRfbGlrZSkpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfcHBsX2RvbnRfbGlrZSkpYCApCiAgICAtIHN0b3JpZXMgdGhhdCBJIGRvbuKAmXQgd2FudCB0byBzZWUgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfc3RvcmllcykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfc3RvcmllcykpYCApCiAgICAtIHN0b3JpZXMgcG9zdGVkIGJ5IHBlb3BsZSBJIGRvbuKAmXQga25vdyAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9wcGxfZG9udF9rbm93KSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9wcGxfZG9udF9rbm93KSlgICkKLSBTcGFtIFN0b3JpZXMgKih2YXJpYWJsZSBuYW1lIDogc3BhbV9mcmVxdWVuY3kpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJHNwYW1fZnJlcXVlbmN5KSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRzcGFtX2ZyZXF1ZW5jeSkpYCwgQ3JvbmJhY2gncyBhbHBoYTogYHIgc3VtbWFyeShwc3ljaDo6YWxwaGEoZCAlPiUgc2VsZWN0KGNvcnJlY3RfZnJlcXVlbmN5X2ZhbHNlLCBjb3JyZWN0X2ZyZXF1ZW5jeV9zcGFtLCBjb3JyZWN0X2ZyZXF1ZW5jeV9hZHMpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4qKiAKICAgIC0gc3RvcmllcyBhYm91dCBmYWxzZSBjb250ZW50ICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X2ZhbHNlKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9mYWxzZSkpYCApCiAgICAtIHN0b3JpZXMgdGhhdCBJIHRoaW5rIGFyZSBzcGFtICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X3NwYW0pKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X3NwYW0pKWAgKQogICAgLSBzdG9yaWVzIHRoYXQgYXJlIOKAnHNwb25zb3JlZOKAnSBvciDigJxzdWdnZXN0ZWTigJ0gKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfYWRzKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9hZHMpKWAgKQotIE9mZmVuc2l2ZSBTdG9yaWVzICoodmFyaWFibGUgbmFtZSA6IG9mZmVuc2l2ZV9mcmVxdWVuY3kpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJG9mZmVuc2l2ZV9mcmVxdWVuY3kpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJG9mZmVuc2l2ZV9mcmVxdWVuY3kpKWAsIENyb25iYWNoJ3MgYWxwaGE6IGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChjb3JyZWN0X2ZyZXF1ZW5jeV9vZmZlbnNpdmUsIGNvcnJlY3RfZnJlcXVlbmN5X3Vwc2V0dGluZykgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykpKSRyYXdfYWxwaGFgLioqICAKICAgIC0gc3RvcmllcyBJIHRoaW5rIGFyZSBvZmZlbnNpdmUgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfb2ZmZW5zaXZlKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9vZmZlbnNpdmUpKWAgKQogICAgLSBzdG9yaWVzIHRoYXQgYXJlIHVwc2V0dGluZyBvciBpcnJpdGF0aW5nICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X3Vwc2V0dGluZykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkY29ycmVjdF9mcmVxdWVuY3lfdXBzZXR0aW5nKSlgICkKLSBDb3JyZWN0IFN0b3JpZXMgKih2YXJpYWJsZSBuYW1lIDogY29ycmVjdF9mcmVxdWVuY3lfbGlrZWQpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X2xpa2VkKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9saWtlZCkpYCoqLgogICAgLSBzdG9yaWVzIHRoYXQgbXkgZnJpZW5kcyBoYXZlIOKAnGxpa2Vk4oCdICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvcnJlY3RfZnJlcXVlbmN5X2xpa2VkKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRjb3JyZWN0X2ZyZXF1ZW5jeV9saWtlZCkpYCApCgogCiMjUXVlc3Rpb25zIGFib3V0IEludGVycHJldGFiaWxpdHkgCgojIyNJbnRlcnByZXRhYmlsaXR5IFExCioodmFyaWFibGUgbmFtZTogaW50ZXJwcmV0X3JzbnMpKiAKYGBge3IgaW50ZXJwcmV0YWJpbGl0eTEsIGVjaG89RkFMU0V9CmkxIDwtIGQgJT4lIGNvdW50KGludGVycHJldF9yc25zKQpjb2xuYW1lcyhpMSkgPC0gIGMoJ0kgdW5kZXJzdGFuZCB0aGUgcmVhc29ucyB3aHkgSSBzZWUgdGhlIHN0b3JpZXMgSSBkbyBpbiBteSBOZXdzIEZlZWQuJywgJ24nKQppMQpgYGAKCgpGb2xsb3cgdXAgcXVlc3Rpb25zOiBZb3UgYW5zd2VyZWQgKnlvdXIgYW5zd2VyKGUuZy4sICJBZ3JlZSIpKiB0byB0aGUgcXVlc3Rpb24uIEhvdyBzdXJlIG9yIHVuc3VyZSBhcmUgeW91IGFib3V0IHlvdXIgYW5zd2VyPyBQbGVhc2UgaW5kaWNhdGUgeW91ciBhbnN3ZXIgYmVsb3cgb24gYSBzY2FsZSBmcm9tIDAtMTAwLCB3aGVyZSAwIG1lYW5zIENPTVBMRVRFTFkgVU5TVVJFIGFuZCAxMDAgbWVhbnMgQ09NUExFVEVMWSBTVVJFIC0gKipNID0gYHIgbWVhbihkJGludGVycHJldF9yc25zX3N1cmUpYCwgU0QgPSBgciBzZChkJGludGVycHJldF9yc25zX3N1cmUpYCoqLiAqKHZhcmlhYmxlIG5hbWU6IGludGVycHJldF9yc25zX3N1cmUpKgoKIyMjSW50ZXJwcmV0YWJpbGl0eSBRMgoqKHZhcmlhYmxlIG5hbWU6IGludGVycHJldF9vcmRlcikqCmBgYHtyIGludGVycHJldGFiaWxpdHkyLCBlY2hvPUZBTFNFfQppMiA8LSBkICU+JSBjb3VudChpbnRlcnByZXRfb3JkZXIpCmNvbG5hbWVzKGkyKSA8LSAgYygnVGhlIG9yZGVyIG9mIHRoZSBzdG9yaWVzIHRoYXQgYXBwZWFyIGluIG15IE5ld3MgRmVlZCB3aGVuIEkgdmlzaXQgRmFjZWJvb2sgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBtZS4nLCAnbicpCmkyCmBgYAoKCiMjI0ludGVycHJldGFiaWxpdHkgUTMgCgpBIHNlcmllcyBvZiA4IHF1ZXN0aW9ucyB3YXMgZGVzaWduZWQgdG8gbWVhc3VyZSBpbnRlcnByZXRhYmlsaXR5IHdpdGggMiBkaWZmZXJlbnQgZmFjdG9yIHZhcmlhYmxlcy4gVGhlIHF1ZXN0aW9ucyB3ZXJlOiAKCioqQmVsb3cgYXJlIHNvbWUgZ29hbHMgdGhhdCBkaWZmZXJlbnQgcGVvcGxlIGNhbiBoYXZlIGZvciB1c2luZyB0aGUgTmV3cyBGZWVkLiBQbGVhc2UgY29uc2lkZXIgdGhlIHRleHQgeW91IHJlYWQgYWJvdXQgRmFjZWJvb2ssIGFuZCBpbmRpY2F0ZSBob3cgY29uc2lzdGVudCBvciByYW5kb20gdGhlIE5ld3MgRmVlZCBzZWVtcyBsaWtlIGl0IGlzIGFib3V0IHNob3dpbmcgeW91IHN0b3JpZXMgdGhhdCB3b3VsZCBoZWxwIHlvdSBhY2hpZXZlIGVhY2ggZ29hbCwgb24gYSBzY2FsZSBvZiAwLTEwMCB3aGVyZSAwIG1lYW5zIENPTVBMRVRFTFkgUkFORE9NIGFuZCAxMDAgbWVhbnMgQ09NUExFVEVMWSBDT05TSVNURU5ULioqCgotIEludGVycGVyc29uYWwgR29hbHMgKih2YXJpYWJsZSBuYW1lOiBlbnRlcnRhaW5lZF9nb2FscykqIC0gKipNID0gYHIgbWVhbihhcy5udW1lcmljKGQkZW50ZXJ0YWluZWRfZ29hbHMpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGVudGVydGFpbmVkX2dvYWxzKSlgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoaW50ZXJwcmV0X2dvYWxzX2tlZXBfdXAsIGludGVycHJldF9nb2Fsc192YXJpZXR5LCBpbnRlcnByZXRfZ29hbHNfaW50ZXJlc3RzLCBpbnRlcnByZXRfZ29hbHNfZW50ZXJ0YWluZWQpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4qKiAgIAogICAgLSBoZWxwaW5nIG1lIGtlZXAgdXAgd2l0aCBmcmllbmRzIGFuZCBmYW1pbHkgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX2tlZXBfdXApKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGludGVycHJldF9nb2Fsc19rZWVwX3VwKSlgICkKICAgIC0gc2hvd2luZyBtZSBhIHZhcmlldHkgb2YgY29udGVudCAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRpbnRlcnByZXRfZ29hbHNfdmFyaWV0eSkpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX3ZhcmlldHkpKWAgKQogICAgLSB1bmRlcnN0YW5kaW5nIG15IGludGVyZXN0cyBhbmQgcHJlZmVyZW5jZXMgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX2ludGVyZXN0cykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX2ludGVyZXN0cykpYCApCiAgICAtIGtlZXBpbmcgbWUgZW50ZXJ0YWluZWQgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX2VudGVydGFpbmVkKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRpbnRlcnByZXRfZ29hbHNfZW50ZXJ0YWluZWQpKWAgKQotIEluZm9ybWF0aW9uIEdvYWxzICoodmFyaWFibGUgbmFtZTogaW5mb3JtZWRfZ29hbCkqIC0gKipNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaW5mb3JtZWRfZ29hbHMpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGluZm9ybWVkX2dvYWxzKSlgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoaW50ZXJwcmV0X2dvYWxzX2luZm9ybWVkLCBpbnRlcnByZXRfZ29hbHNfbmV3cywgaW50ZXJwcmV0X2dvYWxzX2V2ZW50cywgaW50ZXJwcmV0X2dvYWxzX29wcG9ydHVuaXRpZXMpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4qKiAgCiAgICAtIGtlZXBpbmcgbWUgd2VsbC1pbmZvcm1lZCAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRpbnRlcnByZXRfZ29hbHNfaW5mb3JtZWQpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGludGVycHJldF9nb2Fsc19pbmZvcm1lZCkpYCApCiAgICAtIGhlbHBpbmcgbWUgY2F0Y2ggdXAgb24gdGhlIG5ld3MgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX25ld3MpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGludGVycHJldF9nb2Fsc19uZXdzKSlgICkKICAgIC0gbGV0dGluZyBtZSBrbm93IGFib3V0IGZ1dHVyZSBldmVudHMgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX2V2ZW50cykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX2V2ZW50cykpYCApCiAgICAtIGhlbHBpbmcgbWUgbmV0d29yayBhbmQgZmluZCBqb2Igb3Bwb3J0dW5pdGllcyAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRpbnRlcnByZXRfZ29hbHNfb3Bwb3J0dW5pdGllcykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkaW50ZXJwcmV0X2dvYWxzX29wcG9ydHVuaXRpZXMpKWAgKQogICAgCiMjUXVlc3Rpb25zIGFib3V0IEFjY291bnRhYmlsaXR5IAoKIyMjQWNjb3VudGFiaWxpdHkgUTEKKih2YXJpYWJsZSBuYW1lOiBhY2N0X2luZmx1ZW5jZSkqCmBgYHtyIGFjY291bnRhYmlsaXR5MSwgZWNobz1GQUxTRX0KYWNjMSA8LSBkICU+JSBjb3VudChhY2N0X2luZmx1ZW5jZSkKY29sbmFtZXMoYWNjMSkgPC0gYygnSSBjYW4gaW5mbHVlbmNlIHdoaWNoIHN0b3JpZXMgYXBwZWFyIGluIG15IE5ld3MgRmVlZC4nLCAnbicpCmFjYzEKYGBgCkZvbGxvdyB1cCBxdWVzdGlvbjogWW91IGFuc3dlcmVkICp5b3VyIGFuc3dlcihlLmcuLCAiQWdyZWUiKSogdG8gdGhlIHF1ZXN0aW9uLiBIb3cgc3VyZSBvciB1bnN1cmUgYXJlIHlvdSBhYm91dCB5b3VyIGFuc3dlcj8gUGxlYXNlIGluZGljYXRlIHlvdXIgYW5zd2VyIGJlbG93IG9uIGEgc2NhbGUgZnJvbSAwLTEwMCwgd2hlcmUgMCBtZWFucyBDT01QTEVURUxZIFVOU1VSRSBhbmQgMTAwIG1lYW5zIENPTVBMRVRFTFkgU1VSRSAtICoqTSA9IGByIG1lYW4oZCRhY2N0X2luZmx1ZW5jZV9zdXJlKWAsIFNEID0gYHIgc2QoZCRhY2N0X2luZmx1ZW5jZV9zdXJlKWAqKi4gKih2YXJpYWJsZSBuYW1lOiBhY2N0X2luZmx1ZW5jZV9zdXJlKSoKCgojIyNBY2NvdW50YWJpbGl0eSBRMiAKQSBzZXJpZXMgb2YgMyBxdWVzdGlvbnMgd2FzIGRlc2lnbmVkIHRvIG1lYXN1cmUgdGhlIGNvbmNlcHQgb2YgYWNjb3VudGFiaWxpdHkvZmFpcm5lc3MgaW4gTmV3cyBGZWVkLiBUaGUgcXVlc3Rpb25zIHdlcmU6IAoKLSBUaGUgTmV3cyBGZWVkIGJlaGF2ZXMgdGhlIHNhbWUgZm9yIGV2ZXJ5b25lIHdobyB1c2VzIGl0LiAKLSBUaGUgTmV3cyBGZWVkIGlzIHVuYmlhc2VkIGFib3V0IHdoaWNoIHN0b3JpZXMgaXQgc2hvd3MgdG8gcGVvcGxlLgotIFRoZSBOZXdzIEZlZWQgYWN0cyBpbiB0aGUgYmVzdCBpbnRlcmVzdCBvZiB0aGUgcGVvcGxlIHdobyB1c2UgaXQuIAoKVGhlIG1lYW4gb2YgdGhlIGNvbXBvc2l0ZSB2YXJpYWJsZSBjcmVhdGVkIGZyb20gdGhlc2UgdGhyZWUgcXVlc3Rpb25zIGlzICoqYHIgbWVhbihhcy5udW1lcmljKGQkYWNjdF9mYWlybmVzcykpYCoqIGFuZCBDcm9uYmFjaCdzIGFscGhhIGlzIGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChhY2N0X2ZhaXJuZXNzX3NhbWUsIGFjY3RfZmFpcm5lc3NfdW5iaWFzZWQsIGFjY3RfZmFpcm5lc3NfYmVzdF9pbnRlcmVzdCkgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykpKSRyYXdfYWxwaGFgLiAgKih2YXJpYWJsZSBuYW1lOiBhY2N0X2ZhaXJuZXNzKSoKCkhlcmUgYXJlIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBlYWNoIG9mIHRob3NlIHF1ZXN0aW9uczogIApgYGB7ciBhY2NvdW50YWJpbGl0eTItMSwgZWNobz1GQUxTRX0KYWNjMi4xIDwtIGQgJT4lIGNvdW50KGFjY3RfZmFpcm5lc3Nfc2FtZSkKY29sbmFtZXMoYWNjMi4xICkgPC0gYygnVGhlIE5ld3MgRmVlZCBiZWhhdmVzIHRoZSBzYW1lIGZvciBldmVyeW9uZSB3aG8gdXNlcyBpdC4gJywgJ24nKQphY2MyLjEgCmBgYAoKCmBgYHtyIGFjY291bnRhYmlsaXR5Mi0yLCBlY2hvPUZBTFNFfQphY2MyLjIgPC0gZCAlPiUgY291bnQoYWNjdF9mYWlybmVzc191bmJpYXNlZCkKY29sbmFtZXMoYWNjMi4yICkgPC0gYygnVGhlIE5ld3MgRmVlZCBpcyB1bmJpYXNlZCBhYm91dCB3aGljaCBzdG9yaWVzIGl0IHNob3dzIHRvIHBlb3BsZS4gJywgJ24nKQphY2MyLjIgCmBgYAoKYGBge3IgYWNjb3VudGFiaWxpdHkyLTMsIGVjaG89RkFMU0V9CmFjYzIuMyA8LSBkICU+JSBjb3VudChhY2N0X2ZhaXJuZXNzX2Jlc3RfaW50ZXJlc3QpCmNvbG5hbWVzKGFjYzIuMykgPC0gYygnVGhlIE5ld3MgRmVlZCBhY3RzIGluIHRoZSBiZXN0IGludGVyZXN0IG9mIHRoZSBwZW9wbGUgd2hvIHVzZSBpdC4nLCAnbicpCmFjYzIuMyAKYGBgCgojIyNBY2NvdW50YWJpbGl0eSBRMyAgCgpBIHNlcmllcyBvZiAxMCBxdWVzdGlvbnMgd2FzIGRlc2lnbmVkIHRvIG1lYXN1cmUgYWNjb3VudGFiaWxpdHkgd2l0aCA0IGRpZmZlcmVudCBmYWN0b3IgdmFyaWFibGVzLiBUaGUgcXVlc3Rpb25zIHdlcmU6IAoKKipCZWxvdyBhcmUgc29tZSBhY3Rpb25zIHJlbGF0ZWQgdG8gRmFjZWJvb2suIEhvdyBsaWtlbHkgZG8geW91IHRoaW5rIGl0IGlzIHRoYXQgaWYgeW91IGRvIHRoZXNlIGFjdGlvbnMgaW4gdGhlIGZ1dHVyZSwgaXQgd2lsbCBhZmZlY3Qgd2hpY2ggc3RvcmllcyBhcHBlYXIgaW4geW91ciBOZXdzIEZlZWQ/IFBsZWFzZSBjb25zaWRlciB0aGUgdGV4dCB5b3UgcmVhZCBhYm91dCBGYWNlYm9vaywgYW5kIGluZGljYXRlIHlvdXIgYW5zd2VyIGZvciBlYWNoIGl0ZW0gYmVsb3cgb24gYSBzY2FsZSBmcm9tIDAtMTAwLCB3aGVyZSAwIG1lYW5zIFVOTElLRUxZLCBhbmQgMTAwIG1lYW5zIExJS0VMWS4gKioKCi0gQ29udGVudCBBY3Rpb24gKih2YXJpYWJsZSBuYW1lOiBjb250ZW50X2FjdGlvbnMpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGNvbnRlbnRfYWN0aW9ucykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkY29udGVudF9hY3Rpb25zKSlgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoYWNjdF9hY3Rpb25zX2xpa2UsIGFjY3RfYWN0aW9uc19jb21tZW50LCBhY2N0X2FjdGlvbnNfZm9sbG93KSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKSkpJHJhd19hbHBoYWAuKiogCiAgICAtIOKAnExpa2XigJ0gYSBzdG9yeSAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfbGlrZSkpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkYWNjdF9hY3Rpb25zX2xpa2UpKWAgKQogICAgLSBDb21tZW50IG9uIGEgc3RvcnkgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkYWNjdF9hY3Rpb25zX2NvbW1lbnQpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc19jb21tZW50KSlgICkKICAgIC0gRm9sbG93IGEgcGVyc29uIG9yIGEgUGFnZSAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfZm9sbG93KSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfZm9sbG93KSlgICkKLSBVSSBDb250cm9sIEFjdGlvbiAqKHZhcmlhYmxlIG5hbWU6IHVpX2NvbnRyb2xzX2FjdGlvbnMpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJHVpX2NvbnRyb2xzX2FjdGlvbnMpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJHVpX2NvbnRyb2xzX2FjdGlvbnMpKWAsIENyb25iYWNoJ3MgYWxwaGE6IGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChhY2N0X2FjdGlvbnNfc2VlX2ZpcnN0LCBhY2N0X2FjdGlvbnNfbW9zdF9yZWNlbnQsIGFjY3RfYWN0aW9uc19jbG9zZV9mcmllbmQpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4qKiAgCiAgICAtIFByaW9yaXRpemUgd2hvIHRvIOKAnHNlZSBmaXJzdOKAnSAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfc2VlX2ZpcnN0KSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfc2VlX2ZpcnN0KSlgICkKICAgIC0gU29ydCBieSDigJxNb3N0IFJlY2VudOKAnSBzdG9yaWVzICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc19tb3N0X3JlY2VudCkpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkYWNjdF9hY3Rpb25zX21vc3RfcmVjZW50KSlgICkKICAgIC0gQWRkIGEgcGVyc29uIHRvIHlvdXIg4oCcQ2xvc2UgRnJpZW5kc+KAnSBsaXN0ICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc19jbG9zZV9mcmllbmQpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc19jbG9zZV9mcmllbmQpKWAgKQotIFZpc2l0IEFjdGlvbiAqKHZhcmlhYmxlIG5hbWU6IHZpc2l0X2FjdGlvbnMpKiAtICoqTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJHZpc2l0X2FjdGlvbnMpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJHZpc2l0X2FjdGlvbnMpKWAsIENyb25iYWNoJ3MgYWxwaGE6IGByIHN1bW1hcnkocHN5Y2g6OmFscGhhKGQgJT4lIHNlbGVjdChhY2N0X2FjdGlvbnNfdmlzaXRfbGVzcywgYWNjdF9hY3Rpb25zX3Zpc2l0X21vcmUpICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpKSkkcmF3X2FscGhhYC4qKiAKICAgIC0gVmlzaXQgRmFjZWJvb2sgbGVzcyBvZnRlbiAoIE0gPSBgciBtZWFuKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfdmlzaXRfbGVzcykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkYWNjdF9hY3Rpb25zX3Zpc2l0X2xlc3MpKWAgKQogICAgLSBWaXNpdCBGYWNlYm9vayBtb3JlIG9mdGVuICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc192aXNpdF9tb3JlKSlgLCBTRCA9IGByIHNkKGFzLm51bWVyaWMoZCRhY2N0X2FjdGlvbnNfdmlzaXRfbW9yZSkpYCApCi0gSGlkZSBBY3Rpb24gKih2YXJpYWJsZSBuYW1lOiBoaWRpbmdfYWN0aW9ucykqIC0gKipNID0gYHIgbWVhbihhcy5udW1lcmljKGQkaGlkaW5nX2FjdGlvbnMpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGhpZGluZ19hY3Rpb25zKSlgLCBDcm9uYmFjaCdzIGFscGhhOiBgciBzdW1tYXJ5KHBzeWNoOjphbHBoYShkICU+JSBzZWxlY3QoYWNjdF9hY3Rpb25zX2hpZGUsIGFjY3RfYWN0aW9uc191bmZvbGxvdykgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykpKSRyYXdfYWxwaGFgLioqIAogICAgLSBIaWRlIGEgc3RvcnkgKCBNID0gYHIgbWVhbihhcy5udW1lcmljKGQkYWNjdF9hY3Rpb25zX2hpZGUpKWAsIFNEID0gYHIgc2QoYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc19oaWRlKSlgICkKICAgIC0gVW5mb2xsb3cgYSBwZXJzb24gb3IgYSBQYWdlICggTSA9IGByIG1lYW4oYXMubnVtZXJpYyhkJGFjY3RfYWN0aW9uc191bmZvbGxvdykpYCwgU0QgPSBgciBzZChhcy5udW1lcmljKGQkYWNjdF9hY3Rpb25zX3VuZm9sbG93KSlgICkKCgojIyBEZW1vZ3JhcGhpY3MgUXVlc3Rpb25zCgotICoqV2hhdCBpcyB0aGUgbGFzdCBncmFkZSBvciBjbGFzcyB5b3UgY29tcGxldGVkIGluIHNjaG9vbD8qKiAqKHZhcmlhYmxlIG5hbWU6IGVkdWNhdGlvbikqIFtOb25lLCBvciBncmFkZXMgMS04IC8gU29tZSBoaWdoIHNjaG9vbCAvIEhpZ2ggc2Nob29sIGdyYWR1YXRlIG9yIEdFRCBjZXJ0aWZpY2F0ZSAvIFRlY2huaWNhbCwgdHJhZGUsIG9yIHZvY2F0aW9uYWwgc2Nob29sIEFGVEVSIGhpZ2ggc2Nob29sIC8gU29tZSBjb2xsZWdlLCBubyA0LXllYXIgZGVncmVlIC8gNC15ZWFyIGNvbGxlZ2UgZGVncmVlIC8gU29tZSBwb3N0Z3JhZHVhdGUgb3IgcHJvZmVzc2lvbmFsIHNjaG9vbGluZywgbm8gcG9zdGdyYWR1YXRlIGRlZ3JlZSAvIFBvc3RncmFkdWF0ZSBvciBwcm9mZXNzaW9uYWwgZGVncmVlLCBpbmNsdWRpbmcgbWFzdGVy4oCZcywgZG9jdG9yYXRlLCBtZWRpY2FsIG9yIGxhdyBkZWdyZWVdCgotICoqV2hhdCB3YXMgeW91ciB0b3RhbCBob3VzZWhvbGQgaW5jb21lIGJlZm9yZSB0YXhlcyBkdXJpbmcgdGhlIHBhc3QgMTIgbW9udGhzPyoqICoodmFyaWFibGUgbmFtZTogaW5jb21lKSogW0xlc3MgdGhhbiBcJDI1LDAwMCAvIFwkMjUsMDAwIHRvIFwkMzQsOTk5IC8gXCQzNSwwMDAgdG8gXCQ0OSw5OTkgLyBcJDUwLDAwMCB0byBcJDc0LDk5OSAvIFwkNzUsMDAwIHRvIFwkOTksOTk5IC8gXCQxMDAsMDAwIHRvIFwkMTQ5LDk5OSAvIFwkMTUwLDAwMCB0byBcJDE5OSw5OTkgLyBcJDIwMCwwMDAgb3IgbW9yZV0KCi0gKipXaGljaCBjYXRlZ29yaWVzIGJlbG93IGJlc3QgZGVzY3JpYmUgeW91PyBTZWxlY3QgYWxsIHRoYXQgYXBwbHk6KiogKih2YXJpYWJsZSBuYW1lOiBldGhuaWNpdHkpKiBbV2hpdGUgLyBIaXNwYW5pYywgTGF0aW5vIG9yIFNwYW5pc2ggLyBCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuIC8gQXNpYW4gLyBBbWVyaWNhbiBJbmRpYW4gb3IgQWxhc2thIE5hdGl2ZSAvIE1pZGRsZSBFYXN0ZXJuIG9yIE5vcnRoIEFmcmljYW4gLyBOYXRpdmUgSGF3YWlpYW4gb3IgT3RoZXIgUGFjaWZpYyBJc2xhbmRlciAvIFNvbWUgT3RoZXIgUmFjZSwgRXRobmljaXR5IG9yIE9yaWdpbiAocGxlYXNlIHNwZWNpZnkpXQoKLSAqKldoaWNoIHJlZ2lvbiBvZiB0aGUgY291bnRyeSBkbyB5b3UgbGl2ZSBpbj8qKiAqKHZhcmlhYmxlIG5hbWU6IHJlZ2lvbikqIFtOZXcgRW5nbGFuZCAtIENvbm5lY3RpY3V0LCBNYWluZSwgTWFzc2FjaHVzZXR0cywgTmV3IEhhbXBzaGlyZSwgUmhvZGUgSXNsYW5kLCBWZXJtb250IC8gTWlkZGxlIEF0bGFudGljIC0gTmV3IEplcnNleSwgTmV3IFlvcmssIFBlbm5zeWx2YW5pYSAvIEVhc3QgTm9ydGggQ2VudHJhbCAtIElsbGlub2lzLCBJbmRpYW5hLCBNaWNoaWdhbiwgT2hpbywgV2lzY29uc2luIC8gV2VzdCBOb3J0aCBDZW50cmFsIC0gSW93YSwgS2Fuc2FzLCBNaW5uZXNvdGEsIE1pc3NvdXJpLCBOZWJyYXNrYSwgTm9ydGggRGFrb3RhLCBTb3V0aCBEYWtvdGEgLyBTb3V0aCBBdGxhbnRpYyAtIERlbGF3YXJlLCBEaXN0cmljdCBvZiBDb2x1bWJpYSwgRmxvcmlkYSwgR2VvcmdpYSwgTWFyeWxhbmQsIE5vcnRoIENhcm9saW5hLCBTb3V0aCBDYXJvbGluYSwgVmlyZ2luaWEsIFdlc3QgVmlyZ2luaWEgLyBFYXN0IFNvdXRoIENlbnRyYWwgLSBBbGFiYW1hLCBLZW50dWNreSwgTWlzc2lzc2lwcGksIFRlbm5lc3NlZSAvIFdlc3QgU291dGggQ2VudHJhbCAtIEFya2Fuc2FzLCBMb3Vpc2lhbmEsIE9rbGFob21hLCBUZXhhcyAvIE1vdW50YWluIC0gQXJpem9uYSwgQ29sb3JhZG8sIElkYWhvLCBNb250YW5hLCBOZXZhZGEsIE5ldyBNZXhpY28sIFV0YWgsIFd5b21pbmcgUGFjaWZpYyAtIEFsYXNrYSwgQ2FsaWZvcm5pYSwgSGF3YWlpLCBPcmVnb24sIFdhc2hpbmd0b24gLyBPdGhlciByZWdpb24gKHBsZWFzZSBzcGVjaWZ5KV0KCgoKIyBJbmVsaWdpYmxlICYgRXhjbHVkZWQgUGFydGljaXBhbnRzCgojIyBIb3cgbWFueSBwYXJ0aWNpcGFudHMgd2VyZSBpbmVsaWdpYmxlIHZzLiBleGNsdWRlZD8KClRoZSBlbWFpbCB0aGF0IHRoZSBRdWFsdHJpY3MgcHJvamVjdCBtYW5hZ2VyIHNlbmRzIG91dCB0byBwb3NzaWJsZSBwYXJ0aWNpcGFudHMgZG9lcyBub3QgY29udGFpbiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHVkeS4gSW5zdGVhZCwgdGhlIGNvbnNlbnQgZm9ybSBzZXJ2ZXMgYXMgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHBhcnRpY2lwYW50cyBzbyB0aGV5IGNhbiBkZWNpZGUgd2hldGhlciB0aGV5IHdhbnQgdG8gcGFydGljaXBhdGUuIGByIGxlbmd0aChkLmV4Y2x1ZGVkJFJlc3BvbnNlSUQpICsgbGVuZ3RoKGQkUmVzcG9uc2VJRClgIHN0YXJ0ZWQgdGhlIHN0dWR5IGJ5IGNsaWNraW5nIG9uIHRoZSBsaW5rIGluIHRoZSByZWNydWl0aW5nIGVtYWlsIGFuZCB2aWV3aW5nIHRoZSBjb25zZW50IGZvcm0uCgpgciBhcy5jaGFyYWN0ZXIoZC5leGNsdWRlZCAlPiUgZmlsdGVyKGV4Y2x1ZGVkID09ICJkZWNsaW5lZCBjb25zZW50IikgJT4lIGNvdW50KGV4Y2x1ZGVkKSlbMl1gIHBhcnRpY2lwYW50cyBkaWQgbm90IGNvbnNlbnQgdG8gcGFydGljaXBhdGUuIEFub3RoZXIgYHIgYXMuY2hhcmFjdGVyKGQuZXhjbHVkZWQgJT4lIGZpbHRlcihleGNsdWRlZCA9PSAiaW5lbGlnaWJsZSIpICU+JSBjb3VudChleGNsdWRlZCkpWzJdYCB3ZXJlIHNjcmVlbmVkIG91dCBmb3IgYmVpbmcgaW5lbGlnaWJsZS4gYHIgYXMuY2hhcmFjdGVyKGQuZXhjbHVkZWQgJT4lIGZpbHRlcihleGNsdWRlZCAlaW4lIGMoImZhaWxlZCBhdHRlbnRpb24gY2hlY2siLCAiZmFpbGVkIG1hbmlwdWxhdGlvbiBjaGVjayIsICJmaW5pc2hlZCB0b28gc2xvd2x5IiwgInBvb3IgcXVhbGl0eSByZXNwb25zZSIsICJnZW5kZXIgbm90IE1hbiBvciBXb21hbiIsICJpbmNvbXBsZXRlIikpICU+JSBzdW1tYXJpemUobigpKSlgIHBhcnRpY2lwYW50cyB3ZXJlIGVsaWdpYmxlLCBidXQgd2VyZSBleGNsdWRlZCBiZWZvcmUgdGhleSBjb21wbGV0ZWQgdGhlIHN1cnZleSwgZm9yIG90aGVyIHJlYXNvbnMgKGUuZy4sIGZhaWxpbmcgdGhlIGF0dGVudGlvbiBjaGVja3Mgb3IgbWFuaXB1bGF0aW9uIGNoZWNrLCBwcm92aWRpbmcgcG9vciBxdWFsaXR5IHJlc3BvbnNlcywgZXRjLikuIEFmdGVyIGRhdGEgY2xlYW5pbmcsIHRoZXJlIHdlcmUgYHIgbGVuZ3RoKGQkUmVzcG9uc2VJRClgIHBhcnRpY2lwYW50cyBpbiB0aGUgZmluYWwgZGF0YXNldCBmb3IgYW5hbHlzaXMuCgojIyBGb3Igd2hhdCByZWFzb25zIHdlcmUgcGFydGljaXBhbnRzIGluZWxpZ2libGU/CgpUaGlzIG9ubHkgaW5jbHVkZXMgcGFydGljaXBhbnRzIHRoYXQgY29uc2VudGVkIHRvIHRoZSBzdHVkeSwgYnV0IHdlcmUgZGV0ZXJtaW5lZCB0byBiZSBpbmVsaWdpYmxlIGluIHRoZSBzY3JlZW5pbmcuIFRoZSBzdXJ2ZXkgd2FzIGNvbmZpZ3VyZWQgdG8gZGlyZWN0IHBhcnRpY2lwYW50cyB0byB0aGUgZW5kIG9mIHRoZSBzdXJ2ZXkgYWZ0ZXIgZWFjaCBzY3JlZW5pbmcgcXVlc3Rpb24sIGlmIHRoZXkgZ2F2ZSBhbiBpbmVsaWdpYmxlIHJlc3BvbnNlIHRvIHRoYXQgcXVlc3Rpb24uCgpUaGUgdGFibGUgaXMgc29ydGVkIGJ5IGNvbHVtbiBzbyB0aGF0IHRoZSBudW1iZXIgaW4gdGhlICJuIiBjb2x1bW4gaXMgaG93IG1hbnkgcGVvcGxlIHdlcmUgaW5lbGlnaWJsZSBmb3IgdGhlIHJlYXNvbiBpbiB0aGUgcmlnaHQtbW9zdCBjb2x1bW4gaGF2aW5nICJUUlVFIiBvciAiTm8iLiAoVFJVRSBtZWFucyB0aGV5IGVudGVyZWQgYW4gaW5lbGlnaWJsZSByZXNwb25zZS4pCgpUaGUgdHdvIGxhcmdlc3QgY2F0ZWdvcmllcyBvZiBpbmVsaWdpYmxlIHJlc3BvbmRlbnRzIHdlcmUgdGhvc2Ugd2hvIHNhaWQgdGhleSBoYWQgbWFuYWdlZCBhIFBhZ2Ugb24gRmFjZWJvb2ssIGFuZCB0aG9zZSB3aG8gc2FpZCB0aGV5IGhhZCBmZXdlciB0aGFuIDUwIEZhY2Vib29rIGZyaWVuZHMuCmBgYHtyIGluZWxpZ2libGVzLCBlY2hvPUZBTFNFfQpkLnJlYXNvbnMuZXhjbHVkZWQgPC0gZC5leGNsdWRlZCAlPiUgCiAgZmlsdGVyKGV4Y2x1ZGVkICVpbiUgYygiaW5lbGlnaWJsZSIpKSAlPiUKICBzZWxlY3QoUmVzcG9uc2VJRCwgZXhjbHVkZWQsIGFnZSwgZmJfdXNlLCBmYl9mcmllbmRzLCBmYl9ob3dfbG9uZywgZmJfdmlzaXQsIG1hbmFnZV9wYWdlLCBzb2NpYWxfbWVkaWFfd29yaywgSVRfd29yaykgJT4lIAogIG11dGF0ZShhZ2UgPSAoYWdlIDwgMTgpLCAKICAgICAgICAgZmJfZnJpZW5kcyA9IChmYl9mcmllbmRzIDwgNTApLCAKICAgICAgICAgZmJfaG93X2xvbmcgPSAoZmJfaG93X2xvbmcgPT0gIkxlc3MgdGhhbiBvbmUgbW9udGgiKSwgCiAgICAgICAgIGZiX3Zpc2l0ID0gKGZiX3Zpc2l0ID09ICJOZXZlciIgfCBmYl92aXNpdCA9PSAiTGVzcyB0aGFuIG9uY2UgcGVyIG1vbnRoIiksIAogICAgICAgICBtYW5hZ2VfcGFnZSA9IChtYW5hZ2VfcGFnZSA9PSAiWWVzIiksIAogICAgICAgICBzb2NpYWxfbWVkaWFfd29yayA9IChzb2NpYWxfbWVkaWFfd29yayA9PSAiWWVzIiksIAogICAgICAgICBJVF93b3JrID0gKElUX3dvcmsgPT0gIlllcyIpKQpkLnJlYXNvbnMuZXhjbHVkZWQgJT4lIAogIHNlbGVjdChmYl91c2UsIGFnZSwgZmJfZnJpZW5kcywgZmJfaG93X2xvbmcsIGZiX3Zpc2l0LCBtYW5hZ2VfcGFnZSwgc29jaWFsX21lZGlhX3dvcmssIElUX3dvcmspICU+JSAKICBjb3VudChmYl91c2UsIGFnZSwgZmJfZnJpZW5kcywgZmJfaG93X2xvbmcsIGZiX3Zpc2l0LCBtYW5hZ2VfcGFnZSwgc29jaWFsX21lZGlhX3dvcmssIElUX3dvcmspICU+JSAKICBhcnJhbmdlKGRlc2MoZmJfdXNlKSwgYWdlLCBmYl9mcmllbmRzLCBmYl9ob3dfbG9uZywgZmJfdmlzaXQsIG1hbmFnZV9wYWdlLCBzb2NpYWxfbWVkaWFfd29yaywgSVRfd29yaykKYGBgCgojIyBGb3Igd2hhdCByZWFzb25zIHdlcmUgZWxpZ2libGUgcGFydGljaXBhbnRzIGV4Y2x1ZGVkPwoKVGhlIHJlYXNvbnMgcGFydGljaXBhbnRzIHdlcmUgZXhjbHVkZWQgYWZ0ZXIgY29uc2VudGluZyBhbmQgYmVpbmcgZGV0ZXJtaW5lZCBlbGlnaWJsZSB0byBwYXJ0aWNpcGF0ZSB3ZXJlOgoKLSAqKmZhaWxlZCBhdHRlbnRpb24gY2hlY2sqKjogVGhlIHN0dWR5IGhhZCBmb3VyIGF0dGVudGlvbiBjaGVjayBxdWVzdGlvbnMuIFRocmVlIG9mIHRoZW0gd2VyZSBvZiB0aGUgZm9ybSBUbyBoZWxwIHVzIG1vbml0b3IgdGhlIHF1YWxpdHkgb2Ygb3VyIGRhdGEsIHBsZWFzZSBzZWxlY3QgPG9uZSBvZiB0aGUgY2hvaWNlcz4gZnJvbSB0aGUgY2hvaWNlcyBiZWxvdy4gSWYgdGhleSBjaG9zZSBhIGRpZmZlcmVudCByZXNwb25zZSB0aGFuIHRoZSBvbmUgdGhleSB3ZXJlIGRpcmVjdGVkIHRvLCB0aGV5IHdlcmUgZGlyZWN0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3VydmV5LiBUaGUgZm91cnRoIG9uZSB3YXMgYSBmYWtlIHdvcmQgaW4gdGhlIGJsb2NrIG9mIGludGVybmV0LXJlbGF0ZWQgdGVybXMuIElmIHRoZXkgc2FpZCB0aGV5IGhhZCAiR29vZCIgb3IgIkZ1bGwiIGZhbWlsaWFyaXR5IHdpdGggdGhlIGZha2Ugd29yZCwgdGhleSB3ZXJlIGRpcmVjdGVkIHRvIHRoZSBlbmQgb2YgdGhlIHN1cnZleS4KLSAqKmZhaWxlZCBtYW5pcHVsYXRpb24gY2hlY2sqKjogVGhlIHN0dWR5IGluY2x1ZGVkIHRocmVlIHF1ZXN0aW9ucyBpbiBlYWNoIGNvbmRpdGlvbiBkZXNpZ25lZCB0byBlbnN1cmUgdGhhdCBwYXJ0aWNpcGFudHMgaGFkIHJlYWQgYW5kIHBhaWQgYXR0ZW50aW9uIHRvIHRoZSBleHBsYW5hdGlvbiB0ZXh0LiBQYXJ0aWNpcGFudHMgd2VyZSBnaXZlbiB0d28gY2hhbmNlcyB0byBwYXNzIGFsbCB0aHJlZSBxdWVzdGlvbnMuIElmIHRoZXkgYW5zd2VyZWQgb25lIG9mIHRoZSBxdWVzdGlvbnMgaW5jb3JyZWN0bHksIHRoZXkgd2VyZSBkaXJlY3RlZCBiYWNrIHRvIHJlYWQgdGhlIGV4cGxhbmF0aW9uIGFnYWluIGEgc2Vjb25kIHRpbWUuIElmIHRoZXkgYWdhaW4gZmFpbGVkIHRvIGFuc3dlciBhbGwgb2YgdGhlIHF1ZXN0aW9ucyBjb3JyZWN0bHksIHRoZXkgd2VyZSBkaXJlY3RlZCB0byB0aGUgZW5kIG9mIHRoZSBzdXJ2ZXkuCi0gKipmaW5pc2hlZCB0b28gc2xvd2x5Kio6IFBhcnRpY2lwYW50cyB3ZXJlIHJlcXVpcmVkIHRvIGZpbmlzaCB0aGUgc3R1ZHkgd2l0aGluIDYwIG1pbnV0ZXMgb2YgZmluaXNoaW5nIHRoZSBjb25zZW50IGFuZCBzY3JlZW5pbmcgcXVlc3Rpb25zLiBJZiB0aGV5IGRpZCBub3QsIHRoZXkgd2VyZSBleGNsdWRlZC4KLSAqKmluY29tcGxldGUqKjogVGhlc2UgYXJlIHBhcnRpYWwgcmVzcG9uc2VzIHdoZXJlIGEgcGFydGljaXBhbnQgc3RhcnRlZCBidXQgZGlkIG5vdCBmaW5pc2ggdGhlIHN1cnZleS4KLSAqKnBvb3IgcXVhbGl0eSByZXNwb25zZSoqOiBXZSBleGFtaW5lZCB0aGUgcmVzcG9uc2VzIGZvciBmb3VyIHN5bXB0b21zIG9mIGxvdyBxdWFsaXR5IHJlc3BvbnNlcywgaW5jbHVkaW5nIDEpIGFuc3dlcnMgdG8gdGhlIG9wZW4tZW5kZWQgcXVlc3Rpb24gdGhhdCB3ZXJlIHVucmVsYXRlZCB0byB0aGUgcXVlc3Rpb24gb3IgY29udGFpbmVkIHJlcGVhdGVkIGNoYXJhY3RlcnMgb3Igb3RoZXIgdGV4dCBpbnRlbmRlZCB0byBmaWxsIHVwIHNwYWNlIHRoYXQgZGlkIG5vdCBhbnN3ZXIgdGhlIHF1ZXN0aW9uOyAyKSBhbnN3ZXMgdGhhdCB3ZXJlIHRvbyBzaW1pbGFyIHRvIG90aGVyIGFuc3dlcnMgaW5kaWNhdGluZyBwb3NzaWJsZSByZXBlYXQgcGFydGljaXBhdGlvbjsgMykgdmVyeSBsb3cgdmFyaWF0aW9uIGluIGFuc3dlcnMgKCJzdHJhaWdodCBkb3duIiBhbnN3ZXJzKSBhY3Jvc3MgNCBkaWZmZXJlbnQgc2VjdGlvbnMgb2YgdGhlIHN1cnZleTsgYW5kIDQpIGEgbWlzbWF0Y2ggYmV0d2VlbiBhIG11bHRpcGxlLWNob2ljZSBxdWVzdGlvbiBhc2tpbmcgcGVvcGxlIGhvdyBsb25nIHRoZXkgaGFkIGJlZW4gRmFjZWJvb2sgdXNlcnMsIGFuZCBhIHF1ZXN0aW9uIHRoYXQgYXNrZWQgdGhlbSB0byBlbnRlciB0aGUgZGF0ZSAobW9udGgsIGRheSBhbmQgeWVhcikgb2YgdGhlaXIgZmlyc3QgYWN0aXZpdHkgb24gRmFjZWJvb2ssIGJ5IGxvb2tpbmcgaXQgdXAgb24gdGhlaXIgRmFjZWJvb2sgQWN0aXZpdHkgTG9nIHBhZ2UuCgpIZXJlIGlzIHRoZSBudW1iZXIgb2YgcmVzcG9uc2VzIGV4Y2x1ZGVkIGZvciBlYWNoIHJlYXNvbiAodGhpcyBkb2VzIG5vdCBpbmNsdWRlIHBhcnRpY2lwYW50cyB3aG8gd2VyZSBpbmVsaWdpYmxlIG9yIGRlY2xpbmVkIGNvbnNlbnQpOgpgYGB7ciBleGNsdWRlZCBjb3VudCwgZWNobz1GQUxTRX0KIyBob3cgbWFueSBhY3R1YWwgcGFydGljaXBhbnRzICh3aXRoIHN0YXJ0IGRhdGUgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiBkYXRhIGNvbGxlY3Rpb24pIHdlcmUgZXhjbHVkZWQgZm9yIHZhcmlvdXMgcmVhc29ucz8KZC5leGNsdWRlZCAlPiUgZmlsdGVyKGV4Y2x1ZGVkICE9ICJpbmVsaWdpYmxlIiAmIGV4Y2x1ZGVkICE9ICJkZWNsaW5lZCBjb25zZW50IikgJT4lIGNvdW50KGV4Y2x1ZGVkKQpgYGAKCgojIFBhcnRpY2lwYW50IERlbW9ncmFwaGljcwoKYGBge3IgY3JlYXRlIG9iamVjdHM6IHBhcnRpY2lwYW50IG51bWJlcnMsIGVjaG89RkFMU0V9CnAgPC0gYmluZF9yb3dzKGQuZXhjbHVkZWQgJT4lIGNvdW50KGV4Y2x1ZGVkKSwgZCAlPiUgY291bnQoZXhjbHVkZWQpICU+JSBtdXRhdGUoZXhjbHVkZWQgPSBhcy5jaGFyYWN0ZXIoZXhjbHVkZWQpKSkKbnVtX2V4Y2x1ZGVkIDwtIGFzLmNoYXJhY3RlcihwICU+JSBmaWx0ZXIoZXhjbHVkZWQgJWluJSBjKCJmYWlsZWQgYXR0ZW50aW9uIGNoZWNrIiwgImZhaWxlZCBtYW5pcHVsYXRpb24gY2hlY2siLCAiZmluaXNoZWQgdG9vIHNsb3dseSIsICJpbmNvbXBsZXRlIiwgImdlbmRlciBub3QgTWFuIG9yIFdvbWFuIiwgInBvb3IgcXVhbGl0eSByZXNwb25zZSIpKSAlPiUgc3VtbWFyaXplKHN1bShuKSkpCgpkLmluY29tZSA8LSBkICU+JSBtdXRhdGUoaW5jb21lPWRwbHlyOjpyZWNvZGUoaW5jb21lLCBgTGVzcyB0aGFuICQyNSwwMDBgPSJCZWxvdyA3NWsiLCBgJDI1LDAwMCB0byAkMzQsOTk5YD0iQmVsb3cgNzVrIiwgYCQzNSwwMDAgdG8gJDQ5LDk5OWA9IkJlbG93IDc1ayIsIGAkNTAsMDAwIHRvICQ3NCw5OTlgPSJCZWxvdyA3NWsiLCBgJDc1LDAwMCB0byAkOTksOTk5YD0iQWJvdmUgNzVrIiwgYCQxMDAsMDAwIHRvICQxNDksOTk5YD0iQWJvdmUgNzVrIiwgYCQxNTAsMDAwIHRvICQxOTksOTk5YD0iQWJvdmUgNzVrIiwgYCQyMDAsMDAwIG9yIG1vcmVgPSJBYm92ZSA3NWsiKSkgJT4lIGdyb3VwX2J5KGluY29tZSkgJT4lIHN1bW1hcml6ZShjb3VudD1uKCkpICU+JSBtdXRhdGUocGVyY2VudD1jb3VudC9zdW0oY291bnQpKjEwMCkKCmdlbmRlcl9wZXJjZW50IDwtIGQgJT4lIGdyb3VwX2J5KGdlbmRlcikgJT4lIHN1bW1hcml6ZShjb3VudD1uKCkpICU+JSBtdXRhdGUocGVyY2VudD1jb3VudC9zdW0oY291bnQpKjEwMCkKZGFpbHlfdmlzaXRfcGVyY2VudCA8LSBkICU+JSBncm91cF9ieShmYl92aXNpdF9kYWlseSkgJT4lIHN1bW1hcml6ZShjb3VudD1uKCkpICU+JSBtdXRhdGUocGVyY2VudD1jb3VudC9zdW0oY291bnQpKjEwMCkKc3Rvcmllc19wb3N0ZWRfcGVyY2VudCA8LSBkICU+JSBncm91cF9ieShzdG9yaWVzX3Bvc3RlZCkgJT4lIHN1bW1hcml6ZShjb3VudD1uKCkpICU+JSBtdXRhdGUocGVyY2VudD1jb3VudC9zdW0oY291bnQpKjEwMCkKaG93X2xvbmdfcGVyY2VudCA8LSBkICU+JSBncm91cF9ieShmYl9ob3dfbG9uZykgJT4lIHN1bW1hcml6ZShjb3VudD1uKCkpICU+JSBtdXRhdGUocGVyY2VudD1jb3VudC9zdW0oY291bnQpKjEwMCkKCmV0aG5pY2l0eV9jb3VudHMgPC0gZCAlPiUgc2VsZWN0KGV0aG5pY2l0eV93aGl0ZSwgZXRobmljaXR5X2hpc3BhbmljLCBldGhuaWNpdHlfYmxhY2ssIGV0aG5pY2l0eV9hc2lhbiwgZXRobmljaXR5X25hdGl2ZV9hbSwgZXRobmljaXR5X21pZGRsZV9lYXN0ZXJuLCBldGhuaWNpdHlfcGFjaWZpYywgZXRobmljaXR5X290aGVyKSAlPiUgc3VtbWFyaXplKHdoaXRlID0gc3VtKGV0aG5pY2l0eV93aGl0ZSksIGhpc3BhbmljID0gc3VtKGV0aG5pY2l0eV9oaXNwYW5pYyksIGJsYWNrID0gc3VtKGV0aG5pY2l0eV9ibGFjayksIGFzaWFuID0gc3VtKGV0aG5pY2l0eV9hc2lhbiksIG5hdGl2ZV9hbSA9IHN1bShldGhuaWNpdHlfbmF0aXZlX2FtKSwgbWlkX2Vhc3QgPSBzdW0oZXRobmljaXR5X21pZGRsZV9lYXN0ZXJuKSwgcGFjaWZpYyA9IHN1bShldGhuaWNpdHlfcGFjaWZpYyksIG90aGVyID0gc3VtKGV0aG5pY2l0eV9vdGhlcikpCmV0aG5pY2l0eV9jb3VudHMgPC0gYXMuZGF0YS5mcmFtZSh0KGV0aG5pY2l0eV9jb3VudHMpKQpldGhuaWNpdHlfY291bnRzJGV0aG5pY2l0eSA8LSByb3cubmFtZXMoZXRobmljaXR5X2NvdW50cykKZXRobmljaXR5X2NvdW50cyRjb3VudHMgPC0gZXRobmljaXR5X2NvdW50cyRWMQpyb3cubmFtZXMoZXRobmljaXR5X2NvdW50cykgPC0gTlVMTApldGhuaWNpdHlfY291bnRzJFYxIDwtIE5VTEwKZXRobmljaXR5X2NvdW50cyA8LSBhcy50aWJibGUoZXRobmljaXR5X2NvdW50cykKYGBgCgpgYGB7ciBwYXJ0aWNpcGFudCB0YWJsZSBudW1iZXJzLCBlY2hvPUZBTFNFfQpldGhuaWNpdHkgPC0gZCAlPiUgCiAgc2VsZWN0KGV0aG5pY2l0eV93aGl0ZSwgZXRobmljaXR5X2hpc3BhbmljLCBldGhuaWNpdHlfYmxhY2ssIGV0aG5pY2l0eV9hc2lhbiwgZXRobmljaXR5X25hdGl2ZV9hbSwgZXRobmljaXR5X21pZGRsZV9lYXN0ZXJuLCBldGhuaWNpdHlfcGFjaWZpYywgZXRobmljaXR5X290aGVyKSAlPiUKICBtdXRhdGUobXVsdGlyYWNpYWw9ZXRobmljaXR5X3doaXRlK2V0aG5pY2l0eV9oaXNwYW5pYytldGhuaWNpdHlfYmxhY2srZXRobmljaXR5X2FzaWFuK2V0aG5pY2l0eV9uYXRpdmVfYW0gKyBldGhuaWNpdHlfbWlkZGxlX2Vhc3Rlcm4rZXRobmljaXR5X3BhY2lmaWMrZXRobmljaXR5X290aGVyKSAlPiUgbXV0YXRlKG11bHRpcmFjaWFsPWlmZWxzZShtdWx0aXJhY2lhbCA+IDEsIFRSVUUsIEZBTFNFKSkKCmUud2hpdGUgPC0gZXRobmljaXR5ICU+JSBmaWx0ZXIoZXRobmljaXR5X3doaXRlPT1UUlVFICYgbXVsdGlyYWNpYWw9PUZBTFNFKSAlPiUgY291bnQoKSAlPiUgbXV0YXRlKHBlcmNlbnQ9KG4vbGVuZ3RoKGQkUmVzcG9uc2VJRCkpKjEwMCkKZS5ibGFjayA8LSBldGhuaWNpdHkgJT4lIGZpbHRlcihldGhuaWNpdHlfYmxhY2s9PVRSVUUgJiBtdWx0aXJhY2lhbD09RkFMU0UpICU+JSBjb3VudCgpICU+JSBtdXRhdGUocGVyY2VudD0obi9sZW5ndGgoZCRSZXNwb25zZUlEKSkqMTAwKQplLmhpc3BhbmljIDwtIGV0aG5pY2l0eSAlPiUgZmlsdGVyKGV0aG5pY2l0eV9oaXNwYW5pYz09VFJVRSAmIG11bHRpcmFjaWFsPT1GQUxTRSkgJT4lIGNvdW50KCkgJT4lIG11dGF0ZShwZXJjZW50PShuL2xlbmd0aChkJFJlc3BvbnNlSUQpKSoxMDApCmUuYXNpYW4gPC0gZXRobmljaXR5ICU+JSBmaWx0ZXIoZXRobmljaXR5X2FzaWFuPT1UUlVFICYgbXVsdGlyYWNpYWw9PUZBTFNFKSAlPiUgY291bnQoKSAlPiUgbXV0YXRlKHBlcmNlbnQ9KG4vbGVuZ3RoKGQkUmVzcG9uc2VJRCkpKjEwMCkKZS5uYXRpdmUuYW0gPC0gZXRobmljaXR5ICU+JSBmaWx0ZXIoZXRobmljaXR5X25hdGl2ZV9hbT09VFJVRSAmIG11bHRpcmFjaWFsPT1GQUxTRSkgJT4lIGNvdW50KCkgJT4lIG11dGF0ZShwZXJjZW50PShuL2xlbmd0aChkJFJlc3BvbnNlSUQpKSoxMDApCmUubWlkZGxlLmVhc3Rlcm4gPC0gZXRobmljaXR5ICU+JSBmaWx0ZXIoZXRobmljaXR5X21pZGRsZV9lYXN0ZXJuPT1UUlVFICYgbXVsdGlyYWNpYWw9PUZBTFNFKSAlPiUgY291bnQoKSAlPiUgbXV0YXRlKHBlcmNlbnQ9KG4vbGVuZ3RoKGQkUmVzcG9uc2VJRCkpKjEwMCkKZS5wYWNpZmljIDwtIGV0aG5pY2l0eSAlPiUgZmlsdGVyKGV0aG5pY2l0eV9wYWNpZmljPT1UUlVFICYgbXVsdGlyYWNpYWw9PUZBTFNFKSAlPiUgY291bnQoKSAlPiUgbXV0YXRlKHBlcmNlbnQ9KG4vbGVuZ3RoKGQkUmVzcG9uc2VJRCkpKjEwMCkKZS5tdWx0aXJhY2lhbCA8LSBldGhuaWNpdHkgJT4lIGZpbHRlcihtdWx0aXJhY2lhbD09VFJVRSB8IGV0aG5pY2l0eV9vdGhlcj09VFJVRSkgJT4lIGNvdW50KCkgJT4lIG11dGF0ZShwZXJjZW50PShuL2xlbmd0aChkJFJlc3BvbnNlSUQpKSoxMDApCgpkLmluY29tZTIgPC0gZCAlPiUgbXV0YXRlKGluY29tZT1kcGx5cjo6cmVjb2RlKGluY29tZSxgJDE1MCwwMDAgdG8gJDE5OSw5OTlgPSIkMTUwLDAwMCBvciBtb3JlIiwgYCQyMDAsMDAwIG9yIG1vcmVgPSIkMTUwLDAwMCBvciBtb3JlIikpICU+JSBncm91cF9ieShpbmNvbWUpICU+JSBzdW1tYXJpemUoY291bnQ9bigpKSAlPiUgbXV0YXRlKHBlcmNlbnQ9Y291bnQvc3VtKGNvdW50KSoxMDApCgpkLmVkdWNhdGlvbiA8LSBkICU+JSBtdXRhdGUoZWR1Y2F0aW9uPWRwbHlyOjpyZWNvZGUoZWR1Y2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIGBOb25lLCBvciBncmFkZXMgMS04YD0iTm8gaGlnaCBzY2hvb2wgZGVncmVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYFNvbWUgaGlnaCBzY2hvb2xgPSJObyBoaWdoIHNjaG9vbCBkZWdyZWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBgSGlnaCBzY2hvb2wgZ3JhZHVhdGUgb3IgR0VEIGNlcnRpZmljYXRlYD0iSGlnaCBzY2hvb2wgZ3JhZCwgb3IgR0VEIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYFRlY2huaWNhbCwgdHJhZGUsIG9yIHZvY2F0aW9uYWwgc2Nob29sIEFGVEVSIGhpZ2ggc2Nob29sYD0iU29tZSBjb2xsZWdlLCBvciB2b2NhdGlvbmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYFNvbWUgY29sbGVnZSwgbm8gNC15ZWFyIGRlZ3JlZWA9IlNvbWUgY29sbGVnZSwgb3Igdm9jYXRpb25hbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGBTb21lIHBvc3RncmFkdWF0ZSBvciBwcm9mZXNzaW9uYWwgc2Nob29saW5nLCBubyBwb3N0Z3JhZHVhdGUgZGVncmVlYD0iU29tZSBncmFkIHNjaG9vbCwgb3IgZ3JhZCBkZWdyZWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBgUG9zdGdyYWR1YXRlIG9yIHByb2Zlc3Npb25hbCBkZWdyZWUsIGluY2x1ZGluZyBtYXN0ZXLigJlzLCBkb2N0b3JhdGUsIG1lZGljYWwgb3IgbGF3IGRlZ3JlZWA9IlNvbWUgZ3JhZCBzY2hvb2wsIG9yIGdyYWQgZGVncmVlIikpICU+JSBjb3VudChlZHVjYXRpb24pICU+JSBtdXRhdGUocGVyY2VudD0obi9sZW5ndGgoZCRSZXNwb25zZUlEKSkqMTAwKQoKZC5mYi52aXNpdCA8LSBkICU+JSBtdXRhdGUoZmJfdmlzaXQ9ZHBseXI6OnJlY29kZShmYl92aXNpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBgQWJvdXQgb25jZSBwZXIgbW9udGhgPSJPbmNlIHBlciB3ZWVrIG9yIGxlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGBBIGZldyB0aW1lcyBwZXIgbW9udGhgPSJPbmNlIHBlciB3ZWVrIG9yIGxlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGBBYm91dCBvbmNlIHBlciB3ZWVrYD0iT25jZSBwZXIgd2VlayBvciBsZXNzIikpICU+JSBjb3VudChmYl92aXNpdCkgJT4lIG11dGF0ZShwZXJjZW50PShuL2xlbmd0aChkJFJlc3BvbnNlSUQpKSoxMDApCmBgYAoKKipBZ2UqKiAgCm1lYW46IGByIHJvdW5kKG1lYW4oZCRhZ2UpLCBkaWdpdHM9MilgICAKc2Q6IGByIHJvdW5kKHNkKGQkYWdlKSwgZGlnaXRzPTIpYCAgCnJhbmdlOiBgciByb3VuZChyYW5nZShkJGFnZSksIGRpZ2l0cz0yKWAKCioqR2VuZGVyKiogIApXb21lbjogYHIgYXMuY2hhcmFjdGVyKGdlbmRlcl9wZXJjZW50JGNvdW50WzJdKWAgKGByIGFzLmNoYXJhY3Rlcihyb3VuZChnZW5kZXJfcGVyY2VudCRwZXJjZW50WzJdLCBkaWdpdHM9MikpYCUpICAKTWVuOiBgciBhcy5jaGFyYWN0ZXIoZ2VuZGVyX3BlcmNlbnQkY291bnRbMV0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGdlbmRlcl9wZXJjZW50JHBlcmNlbnRbMV0sIGRpZ2l0cz0yKSlgJSkgCgoqKkV0aG5pY2l0eSoqICAKV2hpdGU6IGByIGFzLmNoYXJhY3RlcihlLndoaXRlJG4pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGUud2hpdGUkcGVyY2VudCwgZGlnaXRzPTIpKWAlKSAgCkhpc3BhbmljLCBMYXRpbm8gb3IgU3BhbmlzaDogYHIgYXMuY2hhcmFjdGVyKGUuaGlzcGFuaWMkbilgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZS5oaXNwYW5pYyRwZXJjZW50LCBkaWdpdHM9MikpYCUpICAKQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbjogYHIgYXMuY2hhcmFjdGVyKGUuYmxhY2skbilgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZS5ibGFjayRwZXJjZW50LCBkaWdpdHM9MikpYCUpICAKQXNpYW46IGByIGFzLmNoYXJhY3RlcihlLmFzaWFuJG4pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGUuYXNpYW4kcGVyY2VudCwgZGlnaXRzPTIpKWAlKSAgCkFtZXJpY2FuIEluZGlhbiBvciBBbGFza2EgTmF0aXZlOiBgciBhcy5jaGFyYWN0ZXIoZS5uYXRpdmUuYW0kbilgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZS5uYXRpdmUuYW0kcGVyY2VudCwgZGlnaXRzPTIpKWA1KSAgCk5hdGl2ZSBIYXdhaWlhbiAvIFBhY2lmaWMgSXNsYW5kZXI6IGByIGFzLmNoYXJhY3RlcihlLnBhY2lmaWMkbilgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZS5wYWNpZmljJHBlcmNlbnQsIGRpZ2l0cz0yKSlgJSkgIApNdWx0aXJhY2lhbCAvIE90aGVyOiBgciBhcy5jaGFyYWN0ZXIoZS5tdWx0aXJhY2lhbCRuKWAgKGByIGFzLmNoYXJhY3Rlcihyb3VuZChlLm11bHRpcmFjaWFsJHBlcmNlbnQsIGRpZ2l0cz0yKSlgJSkgIAoKKk5vdGU6IGV0aG5pY2l0eSBjYXRlZ29yeSBjb3VudHMgYXJlIGFkanVzdGVkIHRvIGFjY291bnQgZm9yIHRoZSBwYXJ0aWNpcGFudHMgd2hvIHJlcG9ydGVkIGJlaW5nIG11bHRpLXJhY2lhbC4gT3RoZXJ3aXNlLCBhcHByb3hpbWF0ZWx5IDM1IHBlb3BsZSB3b3VsZCBiZSBjb3VudGVkIGluIG1vcmUgdGhhbiBvbmUgY2F0ZWdvcnkuKgoKKipFZHVjYXRpb24qKiAgCk5vIGhpZ2ggc2Nob29sIGRlZ3JlZTogYHIgYXMuY2hhcmFjdGVyKGQuZWR1Y2F0aW9uJG5bMV0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGQuZWR1Y2F0aW9uJHBlcmNlbnRbMV0sIGRpZ2l0cz0yKSlgJSkgIApIaWdoIHNjaG9vbCBncmFkLCBvciBHRUQ6IGByIGFzLmNoYXJhY3RlcihkLmVkdWNhdGlvbiRuWzJdKWAgKGByIGFzLmNoYXJhY3Rlcihyb3VuZChkLmVkdWNhdGlvbiRwZXJjZW50WzJdLCBkaWdpdHM9MikpYCUpICAKU29tZSBjb2xsZWdlLCBvciB2b2NhdGlvbmFsOiBgciBhcy5jaGFyYWN0ZXIoZC5lZHVjYXRpb24kblszXSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5lZHVjYXRpb24kcGVyY2VudFszXSwgZGlnaXRzPTIpKWAlKSAgCjQteWVhciBjb2xsZWdlIGRlZ3JlZTogYHIgYXMuY2hhcmFjdGVyKGQuZWR1Y2F0aW9uJG5bNF0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGQuZWR1Y2F0aW9uJHBlcmNlbnRbNF0sIGRpZ2l0cz0yKSlgJSkgIApTb21lIGdyYWQgc2Nob29sLCBvciBncmFkIGRlZ3JlZTogYHIgYXMuY2hhcmFjdGVyKGQuZWR1Y2F0aW9uJG5bNV0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGQuZWR1Y2F0aW9uJHBlcmNlbnRbNV0sIGRpZ2l0cz0yKSlgJSkgIAoKKipJbmNvbWUqKiAgCkxlc3MgdGhhbiBcJDI1LDAwMDogYHIgYXMuY2hhcmFjdGVyKGQuaW5jb21lMiRjb3VudFsxXSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5pbmNvbWUyJHBlcmNlbnRbMV0sIGRpZ2l0cz0yKSlgJSkgIApcJDI1LDAwMCB0byBcJDM0LDk5OTogYHIgYXMuY2hhcmFjdGVyKGQuaW5jb21lMiRjb3VudFsyXSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5pbmNvbWUyJHBlcmNlbnRbMl0sIGRpZ2l0cz0yKSlgJSkgIApcJDM1LDAwMCB0byBcJDQ5LDk5OTogYHIgYXMuY2hhcmFjdGVyKGQuaW5jb21lMiRjb3VudFszXSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5pbmNvbWUyJHBlcmNlbnRbM10sIGRpZ2l0cz0yKSlgJSkgIApcJDUwLDAwMCB0byBcJDc0LDk5OTogYHIgYXMuY2hhcmFjdGVyKGQuaW5jb21lMiRjb3VudFs0XSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5pbmNvbWUyJHBlcmNlbnRbNF0sIGRpZ2l0cz0yKSlgJSkgIApcJDc1LDAwMCB0byBcJDk5LDk5OTogYHIgYXMuY2hhcmFjdGVyKGQuaW5jb21lMiRjb3VudFs1XSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5pbmNvbWUyJHBlcmNlbnRbNV0sIGRpZ2l0cz0yKSlgJSkgIApcJDEwMCwwMDAgdG8gXCQxNDksOTk5OiBgciBhcy5jaGFyYWN0ZXIoZC5pbmNvbWUyJGNvdW50WzZdKWAgKGByIGFzLmNoYXJhY3Rlcihyb3VuZChkLmluY29tZTIkcGVyY2VudFs2XSwgZGlnaXRzPTIpKWA1KSAgClwkMTUwLDAwMCBvciBtb3JlOiBgciBhcy5jaGFyYWN0ZXIoZC5pbmNvbWUyJGNvdW50WzddKWAgKGByIGFzLmNoYXJhY3Rlcihyb3VuZChkLmluY29tZTIkcGVyY2VudFs3XSwgZGlnaXRzPTIpKWAlKSAgCgoqKk51bWJlciBvZiBGYWNlYm9vayBGcmllbmRzKiogIAptZWFuOiBgciByb3VuZChtZWFuKGQkZmJfZnJpZW5kcyksIGRpZ2l0cz0yKWAgIApzZDogYHIgcm91bmQoc2QoZCRmYl9mcmllbmRzKSwgZGlnaXRzPTIpYCAgCnJhbmdlOiBgciByb3VuZChyYW5nZShkJGZiX2ZyaWVuZHMpLCBkaWdpdHM9MilgCgoqKkZyZXF1ZW5jeSBvZiBWaXN0aW5nIEZhY2Vib29rKiogIApTZXZlcmFsIHRpbWVzIHBlciBkYXk6IGByIGFzLmNoYXJhY3RlcihkLmZiLnZpc2l0JG5bNF0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGQuZmIudmlzaXQkcGVyY2VudFs0XSwgZGlnaXRzPTIpKWAlKSAgCkFib3V0IG9uY2UgcGVyIGRheTogYHIgYXMuY2hhcmFjdGVyKGQuZmIudmlzaXQkblszXSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5mYi52aXNpdCRwZXJjZW50WzNdLCBkaWdpdHM9MikpYCUpICAKQSBmZXcgdGltZXMgcGVyIHdlZWs6IGByIGFzLmNoYXJhY3RlcihkLmZiLnZpc2l0JG5bMl0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKGQuZmIudmlzaXQkcGVyY2VudFsyXSwgZGlnaXRzPTIpKWAlKSAgCk9uY2UgcGVyIHdlZWsgb3IgbGVzczogYHIgYXMuY2hhcmFjdGVyKGQuZmIudmlzaXQkblsxXSlgIChgciBhcy5jaGFyYWN0ZXIocm91bmQoZC5mYi52aXNpdCRwZXJjZW50WzFdLCBkaWdpdHM9MikpYCUpICAKCioqUG9zdGVkIHN0b3J5IGluIHRoZSBwYXN0IHdlZWs/KiogIAp5ZXM6IGByIGFzLmNoYXJhY3RlcihzdG9yaWVzX3Bvc3RlZF9wZXJjZW50JGNvdW50WzJdKWAgKGByIGFzLmNoYXJhY3Rlcihyb3VuZChzdG9yaWVzX3Bvc3RlZF9wZXJjZW50JHBlcmNlbnRbMl0sIGRpZ2l0cz0yKSlgJSkgIApubzogYHIgYXMuY2hhcmFjdGVyKHN0b3JpZXNfcG9zdGVkX3BlcmNlbnQkY291bnRbMV0pYCAoYHIgYXMuY2hhcmFjdGVyKHJvdW5kKHN0b3JpZXNfcG9zdGVkX3BlcmNlbnQkcGVyY2VudFsxXSwgZGlnaXRzPTIpKWAlKSAgCgoqKlllYXJzIFNpbmNlIENyZWF0aW5nIEZhY2Vib29rIEFjY291bnQqKiAgCm1lYW46IGByIHJvdW5kKG1lYW4oZCR5ZWFyX2RpZmYpLCBkaWdpdHM9MilgICAKc2Q6IGByIHJvdW5kKHNkKGQkeWVhcl9kaWZmKSwgZGlnaXRzPTIpYCAgCnJhbmdlOiBgciByb3VuZChyYW5nZShkJHllYXJfZGlmZiksIGRpZ2l0cz0yKWAKCgoKCiNFeHBlcmltZW50IE1hbmlwdWxhdGlvbgoKKk5vdGU6IEVhY2ggZXhwbGFuYXRpb24gaGFzIHRocmVlIGRpZmZlcmVudCBtYW5pcHVsYXRpb24gY2hlY2sgcXVlc3Rpb25zIGFuZCB0aGUgY29ycmVjdCBhbnN3ZXJzIHRvIGVhY2ggcXVlc3Rpb24gYXJlIGluIGJvbGQgdHlwZS4qCgpQaWxvdHMgb2YgdGhlIGV4cGxhbmF0aW9uczogV2UgZGlkIGluaXRpYWwgdGhpbmstYWxvdWQgcGlsb3RzIG9mIHRoZSBleHBsYW5hdGlvbnMgYW5kIG1hbmlwdWxhdGlvbiBjaGVjayBxdWVzdGlvbnMgd2l0aCBtZW1iZXJzIG9mIG91ciBsYWIsIGFuZCByZXZpc2VkIHRoZSBleHBsYW5hdGlvbnMuIFdlIHRoZW4gZGlkIHR3byByb3VuZHMgb2YgcGlsb3RpbmcgdXNpbmcgQW1hem9uIE1lY2hhbmljYWwgVHVyayB3b3JrZXJzIGFzIHBhcnRpY2lwYW50cywgYW5kIHJldmlzZWQgdGhlIGV4cGxhbmF0aW9ucyBhbmQgcXVlc3Rpb25zIGJldHdlZW4gdGhlIHR3byByb3VuZHMuIFdlIGFza2VkIHBhcnRpY2lwYW50cyB0byByYXRlIGhvdyBuZXcgdGhlIGluZm9ybWF0aW9uIHdhcyB0byB0aGVtLCB0aGUgdG9uZSBvZiB0aGUgdGV4dCwgdGhlIGNsYXJpdHkgb2YgdGhlIHRleHQsIGFuZCB0aGUgYmVsaWV2YWJpbGl0eSBvZiB0aGUgdGV4dCwgYW5kIGNvbXBhcmVkIG1lYW5zIGFjcm9zcyBjb25kaXRpb25zLiBEaWZmaWN1bHR5IHdhcyBiYXNlZCBvbiB0aW1lIHRvIHJlYWQgdGhlIGV4cGxhbmF0aW9ucywgYW5kIHRoZSBGbGVzY2ggS2luY2FpZCByZWFkaW5nIGxldmVsIGNhbGN1bGF0aW9uIGF2YWlsYWJsZSBpbiBNUyBXb3JkLgoKIyMgIldoYXQiIEV4cGxhbmF0aW9uCgoqKDE5OCB3b3JkczsgRmxlc2NoLUtpbmNhaWQgR3JhZGUgTGV2ZWwgMTAuNikqICAKVGhlIHN0b3JpZXMgcGVvcGxlIHNlZSBpbiB0aGVpciBGYWNlYm9vayBOZXdzIEZlZWRzIGFyZSBvbmx5IHNvbWUgb2YgdGhlIHN0b3JpZXMgY3JlYXRlZCBieSB0aGVpciBGYWNlYm9vayBmcmllbmRzLCBwZW9wbGUgdGhleSAiZm9sbG93IiwgUGFnZXMgdGhleSAibGlrZSIsIGFuZCBncm91cHMgdGhleSBiZWxvbmcgdG8uIFRoZSBOZXdzIEZlZWQgZG9lcyBub3Qgc2hvdyBwZW9wbGUgZXZlcnkgcG9zc2libGUgc3RvcnkuIEluc3RlYWQsIHRoZXJlIGlzIGFuIGFsZ29yaXRobSAoYSBmb3JtdWxhIG9yIHNldCBvZiBydWxlcykgdGhhdCBtYWtlcyBhIGd1ZXNzIGFib3V0IHdoaWNoIHN0b3JpZXMgcGVvcGxlIHdhbnQgdG8gc2VlLCBhbmQgdGhlIG9yZGVyIHRoYXQgdGhleSdsbCB3YW50IHRvIHNlZSB0aGVtIGluLiBFYWNoIHBlcnNvbidzIE5ld3MgRmVlZCBpcyBhIHVuaXF1ZSBsaXN0IG9mIHN0b3JpZXMgY3JlYXRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZW0uIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RvcmllcyBpbiBvbmUgcGVyc29u4oCZcyBOZXdzIEZlZWQgbWF5IGJlIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdGhlIHN0b3JpZXMgaW4gYW5vdGhlciBwZXJzb27igJlzIE5ld3MgRmVlZC4KClRoZSBOZXdzIEZlZWQgZG9lcyBub3Qgc2hvdyBzdG9yaWVzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBjcmVhdGVkLCB1bmxlc3MgcGVvcGxlIGNoYW5nZSBhIHNldHRpbmcgdGhhdCBjYXVzZXMgdGhlIHN0b3JpZXMgdG8gYmUgc2hvd24gaW4gIk1vc3QgUmVjZW50IiBvcmRlciBmb3IgYSBsaXR0bGUgd2hpbGUuIEluc3RlYWQsIHRoZSBzdG9yaWVzIGF0IHRoZSB0b3Agb2YgdGhlIE5ld3MgRmVlZCBhcmUgdGhlIHN0b3JpZXMgdGhlIGFsZ29yaXRobSBoYXMgYXV0b21hdGljYWxseSBjaG9zZW4gdG8gc2hvdyBmaXJzdC4gVGhpcyBtZWFucyB0aGF0IHBlb3BsZSBhcmUgbW9yZSBsaWtlbHkgdG8gc2VlIHN0b3JpZXMgdGhhdCB0aGUgYWxnb3JpdGhtIGhhcyBkZWNpZGVkIHRvIHB1dCBoaWdoZXIgdXAgaW4gdGhlIE5ld3MgRmVlZCwgYW5kIG1heSBtaXNzIHN0b3JpZXMgaXQgaGFzIGRlY2lkZWQgdG8gcHV0IGxvd2VyIGRvd24uCgojIyMgIldoYXQiIGNvbmRpdGlvbiBtYW5pcHVsYXRpb24gY2hlY2sgcXVlc3Rpb25zCgoxLiBUaGUgdGV4dCBJIGp1c3QgcmVhZCBkaXNjdXNzZWTigKYKICAgIC0gVGhlIHR5cGVzIG9mIGFkcyBGYWNlYm9vayBhbGxvd3MgdW5kZXIgaXRzIGFkdmVydGlzaW5nIHBvbGljeS4KICAgIC0gKipGYWNlYm9va+KAmXMgYWxnb3JpdGhtIHRoYXQgcGVyc29uYWxpemVzIHRoZSBOZXdzIEZlZWQuKioKICAgIC0gVGhlIHVzZSBvZiBGYWNlYm9vayBmb3Igb3JnYW5pemluZyBldmVudHMuCiAgICAtIFRoZSBkaWZmZXJlbnQga2luZHMgb2YgRmFjZWJvb2sgYXBwcyB0aGF0IGFyZSBhdmFpbGFibGUuCiAgICAtIE5vbmUgb2YgdGhlIGFib3ZlLgogIAoyLiBDaG9vc2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpc3QgYmVsb3cgdGhhdCB3YXMgaW4gdGhlIHRleHQgdGhhdCB5b3UgcmVhZDoKICAgIC0gVGhlIHN0b3JpZXMgaW4gdGhlIE5ld3MgRmVlZCBhcmUgYWxsIGNyZWF0ZWQgYnkgRmFjZWJvb2sgZW1wbG95ZWVzLgogICAgLSBTdG9yaWVzIGFib3V0IGtpdHRlbnMgYXJlIG1vcmUgcG9wdWxhciB0aGFuIGFsbCBvdGhlciB0eXBlcyBvZiBzdG9yaWVzIGluIHRoZSBOZXdzIEZlZWQuCiAgICAtIFRoZSBOZXdzIEZlZWQgd2FzIGZpcnN0IGF2YWlsYWJsZSB0byB1c2VycyBvbiBTZXB0ZW1iZXIgNiwgMjAwNi4KICAgIC0gKipUaGUgc3RvcmllcyBpbiB0aGUgTmV3cyBGZWVkIGFyZSBub3QgcHJlc2VudGVkIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGNyZWF0ZWQuKioKICAgIC0gTm9uZSBvZiB0aGUgYWJvdmUuCgozLiBXaGljaCBvZiB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgaXMgdHJ1ZT8KICAgIC0gRmFjZWJvb2sgd2FzIGZpcnN0IGNyZWF0ZWQgYXQgU3RhbmZvcmQgVW5pdmVyc2l0eSBpbiBDYWxpZm9ybmlhLgogICAgLSBFbmdsaXNoIChQaXJhdGUpIGFuZCBLbGluZ29uIGFyZSB0d28gb2YgdGhlIGxhbmd1YWdlIG9wdGlvbnMgb2ZmZXJlZCBieSBGYWNlYm9vay4KICAgIC0gKipUaGUgTmV3cyBGZWVkIGhhcyBhICJNb3N0IFJlY2VudCIgc2V0dGluZy4qKgogICAgLSBGYWNlYm9vaydzIG1haW4gdXNlciBpbnRlcmZhY2UgY29sb3IgaXMgYmx1ZSwgYmVjYXVzZSBibHVlIGlzIE1hcmsgWnVja2VyYmVyZydzIGZhdm9yaXRlIGNvbG9yLgogICAgLSBOb25lIG9mIHRoZSBhYm92ZS4KCiMjICJIb3ciIEV4cGxhbmF0aW9uCgoqKDE5NCB3b3JkczsgRmxlc2NoLUtpbmNhaWQgR3JhZGUgTGV2ZWwgMTAuNykqICAKV2hlbiBhIHBlcnNvbiB2aXNpdHMgRmFjZWJvb2ssIHRob3VzYW5kcyBvZiBwaWVjZXMgb2YgaW5mb3JtYXRpb24gY2FsbGVkICJzaWduYWxzIiBhcmUgY29sbGVjdGVkIGFib3V0IHRoZWlyIGFjdGlvbnMgd2hpbGUgdGhleSB2aWV3IHN0b3JpZXMgaW4gdGhlaXIgTmV3cyBGZWVkcy4gU2lnbmFscyBwcm92aWRlIGNsdWVzIGFib3V0IHRoZSBraW5kcyBvZiBzdG9yaWVzIHBlb3BsZSB3YW50IHRvIHNlZS4gRmFjZWJvb2sgdXNlcyBhbiBhbGdvcml0aG0gKGEgZm9ybXVsYSBvciBzZXQgb2YgcnVsZXMpIHRvIGNhbGN1bGF0ZSBhIHNjb3JlIGZvciBhbGwgdGhlIHBvc3NpYmxlIHN0b3JpZXMgdGhhdCBjb3VsZCBhcHBlYXIgaW4gYSBwZXJzb24ncyBOZXdzIEZlZWQuIFRoZSBzY29yZSBpcyBiYXNlZCBvbiB0aGUgc2lnbmFscyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQsIGFuZCBpdCBpcyB1c2VkIHRvIHB1dCB0aGUgc3RvcmllcyBpbiBvcmRlci4gVGhlIHN0b3JpZXMgdGhhdCBhcmUgaGlnaGVyIHVwIGluIHRoZSBsaXN0IGFyZSB0aGUgb25lcyB0aGUgYWxnb3JpdGhtIGhhcyBndWVzc2VkIHRoZSBwZXJzb24gd2lsbCBsaWtlIHRoZSBtb3N0LCBzbyBpdCBzaG93cyB0aG9zZSBzdG9yaWVzIGZpcnN0LgoKRm9yIGV4YW1wbGUsIGlmIGEgcGVyc29uIGFsd2F5cyAibGlrZXMiIHN0b3JpZXMgcG9zdGVkIGJ5IGEgY2VydGFpbiBmcmllbmQsIHRoYXQgc2lnbmFsIHRlbGxzIHRoZSBhbGdvcml0aG0gdGhhdCBpdCBzaG91bGQgY2hvb3NlIG1vcmUgc3RvcmllcyBmcm9tIHRoYXQgZnJpZW5kIHRvIHNob3cgaGlnaGVyIHVwIGluIHRoZSBwZXJzb24ncyBOZXdzIEZlZWQuIEFub3RoZXIgc2lnbmFsIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgImxpa2VzIiBhIHBhcnRpY3VsYXIgc3RvcnkgaGFzIHJlY2VpdmVkIGZyb20gZXZlcnlvbmUgb24gRmFjZWJvb2sgd2hvIHNhdyB0aGUgc3RvcnkuIElmIHRoZSBzdG9yeSBoYXMgb25seSBhIGZldyAibGlrZXMiLCB0aGUgYWxnb3JpdGhtIGFzc3VtZXMgdGhlIHN0b3J5IGlzbid0IHZlcnkgcG9wdWxhciwgYW5kIG1vc3QgcGVvcGxlIHdvbid0IHdhbnQgdG8gc2VlIGl0LiAKCiMjIyAiSG93IiBjb25kaXRpb24gbWFuaXB1bGF0aW9uIGNoZWNrIHF1ZXN0aW9ucwoKMS4gVGhlIHRleHQgSSBqdXN0IHJlYWQgZGlzY3Vzc2Vk4oCmCiAgICAtIFRoZSB0eXBlcyBvZiBhZHMgRmFjZWJvb2sgYWxsb3dzIHVuZGVyIGl0cyBhZHZlcnRpc2luZyBwb2xpY3kuCiAgICAtICoqVGhlIHNpZ25hbHMgRmFjZWJvb2vigJlzIE5ld3MgRmVlZCBhbGdvcml0aG0gY29uc2lkZXJzLioqCiAgICAtIFRoZSB1c2Ugb2YgRmFjZWJvb2sgZm9yIG9yZ2FuaXppbmcgZXZlbnRzLgogICAgLSBUaGUgZGlmZmVyZW50IGtpbmRzIG9mIEZhY2Vib29rIGFwcHMgdGhhdCBhcmUgYXZhaWxhYmxlLgogICAgLSBOb25lIG9mIHRoZSBhYm92ZS4KCjIuIENob29zZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGlzdCBiZWxvdyB0aGF0IHdhcyBpbiB0aGUgdGV4dCB0aGF0IHlvdSByZWFkOgogICAgLSBUaGUgc3RvcmllcyBpbiB0aGUgTmV3cyBGZWVkIGFyZSBhbGwgY3JlYXRlZCBieSBGYWNlYm9vayBlbXBsb3llZXMuCiAgICAtIFN0b3JpZXMgYWJvdXQga2l0dGVucyBhcmUgbW9yZSBwb3B1bGFyIHRoYW4gYWxsIG90aGVyIHR5cGVzIG9mIHN0b3JpZXMgaW4gdGhlIE5ld3MgRmVlZC4KICAgIC0gVGhlIE5ld3MgRmVlZCB3YXMgZmlyc3QgYXZhaWxhYmxlIHRvIHVzZXJzIG9uIFNlcHRlbWJlciA2LCAyMDA2LgogICAgLSAqKlRoZSBvcmRlciBvZiB0aGUgc3RvcmllcyBpbiB0aGUgTmV3cyBGZWVkIGlzIGJhc2VkIG9uIGEgc2NvcmUgY2FsY3VsYXRlZCBieSB0aGUgYWxnb3JpdGhtLioqCiAgICAtIE5vbmUgb2YgdGhlIGFib3ZlLgoKMy4gV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGlzIHRydWU/CiAgICAtIEZhY2Vib29rIHdhcyBmaXJzdCBjcmVhdGVkIGF0IFN0YW5mb3JkIFVuaXZlcnNpdHkgaW4gQ2FsaWZvcm5pYS4KICAgIC0gRW5nbGlzaCAoUGlyYXRlKSBhbmQgS2xpbmdvbiBhcmUgdHdvIG9mIHRoZSBsYW5ndWFnZSBvcHRpb25zIG9mZmVyZWQgYnkgRmFjZWJvb2suCiAgICAtICoqIkxpa2VzIiBvbiBzdG9yaWVzIGluZGljYXRlIHBlb3BsZSdzIHByZWZlcmVuY2VzLioqCiAgICAtIEZhY2Vib29rJ3MgbWFpbiB1c2VyIGludGVyZmFjZSBjb2xvciBpcyBibHVlLCBiZWNhdXNlIGJsdWUgaXMgTWFyayBadWNrZXJiZXJnJ3MgZmF2b3JpdGUgY29sb3IuCiAgICAtIE5vbmUgb2YgdGhlIGFib3ZlLgoKIyMgIldoeSIgRXhwbGFuYXRpb24KCiooMjAyIHdvcmRzOyBGbGVzY2gtS2luY2FpZCBHcmFkZSBMZXZlbCAxMC43KSogIApFYWNoIHRpbWUgYSBwZXJzb24gdmlzaXRzIEZhY2Vib29rLCB0aGVyZSBhcmUgdGhvdXNhbmRzIG9mIHN0b3JpZXMgcG9zdGVkIGJ5IHRoZSBwZW9wbGUsIFBhZ2VzIGFuZCBncm91cHMgdGhleSdyZSBjb25uZWN0ZWQgdG8gdGhhdCBjb3VsZCBwb3NzaWJseSBiZSBzaG93biB0byB0aGVtIGluIHRoZWlyIE5ld3MgRmVlZHMuIEJ1dCwgdGhpcyBpcyB0b28gbWFueSBzdG9yaWVzIGZvciBtb3N0IHBlb3BsZSB0byBiZSBhYmxlIHRvIHNlZSB0aGVtIGFsbC4gQWxzbywgc29tZSBvZiB0aGUgc3RvcmllcyBtYXkgYmUgb25lcyB0aGF0IHBlb3BsZSB3b3VsZCBwcmVmZXIgbm90IHRvIHNlZSwgd2hpbGUgb3RoZXIgc3RvcmllcyBtYXkgYmUgbW9yZSBpbXBvcnRhbnQgdG8gdGhlbS4gRmFjZWJvb2vigJlzIGdvYWwgZm9yIHRoZSBOZXdzIEZlZWQgaXMgdG8gc2hvdyBwZW9wbGUgc3RvcmllcyB0aGF0IGFyZSBpbnRlcmVzdGluZyBhbmQgcmVsZXZhbnQuCgpUbyBhY2NvbXBsaXNoIHRoaXMgZ29hbCwgdGhlIE5ld3MgRmVlZCBjYW4ndCBzaG93IGV2ZXJ5IHBvc3NpYmxlIHN0b3J5LiBJbnN0ZWFkLCBGYWNlYm9vayB1c2VzIGFuIGFsZ29yaXRobSAoYSBmb3JtdWxhIG9yIHNldCBvZiBydWxlcykgdG8gYXV0b21hdGljYWxseSBjaG9vc2Ugc29tZSBvZiB0aGUgYXZhaWxhYmxlIHN0b3JpZXMgZm9yIHRoZSBOZXdzIEZlZWQuIFRoZSBhbGdvcml0aG0gY2hvb3NlcyBzdG9yaWVzIGl0IGV4cGVjdHMgdG8gYmUgaGlnaCBxdWFsaXR5IGFuZCB0aGF0IHBlb3BsZSBtYXkgImxpa2UiIG9yIGNvbW1lbnQgb24gb3Igc2hhcmUsIGFuZCBub3Qgc3RvcmllcyBpdCBoYXMgZGV0ZXJtaW5lZCB0byBiZSBvdXRkYXRlZCwgc3BhbSwgb3IgbWlzbGVhZGluZy4gVGhlIGFsZ29yaXRobSBhbHNvIGRlY2lkZXMgdGhlIG9yZGVyIHRoZSBzdG9yaWVzIGFyZSBzaG93biBpbiBmb3IgZWFjaCBwZXJzb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUgYWxnb3JpdGhtIG1heSBjaG9vc2UgZGlmZmVyZW50IHN0b3JpZXMgdG8gc2hvdyB0byBkaWZmZXJlbnQgcGVvcGxlIGV2ZW4gaWYgdGhleSBoYXZlIHRoZSBzYW1lIEZhY2Vib29rIGZyaWVuZHMsIGRlcGVuZGluZyBvbiBpdHMgZ3Vlc3MgYWJvdXQgd2hhdCBtYXR0ZXJzIG1vc3QgdG8gZWFjaCBwZXJzb24uCgojIyMgIldoeSIgY29uZGl0aW9uIG1hbmlwdWxhdGlvbiBjaGVjayBxdWVzdGlvbnMKCjEuIFRoZSB0ZXh0IEkganVzdCByZWFkIGRpc2N1c3NlZOKApgogICAgLSBUaGUgdHlwZXMgb2YgYWRzIEZhY2Vib29rIGFsbG93cyB1bmRlciBpdHMgYWR2ZXJ0aXNpbmcgcG9saWN5LgogICAgLSAqKlRoZSBnb2FscyBvZiB0aGUgRmFjZWJvb2sgTmV3cyBGZWVkIGFsZ29yaXRobS4qKgogICAgLSBUaGUgdXNlIG9mIEZhY2Vib29rIGZvciBvcmdhbml6aW5nIGV2ZW50cy4KICAgIC0gVGhlIGRpZmZlcmVudCBraW5kcyBvZiBGYWNlYm9vayBhcHBzIHRoYXQgYXJlIGF2YWlsYWJsZS4KICAgIC0gTm9uZSBvZiB0aGUgYWJvdmUuCgoyLiBDaG9vc2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpc3QgYmVsb3cgdGhhdCB3YXMgaW4gdGhlIHRleHQgdGhhdCB5b3UgcmVhZDoKICAgIC0gVGhlIHN0b3JpZXMgaW4gdGhlIE5ld3MgRmVlZCBhcmUgYWxsIGNyZWF0ZWQgYnkgRmFjZWJvb2sgZW1wbG95ZWVzLgogICAgLSBTdG9yaWVzIGFib3V0IGtpdHRlbnMgYXJlIG1vcmUgcG9wdWxhciB0aGFuIGFsbCBvdGhlciB0eXBlcyBvZiBzdG9yaWVzIGluIHRoZSBOZXdzIEZlZWQuCiAgICAtIFRoZSBOZXdzIEZlZWQgd2FzIGZpcnN0IGF2YWlsYWJsZSB0byB1c2VycyBvbiBTZXB0ZW1iZXIgNiwgMjAwNi4KICAgIC0gKipUaGUgYWxnb3JpdGhtIGNob29zZXMgc3RvcmllcyB0aGF0IGFyZSBoaWdoIHF1YWxpdHkgYW5kIGVuZ2FnaW5nIHRvIGFwcGVhciBpbiB0aGUgTmV3cyBGZWVkLioqCiAgICAtIE5vbmUgb2YgdGhlIGFib3ZlLgoKMy4gV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGlzIHRydWU/CiAgICAtIEZhY2Vib29rIHdhcyBmaXJzdCBjcmVhdGVkIGF0IFN0YW5mb3JkIFVuaXZlcnNpdHkgaW4gQ2FsaWZvcm5pYS4KICAgIC0gRW5nbGlzaCAoUGlyYXRlKSBhbmQgS2xpbmdvbiBhcmUgdHdvIG9mIHRoZSBsYW5ndWFnZSBvcHRpb25zIG9mZmVyZWQgYnkgRmFjZWJvb2suCiAgICAtICoqVGhlcmUgYXJlIHRob3VzYW5kcyBvZiBwb3NzaWJsZSBzdG9yaWVzIGF2YWlsYWJsZSBvbiBldmVyeSB2aXNpdCB0byBGYWNlYm9vay4qKgogICAgLSBGYWNlYm9vaydzIG1haW4gdXNlciBpbnRlcmZhY2UgY29sb3IgaXMgYmx1ZSwgYmVjYXVzZSBibHVlIGlzIE1hcmsgWnVja2VyYmVyZydzIGZhdm9yaXRlIGNvbG9yLgogICAgLSBOb25lIG9mIHRoZSBhYm92ZS4KCiMjICJPYmplY3RpdmUiIEV4cGxhbmF0aW9uCgoqKDIwNyB3b3JkczsgRmxlc2NoLUtpbmNhaWQgR3JhZGUgTGV2ZWwgMTAuNikqICAKU29tZXRpbWVzIHdoZW4gcGVvcGxlIHZpc2l0IEZhY2Vib29rIHRoZXkgc2VlIHN0b3JpZXMgaW4gdGhlaXIgTmV3cyBGZWVkcyB0aGV5IGRvbid0IHdhbnQgdG8gc2VlLCBvciB0aGV5IG1pc3Mgc3RvcmllcyB0aGF0IGFyZSBpbXBvcnRhbnQgdG8gdGhlbS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggaG93IHRoZSBhbGdvcml0aG0gKGEgZm9ybXVsYSBvciBzZXQgb2YgcnVsZXMpIGd1ZXNzZXMgd2hpY2ggc3RvcmllcyBpdCBzaG91bGQgcHV0IGhpZ2hlciB1cCBpbiB0aGUgTmV3cyBGZWVkLiBGYWNlYm9vayBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgcGVvcGxlIGludGVyYWN0IHdpdGggc3RvcmllcyBpbiB0aGVpciBOZXdzIEZlZWRzLCBhbmQgZmVlZGJhY2sgZnJvbSBwZW9wbGUgYWJvdXQgd2hhdCBraW5kcyBvZiBzdG9yaWVzIHRoZXkgcHJlZmVyLiBGYWNlYm9va+KAmXMgZW5naW5lZXJzIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIHVuZGVyc3RhbmQgd2hpY2ggc3RvcmllcyBwZW9wbGUgYXJlIG1vc3QgaW50ZXJlc3RlZCBpbiwgYW5kIHdoeS4gVGhlbiwgdGhlIGVuZ2luZWVycyBtYWtlIGNoYW5nZXMgdG8gaW1wcm92ZSBob3cgdGhlIGFsZ29yaXRobSBjaG9vc2VzIHN0b3JpZXMuCiAKRmFjZWJvb2sgdGVzdHMgdGhlIGNoYW5nZXMgdG8gdGhlIGFsZ29yaXRobSB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIHBlb3BsZSB0byBzZWUgaWYgaXQgaXMgd29ya2luZyBiZXR0ZXIgZm9yIHRoZW0uIE9uZSB3YXkgRmFjZWJvb2sgY2FuIHRlbGwgaWYgdGhpbmdzIGFyZSBiZXR0ZXIgaXMgYnkgd2hldGhlciBwZW9wbGUgc3BlbmQgbW9yZSB0aW1lIGxvb2tpbmcgYXQgc3RvcmllcyBpbiB0aGVpciBOZXdzIEZlZWRzIGFmdGVyIHRoZSBjaGFuZ2VzLCBjb21wYXJlZCB3aXRoIGJlZm9yZSB0aGUgY2hhbmdlcy4gRmFjZWJvb2sgYWxzbyBhc2tzIHBlb3BsZSBxdWVzdGlvbnMgYWJvdXQgaG93IG11Y2ggdGhleSB3YW50ZWQgdG8gc2VlIGNlcnRhaW4gc3Rvcmllcy4gQWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBwZW9wbGUncyBhY3Rpb25zLCBwcmVmZXJlbmNlcyBhbmQgb3BpbmlvbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2hhbmdlIGlzIGFuIGltcHJvdmVtZW50IG9yIG5vdC4gVGhlIGFsZ29yaXRobSBpcyB1cGRhdGVkIGxpa2UgdGhpcyBvbiBhIHJlZ3VsYXIgYmFzaXMuCgojIyMgIk9iamVjdGl2ZSIgY29uZGl0aW9uIG1hbmlwdWxhdGlvbiBjaGVjayBxdWVzdGlvbnMKCjEuIFRoZSB0ZXh0IEkganVzdCByZWFkIGRpc2N1c3NlZOKApgogICAgLSBUaGUgdHlwZXMgb2YgYWRzIEZhY2Vib29rIGFsbG93cyB1bmRlciBpdHMgYWR2ZXJ0aXNpbmcgcG9saWN5LgogICAgLSAqKlRoZSBwcm9jZXNzIG9mIGV2YWx1YXRpbmcgdGhlIEZhY2Vib29rIE5ld3MgRmVlZCBhbGdvcml0aG0uKioKICAgIC0gVGhlIHVzZSBvZiBGYWNlYm9vayBmb3Igb3JnYW5pemluZyBldmVudHMuCiAgICAtIFRoZSBkaWZmZXJlbnQga2luZHMgb2YgRmFjZWJvb2sgYXBwcyB0aGF0IGFyZSBhdmFpbGFibGUuCiAgICAtIE5vbmUgb2YgdGhlIGFib3ZlLgoKMi4gQ2hvb3NlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsaXN0IGJlbG93IHRoYXQgd2FzIGluIHRoZSB0ZXh0IHRoYXQgeW91IHJlYWQ6CiAgICAtIFRoZSBzdG9yaWVzIGluIHRoZSBOZXdzIEZlZWQgYXJlIGFsbCBjcmVhdGVkIGJ5IEZhY2Vib29rIGVtcGxveWVlcy4KICAgIC0gU3RvcmllcyBhYm91dCBraXR0ZW5zIGFyZSBtb3JlIHBvcHVsYXIgdGhhbiBhbGwgb3RoZXIgdHlwZXMgb2Ygc3RvcmllcyBpbiB0aGUgTmV3cyBGZWVkLgogICAgLSBUaGUgTmV3cyBGZWVkIHdhcyBmaXJzdCBhdmFpbGFibGUgdG8gdXNlcnMgb24gU2VwdGVtYmVyIDYsIDIwMDYuCiAgICAtICoqRmFjZWJvb2sgdGVzdHMgY2hhbmdlcyB0byB0aGUgTmV3cyBGZWVkIGFsZ29yaXRobSB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIHVzZXJzLioqCiAgICAtIE5vbmUgb2YgdGhlIGFib3ZlLgoKMy4gV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGlzIHRydWU/CiAgICAtIEZhY2Vib29rIHdhcyBmaXJzdCBjcmVhdGVkIGF0IFN0YW5mb3JkIFVuaXZlcnNpdHkgaW4gQ2FsaWZvcm5pYS4KICAgIC0gRW5nbGlzaCAoUGlyYXRlKSBhbmQgS2xpbmdvbiBhcmUgdHdvIG9mIHRoZSBsYW5ndWFnZSBvcHRpb25zIG9mZmVyZWQgYnkgRmFjZWJvb2suCiAgICAtICoqRW5naW5lZXJzIHJlZ3VsYXJseSB1cGRhdGUgdGhlIE5ld3MgRmVlZCBhbGdvcml0aG0uKioKICAgIC0gRmFjZWJvb2sncyBtYWluIHVzZXIgaW50ZXJmYWNlIGNvbG9yIGlzIGJsdWUsIGJlY2F1c2UgYmx1ZSBpcyBNYXJrIFp1Y2tlcmJlcmcncyBmYXZvcml0ZSBjb2xvci4KICAgIC0gTm9uZSBvZiB0aGUgYWJvdmUuCgojIyBDb250cm9sIFRleHQKCiooMTg5IHdvcmRzOyBGbGVzY2gtS2luY2FpZCBHcmFkZSBMZXZlbCAxMC44KSogIApGYWNlYm9vayBpcyBhbiBBbWVyaWNhbiBjb21wYW55IGFuZCBvbmxpbmUgc29jaWFsIG1lZGlhIHdlYnNpdGUuIEl0IGlzIGJhc2VkIGluIE1lbmxvIFBhcmssIENhbGlmb3JuaWEgYW5kIGhhcyBvZmZpY2VzIGluIDE1IGNvdW50cmllcy4gRmFjZWJvb2sgd2FzIGxhdW5jaGVkIG9uIEZlYnJ1YXJ5IDQsIDIwMDQsIGJ5IE1hcmsgWnVja2VyYmVyZyBhbmQgc2V2ZXJhbCBvdGhlciBIYXJ2YXJkIFVuaXZlcnNpdHkgc3R1ZGVudHMuIEF0IGZpcnN0LCBtZW1iZXJzaGlwIHdhcyBsaW1pdGVkIHRvIEhhcnZhcmQgc3R1ZGVudHMuIFNpbmNlIDIwMDYsIGFueW9uZSB3aG8gaXMgYWdlIDEzIGFuZCBvbGRlciBhbmQgaGFzIGEgdmFsaWQgZW1haWwgYWRkcmVzcyBjYW4gYmVjb21lIGEgcmVnaXN0ZXJlZCB1c2VyLgoKRmFjZWJvb2sgaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlIGxhbmd1YWdlcy4gSXQgbWF5IGJlIGFjY2Vzc2VkIG92ZXIgdGhlIEludGVybmV0IGFuZCBtb2JpbGUgbmV0d29ya3MgdXNpbmcgZGVza3RvcHMsIGxhcHRvcHMsIHRhYmxldCBjb21wdXRlcnMsIGFuZCBzbWFydHBob25lcy4gQWZ0ZXIgY3JlYXRpbmcgYW4gYWNjb3VudCwgcGVvcGxlIHR5cGljYWxseSBmaWxsIG91dCBhIHVzZXIgcHJvZmlsZSB3aXRoIGluZm9ybWF0aW9uIGxpa2UgdGhlaXIgbmFtZSwgb2NjdXBhdGlvbiBhbmQgZW1haWwgYWRkcmVzcy4gVGhleSB0aGVuIHVzZSBGYWNlYm9vayB0byBhZGQgb3RoZXIgdXNlcnMgYXMgZnJpZW5kcywgZXhjaGFuZ2UgbWVzc2FnZXMsIGNyZWF0ZSBldmVudHMsIGFuZCBwb3N0IHN0b3JpZXMuIFBlb3BsZSBpbnRlcmFjdCB3aXRoIG90aGVycyBieSBjb21tZW50aW5nIG9uIG9yICJsaWtpbmciIHN0b3JpZXMuIFRoZXkgY2FuIGFsc28gam9pbiBjb21tb24gaW50ZXJlc3QgZ3JvdXBzIGFuZCBzaGFyZSBwaG90b3MsIHZpZGVvcyBhbmQgbGlua3MuIFBlb3BsZSByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBvdGhlcnMgdGhleSBhcmUgY29ubmVjdGVkIHRvIHVwZGF0ZSB0aGVpciB1c2VyIHByb2ZpbGVzIG9yIHBvc3Qgc3Rvcmllcy4gU3RvcmllcyB0aGF0IGhhdmUgYmVlbiBwb3N0ZWQgYnkgcGVvcGxlLCBQYWdlcyBhbmQgZ3JvdXBzIGFwcGVhciBpbiB0aGUgTmV3cyBGZWVkLCB3aGljaCBpcyBhIGNvbnN0YW50bHkgdXBkYXRpbmcgbGlzdCBvZiBzdG9yaWVzLgoKIyMjIENvbnRyb2wgY29uZGl0aW9uIG1hbmlwdWxhdGlvbiBjaGVjayBxdWVzdGlvbnMKCjEuIFRoZSB0ZXh0IHRoYXQgSSBqdXN0IHJlYWQgZGlzY3Vzc2Vk4oCmCiAgICAtIFRoZSB0eXBlcyBvZiBhZHMgRmFjZWJvb2sgYWxsb3dzIHVuZGVyIGl0cyBhZHZlcnRpc2luZyBwb2xpY3kuCiAgICAtICoqSG93IEZhY2Vib29rIGZpcnN0IGdvdCBzdGFydGVkLioqCiAgICAtIFRoZSB1c2Ugb2YgRmFjZWJvb2sgZm9yIG9yZ2FuaXppbmcgZXZlbnRzLgogICAgLSBUaGUgZGlmZmVyZW50IGtpbmRzIG9mIEZhY2Vib29rIGFwcHMgdGhhdCBhcmUgYXZhaWxhYmxlLgogICAgLSBOb25lIG9mIHRoZSBhYm92ZS4KCjIuIENob29zZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGlzdCBiZWxvdyB0aGF0IHdhcyBpbiB0aGUgdGV4dCB0aGF0IHlvdSByZWFkOgogICAgLSBUaGUgc3RvcmllcyBpbiB0aGUgTmV3cyBGZWVkIGFyZSBhbGwgY3JlYXRlZCBieSBGYWNlYm9vayBlbXBsb3llZXMuCiAgICAtIFN0b3JpZXMgYWJvdXQga2l0dGVucyBhcmUgbW9yZSBwb3B1bGFyIHRoYW4gYWxsIG90aGVyIHR5cGVzIG9mIHN0b3JpZXMgaW4gdGhlIE5ld3MgRmVlZC4KICAgIC0gVGhlIE5ld3MgRmVlZCB3YXMgZmlyc3QgYXZhaWxhYmxlIHRvIHVzZXJzIG9uIFNlcHRlbWJlciA2LCAyMDA2LgogICAgLSAqKlRoZSBOZXdzIEZlZWQgc2hvd3Mgc3RvcmllcyBmcm9tIHBlb3BsZSwgUGFnZXMgYW5kIGdyb3Vwcy4qKgogICAgLSBOb25lIG9mIHRoZSBhYm92ZS4KCjMuIFdoaWNoIG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBpcyB0cnVlPwogICAgLSBGYWNlYm9vayB3YXMgZmlyc3QgY3JlYXRlZCBhdCBTdGFuZm9yZCBVbml2ZXJzaXR5IGluIENhbGlmb3JuaWEuCiAgICAtIEVuZ2xpc2ggKFBpcmF0ZSkgYW5kIEtsaW5nb24gYXJlIHR3byBvZiB0aGUgbGFuZ3VhZ2Ugb3B0aW9ucyBvZmZlcmVkIGJ5IEZhY2Vib29rLgogICAgLSAqKkEgdmFsaWQgZW1haWwgYWRkcmVzcyBpcyByZXF1aXJlZCB0byBzaWduIHVwIGZvciBGYWNlYm9vay4qKgogICAgLSBGYWNlYm9vaydzIG1haW4gdXNlciBpbnRlcmZhY2UgY29sb3IgaXMgYmx1ZSwgYmVjYXVzZSBibHVlIGlzIE1hcmsgWnVja2VyYmVyZydzIGZhdm9yaXRlIGNvbG9yLgogICAgLSBOb25lIG9mIHRoZSBhYm92ZS4KCgojIENvcnJlbGF0aW9ucyBCZXR3ZWVuIHRoZSBWYXJpYWJsZXMKYGBge3IgYmlnIGNvcnJlbGF0aW9uIHRhYmxlLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnZhcnMuZm9yLmNvcnJlbGF0aW9ucyA8LSBkICU+JSAKICBzZWxlY3QoUmVzcG9uc2VJRCwgYWNjdF9pbmZsdWVuY2UsIGFjY3RfaW5mbHVlbmNlX3N1cmUsIGFjY3RfZmFpcm5lc3MsIGNvbnRlbnRfYWN0aW9ucywgdWlfY29udHJvbHNfYWN0aW9ucywgdmlzaXRfYWN0aW9ucywgaGlkaW5nX2FjdGlvbnMsCiAgICAgICAgIGludGVycHJldF9yc25zLCBpbnRlcnByZXRfcnNuc19zdXJlLCBpbnRlcnByZXRfb3JkZXIsIGVudGVydGFpbmVkX2dvYWxzLCBpbmZvcm1lZF9nb2FscywKICAgICAgICAgY29ycmVjdF9leHBlY3QsIGNvcnJlY3RfZXhwZWN0X3N1cmUsIGNvcnJlY3RfbWlzc2VkLCB3YW50X2ZyZXF1ZW5jeSwgZG9udF93YW50X2ZyZXF1ZW5jeSwgc3BhbV9mcmVxdWVuY3ksIG9mZmVuc2l2ZV9mcmVxdWVuY3ksIGNvcnJlY3RfZnJlcXVlbmN5X2xpa2VkLAogICAgICAgICBhd2FyZV9ldnBzdF9hZnQsIGF3YXJlX2V2cHN0X2FmdF9zdXJlLCBhd2FyZV9pbmZvX25ldywgYXdhcmVfaW5mb19zdXJwcmlzZSwgc3lzdGVtX3JlYXNvbnMsIHVzZXJfcmVhc29ucywgaGlkZV9yZWFzb25zLCB0b29tYW55X3JlYXNvbnMsIGF3YXJlX3JlYXNvbnNfdG9vX25ldywKICAgICAgICAgYWdlLCBpbnRlcm5ldF9saXRlcmFjeSwgdHJ1c3RfcHJvcGVuc2l0eSwgZmJfZnJpZW5kcywgbmV0d29ya19kaXZlcnNpdHksIHllYXJfZGlmZiwgZmJfdmlzaXQsIG51bV9zdG9yaWVzLCBmYl9yb3V0aW5lLCBmYl9zYXRpc2ZhY3Rpb24sIGV2cHN0X2JlZm9yZSwgZXZwc3RfYmVmb3JlX3N1cmUpICU+JSAKICBtdXRhdGUoYWNjdF9pbmZsdWVuY2U9YXMubnVtZXJpYyhhY2N0X2luZmx1ZW5jZSksCiAgICAgICAgIGludGVycHJldF9yc25zPWFzLm51bWVyaWMoaW50ZXJwcmV0X3JzbnMpLCBpbnRlcnByZXRfb3JkZXI9YXMubnVtZXJpYyhpbnRlcnByZXRfb3JkZXIpLAogICAgICAgICBjb3JyZWN0X2V4cGVjdD1hcy5udW1lcmljKGNvcnJlY3RfZXhwZWN0KSwgY29ycmVjdF9taXNzZWQ9YXMubnVtZXJpYyhjb3JyZWN0X21pc3NlZCksCiAgICAgICAgIGF3YXJlX2V2cHN0X2FmdD1hcy5udW1lcmljKGF3YXJlX2V2cHN0X2FmdCksIGF3YXJlX2luZm9fbmV3PWFzLm51bWVyaWMoYXdhcmVfaW5mb19uZXcpLCBhd2FyZV9pbmZvX3N1cnByaXNlPWFzLm51bWVyaWMoYXdhcmVfaW5mb19zdXJwcmlzZSksIGF3YXJlX3JlYXNvbnNfdG9vX25ldz1hcy5udW1lcmljKGF3YXJlX3JlYXNvbnNfdG9vX25ldyksCiAgICAgICAgIGZiX3Zpc2l0PWFzLm51bWVyaWMoZmJfdmlzaXQpLCBldnBzdF9iZWZvcmU9YXMubnVtZXJpYyhldnBzdF9iZWZvcmUpKSAKICAKCnZhcnMuZm9yLmNvcnJlbGF0aW9ucyAlPiUgc2VsZWN0KC1SZXNwb25zZUlEKSAlPiUgY29ycmVsYXRlKCkKdmFycy5mb3IuY29ycmVsYXRpb25zICU+JSBzZWxlY3QoLVJlc3BvbnNlSUQpICU+JSBjb3IoKSAlPiUgY29ycnBsb3Qob3JkZXI9IkFPRSIsIHRsLmNvbD0nYmxhY2snLCB0bC5jZXg9Ljc1LCB0bC5zcnQ9NDUsIHR5cGU9Imxvd2VyIikKYGBgCgojUmVncmVzc2lvbiBNb2RlbHMKCmBgYHtyIFJlZ3Jlc3Npb25fcHJlcCwgaW5jbHVkZT1GQUxTRX0KIyMga25vd2xlZGdlCmV2cHN0X2JlZm9yZV9tIDwtIGxtKGV2cHN0X2JlZm9yZV9udW0gfiBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmF3YXJlbmVzc19tMWMgPC0gbG0oYXdhcmVfaW5mb19uZXdfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphd2FyZW5lc3NfbTJjIDwtIGxtKGF3YXJlX2luZm9fc3VycHJpc2VfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgojIyBhd2FyZW5lc3MKYXdhcmVuZXNzX200YyA8LSBsbShhd2FyZV9ldnBzdF9hZnRfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphd2FyZW5lc3NfbTVjIDwtIGxtKHN5c3RlbV9yZWFzb25zIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphd2FyZW5lc3NfbTZjIDwtIGxtKHVzZXJfcmVhc29ucyB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQoKIyMgY29ycmVjdG5lc3MKY29ycmVjdG5lc3NfbTFjIDwtIGxtKGNvcnJlY3RfbWlzc2VkX251bSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQoKY29ycmVjdG5lc3NfbTJjIDwtIGxtKHdhbnRfZnJlcXVlbmN5IH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgpjb3JyZWN0bmVzc19tM2MgPC0gbG0oZG9udF93YW50X2ZyZXF1ZW5jeSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQoKIyMgaW50ZXJwcmV0YWJpbGl0eQppbnRlcnByZXRhYmlsaXR5X20xYyA8LSBsbShpbnRlcnByZXRfcnNuc19udW0gfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmludGVycHJldGFiaWxpdHlfbTNjIDwtIGxtKGVudGVydGFpbmVkX2dvYWxzIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgppbnRlcnByZXRhYmlsaXR5X200YyA8LSBsbShpbmZvcm1lZF9nb2FscyB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQoKIyMgYWNjb3VudGFiaWxpdHkKYWNjb3VudGFiaWxpdHlfbTJjIDwtIGxtKGFjY3RfZmFpcm5lc3NfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphY2NvdW50YWJpbGl0eV9tM2MgPC0gbG0oY29udGVudF9hY3Rpb25zIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphY2NvdW50YWJpbGl0eV9tNGMgPC0gbG0odWlfY29udHJvbHNfYWN0aW9ucyB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQpgYGAKCiMjS25vd2xlZGdlCmBgYHtyIHJlZ3Jlc3Npb25fa25vd2xlZ2UsIGVjaG89RkFMU0V9CnN0YXJnYXplcihldnBzdF9iZWZvcmVfbSwgdHlwZT0idGV4dCIsIHNpbmdsZS5yb3c9VFJVRSwgc3Rhci5jdXRvZmZzID0gYygwLjEwLCAwLjA1LCAwLjAxLCAwLjAwMSksIHN0YXIuY2hhciA9IGMoIuKAoiIsICIqIiwgIioqIiwgIioqKiIpLCBub3RlcyA9ICIuIHA8MC4xOyAqIHA8MC4wNTsgKiogcDwwLjAxOyAqKiogcDwwLjAwMSIsIG5vdGVzLmFwcGVuZCA9IEYpCnN0YXJnYXplcihhd2FyZW5lc3NfbTFjLCBhd2FyZW5lc3NfbTJjLCB0eXBlPSJ0ZXh0Iiwgc2luZ2xlLnJvdz1UUlVFLCBzdGFyLmN1dG9mZnMgPSBjKDAuMTAsIDAuMDUsIDAuMDEsIDAuMDAxKSwgc3Rhci5jaGFyID0gYygi4oCiIiwgIioiLCAiKioiLCAiKioqIiksIG5vdGVzID0gIi4gcDwwLjE7ICogcDwwLjA1OyAqKiBwPDAuMDE7ICoqKiBwPDAuMDAxIiwgbm90ZXMuYXBwZW5kID0gRikKYGBgCgojI0F3YXJlbmVzcwpgYGB7ciByZWdyZXNzaW9uX0F3YXJlbmVzcywgZWNobz1GQUxTRX0Kc3RhcmdhemVyKGF3YXJlbmVzc19tNGMsIGF3YXJlbmVzc19tNWMsIGF3YXJlbmVzc19tNmMsIHR5cGU9InRleHQiLCBzaW5nbGUucm93PVRSVUUsIHN0YXIuY3V0b2ZmcyA9IGMoMC4xMCwgMC4wNSwgMC4wMSwgMC4wMDEpLCBzdGFyLmNoYXIgPSBjKCLigKIiLCAiKiIsICIqKiIsICIqKioiKSwgbm90ZXMgPSAiLiBwPDAuMTsgKiBwPDAuMDU7ICoqIHA8MC4wMTsgKioqIHA8MC4wMDEiLCBub3Rlcy5hcHBlbmQgPSBGKQpgYGAKCiMjQ29ycmVjdG5lc3MKYGBge3IgcmVncmVzc2lvbl9jb3JyZWN0bmVzcywgZWNobz1GQUxTRX0Kc3RhcmdhemVyKGNvcnJlY3RuZXNzX20xYywgY29ycmVjdG5lc3NfbTJjLCBjb3JyZWN0bmVzc19tM2MsIHR5cGU9InRleHQiLCBzaW5nbGUucm93PVRSVUUsIHN0YXIuY3V0b2ZmcyA9IGMoMC4xMCwgMC4wNSwgMC4wMSwgMC4wMDEpLCBzdGFyLmNoYXIgPSBjKCLigKIiLCAiKiIsICIqKiIsICIqKioiKSwgbm90ZXMgPSAiLiBwPDAuMTsgKiBwPDAuMDU7ICoqIHA8MC4wMTsgKioqIHA8MC4wMDEiLCBub3Rlcy5hcHBlbmQgPSBGKQpgYGAKCiMjSW50ZXJwcmV0YWJpbGl0eQpgYGB7ciByZWdyZXNzaW9uX2ludGVycHJldGFiaWxpdHksIGVjaG89RkFMU0V9CnN0YXJnYXplcihpbnRlcnByZXRhYmlsaXR5X20xYywgaW50ZXJwcmV0YWJpbGl0eV9tM2MsIGludGVycHJldGFiaWxpdHlfbTRjLCB0eXBlPSJ0ZXh0Iiwgc2luZ2xlLnJvdz1UUlVFLCBzdGFyLmN1dG9mZnMgPSBjKDAuMTAsIDAuMDUsIDAuMDEsIDAuMDAxKSwgc3Rhci5jaGFyID0gYygi4oCiIiwgIioiLCAiKioiLCAiKioqIiksIG5vdGVzID0gIi4gcDwwLjE7ICogcDwwLjA1OyAqKiBwPDAuMDE7ICoqKiBwPDAuMDAxIiwgbm90ZXMuYXBwZW5kID0gRikKYGBgCgojI0FjY291bnRhYmlsaXR5CmBgYHtyIHJlZ3Jlc3Npb25fYWNjb3VudGFiaWxpdHksIGVjaG89RkFMU0V9CnN0YXJnYXplcihhY2NvdW50YWJpbGl0eV9tMmMsIGFjY291bnRhYmlsaXR5X20zYywgYWNjb3VudGFiaWxpdHlfbTRjLCB0eXBlPSJ0ZXh0Iiwgc2luZ2xlLnJvdz1UUlVFLCBzdGFyLmN1dG9mZnMgPSBjKDAuMTAsIDAuMDUsIDAuMDEsIDAuMDAxKSwgc3Rhci5jaGFyID0gYygi4oCiIiwgIioiLCAiKioiLCAiKioqIiksIG5vdGVzID0gIi4gcDwwLjE7ICogcDwwLjA1OyAqKiBwPDAuMDE7ICoqKiBwPDAuMDAxIiwgbm90ZXMuYXBwZW5kID0gRikKYGBgCgojIyBIZWF0bWFwIG9mIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzCgpUaGUgZmlndXJlIGJlbG93IGlzIGEgaGVhdG1hcCBzaG93aW5nIGFsbCBjb2VmZmljaWVudHMsIGluY2x1ZGluZyBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgY29udHJvbHMsIGZvciB0aGUgcHJlZGljdG9ycyBpbiBlYWNoIG1vZGVsIGhhdmluZyBwLXZhbHVlcyBsZXNzIHRoYW4gMC4wNS4gT3V0Y29tZSB2YXJpYWJsZXMgd2VyZSBzdGFuZGFyZGl6ZWQgc28gdGhhdCB0aGV5IGFyZSBkaXJlY3RseSBjb21wYXJhYmxlLiBBd2FyZW5lc3MgdmFyaWFibGVzID0gS25vd2xlZGdlIEFmdGVyLCBTeXN0ZW0gQWdlbmN5LCBVc2VyIEFnZW5jeS4gQ29ycmVjdG5lc3MgdmFyaWFibGVzID0gTWlzc2VkIFN0b3JpZXMsIFdhbnRlZCBTdG9yaWVzLCBVbndhbnRlZCBTdG9yaWVzLiBJbnRlcnByZXRhYmlsaXR5IHZhcmlhYmxlcyA9IFVuZGVyc3RhbmQgV2h5LCBJbnRlcnBlcnNvbmFsIGFuZCBJbmZvcm1hdGlvbmFsIEdvYWxzLiBBY2NvdW50YWJpbGl0eSB2YXJpYWJsZXMgPSBGYWlybmVzcywgQ29udGVudCBhbmQgVXNlciBBY3Rpb25zLgoKYGBge3IgYWxsIG1vZGVscyBmb3IgaGVhdG1hcCwgZWNobz1GQUxTRX0KIyMjIHRoaXMgY29kZSBydW5zIHRoZSByZWdyZXNzaW9ucyB1c2VkIGluIHRoaXMgZmlsZQoKIyMga25vd2xlZGdlCmV2cHN0X2JlZm9yZV9tIDwtIGxtKGV2cHN0X2JlZm9yZV9udW0gfiBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmF3YXJlbmVzc19tMWMgPC0gbG0oYXdhcmVfaW5mb19uZXdfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmF3YXJlbmVzc19tMV9obSA8LSBsbShzY2FsZShhd2FyZV9pbmZvX25ld19udW0pIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphd2FyZW5lc3NfbTJjIDwtIGxtKGF3YXJlX2luZm9fc3VycHJpc2VfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmF3YXJlbmVzc19tMl9obSA8LSBsbShzY2FsZShhd2FyZV9pbmZvX3N1cnByaXNlX251bSkgfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCiMjIGF3YXJlbmVzcwphd2FyZW5lc3NfbTRjIDwtIGxtKGF3YXJlX2V2cHN0X2FmdF9udW0gfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKYXdhcmVuZXNzX200X2htIDwtIGxtKHNjYWxlKGF3YXJlX2V2cHN0X2FmdF9udW0pIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphd2FyZW5lc3NfbTVjIDwtIGxtKHN5c3RlbV9yZWFzb25zIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmF3YXJlbmVzc19tNV9obSA8LSBsbShzY2FsZShzeXN0ZW1fcmVhc29ucykgfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmF3YXJlbmVzc19tNmMgPC0gbG0odXNlcl9yZWFzb25zIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmF3YXJlbmVzc19tNl9obSA8LSBsbShzY2FsZSh1c2VyX3JlYXNvbnMpIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgojIyBjb3JyZWN0bmVzcwpjb3JyZWN0bmVzc19tMWMgPC0gbG0oY29ycmVjdF9taXNzZWRfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmNvcnJlY3RuZXNzX20xX2htIDwtIGxtKHNjYWxlKGNvcnJlY3RfbWlzc2VkX251bSkgfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmNvcnJlY3RuZXNzX20yYyA8LSBsbSh3YW50X2ZyZXF1ZW5jeSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQpjb3JyZWN0bmVzc19tMl9obSA8LSBsbShzY2FsZSh3YW50X2ZyZXF1ZW5jeSkgfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmNvcnJlY3RuZXNzX20zYyA8LSBsbShkb250X3dhbnRfZnJlcXVlbmN5IH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmNvcnJlY3RuZXNzX20zX2htIDwtIGxtKHNjYWxlKGRvbnRfd2FudF9mcmVxdWVuY3kpIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgojIyBpbnRlcnByZXRhYmlsaXR5CmludGVycHJldGFiaWxpdHlfbTFjIDwtIGxtKGludGVycHJldF9yc25zX251bSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQppbnRlcnByZXRhYmlsaXR5X20xX2htIDwtIGxtKHNjYWxlKGludGVycHJldF9yc25zX251bSkgfiBjb25kaXRpb24gKyBldnBzdF9iZWZvcmUuY2VudGVyZWQgKyBhZ2UuY2VudGVyZWQgKyBnZW5kZXIgKyBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZCArIHRydXN0X3Byb3BlbnNpdHkuY2VudGVyZWQgKyBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWQgKyBmYl9yb3V0aW5lLmNlbnRlcmVkICsgc3Rvcmllc19wb3N0ZWQsIGRhdGE9ZCkKCmludGVycHJldGFiaWxpdHlfbTNjIDwtIGxtKGVudGVydGFpbmVkX2dvYWxzIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmludGVycHJldGFiaWxpdHlfbTNfaG0gPC0gbG0oc2NhbGUoZW50ZXJ0YWluZWRfZ29hbHMpIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgppbnRlcnByZXRhYmlsaXR5X200YyA8LSBsbShpbmZvcm1lZF9nb2FscyB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQppbnRlcnByZXRhYmlsaXR5X200X2htIDwtIGxtKHNjYWxlKGluZm9ybWVkX2dvYWxzKSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQoKIyMgYWNjb3VudGFiaWxpdHkKYWNjb3VudGFiaWxpdHlfbTJjIDwtIGxtKGFjY3RfZmFpcm5lc3NfbnVtIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCmFjY291bnRhYmlsaXR5X20yX2htIDwtIGxtKHNjYWxlKGFjY3RfZmFpcm5lc3NfbnVtKSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQoKYWNjb3VudGFiaWxpdHlfbTNjIDwtIGxtKGNvbnRlbnRfYWN0aW9ucyB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQphY2NvdW50YWJpbGl0eV9tM19obSA8LSBsbShzY2FsZShjb250ZW50X2FjdGlvbnMpIH4gY29uZGl0aW9uICsgZXZwc3RfYmVmb3JlLmNlbnRlcmVkICsgYWdlLmNlbnRlcmVkICsgZ2VuZGVyICsgaW50ZXJuZXRfbGl0ZXJhY3kuY2VudGVyZWQgKyB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkICsgZmJfc2F0aXNmYWN0aW9uLmNlbnRlcmVkICsgZmJfcm91dGluZS5jZW50ZXJlZCArIHN0b3JpZXNfcG9zdGVkLCBkYXRhPWQpCgphY2NvdW50YWJpbGl0eV9tNGMgPC0gbG0odWlfY29udHJvbHNfYWN0aW9ucyB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQphY2NvdW50YWJpbGl0eV9tNF9obSA8LSBsbShzY2FsZSh1aV9jb250cm9sc19hY3Rpb25zKSB+IGNvbmRpdGlvbiArIGV2cHN0X2JlZm9yZS5jZW50ZXJlZCArIGFnZS5jZW50ZXJlZCArIGdlbmRlciArIGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkICsgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZCArIGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZCArIGZiX3JvdXRpbmUuY2VudGVyZWQgKyBzdG9yaWVzX3Bvc3RlZCwgZGF0YT1kKQpgYGAKCmBgYHtyIGhlYXRtYXAsIGVjaG89RkFMU0V9CiMjIyB0aGlzIGNvZGUgY3JlYXRlcyB0aGUgaGVhdG1hcAoKYWxsX2NvZWZzIDwtIGFzLnRpYmJsZShiaW5kX3Jvd3MoCgkJdGlkeShhd2FyZW5lc3NfbTFjKSAlPiUgbXV0YXRlKGR2ID0gImF3YXJlX2luZm9fbmV3IiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImF3YXJlbmVzcyIpLAoJCXRpZHkoYXdhcmVuZXNzX20yYykgJT4lIG11dGF0ZShkdiA9ICJhd2FyZV9pbmZvX3N1cnByaXNlIiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImF3YXJlbmVzcyIpLAoJCXRpZHkoYXdhcmVuZXNzX200YykgJT4lIG11dGF0ZShkdiA9ICJhd2FyZV9ldnBzdF9hZnQiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiYXdhcmVuZXNzIiksCgkJdGlkeShhd2FyZW5lc3NfbTVjKSAlPiUgbXV0YXRlKGR2ID0gInN5c3RlbV9yZWFzb25zIiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImF3YXJlbmVzcyIpLAoJCXRpZHkoYXdhcmVuZXNzX202YykgJT4lIG11dGF0ZShkdiA9ICJ1c2VyX3JlYXNvbnMiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiYXdhcmVuZXNzIiksCgkJdGlkeShjb3JyZWN0bmVzc19tMWMpICU+JSBtdXRhdGUoZHYgPSAiY29ycmVjdF9taXNzZWQiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiY29ycmVjdG5lc3MiKSwKICAgIHRpZHkoY29ycmVjdG5lc3NfbTJjKSAlPiUgbXV0YXRlKGR2ID0gIndhbnRfZnJlcXVlbmN5IiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImNvcnJlY3RuZXNzIiksCiAgICB0aWR5KGNvcnJlY3RuZXNzX20zYykgJT4lIG11dGF0ZShkdiA9ICJkb250X3dhbnRfZnJlcXVlbmN5IiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImNvcnJlY3RuZXNzIiksCgkJdGlkeShpbnRlcnByZXRhYmlsaXR5X20xYykgJT4lIG11dGF0ZShkdiA9ICJpbnRlcnByZXRfcnNucyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJpbnRlcnByZXRhYmlsaXR5IiksCgkJdGlkeShpbnRlcnByZXRhYmlsaXR5X20zYykgJT4lIG11dGF0ZShkdiA9ICJlbnRlcnRhaW5lZF9nb2FscyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJpbnRlcnByZXRhYmlsaXR5IiksCgkJdGlkeShpbnRlcnByZXRhYmlsaXR5X200YykgJT4lIG11dGF0ZShkdiA9ICJpbmZvcm1lZF9nb2FscyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJpbnRlcnByZXRhYmlsaXR5IiksCgkJdGlkeShhY2NvdW50YWJpbGl0eV9tMmMpICU+JSBtdXRhdGUoZHYgPSAiYWNjdF9mYWlybmVzcyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJhY2NvdW50YWJpbGl0eSIpLAoJCXRpZHkoYWNjb3VudGFiaWxpdHlfbTNjKSAlPiUgbXV0YXRlKGR2ID0gImNvbnRlbnRfYWN0aW9ucyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJhY2NvdW50YWJpbGl0eSIpLAoJCXRpZHkoYWNjb3VudGFiaWxpdHlfbTRjKSAlPiUgbXV0YXRlKGR2ID0gInVpX2NvbnRyb2xzX2FjdGlvbnMiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiYWNjb3VudGFiaWxpdHkiKQopKQphbGxfY29lZnMgPC0gYWxsX2NvZWZzICU+JSBtdXRhdGUoCiAgICAgICAgdGVybSA9IGlmZWxzZSh0ZXJtPT0iY29uZGl0aW9ud2hhdCIsICJ3aGF0IiwgaWZlbHNlKAogICAgICAgICAgICAgICAgICAgICAgICB0ZXJtPT0iY29uZGl0aW9uaG93IiwgImhvdyIsIGlmZWxzZSgKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtPT0iY29uZGl0aW9ud2h5IiwgIndoeSIsIGlmZWxzZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm09PSJjb25kaXRpb25vYmplY3RpdmUiLCAib2JqZWN0aXZlIix0ZXJtKQogICAgICAgICAgICAgICAgICAgICAgICAgICkpKSwKICAgICAgICB0ZXJtID0gZmN0X3JlbGV2ZWwodGVybSwgbGV2ZWxzPWMoIndoYXQiLCAiaG93IiwgIndoeSIsICJvYmplY3RpdmUiKSksCiAgICAgICAgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gZmN0X3JlbGV2ZWwodHJhbnNwYXJlbmN5X2Z1bmN0aW9uLCBsZXZlbHM9YygiYXdhcmVuZXNzIiwgImNvcnJlY3RuZXNzIiwgImludGVycHJldGFiaWxpdHkiLCAiYWNjb3VudGFiaWxpdHkiKSksCiAgICAgICAgdGVybSA9IGRwbHlyOjpyZWNvZGUodGVybSwgYGV2cHN0X2JlZm9yZS5jZW50ZXJlZGAgPSAiZXZwc3RfYmVmb3JlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFnZS5jZW50ZXJlZGAgPSAiYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGdlbmRlcldvbWFuYCA9ICJnZW5kZXIgKFdvbWFuKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbnRlcm5ldF9saXRlcmFjeS5jZW50ZXJlZGAgPSAiaW50ZXJuZXRfbGl0ZXJhY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdHJ1c3RfcHJvcGVuc2l0eS5jZW50ZXJlZGAgPSAidHJ1c3RfcHJvcGVuc2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmYl9zYXRpc2ZhY3Rpb24uY2VudGVyZWRgID0gImZiX3NhdGlzZmFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmYl9yb3V0aW5lLmNlbnRlcmVkYCA9ICJmYl9yb3V0aW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHN0b3JpZXNfcG9zdGVkWWVzYCA9ICJzdG9yaWVzX3Bvc3RlZCAoWWVzKSIpLAogICAgICAgIHRlcm0gPSBmY3RfcmVsZXZlbCh0ZXJtLCBsZXZlbHM9YygiZXZwc3RfYmVmb3JlIiwgImZiX3NhdGlzZmFjdGlvbiIsICJ0cnVzdF9wcm9wZW5zaXR5IiwgInN0b3JpZXNfcG9zdGVkIChZZXMpIiwgImZiX3JvdXRpbmUiLCAiaW50ZXJuZXRfbGl0ZXJhY3kiLCAiZ2VuZGVyIChXb21hbikiLCAiYWdlIikpCikKCmFsbF9jb2Vmc19obSA8LSBhcy50aWJibGUoYmluZF9yb3dzKAoJCXRpZHkoYXdhcmVuZXNzX20xX2htKSAlPiUgbXV0YXRlKGR2ID0gImF3YXJlX2luZm9fbmV3IiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImF3YXJlbmVzcyIpLAoJCXRpZHkoYXdhcmVuZXNzX20yX2htKSAlPiUgbXV0YXRlKGR2ID0gImF3YXJlX2luZm9fc3VycHJpc2UiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiYXdhcmVuZXNzIiksCgkJdGlkeShhd2FyZW5lc3NfbTRfaG0pICU+JSBtdXRhdGUoZHYgPSAiYXdhcmVfZXZwc3RfYWZ0IiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImF3YXJlbmVzcyIpLAoJCXRpZHkoYXdhcmVuZXNzX201X2htKSAlPiUgbXV0YXRlKGR2ID0gInN5c3RlbV9yZWFzb25zIiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImF3YXJlbmVzcyIpLAoJCXRpZHkoYXdhcmVuZXNzX202X2htKSAlPiUgbXV0YXRlKGR2ID0gInVzZXJfcmVhc29ucyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJhd2FyZW5lc3MiKSwKCQl0aWR5KGNvcnJlY3RuZXNzX20xX2htKSAlPiUgbXV0YXRlKGR2ID0gImNvcnJlY3RfbWlzc2VkIiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImNvcnJlY3RuZXNzIiksCiAgICB0aWR5KGNvcnJlY3RuZXNzX20yX2htKSAlPiUgbXV0YXRlKGR2ID0gIndhbnRfZnJlcXVlbmN5IiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImNvcnJlY3RuZXNzIiksCiAgICB0aWR5KGNvcnJlY3RuZXNzX20zX2htKSAlPiUgbXV0YXRlKGR2ID0gImRvbnRfd2FudF9mcmVxdWVuY3kiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiY29ycmVjdG5lc3MiKSwKCQl0aWR5KGludGVycHJldGFiaWxpdHlfbTFfaG0pICU+JSBtdXRhdGUoZHYgPSAiaW50ZXJwcmV0X3JzbnMiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiaW50ZXJwcmV0YWJpbGl0eSIpLAoJCXRpZHkoaW50ZXJwcmV0YWJpbGl0eV9tM19obSkgJT4lIG11dGF0ZShkdiA9ICJlbnRlcnRhaW5lZF9nb2FscyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJpbnRlcnByZXRhYmlsaXR5IiksCgkJdGlkeShpbnRlcnByZXRhYmlsaXR5X200X2htKSAlPiUgbXV0YXRlKGR2ID0gImluZm9ybWVkX2dvYWxzIiwgdHJhbnNwYXJlbmN5X2Z1bmN0aW9uID0gImludGVycHJldGFiaWxpdHkiKSwKCQl0aWR5KGFjY291bnRhYmlsaXR5X20yX2htKSAlPiUgbXV0YXRlKGR2ID0gImFjY3RfZmFpcm5lc3MiLCB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSAiYWNjb3VudGFiaWxpdHkiKSwKCQl0aWR5KGFjY291bnRhYmlsaXR5X20zX2htKSAlPiUgbXV0YXRlKGR2ID0gImNvbnRlbnRfYWN0aW9ucyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJhY2NvdW50YWJpbGl0eSIpLAoJCXRpZHkoYWNjb3VudGFiaWxpdHlfbTRfaG0pICU+JSBtdXRhdGUoZHYgPSAidWlfY29udHJvbHNfYWN0aW9ucyIsIHRyYW5zcGFyZW5jeV9mdW5jdGlvbiA9ICJhY2NvdW50YWJpbGl0eSIpCikpCmFsbF9jb2Vmc19obSA8LSBhbGxfY29lZnNfaG0gJT4lIG11dGF0ZSgKICAgICAgICB0ZXJtID0gaWZlbHNlKHRlcm09PSJjb25kaXRpb253aGF0IiwgIndoYXQiLCBpZmVsc2UoCiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm09PSJjb25kaXRpb25ob3ciLCAiaG93IiwgaWZlbHNlKAogICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm09PSJjb25kaXRpb253aHkiLCAid2h5IiwgaWZlbHNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybT09ImNvbmRpdGlvbm9iamVjdGl2ZSIsICJvYmplY3RpdmUiLHRlcm0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpLAogICAgICAgIHRlcm0gPSBmY3RfcmVsZXZlbCh0ZXJtLCBsZXZlbHM9Yygid2hhdCIsICJob3ciLCAid2h5IiwgIm9iamVjdGl2ZSIpKSwKICAgICAgICB0cmFuc3BhcmVuY3lfZnVuY3Rpb24gPSBmY3RfcmVsZXZlbCh0cmFuc3BhcmVuY3lfZnVuY3Rpb24sIGxldmVscz1jKCJhd2FyZW5lc3MiLCAiY29ycmVjdG5lc3MiLCAiaW50ZXJwcmV0YWJpbGl0eSIsICJhY2NvdW50YWJpbGl0eSIpKSwKICAgICAgICB0ZXJtID0gZHBseXI6OnJlY29kZSh0ZXJtLCBgZXZwc3RfYmVmb3JlLmNlbnRlcmVkYCA9ICJldnBzdF9iZWZvcmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYWdlLmNlbnRlcmVkYCA9ICJhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZ2VuZGVyV29tYW5gID0gImdlbmRlciAoV29tYW4pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGludGVybmV0X2xpdGVyYWN5LmNlbnRlcmVkYCA9ICJpbnRlcm5ldF9saXRlcmFjeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB0cnVzdF9wcm9wZW5zaXR5LmNlbnRlcmVkYCA9ICJ0cnVzdF9wcm9wZW5zaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZiX3NhdGlzZmFjdGlvbi5jZW50ZXJlZGAgPSAiZmJfc2F0aXNmYWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZiX3JvdXRpbmUuY2VudGVyZWRgID0gImZiX3JvdXRpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgc3Rvcmllc19wb3N0ZWRZZXNgID0gInN0b3JpZXNfcG9zdGVkIChZZXMpIiksCiAgICAgICAgdGVybSA9IGZjdF9yZWxldmVsKHRlcm0sIGxldmVscz1jKCJldnBzdF9iZWZvcmUiLCAiZmJfc2F0aXNmYWN0aW9uIiwgInRydXN0X3Byb3BlbnNpdHkiLCAic3Rvcmllc19wb3N0ZWQgKFllcykiLCAiZmJfcm91dGluZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuZXRfbGl0ZXJhY3kiLCAiZ2VuZGVyIChXb21hbikiLCAiYWdlIikpCikKCm5ld19zdXJwcmlzaW5nX2R2cyA8LSBjKCJhd2FyZV9pbmZvX25ldyIsICJhd2FyZV9pbmZvX3N1cnByaXNlIikKYXdhcmVuZXNzX2R2cyA8LSBjKCJhd2FyZV9ldnBzdF9hZnQiLCAic3lzdGVtX3JlYXNvbnMiLCAidXNlcl9yZWFzb25zIikKY29ycmVjdG5lc3NfZHZzIDwtIGMoImNvcnJlY3RfbWlzc2VkIiwgIndhbnRfZnJlcXVlbmN5IiwgImRvbnRfd2FudF9mcmVxdWVuY3kiKQppbnRlcnByZXRhYmlsaXR5X2R2cyA8LSBjKCJpbnRlcnByZXRfcnNucyIsICJlbnRlcnRhaW5lZF9nb2FscyIsICJpbmZvcm1lZF9nb2FscyIpCmFjY291bnRhYmlsaXR5X2R2cyA8LSBjKCJhY2N0X2ZhaXJuZXNzIiwgImNvbnRlbnRfYWN0aW9ucyIsICJ1aV9jb250cm9sc19hY3Rpb25zIikKCmFsbF9kdnMgPC0gYyhuZXdfc3VycHJpc2luZ19kdnMsIGF3YXJlbmVzc19kdnMsIGNvcnJlY3RuZXNzX2R2cywgaW50ZXJwcmV0YWJpbGl0eV9kdnMsIGFjY291bnRhYmlsaXR5X2R2cykKCmFsbF9jb2VmcyA8LSBhbGxfY29lZnNfaG0gJT4lIAogIAltdXRhdGUoZXN0aW1hdGUgPSBpZmVsc2UocC52YWx1ZSA+PSAwLjA1LCBOQSwgZXN0aW1hdGUpKSAlPiUgCiAgICBtdXRhdGUoZHYgPSBmY3RfcmVsZXZlbChkdiwgbGV2ZWxzPXJldihhbGxfZHZzKSkpICU+JSAKICAJbXV0YXRlKHRlcm0gPSBmY3RfcmVsZXZlbCh0ZXJtLCBsZXZlbHM9Yygid2hhdCIsICJob3ciLCAid2h5IiwgIm9iamVjdGl2ZSIsICJldnBzdF9iZWZvcmUiLCAic3Rvcmllc19wb3N0ZWQgKFllcykiLCAiZmJfcm91dGluZSIsICJmYl9zYXRpc2ZhY3Rpb24iLCAiaW50ZXJuZXRfbGl0ZXJhY3kiLCAidHJ1c3RfcHJvcGVuc2l0eSIsICJnZW5kZXIgKFdvbWFuKSIsICJhZ2UiKSkpICU+JSAKICAJZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIiwgZHYgJWluJSBhbGxfZHZzKSAlPiUgCiAgCXNlbGVjdChkdiwgdGVybSwgZXN0aW1hdGUpCgphbGxfY29lZnMgJT4lCiAgbXV0YXRlKHRlcm0gPSBkcGx5cjo6cmVjb2RlKHRlcm0sIGB3aGF0YCA9ICJXaGF0IiwgYGhvd2AgPSAiSG93IiwgYHdoeWAgPSAiV2h5IiwgYG9iamVjdGl2ZWAgPSAiT2JqZWN0aXZlIiwgCiAgICAgICAgICBgZXZwc3RfYmVmb3JlYCA9ICJLbm93bGVkZ2UgQmVmb3JlIiwKICAgICAgICAgIGBhZ2VgID0gIkFnZSIsCiAgICAgICAgICBgZ2VuZGVyIChXb21hbilgID0gIkdlbmRlciAoV29tYW4pIiwKICAgICAgICAgIGBpbnRlcm5ldF9saXRlcmFjeWAgPSAiSW50ZXJuZXQgTGl0ZXJhY3kiLAogICAgICAgICAgYHRydXN0X3Byb3BlbnNpdHlgID0gIlRydXN0IFByb3BlbnNpdHkiLAogICAgICAgICAgYGZiX3NhdGlzZmFjdGlvbmAgPSAiRkIgU2F0aXNmYWN0aW9uIiwKICAgICAgICAgIGBmYl9yb3V0aW5lYCA9ICJSb3V0aW5lIEZCIEJlaGF2aW9yIiwKICAgICAgICAgIGBzdG9yaWVzX3Bvc3RlZCAoWWVzKWAgPSAiUG9zdGVkIExhc3QgV2VlayAoWWVzKSIpKSAlPiUKICBtdXRhdGUoZHYgPSBkcGx5cjo6cmVjb2RlKGR2LAogICAgICAgICAgYGF3YXJlX2luZm9fbmV3YCA9ICJOZXcgSW5mbyIsCiAgICAgICAgICBgYXdhcmVfaW5mb19zdXJwcmlzZWAgPSAiU3VycHJpc2luZyBJbmZvIiwKICAgICAgICAgIGBhd2FyZV9ldnBzdF9hZnRgID0gIktub3dsZWRnZSBBZnRlciIsCiAgICAgICAgICBgc3lzdGVtX3JlYXNvbnNgID0gIlN5c3RlbSBBZ2VuY3kiLAogICAgICAgICAgYHVzZXJfcmVhc29uc2AgPSAiVXNlciBBZ2VuY3kiLAogICAgICAgICAgYGNvcnJlY3RfbWlzc2VkYCA9ICJNaXNzZWQgU3RvcmllcyIsCiAgICAgICAgICBgd2FudF9mcmVxdWVuY3lgID0gIldhbnRlZCBTdG9yaWVzIiwKICAgICAgICAgIGBkb250X3dhbnRfZnJlcXVlbmN5YCA9ICJVbndhbnRlZCBTdG9yaWVzIiwKICAgICAgICAgIGBpbnRlcnByZXRfcnNuc2AgPSAiVW5kZXJzdGFuZCBXaHkiLAogICAgICAgICAgYGVudGVydGFpbmVkX2dvYWxzYCA9ICJJbnRlcnBlcnNvbmFsIEdvYWxzIiwKICAgICAgICAgIGBpbmZvcm1lZF9nb2Fsc2AgPSAiSW5mb3JtYXRpb25hbCBHb2FscyIsCiAgICAgICAgICBgYWNjdF9mYWlybmVzc2AgPSAiRmFpcm5lc3MiLAogICAgICAgICAgYGNvbnRlbnRfYWN0aW9uc2AgPSAiQ29udGVudCBBY3Rpb25zIiwKICAgICAgICAgIGB1aV9jb250cm9sc19hY3Rpb25zYCA9ICJVSSBDb250cm9scyIpKSAlPiUgCiAgbXV0YXRlKHRlcm0gPSBmY3RfcmVsZXZlbCh0ZXJtLCBsZXZlbHM9YygiV2hhdCIsICJIb3ciLCAiV2h5IiwgIk9iamVjdGl2ZSIsICJLbm93bGVkZ2UgQmVmb3JlIiwgIlBvc3RlZCBMYXN0IFdlZWsgKFllcykiLCAiUm91dGluZSBGQiBCZWhhdmlvciIsICJGQiBTYXRpc2ZhY3Rpb24iLCAiSW50ZXJuZXQgTGl0ZXJhY3kiLCAiVHJ1c3QgUHJvcGVuc2l0eSIsICJHZW5kZXIgKFdvbWFuKSIsICJBZ2UiKSkpICU+JSAKICBkcGx5cjo6cmVuYW1lKENvZWZzID0gZXN0aW1hdGUpICU+JQogIGdncGxvdChhZXModGVybSwgZHYpKSArIAoJCWdlb21fdGlsZShhZXMoZmlsbD1Db2VmcykpICsgCiAgICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnM9YygicmVkNCIsICJ3aGl0ZXNtb2tlIiwgIiMwMTY2NWUiKSwgbmEudmFsdWU9InRyYW5zcGFyZW50IiwgbGltaXRzPXJhbmdlKC0wLjg1LCAwLjg1KSkgKyAKCQl0aGVtZV9idygpICsgCgkJdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgCgkJICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLCAKCQkgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLCAKCQkgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGFuZ2xlID0gLTMwLCBoanVzdCA9IDApLAoJCSAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfYmxhbmsoKSkgKyAKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9My41KSkgKyAKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9Ni41KSkgKyAKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9OS41KSkgKwogICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0xMi41KSkKYGBgCgojVmFyaWFibGUgTmFtZXMsIGFuZCBIb3cgdGhlIFBhcGVyIFJlZmVycyB0byBUaGVtCgojI0NvbnRyb2wgVmFyaWFibGVzCgoqKkRlbW9ncmFwaGljcyoqICAKCi0gYWdlOiBBZ2UKLSBnZW5kZXI6IEdlbmRlcgotIGludGVybmV0X2xpdGVyYWN5OiBJbnRlcm5ldCBMaXRlcmFjeQotIHRydXN0X3Byb3BlbnNpdHk6IFRydXN0IFByb3BlbnNpdHkgW3Rvd2FyZHMgc29jaWFsIG1lZGlhXQoKKipGYWNlYm9vayBVc2UqKiAgCgotIGZiX3NhdGlzZmFjdGlvbjogRkIgU2F0aXNmYWN0aW9uCi0gZmJfcm91dGluZTogUm91dGluZSBGQiBCZWhhdmlvcgotIHN0b3JpZXNfcG9zdGVkOiBQb3N0ZWQgTGFzdCBXZWVrCgojI091dGNvbWUgVmFyaWFibGVzCgoqKlByaW9yIEtub3dsZWRnZSoqICAKCi0gZXZwc3RfYmVmb3JlOiBLbm93bGVkZ2UgQmVmb3JlIFthYm91dCB0aGUgTmV3cyBGZWVkXQotIGF3YXJlX2luZm9fbmV3OiBOZXcgSW5mbyBbaW4gdGhlIGV4cGxhbmF0aW9uc10KLSBhd2FyZV9pbmZvX3N1cnByaXNlOiBTdXJwcmlzaW5nIEluZm8gW2luIHRoZSBleHBsYW5hdGlvbnNdCgoqKkF3YXJlbmVzcyoqICAKCi0gYXdhcmVfZXZwc3RfYWZ0OiBLbm93bGVkZ2UgQWZ0ZXIgW2Fib3V0IHRoZSBOZXdzIEZlZWRdCi0gc3lzdGVtX3JlYXNvbnM6IFN5c3RlbSBBZ2VuY3kgW2NvbnRyb2xsaW5nIHdoYXQgdXNlcnMgc2VlXQotIHVzZXJfcmVhc29uczogVXNlciBBZ2VuY3kgW2NvbnRyb2xsaW5nIHdoYXQgdXNlcnMgc2VlXQoKKipDb3JyZWN0bmVzcyoqICAKCi0gY29ycmVjdF9taXNzZWQ6IE1pc3NlZCBTdG9yaWVzIFtpbiB0aGUgTmV3cyBGZWVkXQotIHdhbnRfZnJlcXVlbmN5OiBXYW50ZWQgU3RvcmllcyBbaW4gdGhlIE5ld3MgRmVlZF0KLSBkb250X3dhbnRfZnJlcXVlbmN5OiBVbndhbnRlZCBTdG9yaWVzIFtpbiB0aGUgTmV3cyBGZWVkXQoKKipJbnRlcnByZXRhYmlsaXR5KiogIAoKLSBpbnRlcnByZXRfcnNuczogVW5kZXJzdGFuZCBXaHkgW3N0b3JpZXMgYXBwZWFyIGluIHRoZSBOZXdzIEZlZWRdCi0gZW50ZXJ0YWluZWRfZ29hbHM6IEludGVycGVyc29uYWwgR29hbHMgW3RoYXQgdGhlIE5ld3MgRmVlZCBtZWV0c10KLSBpbmZvcm1lZF9nb2FsczogSW5mb3JtYXRpb25hbCBHb2FscyBbdGhhdCB0aGUgTmV3cyBGZWVkIG1lZXRzXQoKKipBY2NvdW50YWJpbGl0eSoqICAKCi0gYWNjdF9mYWlybmVzczogRmFpcm5lc3MgW29mIHRoZSBOZXdzIEZlZWRdCi0gY29udGVudF9hY3Rpb25zOiBDb250ZW50IEFjdGlvbnMgW2FmZmVjdCB3aGljaCBzdG9yaWVzIGFwcGVhcl0KLSB1aV9jb250cm9sc19hY3Rpb25zOiBVSSBDb250cm9scyBbYWZmZWN0IHdoaWNoIHN0b3JpZXMgYXBwZWFyXQoK