Introduction
“A simple life, is a happy life” is something you may or may have not heard before. This saying probably doesn’t apply to most people, as a majority of the population probably would not be happy with a simple life and are pretty complex dynamic individuals. Me personally, being at the age where I should be settling down and having a family, I find myself unhappy with the areas I have lived in for one reason or another. There are so many things to consider when looking for a place to settle down and a lot of thought should go into it. Even physically going to a place to scout it out, you can’t really see the things that may matter most to you sometimes.
Use Interactive Maps!
There are two tools to explore below. One is the interactive Tableau dashboard that I think works best as it allows you to adjust all the variables at once. The second tool is an application made in a package called shiny. This tool is good for visually exploring each variable one at a time.
Tableau Dashboard

Click [HERE] to use the Tableau Dashboard located in Tableau Public!
For mobile version, click [HERE]!
Note: If the map goes completely black during use, this means there are no states fitting the range selected. You will need to readjust the ranges for the map to reappear.
Interactive Shiny Application
Select a variable in the map below for overall intensity.
Data Definitions
- GEOID: This gives each state a unique id number.
- NAME: Name of the state.
- population: Population per state.
- Income: Average income per state.
- geometry: A spatial feature that helps with mapping.
- labor_force: Amount of people in the state that can work, both employed and unemployed.
- unempl: Amount of people unemployed in the state.
- unempl_perc: Percentage of people unemployed in the state.
- avg_temp_f: Average temperature for each state in Fahrenheit.
- avg_snow_in: Average amount of snowfall in inches per year by state.
- cost_index: The cost of living index by state. The higher it is the more expensive.
- air_quality: The air quality rating per state. The lower the number the better.
- school_rank: The overall quality of public schools by state rankings. The lower the value the better the school systems.
- crime_rate: The amount of crime by state. The higher the number the worse the crime rates.
- diversity: Created value combining the number of races present in the state and proportions. The higher the score, the more diverse the state is.
- median_age: The median age for each state.
- politic: The political stance in the previous presidential elections. Republican is represented as “0” and democratic as “1”.
- scenery: This is the ranking for each states scenery. The lower the number, the better the state scored for scenery.
Goal of This Project
This lead me to wanting to build the perfect tool for examining states as a whole and get the most insight as to which areas are a good fit for me. I could not find the perfect data set that fit my needs for this project, so I decided to build it myself from scratch using several sources via web scraping and API. By the end of this project, I will have a fully functioning interactive map on one or more platforms. You can explore the map to adjust variables and set ranges you feel comfortable with, resulting in the highlighted states that are the best fit for you.
Here is a list of necessities that people tend to look for in a home destination that I will build my data around.
- Population: I think most people do not prefer an overcrowded area.
- Diversity: Want to be around a good mix of cultures.
- Similar Age: It is nice when families resemble you own ages.
- Jobs: You need a source of income to support your lifestyle.
- Cost of living: A level of spending that you can justify living there.
- Weather: A lot of decisions get based on if the destination has snow or not.
- Cleanliness: People want a nice clean environment including things like air and water quality.
- Schools: You have children and want them to get a good education.
- Crime Rate: You want a safe place to live.
- Political View: Want to be around people that are like minded in regards to political policy.
- Scenery: Some people want architecture, history, mountains, a large body of water, art, and some want all of these things combined.
Data
Data Sources
In order to attempt to answer some of these sought after features, I am going to use several sources and techniques to obtain the data.
API
Web Scrape
Data Collection Process
I don’t want the view of this project to be just heavy code. For that reason, I have hidden most of the code and outputs and will only show examples of the API and web scraping process. The code for the overall project can be viewed in the top right of the page in a little box labeled “Code” where it can be downloaded.
API
Get Diversity Percentages from Census API
library(tidycensus)
# calculate race percentages by state
# establish race variables
race_vars <- c(
White = "B03002_003",
Black = "B03002_004",
Native = "B03002_005",
Asian = "B03002_006",
HIPI = "B03002_007",
Hispanic = "B03002_012"
)
# retrieve census data from API
us_race <- get_acs(
geography = "state",
variables = race_vars,
summary_var = "B03002_001"
)
# build a manageable dataframe
us_race_percent <- us_race %>%
mutate(percent = 100 * (estimate / summary_est)) %>%
select(NAME, variable, percent)
# change percent data type to integer
us_race_percent$percent <- as.integer(us_race_percent$percent)
# view table
us_race_percent
This data breaks race down into 6 categories along with respective percentages. “HIPI” race is for Hawaii Islander, Pacific Islander, and Native populations. Here is a visual for each state. 
As you can see, diversity is kind of a tricky thing to put a number on as a whole. We will try to make a column where diversity is as representative of the data as possible. We will have to consider the number of races present and the percentages for race in our consideration. I will attempt this by creating a score, which is the number of races present + proportions of race based on a points system. The higher the number, the higher the diversity in that state.
library(dplyr)
# eliminate all rows that have 0 percent
diversity <- us_race_percent[us_race_percent$percent > 0, ]
# count the number of categories that have a percentage more than 0 for each state.
cnt <- diversity %>% group_by(NAME) %>%
tally()
# create point system where higher percentages earn less points
diversity$points <- with(diversity, ifelse(percent >= 90 & percent < 100, 1, ifelse(percent > 80 & percent < 90, 2,ifelse(percent > 70 & percent < 80,3, ifelse(percent > 60 & percent < 70 , 4,ifelse(percent > 50 & percent < 60 , 5,ifelse(percent > 40 & percent < 50 , 6,ifelse(percent > 30 & percent < 40 , 7, ifelse(percent > 20 & percent < 30 , 8,ifelse(percent > 10 & percent < 20 , 9, 10))))))))))
# get sum of points; Higher points means bigger proportions of diversity.
diverse <- diversity %>%
group_by(NAME) %>%
summarise(points = sum(points))
# create score combining number of races + proportion score
diverse$diversity <- cnt$n + diverse$points
diverse <- diverse[,c(1,3)]
Here is how the new established scoring system for diversity looks.
Web Scrape
This is an example of the web scraping process to establish a scenery rank based system.
# libraries
library(tidyverse)
library(stringr)
library(xml2)
# source
url <- "https://www.thrillist.com/travel/nation/most-beautiful-states-in-america"
# scrape the data
scenery <- url %>%
read_html() %>%
html_nodes("h2")
# convert xml to data frame
vals <- data.frame(trimws(xml_text(scenery)))
# split the data into two columns of rank and state
df11 <- str_split_fixed(vals$trimws.xml_text.scenery.., " ", 2)
df11 <- data.frame(df11)
# rename
colnames(df11) <- c("scenery", "NAME")
# convert scenery to number and remove periods
df11$scenery <- as.numeric(gsub("\\.","",as.character(df11$scenery)))
# change order
df11 <- df11[,c(2,1)]
df11
Combine and Examine All Data
The package tidycensus contains pretty clean data already and there was little to no cleaning to be done for that data. As far as the web scraping data goes, we can examine the data more.

Explanation of missing data:
Some sources did not contain observations for Puerto Rico and Washington DC. The average snow had one extra Null observation and that was due to Hawaii being the only state having zero inches of snow. This is fixed later in the code.
Data Table
Below is a view of the data table. Given the compact size of the dataset, having some one glance context is helpful.
Analysis
To create a tool for analyzing the data, I imported the data into Tableau and built the dashboard there. An example of the tool and the results for the ranges I picked are demonstrated in the image below.

After narrowing down the ranges of the variables I felt best fit my needs, the states remaining were Colorado and Virginia. To be more specific, I limited my variables to democratic, small to medium sized populations, a higher average of income, a lower cost of living, a smaller size of labor force, lower median age, medium to low crime rate, and a high scenery ranking. All other variables were pretty much full range and did not matter to me.
Oddly enough, these are the two states I have traveled to recently at the end of 2021, checking out most of Colorado state-wide and Williamsburg, Virginia with the intention of possibly moving there. Both of these areas were beautiful and it is hard to pick one over the other. This tool has helped reaffirm my considerations for moving to these areas.
If you want to read more on this subject, here is an excellent and relevant article. [Article]
LS0tDQp0aXRsZTogIldoZXJlIERvIEkgQmVsb25nPyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAyDQotLS0NCg0KIVtHT09HTEUgSU1BR0VTXShodHRwczovL2hhZ2Fkb25lLm1lZGlhLmNsaWVudHMuZWxsaW5ndG9uY21zLmNvbS9BUlRJQ0xFXzE3MDczOTk4N19BUl8wX0paTUZPVVZQWExRTF90MTE3MC5qcGc/NWNjNzE4NjY1YWI2NzJkYmE5M2Q1MTFhYjRjNjgyYmIzNzBlNWY4NikNCg0KIyBfX0ludHJvZHVjdGlvbl9fDQoNCnwgICAgIF9fXyJBIHNpbXBsZSBsaWZlLCBpcyBhIGhhcHB5IGxpZmUiX19fIGlzIHNvbWV0aGluZyB5b3UgbWF5IG9yIG1heSBoYXZlIG5vdCBoZWFyZCBiZWZvcmUuIFRoaXMgc2F5aW5nIHByb2JhYmx5IGRvZXNuJ3QgYXBwbHkgdG8gbW9zdCBwZW9wbGUsIGFzIGEgbWFqb3JpdHkgb2YgdGhlIHBvcHVsYXRpb24gcHJvYmFibHkgd291bGQgbm90IGJlIGhhcHB5IHdpdGggYSBzaW1wbGUgbGlmZSBhbmQgYXJlIHByZXR0eSBjb21wbGV4IGR5bmFtaWMgaW5kaXZpZHVhbHMuIE1lIHBlcnNvbmFsbHksIGJlaW5nIGF0IHRoZSBhZ2Ugd2hlcmUgSSBzaG91bGQgYmUgc2V0dGxpbmcgZG93biBhbmQgaGF2aW5nIGEgZmFtaWx5LCBJIGZpbmQgbXlzZWxmIHVuaGFwcHkgd2l0aCB0aGUgYXJlYXMgSSBoYXZlIGxpdmVkIGluIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuIFRoZXJlIGFyZSBzbyBtYW55IHRoaW5ncyB0byBjb25zaWRlciB3aGVuIGxvb2tpbmcgZm9yIGEgcGxhY2UgdG8gc2V0dGxlIGRvd24gYW5kIGEgbG90IG9mIHRob3VnaHQgc2hvdWxkIGdvIGludG8gaXQuIEV2ZW4gcGh5c2ljYWxseSBnb2luZyB0byBhIHBsYWNlIHRvIHNjb3V0IGl0IG91dCwgeW91IGNhbid0IHJlYWxseSBzZWUgdGhlIHRoaW5ncyB0aGF0IG1heSBtYXR0ZXIgbW9zdCB0byB5b3Ugc29tZXRpbWVzLiANCg0KDQojIF9fVXNlIEludGVyYWN0aXZlIE1hcHMhX18NCg0KfCAgIFRoZXJlIGFyZSB0d28gdG9vbHMgdG8gZXhwbG9yZSBiZWxvdy4gT25lIGlzIHRoZSBpbnRlcmFjdGl2ZSBUYWJsZWF1IGRhc2hib2FyZCB0aGF0IEkgdGhpbmsgd29ya3MgYmVzdCBhcyBpdCBhbGxvd3MgeW91IHRvIGFkanVzdCBhbGwgdGhlIHZhcmlhYmxlcyBhdCBvbmNlLiBUaGUgc2Vjb25kIHRvb2wgaXMgYW4gYXBwbGljYXRpb24gbWFkZSBpbiBhIHBhY2thZ2UgY2FsbGVkIHNoaW55LiBUaGlzIHRvb2wgaXMgZ29vZCBmb3IgdmlzdWFsbHkgZXhwbG9yaW5nIGVhY2ggdmFyaWFibGUgb25lIGF0IGEgdGltZS4NCg0KDQojIyBfX1RhYmxlYXUgRGFzaGJvYXJkX18NCiFbXShDOi9Vc2Vycy9DU0ZpYy9EZXNrdG9wL2RlbW8uZ2lmKQ0KDQpfX0NsaWNrICFbW0hFUkVdKGh0dHBzOi8vcHVibGljLnRhYmxlYXUuY29tL3NoYXJlZC9aU01DVE5XSzk/OmRpc3BsYXlfY291bnQ9biY6b3JpZ2luPXZpel9zaGFyZV9saW5rKV0gdG8gdXNlIHRoZSBUYWJsZWF1IERhc2hib2FyZCBsb2NhdGVkIGluIFRhYmxlYXUgUHVibGljIV9fDQoNCl9fRm9yIG1vYmlsZSB2ZXJzaW9uLCBjbGljayAhW1tIRVJFXShodHRwczovL3B1YmxpYy50YWJsZWF1LmNvbS92aWV3cy9CZXN0U3RhdGVQaG9uZS9EYXNoYm9hcmQxPzpsYW5ndWFnZT1lbi1VUyZwdWJsaXNoPXllcyY6ZGlzcGxheV9jb3VudD1uJjpvcmlnaW49dml6X3NoYXJlX2xpbmspXSEgX18NCg0KKk5vdGU6IElmIHRoZSBtYXAgZ29lcyBjb21wbGV0ZWx5IGJsYWNrIGR1cmluZyB1c2UsIHRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIHN0YXRlcyBmaXR0aW5nIHRoZSByYW5nZSBzZWxlY3RlZC4gWW91IHdpbGwgbmVlZCB0byByZWFkanVzdCB0aGUgcmFuZ2VzIGZvciB0aGUgbWFwIHRvIHJlYXBwZWFyLioNCg0KPGJyPg0KDQojIyBfX0ludGVyYWN0aXZlIFNoaW55IEFwcGxpY2F0aW9uX18NCg0KDQpfX1NlbGVjdCBhIHZhcmlhYmxlIGluIHRoZSBtYXAgYmVsb3cgZm9yIG92ZXJhbGwgaW50ZW5zaXR5Ll9fDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIHJ1biBzaGlueSBhcHAgZnJvbSBnaXRodWI7IHdpbGwgbm90IGRpc3BsYXkgaW4ga25pdHRlZCBmaWxlDQojcnVuR2l0SHViKHJlcG8gPSAiT3V0LW9mLVN0YXRlIiwiRmFubnlQYWNrRmFuYXRpYyIsIHJlZj0gIm1haW4iKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG91dC53aWR0aD0iMTAwJSJ9DQojIGRpc3BsYXkgbGluayB0byBwdWJsaXNoZWQgc2hpbnkgYXBwDQpsaWJyYXJ5KGtuaXRyKQ0KDQppbmNsdWRlX3VybCgiaHR0cHM6Ly9jcmFpZ2Yuc2hpbnlhcHBzLmlvL091dE9mU3RhdGUvIiwgaGVpZ2h0ID0gNjAwKQ0KYGBgDQoNCiMjIF9fRGF0YSBEZWZpbml0aW9uc19fDQoNCiogX19HRU9JRF9fOiBUaGlzIGdpdmVzIGVhY2ggc3RhdGUgYSB1bmlxdWUgaWQgbnVtYmVyLg0KKiBfX05BTUVfXzogTmFtZSBvZiB0aGUgc3RhdGUuDQoqIF9fcG9wdWxhdGlvbl9fOiBQb3B1bGF0aW9uIHBlciBzdGF0ZS4NCiogX19JbmNvbWVfXzogQXZlcmFnZSBpbmNvbWUgcGVyIHN0YXRlLg0KKiBfX2dlb21ldHJ5X186IEEgc3BhdGlhbCBmZWF0dXJlIHRoYXQgaGVscHMgd2l0aCBtYXBwaW5nLg0KKiBfX2xhYm9yX2ZvcmNlX186IEFtb3VudCBvZiBwZW9wbGUgaW4gdGhlIHN0YXRlIHRoYXQgY2FuIHdvcmssIGJvdGggZW1wbG95ZWQgYW5kIHVuZW1wbG95ZWQuDQoqIF9fdW5lbXBsX186IEFtb3VudCBvZiBwZW9wbGUgdW5lbXBsb3llZCBpbiB0aGUgc3RhdGUuDQoqIF9fdW5lbXBsX3BlcmNfXzogUGVyY2VudGFnZSBvZiBwZW9wbGUgdW5lbXBsb3llZCBpbiB0aGUgc3RhdGUuDQoqIF9fYXZnX3RlbXBfZl9fOiBBdmVyYWdlIHRlbXBlcmF0dXJlIGZvciBlYWNoIHN0YXRlIGluIEZhaHJlbmhlaXQuIA0KKiBfX2F2Z19zbm93X2luX186IEF2ZXJhZ2UgYW1vdW50IG9mIHNub3dmYWxsIGluIGluY2hlcyBwZXIgeWVhciBieSBzdGF0ZS4NCiogX19jb3N0X2luZGV4X186IFRoZSBjb3N0IG9mIGxpdmluZyBpbmRleCBieSBzdGF0ZS4gVGhlIGhpZ2hlciBpdCBpcyB0aGUgbW9yZSBleHBlbnNpdmUuDQoqIF9fYWlyX3F1YWxpdHlfXzogVGhlIGFpciBxdWFsaXR5IHJhdGluZyBwZXIgc3RhdGUuIFRoZSBsb3dlciB0aGUgbnVtYmVyIHRoZSBiZXR0ZXIuDQoqIF9fc2Nob29sX3JhbmtfXzogVGhlIG92ZXJhbGwgcXVhbGl0eSBvZiBwdWJsaWMgc2Nob29scyBieSBzdGF0ZSByYW5raW5ncy4gVGhlIGxvd2VyIHRoZSB2YWx1ZSB0aGUgYmV0dGVyIHRoZSBzY2hvb2wgc3lzdGVtcy4NCiogX19jcmltZV9yYXRlX186IFRoZSBhbW91bnQgb2YgY3JpbWUgYnkgc3RhdGUuIFRoZSBoaWdoZXIgdGhlIG51bWJlciB0aGUgd29yc2UgdGhlIGNyaW1lIHJhdGVzLg0KKiBfX2RpdmVyc2l0eV9fOiBDcmVhdGVkIHZhbHVlIGNvbWJpbmluZyB0aGUgbnVtYmVyIG9mIHJhY2VzIHByZXNlbnQgaW4gdGhlIHN0YXRlIGFuZCBwcm9wb3J0aW9ucy4gVGhlIGhpZ2hlciB0aGUgc2NvcmUsIHRoZSBtb3JlIGRpdmVyc2UgdGhlIHN0YXRlIGlzLg0KKiBfX21lZGlhbl9hZ2VfXzogVGhlIG1lZGlhbiBhZ2UgZm9yIGVhY2ggc3RhdGUuDQoqIF9fcG9saXRpY19fOiBUaGUgcG9saXRpY2FsIHN0YW5jZSBpbiB0aGUgcHJldmlvdXMgcHJlc2lkZW50aWFsIGVsZWN0aW9ucy4gUmVwdWJsaWNhbiBpcyByZXByZXNlbnRlZCBhcyAiMCIgYW5kIGRlbW9jcmF0aWMgYXMgIjEiLg0KKiBfX3NjZW5lcnlfXzogVGhpcyBpcyB0aGUgcmFua2luZyBmb3IgZWFjaCBzdGF0ZXMgc2NlbmVyeS4gVGhlIGxvd2VyIHRoZSBudW1iZXIsIHRoZSBiZXR0ZXIgdGhlIHN0YXRlIHNjb3JlZCBmb3Igc2NlbmVyeS4NCg0KDQojIF9fR29hbCBvZiBUaGlzIFByb2plY3RfXw0KDQp8ICAgICBUaGlzIGxlYWQgbWUgdG8gd2FudGluZyB0byBidWlsZCB0aGUgcGVyZmVjdCB0b29sIGZvciBleGFtaW5pbmcgc3RhdGVzIGFzIGEgd2hvbGUgYW5kIGdldCB0aGUgbW9zdCBpbnNpZ2h0IGFzIHRvIHdoaWNoIGFyZWFzIGFyZSBhIGdvb2QgZml0IGZvciBtZS4gSSBjb3VsZCBub3QgZmluZCB0aGUgcGVyZmVjdCBkYXRhIHNldCB0aGF0IGZpdCBteSBuZWVkcyBmb3IgdGhpcyBwcm9qZWN0LCBzbyBJIGRlY2lkZWQgdG8gYnVpbGQgaXQgbXlzZWxmIGZyb20gc2NyYXRjaCB1c2luZyBzZXZlcmFsIHNvdXJjZXMgdmlhIHdlYiBzY3JhcGluZyBhbmQgQVBJLiBCeSB0aGUgZW5kIG9mIHRoaXMgcHJvamVjdCwgSSB3aWxsIGhhdmUgYSBmdWxseSBmdW5jdGlvbmluZyBpbnRlcmFjdGl2ZSBtYXAgb24gb25lIG9yIG1vcmUgcGxhdGZvcm1zLiBZb3UgY2FuIGV4cGxvcmUgdGhlIG1hcCB0byBhZGp1c3QgdmFyaWFibGVzIGFuZCBzZXQgcmFuZ2VzIHlvdSBmZWVsIGNvbWZvcnRhYmxlIHdpdGgsIHJlc3VsdGluZyBpbiB0aGUgaGlnaGxpZ2h0ZWQgc3RhdGVzIHRoYXQgYXJlIHRoZSBiZXN0IGZpdCBmb3IgeW91Lg0KPGJyPg0KX19IZXJlIGlzIGEgbGlzdCBvZiBuZWNlc3NpdGllcyB0aGF0IHBlb3BsZSB0ZW5kIHRvIGxvb2sgZm9yIGluIGEgaG9tZSBkZXN0aW5hdGlvbiB0aGF0IEkgd2lsbCBidWlsZCBteSBkYXRhIGFyb3VuZC4gX18gDQo8YnI+DQoNCiogX19Qb3B1bGF0aW9uX186IEkgdGhpbmsgbW9zdCBwZW9wbGUgZG8gbm90IHByZWZlciBhbiBvdmVyY3Jvd2RlZCBhcmVhLg0KKiBfX0RpdmVyc2l0eV9fOiBXYW50IHRvIGJlIGFyb3VuZCBhIGdvb2QgbWl4IG9mIGN1bHR1cmVzLg0KKiBfX1NpbWlsYXIgQWdlX186IEl0IGlzIG5pY2Ugd2hlbiBmYW1pbGllcyByZXNlbWJsZSB5b3Ugb3duIGFnZXMuDQoqIF9fSm9ic19fOiBZb3UgbmVlZCBhIHNvdXJjZSBvZiBpbmNvbWUgdG8gc3VwcG9ydCB5b3VyIGxpZmVzdHlsZS4NCiogX19Db3N0IG9mIGxpdmluZ19fOiBBIGxldmVsIG9mIHNwZW5kaW5nIHRoYXQgeW91IGNhbiBqdXN0aWZ5IGxpdmluZyB0aGVyZS4NCiogX19XZWF0aGVyX186IEEgbG90IG9mIGRlY2lzaW9ucyBnZXQgYmFzZWQgb24gaWYgdGhlIGRlc3RpbmF0aW9uIGhhcyBzbm93IG9yIG5vdC4NCiogX19DbGVhbmxpbmVzc19fOiBQZW9wbGUgd2FudCBhIG5pY2UgY2xlYW4gZW52aXJvbm1lbnQgaW5jbHVkaW5nIHRoaW5ncyBsaWtlIGFpciBhbmQgd2F0ZXIgcXVhbGl0eS4NCiogX19TY2hvb2xzX186IFlvdSBoYXZlIGNoaWxkcmVuIGFuZCB3YW50IHRoZW0gdG8gZ2V0IGEgZ29vZCBlZHVjYXRpb24uDQoqIF9fQ3JpbWUgUmF0ZV9fOiBZb3Ugd2FudCBhIHNhZmUgcGxhY2UgdG8gbGl2ZS4NCiogX19Qb2xpdGljYWwgVmlld19fOiBXYW50IHRvIGJlIGFyb3VuZCBwZW9wbGUgdGhhdCBhcmUgbGlrZSBtaW5kZWQgaW4gcmVnYXJkcyB0byBwb2xpdGljYWwgcG9saWN5Lg0KKiBfX1NjZW5lcnlfXzogU29tZSBwZW9wbGUgd2FudCBhcmNoaXRlY3R1cmUsIGhpc3RvcnksIG1vdW50YWlucywgYSBsYXJnZSBib2R5IG9mIHdhdGVyLCBhcnQsIGFuZCBzb21lIHdhbnQgYWxsIG9mIHRoZXNlIHRoaW5ncyBjb21iaW5lZC4NCg0KIyBfX0RhdGFfXw0KDQoNCiMjIF9fRGF0YSBTb3VyY2VzX18NCg0KfCAgICAgSW4gb3JkZXIgdG8gYXR0ZW1wdCB0byBhbnN3ZXIgc29tZSBvZiB0aGVzZSBzb3VnaHQgYWZ0ZXIgZmVhdHVyZXMsIEkgYW0gZ29pbmcgdG8gdXNlIHNldmVyYWwgc291cmNlcyBhbmQgdGVjaG5pcXVlcyB0byBvYnRhaW4gdGhlIGRhdGEuDQo8YnI+DQoNCiBfX0FQSV9fDQoNCiogX190aWR5Y2Vuc3VzX186IFRoaXMgaXMgYSBncmVhdCBhcGkgdGhhdCBjb25zaXN0IG9mIGNlbnN1cyBpbmZvcm1hdGlvbiBmb3IgdGhlIHVuaXRlZCBzdGF0ZXMgaW5jbHVkaW5nIHJhY2UgcGVyY2VudGFnZXMsIGFnZSwgYW5kIHBvcHVsYXRpb24gKGtleSByZXF1aXJlZCkuICAgICAgICAgDQogaHR0cHM6Ly9hcGkuY2Vuc3VzLmdvdi9kYXRhL2tleV9zaWdudXAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiBfX1dlYiBTY3JhcGVfXw0KDQoqIF9fVS5TLiBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljc19fOiBUaGlzIGRhdGEgY29udGFpbnMgdGhlIGFtb3VudCBvZiBjaXZpbGlhbiBsYWJvciBmb3JjZSwgbnVtYmVyIG9mIHVuZW1wbG95ZWQsIGFuZCBwZXJjZW50YWdlIHVuZW1wbG95ZWQgYnkgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgDQpodHRwczovL3d3dy5ibHMuZ292L25ld3MucmVsZWFzZS9sYXVzLnQwMS5odG0NCg0KKiBfX3VzYWJ5bnVtYmVycy5jb21fXzogVGhpcyBkYXRhIGNvbnRhaW5zIHRoZSBjb3N0IG9mIGxpdmluZyBpbmRleCByYW5rcyBieSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KaHR0cHM6Ly91c2FieW51bWJlcnMuY29tL3N0YXRlcy1yYW5rZWQtYnktY29zdC1vZi1saXZpbmcvDQoNCiogX19jdXJyZW50cmVzdWx0cy5jb21fXzogVGhpcyBkYXRhIGNvbnRhaW5zIHRoZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGJ5IHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KaHR0cHM6Ly93d3cuY3VycmVudHJlc3VsdHMuY29tL1dlYXRoZXIvVVMvYXZlcmFnZS1hbm51YWwtc3RhdGUtdGVtcGVyYXR1cmVzLnBocA0KDQoqIF9fd29ybGRwb3B1bGF0aW9ucmV2aWV3LmNvbV9fOiBUaGlzIGRhdGEgY29udGFpbnMgYW1vdW50IG9mIGF2ZXJhZ2Ugc25vd2ZhbGwgaW4gaW5jaGVzIGJ5IHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpodHRwczovL3dvcmxkcG9wdWxhdGlvbnJldmlldy5jb20vc3RhdGUtcmFua2luZ3Mvc25vd2llc3Qtc3RhdGVzDQoNCiogX193b3JsZHBvcHVsYXRpb25yZXZpZXcuY29tX186IFRoaXMgZGF0YSBjb250YWlucyBhaXIgcXVhbGl0eSBieSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KaHR0cHM6Ly93b3JsZHBvcHVsYXRpb25yZXZpZXcuY29tL3N0YXRlLXJhbmtpbmdzL2Fpci1xdWFsaXR5LWJ5LXN0YXRlDQoNCiogX19VLlMuIEJ1cmVhdSBvZiBMYWJvciBTdGF0aXN0aWNzX186IFRoaXMgZGF0YSBjb250YWlucyB0aGUgc3RhdGVzIHB1YmxpYyBzY2hvb2wgb3ZlcmFsbCByYW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmh0dHBzOi8vd29ybGRwb3B1bGF0aW9ucmV2aWV3LmNvbS9zdGF0ZS1yYW5raW5ncy9wdWJsaWMtc2Nob29sLXJhbmtpbmdzLWJ5LXN0YXRlDQoNCiogX19lbi53aWtpcGVkaWEub3JnX186IFRoaXMgZGF0YSBjb250YWlucyBjcmltZSByYXRlcyBmb3IgZWFjaCBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1UuUy5fc3RhdGVzX2FuZF90ZXJyaXRvcmllc19ieV92aW9sZW50X2NyaW1lX3JhdGUNCg0KKiBfX2VuLndpa2lwZWRpYS5vcmdfXzogVGhpcyBkYXRhIGNvbnRhaW5zIHBvbGl0aWNhbCB2aWV3cyBmb3IgZWFjaCBzdGF0ZSBmcm9tIHRoZSBsYXN0IHByZXNpZGVudGlhbCBlbGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qb2xpdGljYWxfcGFydHlfc3RyZW5ndGhfaW5fVS5TLl9zdGF0ZXMNCg0KKiBfX3RocmlsbGlzdC5jb21fXzogVGhpcyBkYXRhIGNvbnRhaW5zIHN0YXRlIHJhbmtzIGZvciBzY2VuZXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KaHR0cHM6Ly93d3cudGhyaWxsaXN0LmNvbS90cmF2ZWwvbmF0aW9uL21vc3QtYmVhdXRpZnVsLXN0YXRlcy1pbi1hbWVyaWNhDQoNCg0KIyBfX0RhdGEgQ29sbGVjdGlvbiBQcm9jZXNzX18NCg0KfCAgICAgX19JIGRvbid0IHdhbnQgdGhlIHZpZXcgb2YgdGhpcyBwcm9qZWN0IHRvIGJlIGp1c3QgaGVhdnkgY29kZS4gRm9yIHRoYXQgcmVhc29uLCBJIGhhdmUgaGlkZGVuIG1vc3Qgb2YgdGhlIGNvZGUgYW5kIG91dHB1dHMgYW5kIHdpbGwgb25seSBzaG93IGV4YW1wbGVzIG9mIHRoZSBBUEkgYW5kIHdlYiBzY3JhcGluZyBwcm9jZXNzLiBUaGUgY29kZSBmb3IgdGhlIG92ZXJhbGwgcHJvamVjdCBjYW4gYmUgdmlld2VkIGluIHRoZSB0b3AgcmlnaHQgb2YgdGhlIHBhZ2UgaW4gYSBsaXR0bGUgYm94IGxhYmVsZWQgIkNvZGUiIHdoZXJlIGl0IGNhbiBiZSBkb3dubG9hZGVkLl9fDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyBIZXJlIGlzIGEgbGlzdCBvZiBwYWNrYWdlcyB1c2VkIGluIHRoZSBwcm9jZXNzIGFuZCB0aWR5Y2Vuc3VzIEFQSSBLZXkNCg0KbGlicmFyeSh0aWR5Y2Vuc3VzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHJ2ZXN0KQ0KY2Vuc3VzX2FwaV9rZXkoIjk4ZDcwNjE4Njg3YTQ1Y2ZlMDRlNjBlM2ZhNmNjMmU4NzAzNmZjZWIiKQ0KDQpgYGANCg0KIyMgX19BUElfXw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz1GQUxTRX0NCiMgTWFwIFVTIHN0YXRlIFBvcHVsYXRpb25zDQoNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoc2YpDQoNCg0KIyBub3QgdXNlZCBpbiBrbml0IA0KIyBhcHBseSBwb3B1bGF0aW9uIGF0IHN0YXRlIGxldmVsDQp1c19wb3AgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAic3RhdGUiLCB2YXJpYWJsZXMgPSAiQjAxMDAzXzAwMSIsIGdlb21ldHJ5ID0gVFJVRSkNCg0KcGFsIDwtIGNvbG9yUXVhbnRpbGUocGFsZXR0ZSA9ICJ2aXJpZGlzIiwgZG9tYWluID0gdXNfcG9wJGVzdGltYXRlLCBuID0gMTApDQoNCnVzX3BvcCAlPiUNCiAgICBzdF90cmFuc2Zvcm0oY3JzID0gIitpbml0PWVwc2c6NDMyNiIpICU+JQ0KICAgIGxlYWZsZXQod2lkdGggPSAiMTAwJSIpICU+JQ0KICAgIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXIgPSAiQ2FydG9EQi5Qb3NpdHJvbiIpICU+JQ0KICAgIGFkZFBvbHlnb25zKHBvcHVwID0gfiBzdHJfZXh0cmFjdChOQU1FLCAiXihbXixdKikiKSwNCiAgICAgICAgICAgICAgICBzdHJva2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLA0KICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC43LA0KICAgICAgICAgICAgICAgIGNvbG9yID0gfiBwYWwoZXN0aW1hdGUpKSAlPiUNCiAgICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICAgIHBhbCA9IHBhbCwgDQogICAgICAgICAgICAgIHZhbHVlcyA9IH4gZXN0aW1hdGUsDQogICAgICAgICAgICAgIHRpdGxlID0gIlBvcHVsYXRpb24gcGVyY2VudGlsZXMiLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMSkNCg0KDQojIHBvcHVsYXRpb24gc3Vic2V0DQp1c19wb3AkcG9wdWxhdGlvbiA8LSB1c19wb3AkZXN0aW1hdGUNClVTX3BvcDIgPC0gdXNfcG9wWywtYygzOjYpXSANCg0KVVNfcG9wMg0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBmaWcuc2hvdz0naGlkZSd9DQoNCiMgbm90IHVzZWQgaW4ga25pdA0KIyBHYXRoZXIgQXZlcmFnZSBJbmNvbWUgYnkgU3RhdGUgYW5kIHZpc3VhbGl6ZQ0KDQpVU19pbmMgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAic3RhdGUiLCB2YXJpYWJsZXMgPSAiQjE5MDEzXzAwMSIpDQoNCiMgaW5jb21lIGJ5IHN0YXRlDQpVU19pbmMgJT4lDQogIG11dGF0ZShOQU1FID0gZ3N1YigiU3RhdGUsIFVTIiwgIiIsIE5BTUUpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZXN0aW1hdGUsIHkgPSByZW9yZGVyKE5BTUUsIGVzdGltYXRlKSkpICsNCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBlc3RpbWF0ZSAtIG1vZSwgeG1heCA9IGVzdGltYXRlICsgbW9lKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiSG91c2Vob2xkIEluY29tZSBieSBTdGF0ZSBpbiB0aGUgVVMiLA0KICAgICAgIHN1YnRpdGxlID0gIjIwMTUtMjAxOSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IiwNCiAgICAgICB5ID0gIiIsDQogICAgICAgeCA9ICJBQ1MgZXN0aW1hdGUgKGJhcnMgcmVwcmVzZW50IG1hcmdpbiBvZiBlcnJvcikiKQ0KDQojIGluY29tZSBzdWJzZXQNClVTX2luYyRJbmNvbWUgPC0gVVNfaW5jJGVzdGltYXRlDQp1c19pbmMyIDwtIFVTX2luY1ssLWMoMyw0LDUpXQ0KDQpgYGANCg0KR2V0IERpdmVyc2l0eSBQZXJjZW50YWdlcyBmcm9tIENlbnN1cyBBUEkNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5Y2Vuc3VzKQ0KDQojIGNhbGN1bGF0ZSByYWNlIHBlcmNlbnRhZ2VzIGJ5IHN0YXRlDQojIGVzdGFibGlzaCByYWNlIHZhcmlhYmxlcw0KcmFjZV92YXJzIDwtIGMoDQogIFdoaXRlID0gIkIwMzAwMl8wMDMiLA0KICBCbGFjayA9ICJCMDMwMDJfMDA0IiwNCiAgTmF0aXZlID0gIkIwMzAwMl8wMDUiLA0KICBBc2lhbiA9ICJCMDMwMDJfMDA2IiwNCiAgSElQSSA9ICJCMDMwMDJfMDA3IiwNCiAgSGlzcGFuaWMgPSAiQjAzMDAyXzAxMiINCikNCg0KIyByZXRyaWV2ZSBjZW5zdXMgZGF0YSBmcm9tIEFQSQ0KdXNfcmFjZSA8LSBnZXRfYWNzKA0KICBnZW9ncmFwaHkgPSAic3RhdGUiLA0KICB2YXJpYWJsZXMgPSByYWNlX3ZhcnMsDQogIHN1bW1hcnlfdmFyID0gIkIwMzAwMl8wMDEiDQopDQoNCiMgYnVpbGQgYSBtYW5hZ2VhYmxlIGRhdGFmcmFtZQ0KdXNfcmFjZV9wZXJjZW50IDwtIHVzX3JhY2UgJT4lDQogIG11dGF0ZShwZXJjZW50ID0gMTAwICogKGVzdGltYXRlIC8gc3VtbWFyeV9lc3QpKSAlPiUNCiAgc2VsZWN0KE5BTUUsIHZhcmlhYmxlLCBwZXJjZW50KQ0KDQojIGNoYW5nZSBwZXJjZW50IGRhdGEgdHlwZSB0byBpbnRlZ2VyDQp1c19yYWNlX3BlcmNlbnQkcGVyY2VudCA8LSBhcy5pbnRlZ2VyKHVzX3JhY2VfcGVyY2VudCRwZXJjZW50KQ0KDQojIHZpZXcgdGFibGUNCnVzX3JhY2VfcGVyY2VudA0KYGBgDQo8YnI+DQoqX19fVGhpcyBkYXRhIGJyZWFrcyByYWNlIGRvd24gaW50byA2IGNhdGVnb3JpZXMgYWxvbmcgd2l0aCByZXNwZWN0aXZlIHBlcmNlbnRhZ2VzLiAiSElQSSIgcmFjZSBpcyBmb3IgSGF3YWlpIElzbGFuZGVyLCBQYWNpZmljIElzbGFuZGVyLCBhbmQgTmF0aXZlIHBvcHVsYXRpb25zLiBIZXJlIGlzIGEgdmlzdWFsIGZvciBlYWNoIHN0YXRlLl9fXyoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0xMX0NCiMgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KDQojIHBsb3QNCnZpeiA8LSBnZ3Bsb3QodXNfcmFjZV9wZXJjZW50LCBhZXMoZmlsbD12YXJpYWJsZSwgeT1wZXJjZW50LCB4PU5BTUUpKSArIA0KICAgIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQ9ImlkZW50aXR5IikgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFQpICsNCiAgICBnZ3RpdGxlKCJSYWNlIFBlcmNlbnRhZ2UiKSArDQogICAgdGhlbWVfaXBzdW0oKSArDQogICAgeGxhYigiU3RhdGUiKSArIA0KICAgIGNvb3JkX2ZsaXAoKSArDQogICAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTUpKQ0KIyB2aWV3DQp2aXoNCg0KYGBgDQoNCg0KfCAgICAgQXMgeW91IGNhbiBzZWUsIGRpdmVyc2l0eSBpcyBraW5kIG9mIGEgdHJpY2t5IHRoaW5nIHRvIHB1dCBhIG51bWJlciBvbiBhcyBhIHdob2xlLiBXZSB3aWxsIHRyeSB0byBtYWtlIGEgY29sdW1uIHdoZXJlIGRpdmVyc2l0eSBpcyBhcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgZGF0YSBhcyBwb3NzaWJsZS4gV2Ugd2lsbCBoYXZlIHRvIGNvbnNpZGVyIHRoZSBudW1iZXIgb2YgcmFjZXMgcHJlc2VudCBhbmQgdGhlIHBlcmNlbnRhZ2VzIGZvciByYWNlIGluIG91ciBjb25zaWRlcmF0aW9uLiBJIHdpbGwgYXR0ZW1wdCB0aGlzIGJ5IGNyZWF0aW5nIGEgc2NvcmUsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgcmFjZXMgcHJlc2VudCArIHByb3BvcnRpb25zIG9mIHJhY2UgYmFzZWQgb24gYSBwb2ludHMgc3lzdGVtLiBUaGUgaGlnaGVyIHRoZSBudW1iZXIsIHRoZSBoaWdoZXIgdGhlIGRpdmVyc2l0eSBpbiB0aGF0IHN0YXRlLg0KDQo8YnI+DQogICANCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCg0KIyBlbGltaW5hdGUgYWxsIHJvd3MgdGhhdCBoYXZlIDAgcGVyY2VudA0KZGl2ZXJzaXR5IDwtIHVzX3JhY2VfcGVyY2VudFt1c19yYWNlX3BlcmNlbnQkcGVyY2VudCA+IDAsIF0NCg0KIyBjb3VudCB0aGUgbnVtYmVyIG9mIGNhdGVnb3JpZXMgdGhhdCBoYXZlIGEgcGVyY2VudGFnZSBtb3JlIHRoYW4gMCBmb3IgZWFjaCBzdGF0ZS4NCmNudCA8LSBkaXZlcnNpdHkgJT4lIGdyb3VwX2J5KE5BTUUpICU+JQ0KICB0YWxseSgpDQoNCiMgY3JlYXRlIHBvaW50IHN5c3RlbSB3aGVyZSBoaWdoZXIgcGVyY2VudGFnZXMgZWFybiBsZXNzIHBvaW50cw0KZGl2ZXJzaXR5JHBvaW50cyA8LSB3aXRoKGRpdmVyc2l0eSwgaWZlbHNlKHBlcmNlbnQgPj0gOTAgJiBwZXJjZW50IDwgMTAwLCAxLCBpZmVsc2UocGVyY2VudCA+IDgwICYgcGVyY2VudCA8IDkwLCAyLGlmZWxzZShwZXJjZW50ID4gNzAgJiBwZXJjZW50IDwgODAsMywgaWZlbHNlKHBlcmNlbnQgPiA2MCAmIHBlcmNlbnQgPCA3MCAsIDQsaWZlbHNlKHBlcmNlbnQgPiA1MCAmIHBlcmNlbnQgPCA2MCAsIDUsaWZlbHNlKHBlcmNlbnQgPiA0MCAmIHBlcmNlbnQgPCA1MCAsIDYsaWZlbHNlKHBlcmNlbnQgPiAzMCAmIHBlcmNlbnQgPCA0MCAsIDcsIGlmZWxzZShwZXJjZW50ID4gMjAgJiBwZXJjZW50IDwgMzAgLCA4LGlmZWxzZShwZXJjZW50ID4gMTAgJiBwZXJjZW50IDwgMjAgLCA5LCAxMCkpKSkpKSkpKSkNCg0KIyBnZXQgc3VtIG9mIHBvaW50czsgSGlnaGVyIHBvaW50cyBtZWFucyBiaWdnZXIgcHJvcG9ydGlvbnMgb2YgZGl2ZXJzaXR5Lg0KZGl2ZXJzZSA8LSBkaXZlcnNpdHkgJT4lIA0KICBncm91cF9ieShOQU1FKSAlPiUgDQogIHN1bW1hcmlzZShwb2ludHMgPSBzdW0ocG9pbnRzKSkNCg0KIyBjcmVhdGUgc2NvcmUgY29tYmluaW5nIG51bWJlciBvZiByYWNlcyArIHByb3BvcnRpb24gc2NvcmUNCmRpdmVyc2UkZGl2ZXJzaXR5IDwtIGNudCRuICsgZGl2ZXJzZSRwb2ludHMNCmRpdmVyc2UgPC0gZGl2ZXJzZVssYygxLDMpXQ0KYGBgDQpIZXJlIGlzIGhvdyB0aGUgbmV3IGVzdGFibGlzaGVkIHNjb3Jpbmcgc3lzdGVtIGZvciBkaXZlcnNpdHkgbG9va3MuDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgdmlldw0KZGl2ZXJzZQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCAsIHJlc3VsdHM9J2hpZGUnfQ0KIyBHZXQgYWdlIGJ5IHN0YXRlIGZyb20gQ2Vuc3VzIEFQSQ0KDQp1c19tZWRpYW5fYWdlIDwtIGdldF9hY3MoDQogIGdlb2dyYXBoeSA9ICJzdGF0ZSIsDQogIHZhcmlhYmxlcyA9ICJCMDEwMDJfMDAxIiwNCiAgeWVhciA9IDIwMTksDQogIHN1cnZleSA9ICJhY3MxIiwNCiAgZ2VvbWV0cnkgPSBUUlVFLA0KICByZXNvbHV0aW9uID0gIjIwbSINCikgDQoNCnVzX21lZGlhbl9hZ2UgPC0gZGF0YS5mcmFtZSh1c19tZWRpYW5fYWdlWyxjKDIsNCldKQ0KdXNfbWVkaWFuX2FnZSA8LSB1c19tZWRpYW5fYWdlWyxjKDEsMildDQpjb2xuYW1lcyh1c19tZWRpYW5fYWdlKSA8LSBjKCJOQU1FIiwgIm1lZGlhbl9hZ2UiKQ0KDQp1c19tZWRpYW5fYWdlDQpgYGANCg0KIyMgX19XZWIgU2NyYXBlX18NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIFdlYiBzY3JhcGUgQ2l2aWxpYW4gbGFib3IgdGFibGUgZnJvbSBVLlMuIEJ1cmVhdSBvZiBMYWJvciBTdGF0aXN0aWNzDQoNCnVybCA8LSAiaHR0cHM6Ly93d3cuYmxzLmdvdi9uZXdzLnJlbGVhc2UvbGF1cy50MDEuaHRtIg0KcG9wdWxhdGlvbiA8LSB1cmwgJT4lDQogIHJlYWRfaHRtbCgpICU+JQ0KICBodG1sX25vZGVzKHhwYXRoPScvLypbQGlkPSJsYXVfc3JkX3RiMSJdJykgJT4lDQogIGh0bWxfdGFibGUoKQ0KZGYgPC0gYXMuZGF0YS5mcmFtZShwb3B1bGF0aW9uW1sxXV0pDQoNCiMgcmVtb3Zpbmcgc3ViIHRpdGxlcy9mb290IG5vdGVzIGFuZCBzdWItc2V0dGluZyBtb3N0IHJlY2VudCBjb2x1bW5zDQpkZiA8LSBkZlstYygxOjIsNjI6NjMpLC1jKDI6NCw2OjgsMTA6MTIpXQ0KDQojIHJlbW92aW5nIG5vbi1jb25zaXN0ZW50IGFyZWFzIA0KZGYgPC0gZGZbLWMoNiwxMiwxNywyNywzOCw0Miw1NSksXQ0KDQpjb2xuYW1lcyhkZikgPC0gYygnTkFNRScsICdsYWJvcl9mb3JjZScsICd1bmVtcGwnLCAndW5lbXBsX3BlcmMnKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCiMgV2ViIHNjcmFwZSBjb3N0IG9mIGxpdmluZyBmcm9tIDIwMjEgY29zdCBvZiBsaXZpbmcgaW5kZXggYnkgc3RhdGUuDQoNCnVybCA8LSAiaHR0cHM6Ly91c2FieW51bWJlcnMuY29tL3N0YXRlcy1yYW5rZWQtYnktY29zdC1vZi1saXZpbmcvIg0KY29zdF9pbmQgPC0gdXJsICU+JQ0KICByZWFkX2h0bWwoKSAlPiUNCiAgaHRtbF9ub2Rlcyh4cGF0aD0nLy8qW0BpZD0icG9zdC05MDUiXS9kaXZbMV0vZGl2WzJdL2RpdlsxXS9maWd1cmUvdGFibGUnKSAlPiUNCiAgaHRtbF90YWJsZSgpDQoNCmRmMiA8LSBhcy5kYXRhLmZyYW1lKGNvc3RfaW5kW1sxXV0pDQoNCiMgcmVtb3ZlIHRoZSBmaXJzdCA0IHNwYWNlcyBmcm9tIGNvbHVtbiAxDQpkZjIgPC0gZGYyICU+JQ0KICBtdXRhdGUoTkFNRSA9IHN0cl9zdWIoWDEsIDQsIC0xKSkNCg0KIyByZW1vdmUgY29sIDENCmRmMiA8LSBkZjJbLC0xXQ0KDQojIHJlbmFtZSBjb2x1bW5zIGZvciB1bmlvbiBhbmQgcmVhcnJhbmdlDQpjb2xuYW1lcyhkZjIpIDwtIGMoImNvc3RfaW5kZXgiLCAiTkFNRSIgKQ0KDQpkZjIgPC0gZGYyWyxjKDIsMSldDQoNCiMgcmVtb3ZlIGxlYWRpbmcgc3BhY2UNCmRmMiROQU1FIDwtIHRyaW13cyhkZjIkTkFNRSwgd2hpY2ggPSBjKCJsZWZ0IikpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KIyBXZWIgc2NyYXBlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgYnkgc3RhdGUgaW4gZGVncmVlcyBGYWhyZW5oZWl0Lg0KDQojIGRhdGEgaXMgc3BsaXQgaW50byBtdWx0aXBsZSB0YWJsZXMgc28gd2Ugd2lsbCBoYXZlIHRvIGNvbWJpbmUgYXQgdGhlIGVuZA0KdXJsIDwtICJodHRwczovL3d3dy5jdXJyZW50cmVzdWx0cy5jb20vV2VhdGhlci9VUy9hdmVyYWdlLWFubnVhbC1zdGF0ZS10ZW1wZXJhdHVyZXMucGhwIg0KYXZnX3RlbXAxIDwtIHVybCAlPiUNCiAgcmVhZF9odG1sKCkgJT4lDQogIGh0bWxfbm9kZXMoeHBhdGg9Jy8vKltAaWQ9Im1haW5jb2wiXS9kaXZbMV0vZGl2WzRdL3RhYmxlWzFdJykgJT4lDQogIGh0bWxfdGFibGUoKQ0KZGYzMSA8LSBhcy5kYXRhLmZyYW1lKGF2Z190ZW1wMVtbMV1dKQ0KDQphdmdfdGVtcDIgPC0gdXJsICU+JQ0KICByZWFkX2h0bWwoKSAlPiUNCiAgaHRtbF9ub2Rlcyh4cGF0aD0nLy8qW0BpZD0ibWFpbmNvbCJdL2RpdlsxXS9kaXZbNF0vdGFibGVbMl0nKSAlPiUNCiAgaHRtbF90YWJsZSgpDQpkZjMyIDwtIGFzLmRhdGEuZnJhbWUoYXZnX3RlbXAyW1sxXV0pDQoNCmF2Z190ZW1wMyA8LSB1cmwgJT4lDQogIHJlYWRfaHRtbCgpICU+JQ0KICBodG1sX25vZGVzKHhwYXRoPScvLypbQGlkPSJtYWluY29sIl0vZGl2WzFdL2Rpdls0XS90YWJsZVszXScpICU+JQ0KICBodG1sX3RhYmxlKCkNCmRmMzMgPC0gYXMuZGF0YS5mcmFtZShhdmdfdGVtcDNbWzFdXSkNCg0KIyBjb21iaW5lDQpkZjMgPC0gcmJpbmQoZGYzMSxkZjMyLGRmMzMpDQoNCiMgc3Vic2V0IHRvIG5lZWRlZCB2YXJpYWJsZXMNCmRmMyA8LSBkZjNbLGMoMSwyKV0NCg0KIyByZW5hbWUgZm9yIGpvaW4NCmNvbG5hbWVzKGRmMykgPC0gYygnTkFNRScsImF2Z190ZW1wX2YiKQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCiMgV2ViIHNjcmFwZSBhdmVyYWdlIHNub3dmYWxsIGJ5IHN0YXRlIGluIGluY2hlcy4NCg0KdXJsIDwtICJodHRwczovL3dvcmxkcG9wdWxhdGlvbnJldmlldy5jb20vc3RhdGUtcmFua2luZ3Mvc25vd2llc3Qtc3RhdGVzIg0KYXZnX3Nub3cgPC0gdXJsICU+JQ0KICByZWFkX2h0bWwoKSAlPiUNCiAgaHRtbF9ub2Rlcyh4cGF0aD0nLy8qW0BpZD0iZGF0YVRhYmxlIl0vZGl2WzFdL2Rpdi9kaXZbMV0vZGl2L2RpdlsxXS9kaXZbMl0vdGFibGUnKSAlPiUNCiAgaHRtbF90YWJsZSgpDQpkZjQgPC0gYXMuZGF0YS5mcmFtZShhdmdfc25vd1tbMV1dKQ0KDQojIHJlbmFtZSBmb3Igam9pbg0KY29sbmFtZXMoZGY0KSA8LSBjKCdOQU1FJywiYXZnX3Nub3dfaW4iKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgV2ViIHNjcmFwZSBhaXIgcXVhbGl0eSBieSBzdGF0ZS4gVGhlIGxvd2VyIHRoZSByYXRpbmcgdGhlIGhpZ2hlciBxdWFsaXR5IHRoZSBhaXIuDQoNCnVybCA8LSAiaHR0cHM6Ly93b3JsZHBvcHVsYXRpb25yZXZpZXcuY29tL3N0YXRlLXJhbmtpbmdzL2Fpci1xdWFsaXR5LWJ5LXN0YXRlIg0KYWlyX3F1YWxpdHkgPC0gdXJsICU+JQ0KICByZWFkX2h0bWwoKSAlPiUNCiAgaHRtbF9ub2Rlcyh4cGF0aD0nLy8qW0BpZD0iZGF0YVRhYmxlIl0vZGl2WzFdL2Rpdi9kaXZbMV0vZGl2L2RpdlsyXS9kaXZbMl0nKSAlPiUNCiAgaHRtbF90YWJsZSgpDQpkZjUgPC0gYXMuZGF0YS5mcmFtZShhaXJfcXVhbGl0eVtbMV1dKQ0KDQpkZjUgPC0gZGY1WywtM10NCg0KIyByZW5hbWUgZm9yIGpvaW4NCmNvbG5hbWVzKGRmNSkgPC0gYygnTkFNRScsImFpcl9xdWFsaXR5IikNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQojIFdlYiBzY3JhcGUgcHVibGljIHNjaG9vbCBvdmVyYWxsIHF1YWxpdHkgYnkgc3RhdGUuIFRoZSBsb3dlciB0aGUgbnVtYmVyIHRoZSBoaWdoZXIgaXQgcmFua3MuDQoNCnVybCA8LSAiaHR0cHM6Ly93b3JsZHBvcHVsYXRpb25yZXZpZXcuY29tL3N0YXRlLXJhbmtpbmdzL3B1YmxpYy1zY2hvb2wtcmFua2luZ3MtYnktc3RhdGUiDQpzY2hvb2wgPC0gdXJsICU+JQ0KICByZWFkX2h0bWwoKSAlPiUNCiAgaHRtbF9ub2Rlcyh4cGF0aD0nLy8qW0BpZD0iZGF0YVRhYmxlIl0vZGl2WzFdL2Rpdi9kaXZbMV0vZGl2L2RpdlsxXS9kaXZbMl0nKSAlPiUNCiAgaHRtbF90YWJsZSgpDQpkZjYgPC0gYXMuZGF0YS5mcmFtZShzY2hvb2xbWzFdXSkNCg0KIyBzdWJzZXQgbmVlZGVkIGluZm8gZm9yIGNsZWFuIGpvaW4gbGF0ZXINCmRmNiA8LSBkZjZbLC1jKDMsNCldDQoNCiMgcmVuYW1lIGNvbHVtbnMgZm9yIGpvaW4NCmNvbG5hbWVzKGRmNikgPC0gYygnTkFNRScsInNjaG9vbF9yYW5rIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KIyBXZWIgc2NyYXBlIENyaW1lIHJhdGVzIGJ5IHN0YXRlLiBIaWdoZXIgdGhlIG51bWJlciB0aGUgaGlnaGVyIHRoZSBjcmltZSByYXRlLg0KDQp1cmwgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfVS5TLl9zdGF0ZXNfYW5kX3RlcnJpdG9yaWVzX2J5X3Zpb2xlbnRfY3JpbWVfcmF0ZSINCmNyaW1lIDwtIHVybCAlPiUNCiAgcmVhZF9odG1sKCkgJT4lDQogIGh0bWxfbm9kZXMoeHBhdGg9Jy8vKltAaWQ9Im13LWNvbnRlbnQtdGV4dCJdL2RpdlsxXS90YWJsZScpICU+JQ0KICBodG1sX3RhYmxlKCkNCmRmNyA8LSBhcy5kYXRhLmZyYW1lKGNyaW1lW1sxXV0pDQoNCiMgU3Vic2V0dGluZyBuZWVkZWQgY29sdW1ucyBhbmQgcm93cw0KZGY3IDwtIGRmN1stYygxOjIsNTUpLGMoMSwzKV0NCg0KIyByZW5hbWUgZm9yIGpvaW4NCmNvbG5hbWVzKGRmNykgPC0gYygnTkFNRScsImNyaW1lX3JhdGUiKQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCiMgV2ViIHNjcmFwZSBtb3N0IHJlY2VudCBzdGF0ZSBwb2xpdGljYWwgdm90ZXMgaW4gcHJlc2lkZW50aWFsIGVsZWN0aW9uIGJ5IHN0YXRlLiBEYXRhIHdpbGwgYmUgZWFzaWVyIHRvIGFuYWx5emUgaWYgbGFiZWxlZCBiaW5hcnkuIFJlcHVibGljYW4gd2lsbCBiZSBsYWJlbGVkIGFzICIwIiBhbmQgRGVtb2NyYXRpYyB3aWxsIGJlIGxhYmVsZWQgIjEiLiANCg0KIyBlc3RhYmxpc2ggc291cmNlDQp1cmwgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BvbGl0aWNhbF9wYXJ0eV9zdHJlbmd0aF9pbl9VLlMuX3N0YXRlcyINCg0KIyBzY3JhcGUgZGF0YQ0KcG9saXRpYyA8LSB1cmwgJT4lDQogIHJlYWRfaHRtbCgpICU+JQ0KICBodG1sX25vZGVzKHhwYXRoPScvLypbQGlkPSJtdy1jb250ZW50LXRleHQiXS9kaXZbMV0vdGFibGVbNl0nKSAlPiUNCiAgaHRtbF90YWJsZSgpDQoNCiMgdHVybiBkYXRhIGludG8gZGF0YWZyYW1lDQpkZjggPC0gYXMuZGF0YS5mcmFtZShwb2xpdGljW1sxXV0pDQoNCiMgU3Vic2V0dGluZyBuZWVkZWQgY29sdW1ucyBhbmQgcm93cw0KZGY4IDwtIGRmOFssYygxLDIpXQ0KDQojIHJlbmFtZSBmb3Igam9pbg0KY29sbmFtZXMoZGY4KSA8LSBjKCdOQU1FJywicG9saXRpYyIpDQoNCiMgbWFrZSBkYXRhIGJpbmFyeQ0KZGY4JHBvbGl0aWMgPC0gaWZlbHNlKGRmOCRwb2xpdGljPT0iUmVwdWJsaWNhbiIsIDAgLCAxKQ0KYGBgDQoNClRoaXMgaXMgYW4gZXhhbXBsZSBvZiB0aGUgd2ViIHNjcmFwaW5nIHByb2Nlc3MgdG8gZXN0YWJsaXNoIGEgc2NlbmVyeSByYW5rIGJhc2VkIHN5c3RlbS4gDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgbGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoeG1sMikNCg0KIyBzb3VyY2UNCnVybCA8LSAiaHR0cHM6Ly93d3cudGhyaWxsaXN0LmNvbS90cmF2ZWwvbmF0aW9uL21vc3QtYmVhdXRpZnVsLXN0YXRlcy1pbi1hbWVyaWNhIg0KDQojIHNjcmFwZSB0aGUgZGF0YQ0Kc2NlbmVyeSA8LSB1cmwgJT4lDQogIHJlYWRfaHRtbCgpICU+JQ0KICBodG1sX25vZGVzKCJoMiIpDQoNCiMgY29udmVydCB4bWwgdG8gZGF0YSBmcmFtZQ0KdmFscyA8LSBkYXRhLmZyYW1lKHRyaW13cyh4bWxfdGV4dChzY2VuZXJ5KSkpDQoNCiMgc3BsaXQgdGhlIGRhdGEgaW50byB0d28gY29sdW1ucyBvZiByYW5rIGFuZCBzdGF0ZQ0KZGYxMSA8LSBzdHJfc3BsaXRfZml4ZWQodmFscyR0cmltd3MueG1sX3RleHQuc2NlbmVyeS4uLCAiICIsIDIpDQpkZjExIDwtIGRhdGEuZnJhbWUoZGYxMSkNCg0KIyByZW5hbWUNCmNvbG5hbWVzKGRmMTEpIDwtIGMoInNjZW5lcnkiLCAiTkFNRSIpDQoNCiMgY29udmVydCBzY2VuZXJ5IHRvIG51bWJlciBhbmQgcmVtb3ZlIHBlcmlvZHMNCmRmMTEkc2NlbmVyeSA8LSBhcy5udW1lcmljKGdzdWIoIlxcLiIsIiIsYXMuY2hhcmFjdGVyKGRmMTEkc2NlbmVyeSkpKQ0KDQojIGNoYW5nZSBvcmRlcg0KZGYxMSA8LSBkZjExWyxjKDIsMSldDQoNCmRmMTENCmBgYA0KDQoNCiMjIF9fQ29tYmluZSBhbmQgRXhhbWluZSBBbGwgRGF0YV9fDQoNCnwgICAgIFRoZSBwYWNrYWdlIHRpZHljZW5zdXMgY29udGFpbnMgcHJldHR5IGNsZWFuIGRhdGEgYWxyZWFkeSBhbmQgdGhlcmUgd2FzIGxpdHRsZSB0byBubyBjbGVhbmluZyB0byBiZSBkb25lIGZvciB0aGF0IGRhdGEuIEFzIGZhciBhcyB0aGUgd2ViIHNjcmFwaW5nIGRhdGEgZ29lcywgd2UgY2FuIGV4YW1pbmUgdGhlIGRhdGEgbW9yZS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyBjb21iaW5lIGFsbCBvZiB0aGUgdmFyaWFibGVzIGludG8gb25lIGxhcmdlIGRhdGFzZXQNCg0KIyBqb2luIGluY29tZS9wb3B1bGF0aW9uIGFuZCBjb252ZXJ0IHRvIGRhdGEgZnJhbWUNClVTX2RmIDwtIGZ1bGxfam9pbihVU19wb3AyLCB1c19pbmMyKQ0KdXNfZGYgPC0gYXMuZGF0YS5mcmFtZShVU19kZikNCg0KI2pvaW4gbGFib3Igc2NyYXBlZCBkYXRhIHRvIGFwaSBkYXRhDQp1c19mdWxsIDwtIGFzLmRhdGEuZnJhbWUoZnVsbF9qb2luKHVzX2RmLCBkZikpDQoNCiMgam9pbiBjb3N0IGluZGV4IHRvIG90aGVyIGpvaW5lZCBzZXRzDQp1c19mdWxsMiA8LSBmdWxsX2pvaW4odXNfZnVsbCwgZGYzKQ0KDQojIGpvaW4gYXZlcmFnZSBzbm93ZmFsbCBieSBzdGF0ZQ0KdXNfZnVsbDMgPC0gZnVsbF9qb2luKHVzX2Z1bGwyLCBkZjQpDQoNCiMgam9pbiB0ZW1wZXJhdHVyZQ0KdXNfZnVsbDQgPC0gZnVsbF9qb2luKHVzX2Z1bGwzLCBkZjIpDQoNCiMgam9pbiBBaXIgcXVhbGl0eQ0KdXNfZnVsbDUgPC0gZnVsbF9qb2luKHVzX2Z1bGw0LCBkZjUpDQoNCiMgam9pbiBzY2hvb2wgcXVhbGl0eQ0KdXNfZnVsbDYgPC0gZnVsbF9qb2luKHVzX2Z1bGw1LCBkZjYpDQoNCiMgam9pbiBjcmltZSByYXRlDQp1c19mdWxsNyA8LSBmdWxsX2pvaW4odXNfZnVsbDYsIGRmNykNCg0KIyBqb2luIGNyaW1lIHJhdGUNCnVzX2Z1bGw4IDwtIGZ1bGxfam9pbih1c19mdWxsNywgZGl2ZXJzZSkNCg0KIyBqb2luIGFnZQ0KdXNfZnVsbDkgPC0gZnVsbF9qb2luKHVzX2Z1bGw4LCB1c19tZWRpYW5fYWdlKQ0KDQojIGpvaW4gcG9saXRpY3MNCnVzX2Z1bGwxMCA8LSBmdWxsX2pvaW4odXNfZnVsbDksIGRmOCkNCg0KIyBqb2luIHNjZW5lcnkNCnVzX2Z1bGwxMSA8LSBmdWxsX2pvaW4odXNfZnVsbDEwLCBkZjExKQ0KDQp1c19mdWxsMTENCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoQW1lbGlhKQ0KDQojIEV4YW1pbmUgdGhlIERhdGEgZm9yIE1pc3NpbmcgVmFsdWVzDQptaXNzbWFwKHVzX2Z1bGwxMSkNCmBgYA0KDQpfX0V4cGxhbmF0aW9uIG9mIG1pc3NpbmcgZGF0YTpfXw0KDQp8ICAgICBTb21lIHNvdXJjZXMgZGlkIG5vdCBjb250YWluIG9ic2VydmF0aW9ucyBmb3IgUHVlcnRvIFJpY28gYW5kIFdhc2hpbmd0b24gREMuIFRoZSBhdmVyYWdlIHNub3cgaGFkIG9uZSBleHRyYSBOdWxsIG9ic2VydmF0aW9uIGFuZCB0aGF0IHdhcyBkdWUgdG8gSGF3YWlpIGJlaW5nIHRoZSBvbmx5IHN0YXRlIGhhdmluZyB6ZXJvIGluY2hlcyBvZiBzbm93LiBUaGlzIGlzIGZpeGVkIGxhdGVyIGluIHRoZSBjb2RlLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMgcXVpY2sgZml4IGZvciBIYXdhaWkgc25vdyB2YWx1ZQ0KdXNfZnVsbDExWzcsMTBdID0gMA0KDQp1c19mdWxsMTENCg0KYGBgDQoNCiMjIF9fRGF0YSBUYWJsZV9fDQoNCnwgICBCZWxvdyBpcyBhIHZpZXcgb2YgdGhlIGRhdGEgdGFibGUuIEdpdmVuIHRoZSBjb21wYWN0IHNpemUgb2YgdGhlIGRhdGFzZXQsIGhhdmluZyBzb21lIG9uZSBnbGFuY2UgY29udGV4dCBpcyBoZWxwZnVsLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmZ1bGxfZGYgPC0gdXNfZnVsbDExW29yZGVyKHVzX2Z1bGwxMSRHRU9JRCksXQ0KZnVsbF9kZiANCmBgYA0KDQoNCiMgX19BbmFseXNpc19fDQoNCnwgICAgIFRvIGNyZWF0ZSBhIHRvb2wgZm9yIGFuYWx5emluZyB0aGUgZGF0YSwgSSBpbXBvcnRlZCB0aGUgZGF0YSBpbnRvIFRhYmxlYXUgYW5kIGJ1aWx0IHRoZSBkYXNoYm9hcmQgdGhlcmUuIEFuIGV4YW1wbGUgb2YgdGhlIHRvb2wgYW5kIHRoZSByZXN1bHRzIGZvciB0aGUgcmFuZ2VzIEkgcGlja2VkIGFyZSBkZW1vbnN0cmF0ZWQgaW4gdGhlIGltYWdlIGJlbG93LiANCjxicj4NCiFbTXkgcmVzdWx0cyBhZnRlciB1c2luZyB0aGUgdG9vbC5dKEM6L1VzZXJzL0NTRmljL0Rlc2t0b3AvRGFzaGJvYXJkLlBORykNCg0KPGJyPg0KDQp8ICAgQWZ0ZXIgbmFycm93aW5nIGRvd24gdGhlIHJhbmdlcyBvZiB0aGUgdmFyaWFibGVzIEkgZmVsdCBiZXN0IGZpdCBteSBuZWVkcywgdGhlIHN0YXRlcyByZW1haW5pbmcgd2VyZSBDb2xvcmFkbyBhbmQgVmlyZ2luaWEuIFRvIGJlIG1vcmUgc3BlY2lmaWMsIEkgbGltaXRlZCBteSB2YXJpYWJsZXMgdG8gZGVtb2NyYXRpYywgc21hbGwgdG8gbWVkaXVtIHNpemVkIHBvcHVsYXRpb25zLCBhIGhpZ2hlciBhdmVyYWdlIG9mIGluY29tZSwgYSBsb3dlciBjb3N0IG9mIGxpdmluZywgYSBzbWFsbGVyIHNpemUgb2YgbGFib3IgZm9yY2UsIGxvd2VyIG1lZGlhbiBhZ2UsIG1lZGl1bSB0byBsb3cgY3JpbWUgcmF0ZSwgYW5kIGEgaGlnaCBzY2VuZXJ5IHJhbmtpbmcuIEFsbCBvdGhlciB2YXJpYWJsZXMgd2VyZSBwcmV0dHkgbXVjaCBmdWxsIHJhbmdlIGFuZCBkaWQgbm90IG1hdHRlciB0byBtZS4NCjxicj4NCg0KfCAgIE9kZGx5IGVub3VnaCwgdGhlc2UgYXJlIHRoZSB0d28gc3RhdGVzIEkgaGF2ZSB0cmF2ZWxlZCB0byByZWNlbnRseSBhdCB0aGUgZW5kIG9mIDIwMjEsIGNoZWNraW5nIG91dCBtb3N0IG9mIENvbG9yYWRvIHN0YXRlLXdpZGUgYW5kIFdpbGxpYW1zYnVyZywgVmlyZ2luaWEgd2l0aCB0aGUgaW50ZW50aW9uIG9mIHBvc3NpYmx5IG1vdmluZyB0aGVyZS4gQm90aCBvZiB0aGVzZSBhcmVhcyB3ZXJlIGJlYXV0aWZ1bCBhbmQgaXQgaXMgaGFyZCB0byBwaWNrIG9uZSBvdmVyIHRoZSBvdGhlci4gVGhpcyB0b29sIGhhcyBoZWxwZWQgcmVhZmZpcm0gbXkgY29uc2lkZXJhdGlvbnMgZm9yIG1vdmluZyB0byB0aGVzZSBhcmVhcy4NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojc3RvcmUgZGF0YSBvbiBsb2NhbCBuZXR3b3JrDQojd3JpdGUuY3N2KGZ1bGxfc2hpbl9kZiwgIkM6L1VzZXJzL0NTRmljL0Rlc2t0b3AvT3V0b2ZTdGF0ZS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQo8YnI+DQoNCklmIHlvdSB3YW50IHRvIHJlYWQgbW9yZSBvbiB0aGlzIHN1YmplY3QsIGhlcmUgaXMgYW4gZXhjZWxsZW50IGFuZCByZWxldmFudCBhcnRpY2xlLg0KIVtbQXJ0aWNsZV0oaHR0cHM6Ly93b3JsZGhhcHBpbmVzcy5yZXBvcnQvZWQvMjAyMC91cmJhbi1ydXJhbC1oYXBwaW5lc3MtZGlmZmVyZW50aWFscy1hY3Jvc3MtdGhlLXdvcmxkLyldDQo=