1. The most Nobel of Prizes
The Nobel Prize is perhaps the worlds most well known scientific award. Except for the honor, prestige and substantial prize money the recipient also gets a gold medal showing Alfred Nobel (1833 - 1896) who established the prize. Every year it’s given to scientists and scholars in the categories chemistry, literature, physics, physiology or medicine, economics, and peace. The first Nobel Prize was handed out in 1901, and at that time the Prize was very Eurocentric and male-focused, but nowadays it’s not biased in any way whatsoever. Surely. Right?
Well, we’re going to find out! The Nobel Foundation has made a dataset available of all prize winners from the start of the prize, in 1901, to 2016. Let’s load it in and take a look.
Task 1: Instructions
Load the required libraries and the Nobel Prize dataset.
- Load the
tidyverse
library.
- Use
read_csv
(not read.csv
) to read in datasets/nobel.csv and save it into nobel
.
- Show the
head
of nobel
, that is, the first couple of prize winners.
Make sure to use read_csv (with an underscore) to read in the data. The read.csv
function, which is built into R, has a number of problems which the new read_csv
function avoids.
Good to know
This Project assumes you have used the dplyr
and ggplot2
packages and that you are familiar with the pipe operator (%>%
). Before taking on this Project, we recommend that you have completed the course Introduction to the Tidyverse.
RStudio has created some very helpful cheat sheets, including two that will be helpful for this Project: Data Wrangling and Data Visualization with ggplot2
. We recommend that you keep them open in a separate tab to make it easy to refer to them.
2. So, who gets the Nobel Prize?
Just looking at the first couple of prize winners, or Nobel laureates as they are also called, we already see a celebrity: Wilhelm Conrad Röntgen, the guy who discovered X-rays. And actually, we see that all of the winners in 1901 were guys that came from Europe. But that was back in 1901, looking at all winners in the dataset, from 1901 to 2016, which sex and which country is the most commonly represented? *** (For country, we will use the birth_country
of the winner, as the organization_country
is NA
for all shared Nobel Prizes.)
Task 2: Instructions
Count up the Nobel Prizes. Also, split by sex
and birth_country
.
- Count and display the number of rows/prizes using the
count()
function.
- Count and display the number of rows/prizes, grouped by
sex
.
- Count the number of rows/prizes, grouped by
birth_country
. Arrange the result by no. prizes in descending order and display the first 20 rows using head(20)
. For how to use the group_by
function to group by a column check out Group Cases in the dplyr
cheat sheet. For how to arrange
rows, take a look at Arrange Cases in the same cheat sheet.
# Counting the number of (possibly shared) Nobel Prizes handed
# out between 1901 and 2016
nobel %>% count()
# Counting the number of prizes won by male and female recipients.
nobel %>%
count(sex)
# Counting the number of prizes won by different nationalities.
nobel %>%
group_by(birth_country) %>% count() %>% arrange(desc(n)) %>% head(20)
3. USA dominance
Not so surprising perhaps: the most common Nobel laureate between 1901 and 2016 was a man born in the United States of America. But in 1901 all the laureates were European. When did the USA start to dominate the Nobel Prize charts?
Task 3: Instructions
Calculate the proportion of USA born winners per decade starting from the nobel
dataset and put the result into prop_usa_winners
.
- Add a
usa_born_winner
column to nobel
, where the value is TRUE
when birth_country
is "United States of America"
.
- Add a
decade
column to nobel
showing the decade the prize was awarded (1953
should become 1950
, for example).
- Group by
decade
and use summarize
to add the column proportion
to nobel
. proportion
should contain the proportion of usa_born_winners
for each decade.
- Display / print out
prop_usa_winners
.
You can use mutate
for the first two bullet points.
To calculate the proportion of TRUE
values you can use the mean
function. If the column includes NA
values, you would have to use the na.rm
argument. Here’s how you could use mean
together with summarize
:
my_data %>% group_by(my_categorical_variable) %>% summarize(proportion = mean(is_winner, na.rm = TRUE))
# Calculating the proportion of USA born winners per decade
prop_usa_winners <- nobel %>%
mutate(usa_born_winner = birth_country == "United States of America")
# Display the proportions of USA born winners per decade
prop_usa_winners <- prop_usa_winners %>%
mutate(decade = floor(year / 10) * 10) %>%
group_by(decade) %>%
summarize(proportion = mean(usa_born_winner, na.rm = TRUE))
prop_usa_winners
4. USA dominance, visualized
A table is OK, but to see when the USA started to dominate the Nobel charts we need a plot!
Task 4: Instructions
Plot the proportion of USA born winners per decade.
- Use ggplot to plot prop_usa_winners with decade on the x-axis and proportion on the y-axis as a line-and-dot-plot. That is, add both geom_line() and geom_point().
- Fix the y-scale to that it shows percentages, its limits go from 0.0 to 1.0, and extra spacing is removed above and below 0.0 and 1.0.
To change the y-axis use scale_y_continuous and set the labels, limits, and expand arguments. Check the ggplot2 documentation for how to use limits and expand. Here is a StackOverflow question that shows how to set labels correctly.
# Setting the size of plots in this notebook
options(repr.plot.width=7, repr.plot.height=4)
# Plotting USA born winners
ggplot(data = prop_usa_winners, aes(x = decade, y = proportion))+
geom_line()+
geom_point()+
scale_y_continuous(labels = scales::percent,
limits = 0:1, expand = c(0,0))

5. What is the gender of a typical Nobel Prize winner?
So the USA became the dominating winner of the Nobel Prize first in the 1930s and has kept the leading position ever since. But one group that was in the lead from the start, and never seems to let go, are men. Maybe it shouldn’t come as a shock that there is some imbalance between how many male and female prize winners there are, but how significant is this imbalance? And is it better or worse within specific prize categories like physics, medicine, literature, etc.?
Task 5: Instructions
Plot the proportion of female laureates by decade split by prize category.
- Add
female_winner
column, where the value is TRUE
when sex
is "Female"
.
- Add the column
decade
showing the decade the prize was awarded (1953
should become 1950
, for example).
- Group by
decade
and category
and summarize the proportion of female_winner
into the proportion
column.
- Copy and paste your ggplot code from task 4, except plot the
prop_female_winners
data and map the category variable to the color
parameter.
This task can be solved by copying and modifying the code from task 3 and 4.
# Calculating the proportion of female laureates per decade
prop_female_winners <- nobel %>%
mutate(female_winner = sex == "Female") %>%
mutate(decade = floor(year/10)*10) %>%
group_by(decade, category) %>%
summarize(proportion = mean(female_winner, na.rm = TRUE))
# Plotting the proportion of female laureates per decade
ggplot(data = prop_female_winners, aes(x = decade, y = proportion, color = category ))+
geom_line()+
geom_point()+
scale_y_continuous(labels = scales::percent,
limits = 0:1, expand = c(0,0))

6. The first woman to win the Nobel Prize
The plot above is a bit messy as the lines are overplotting. But it does show some interesting trends and patterns. Overall the imbalance is pretty large with physics, economics, and chemistry having the largest imbalance. Medicine has a somewhat positive trend, and since the 1990s the literature prize is also now more balanced. The big outlier is the peace prize during the 2010s, but keep in mind that this just covers the years 2010 to 2016.
Given this imbalance, who was the first woman to receive a Nobel Prize? And in what category?
Task 6: Instructions
Extract and display the row showing the first woman to win a Nobel Prize.
- Use
filter
to filter away all non-"Female"
laureates.
- Use
top_n
to pick out the row with the earliest year.
top_n(x, n, wt)
is a useful function that takes a table x
and picks out the top n
rows as ordered by the column wt
. By default top_n
sort highest-to-lowest so to pick out five best offers in the bargain bin, you would have to use desc()
:
bargain_bin %>% top_n(5, desc(price))
nobel %>%
filter(sex == "Female") %>%
top_n(1, desc(year))
7. Repeat laureates
For most scientists/writers/activists a Nobel Prize would be the crowning achievement of a long career. But for some people, one is just not enough, and there are few that have gotten it more than once. Who are these lucky few? (Having won no Nobel Prize myself, I’ll assume it’s just about luck.)
Task 7: Instructions
Extract and display the names of repeat Nobel Prize winners.
- Use
count
to count the number of wins grouped by full_name
.
- Filter away all winners that “only” won one time.
# Selecting the laureates that have received 2 or more prizes.
nobel %>%
group_by(full_name) %>%
count() %>%
filter(n>1) %>% arrange(desc(n))
8. How old are you when you get the prize?
The list of repeat winners contains some illustrious names! We again meet Marie Curie, who got the prize in physics for discovering radiation and in chemistry for isolating radium and polonium. John Bardeen got it twice in physics for transistors and superconductivity, Frederick Sanger got it twice in chemistry, and Linus Carl Pauling got it first in chemistry and later in peace for his work in promoting nuclear disarmament. We also learn that organizations also get the prize as both the Red Cross and the UNHCR have gotten it twice.
But how old are you generally when you get the prize?
Task 8: Instructions
Calculate and plot the age of each winner when they won their Nobel Prize.
- Load the
lubridate
package (you’ll find the year()
function useful).
mutate
the nobel
table to include the column age
which should be how old people were when they got their price. Assign the resulting table to nobel_age
.
- Use
ggplot
to plot age
as a function of year
as a scatter plot (geom_point()
) with a smooth trend (geom_smooth()
).
The year()
function from lubridate takes a date and extracts the year:
dates <- as.Date( c(“1985-04-02”, “1988-07-25”)) year(dates) ## [1] 1985 1988
# Loading the lubridate package
library(lubridate)
package <U+393C><U+3E31>lubridate<U+393C><U+3E32> was built under R version 3.5.1
Attaching package: <U+393C><U+3E31>lubridate<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:
date
# Calculating the age of Nobel Prize winners
nobel_age <- nobel %>%
mutate(age = year - year(birth_date))
# Plotting the age of Nobel Prize winners
ggplot(data = nobel_age, aes(x = year, y = age))+
geom_point()+
geom_smooth()

9. Age differences between prize categories
The plot above shows us a lot! We see that people use to be around 55 when they received the price, but nowadays the average is closer to 65. But there is a large spread in the laureates’ ages, and while most are 50+, some are very young.
We also see that the density of points is much high nowadays than in the early 1900s – nowadays many more of the prizes are shared, and so there are many more winners. We also see that there was a disruption in awarded prizes around the Second World War (1939 - 1945).
Let’s look at age trends within different prize categories.
Task 9: Instructions
Plot how old winners are within the different price categories.
- Use
ggplot
to plot age
as a function of year
as a scatter plot (geom_point()
) with a smooth trend (geom_smooth()
) and facet
by category
using facet_wrap
.
- Optional: Remove the confidence band in
geom_smooth
by setting se = FALSE
.
This is the same plot as in task 8, except faceted by category
.
Removing the confidence band in geom_smooth
is not strictly necessary, but the bands are not that meaningful and removing them makes the plot more focused.
If you don’t remember how facet_wrap
works then look under Faceting on the second page of the ggplot2
cheat sheet.
# Same plot as above, but faceted by the category of the Nobel Prize
ggplot(data = nobel_age, aes(x = year, y = age))+
geom_point()+
geom_smooth(se = FALSE)+
facet_wrap(~ category)

10. Oldest and youngest winners
Another plot with lots of exciting stuff going on! We see that both winners of the chemistry, medicine, and physics prize have gotten older over time. The trend is strongest for physics: the average age used to be below 50, and now it’s almost 70. Literature and economics are more stable, and we also see that economics is a newer category. But peace shows an opposite trend where winners are getting younger!
In the peace category we also a winner around 2010 that seems exceptionally young. This begs the questions, who are the oldest and youngest people ever to have won a Nobel Prize?
Task 10: Instructions
Pick out the rows of the oldest and the youngest winner of a Nobel Prize.
- Use
top_n
to pick out and display the row of the oldest winner.
- Use
top_n
to pick out and display the row of the youngest winner. Remember that you can use desc to reverse the sorting:
The most expensive item
bargain_bin %>% top_n(1, price)
The cheapest item
bargain_bin %>% top_n(1, desc(price))
# The oldest winner of a Nobel Prize as of 2016
nobel_age %>% top_n(1, age)
# The youngest winner of a Nobel Prize as of 2016
nobel_age %>% top_n(1, desc(age))
11. You get a prize!
Hey! You get a prize for making it to the very end of this notebook! It might not be a Nobel Prize, but I made it myself in paint so it should count for something. But don’t despair, Leonid Hurwicz was 90 years old when he got his prize, so it might not be too late for you. Who knows.
Before you leave, what was again the name of the youngest winner ever who in 2014 got the prize for “[her] struggle against the suppression of children and young people and for the right of all children to education”?
Task 11: Instructions
- Assign the name of the youngest winner of a Nobel Prize to
youngest_winner
. The first name will suffice.
If you want to know more The Nobel Prize dataset is rich and there and this Project just scratched the surface – there is much more to explore! After you have completed this Project you can download it and continue exploring on your own computer! To do that you will have to install Jupyter notebooks with support for R. Here are instructions for how to install the Jupyter Notebook interface and here are instructions for how to add support for R. Good luck!
# The name of the youngest winner of the Nobel Prize as of 2016
youngest_winner <- "Malala Yousafzai"
youngest_winner
[1] "Malala Yousafzai"
LS0tDQp0aXRsZTogIkEgVklTVUFMIEhJU1RPUlkgT0YgTk9CRUwgUFJJWkUgV0lOTkVSUyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojMS4gVGhlIG1vc3QgTm9iZWwgb2YgUHJpemVzDQoNCg0KVGhlIE5vYmVsIFByaXplIGlzIHBlcmhhcHMgdGhlIHdvcmxkcyBtb3N0IHdlbGwga25vd24gc2NpZW50aWZpYyBhd2FyZC4gRXhjZXB0IGZvciB0aGUgaG9ub3IsIHByZXN0aWdlIGFuZCBzdWJzdGFudGlhbCBwcml6ZSBtb25leSB0aGUgcmVjaXBpZW50IGFsc28gZ2V0cyBhIGdvbGQgbWVkYWwgc2hvd2luZyBBbGZyZWQgTm9iZWwgKDE4MzMgLSAxODk2KSB3aG8gZXN0YWJsaXNoZWQgdGhlIHByaXplLiBFdmVyeSB5ZWFyIGl0J3MgZ2l2ZW4gdG8gc2NpZW50aXN0cyBhbmQgc2Nob2xhcnMgaW4gdGhlIGNhdGVnb3JpZXMgY2hlbWlzdHJ5LCBsaXRlcmF0dXJlLCBwaHlzaWNzLCBwaHlzaW9sb2d5IG9yIG1lZGljaW5lLCBlY29ub21pY3MsIGFuZCBwZWFjZS4gVGhlIGZpcnN0IE5vYmVsIFByaXplIHdhcyBoYW5kZWQgb3V0IGluIDE5MDEsIGFuZCBhdCB0aGF0IHRpbWUgdGhlIFByaXplIHdhcyB2ZXJ5IEV1cm9jZW50cmljIGFuZCBtYWxlLWZvY3VzZWQsIGJ1dCBub3dhZGF5cyBpdCdzIG5vdCBiaWFzZWQgaW4gYW55IHdheSB3aGF0c29ldmVyLiBTdXJlbHkuIFJpZ2h0Pw0KDQpXZWxsLCB3ZSdyZSBnb2luZyB0byBmaW5kIG91dCEgVGhlIE5vYmVsIEZvdW5kYXRpb24gaGFzIG1hZGUgYSBkYXRhc2V0IGF2YWlsYWJsZSBvZiBhbGwgcHJpemUgd2lubmVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcHJpemUsIGluIDE5MDEsIHRvIDIwMTYuIExldCdzIGxvYWQgaXQgaW4gYW5kIHRha2UgYSBsb29rLg0KDQojI1Rhc2sgMTogSW5zdHJ1Y3Rpb25zDQpMb2FkIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgYW5kIHRoZSBOb2JlbCBQcml6ZSBkYXRhc2V0Lg0KDQoqIExvYWQgdGhlIGB0aWR5dmVyc2VgIGxpYnJhcnkuDQoqIFVzZSBgcmVhZF9jc3ZgIChub3QgYHJlYWQuY3N2YCkgdG8gcmVhZCBpbiBkYXRhc2V0cy9ub2JlbC5jc3YgYW5kIHNhdmUgaXQgaW50byBgbm9iZWxgLg0KKiBTaG93IHRoZSBgaGVhZGAgb2YgYG5vYmVsYCwgdGhhdCBpcywgdGhlIGZpcnN0IGNvdXBsZSBvZiBwcml6ZSB3aW5uZXJzLg0KDQoqKioNCk1ha2Ugc3VyZSB0byB1c2UgcmVhZF9jc3YgKHdpdGggYW4gdW5kZXJzY29yZSkgdG8gcmVhZCBpbiB0aGUgZGF0YS4gVGhlIGByZWFkLmNzdmAgZnVuY3Rpb24sIHdoaWNoIGlzIGJ1aWx0IGludG8gUiwgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoaWNoIHRoZSBuZXcgYHJlYWRfY3N2YCBmdW5jdGlvbiBhdm9pZHMuDQoNCiMjR29vZCB0byBrbm93DQpUaGlzIFByb2plY3QgYXNzdW1lcyB5b3UgaGF2ZSB1c2VkIHRoZSBgZHBseXJgIGFuZCBgZ2dwbG90MmAgcGFja2FnZXMgYW5kIHRoYXQgeW91IGFyZSBmYW1pbGlhciB3aXRoIHRoZSBwaXBlIG9wZXJhdG9yIChgJT4lYCkuIEJlZm9yZSB0YWtpbmcgb24gdGhpcyBQcm9qZWN0LCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIGNvdXJzZSBJbnRyb2R1Y3Rpb24gdG8gdGhlIFRpZHl2ZXJzZS4NCg0KUlN0dWRpbyBoYXMgY3JlYXRlZCBzb21lIHZlcnkgaGVscGZ1bCBjaGVhdCBzaGVldHMsIGluY2x1ZGluZyB0d28gdGhhdCB3aWxsIGJlIGhlbHBmdWwgZm9yIHRoaXMgUHJvamVjdDogRGF0YSBXcmFuZ2xpbmcgYW5kIERhdGEgVmlzdWFsaXphdGlvbiB3aXRoIGBnZ3Bsb3QyYC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IGtlZXAgdGhlbSBvcGVuIGluIGEgc2VwYXJhdGUgdGFiIHRvIG1ha2UgaXQgZWFzeSB0byByZWZlciB0byB0aGVtLg0KDQpgYGB7cn0NCiMgTG9hZGluZyBpbiByZXF1aXJlZCBsaWJyYXJpZXMNCiMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgMSAuLi4uDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgUmVhZGluZyBpbiB0aGUgTm9iZWwgUHJpemUgZGF0YQ0Kbm9iZWwgPC0gcmVhZF9jc3YoIm5vYmVsLmNzdiIpDQoNCiMgVGFraW5nIGEgbG9vayBhdCB0aGUgZmlyc3QgY291cGxlIG9mIHdpbm5lcnMNCiMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgMSAuLi4uDQoNCm5hbWVzKG5vYmVsKSA8LSBjKCJ5ZWFyIiwgImNhdGVnb3J5IiwgInByaXplIiwgIm1vdGl2YXRpb24iLCAicHJpemVfc2hhcmUiLCAibGF1cmVhdGVfSUQiLCAibGF1cmVhdGVfdHlwZSIsICAiZnVsbF9uYW1lIiwgImJpcnRoX2RhdGUiLCAiYmlydGhfY2l0eSIsICJiaXJ0aF9jb3VudHJ5IiwgInNleCIsICJvcmdhbml6YXRpb25fbmFtZSIsICJvcmdhbml6YXRpb25fY2l0eSIsICJvcmdhbml6YXRpb25fY291bnRyeSIsICJkZWF0aF9kYXRlIiwgImRlYXRoX2NpdHkiLCAiZGVhdGhfY291bnRyeSIpDQoNCmhlYWQobm9iZWwpDQoNCmBgYA0KDQojMi4gU28sIHdobyBnZXRzIHRoZSBOb2JlbCBQcml6ZT8NCkp1c3QgbG9va2luZyBhdCB0aGUgZmlyc3QgY291cGxlIG9mIHByaXplIHdpbm5lcnMsIG9yIE5vYmVsIGxhdXJlYXRlcyBhcyB0aGV5IGFyZSBhbHNvIGNhbGxlZCwgd2UgYWxyZWFkeSBzZWUgYSBjZWxlYnJpdHk6IFdpbGhlbG0gQ29ucmFkIFL2bnRnZW4sIHRoZSBndXkgd2hvIGRpc2NvdmVyZWQgWC1yYXlzLiBBbmQgYWN0dWFsbHksIHdlIHNlZSB0aGF0IGFsbCBvZiB0aGUgd2lubmVycyBpbiAxOTAxIHdlcmUgZ3V5cyB0aGF0IGNhbWUgZnJvbSBFdXJvcGUuIEJ1dCB0aGF0IHdhcyBiYWNrIGluIDE5MDEsIGxvb2tpbmcgYXQgYWxsIHdpbm5lcnMgaW4gdGhlIGRhdGFzZXQsIGZyb20gMTkwMSB0byAyMDE2LCB3aGljaCBzZXggYW5kIHdoaWNoIGNvdW50cnkgaXMgdGhlIG1vc3QgY29tbW9ubHkgcmVwcmVzZW50ZWQ/DQoqKioNCihGb3IgY291bnRyeSwgd2Ugd2lsbCB1c2UgdGhlIGBiaXJ0aF9jb3VudHJ5YCBvZiB0aGUgd2lubmVyLCBhcyB0aGUgYG9yZ2FuaXphdGlvbl9jb3VudHJ5YCBpcyBgTkFgIGZvciBhbGwgc2hhcmVkIE5vYmVsIFByaXplcy4pDQoNCiMjVGFzayAyOiBJbnN0cnVjdGlvbnMNCkNvdW50IHVwIHRoZSBOb2JlbCBQcml6ZXMuIEFsc28sIHNwbGl0IGJ5IGBzZXhgIGFuZCBgYmlydGhfY291bnRyeWAuDQoNCiogQ291bnQgYW5kIGRpc3BsYXkgdGhlIG51bWJlciBvZiByb3dzL3ByaXplcyB1c2luZyB0aGUgYGNvdW50KClgIGZ1bmN0aW9uLg0KKiBDb3VudCBhbmQgZGlzcGxheSB0aGUgbnVtYmVyIG9mIHJvd3MvcHJpemVzLCBncm91cGVkIGJ5IGBzZXhgLg0KKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MvcHJpemVzLCBncm91cGVkIGJ5IGBiaXJ0aF9jb3VudHJ5YC4gQXJyYW5nZSB0aGUgcmVzdWx0IGJ5IG5vLiBwcml6ZXMgaW4gZGVzY2VuZGluZyBvcmRlciBhbmQgZGlzcGxheSB0aGUgZmlyc3QgMjAgcm93cyB1c2luZyBgaGVhZCgyMClgLg0KRm9yIGhvdyB0byB1c2UgdGhlIGBncm91cF9ieWAgZnVuY3Rpb24gdG8gZ3JvdXAgYnkgYSBjb2x1bW4gY2hlY2sgb3V0IEdyb3VwIENhc2VzIGluIHRoZSBgZHBseXJgIGNoZWF0IHNoZWV0LiBGb3IgaG93IHRvIGBhcnJhbmdlYCByb3dzLCB0YWtlIGEgbG9vayBhdCBBcnJhbmdlIENhc2VzIGluIHRoZSBzYW1lIGNoZWF0IHNoZWV0Lg0KDQoNCmBgYHtyfQ0KIyBDb3VudGluZyB0aGUgbnVtYmVyIG9mIChwb3NzaWJseSBzaGFyZWQpIE5vYmVsIFByaXplcyBoYW5kZWQNCiMgb3V0IGJldHdlZW4gMTkwMSBhbmQgMjAxNg0Kbm9iZWwgJT4lIGNvdW50KCkNCg0KIyBDb3VudGluZyB0aGUgbnVtYmVyIG9mIHByaXplcyB3b24gYnkgbWFsZSBhbmQgZmVtYWxlIHJlY2lwaWVudHMuDQpub2JlbCAlPiUgDQogICAgY291bnQoc2V4KQ0KDQojIENvdW50aW5nIHRoZSBudW1iZXIgb2YgcHJpemVzIHdvbiBieSBkaWZmZXJlbnQgbmF0aW9uYWxpdGllcy4NCm5vYmVsICU+JQ0KICAgIGdyb3VwX2J5KGJpcnRoX2NvdW50cnkpICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JSBoZWFkKDIwKQ0KYGBgDQoNCiMzLiBVU0EgZG9taW5hbmNlDQpOb3Qgc28gc3VycHJpc2luZyBwZXJoYXBzOiB0aGUgbW9zdCBjb21tb24gTm9iZWwgbGF1cmVhdGUgYmV0d2VlbiAxOTAxIGFuZCAyMDE2IHdhcyBhIG1hbiBib3JuIGluIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIEJ1dCBpbiAxOTAxIGFsbCB0aGUgbGF1cmVhdGVzIHdlcmUgRXVyb3BlYW4uIFdoZW4gZGlkIHRoZSBVU0Egc3RhcnQgdG8gZG9taW5hdGUgdGhlIE5vYmVsIFByaXplIGNoYXJ0cz8NCg0KIyNUYXNrIDM6IEluc3RydWN0aW9ucw0KQ2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIFVTQSBib3JuIHdpbm5lcnMgcGVyIGRlY2FkZSBzdGFydGluZyBmcm9tIHRoZSBgbm9iZWxgIGRhdGFzZXQgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gYHByb3BfdXNhX3dpbm5lcnNgLg0KDQoqIEFkZCBhIGB1c2FfYm9ybl93aW5uZXJgIGNvbHVtbiB0byBgbm9iZWxgLCB3aGVyZSB0aGUgdmFsdWUgaXMgYFRSVUVgIHdoZW4gYGJpcnRoX2NvdW50cnlgIGlzIGAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhImAuDQoqIEFkZCBhIGBkZWNhZGVgIGNvbHVtbiB0byBgbm9iZWxgIHNob3dpbmcgdGhlIGRlY2FkZSB0aGUgcHJpemUgd2FzIGF3YXJkZWQgKGAxOTUzYCBzaG91bGQgYmVjb21lIGAxOTUwYCwgZm9yIGV4YW1wbGUpLg0KKiBHcm91cCBieSBgZGVjYWRlYCBhbmQgdXNlIGBzdW1tYXJpemVgIHRvIGFkZCB0aGUgY29sdW1uIGBwcm9wb3J0aW9uYCB0byBgbm9iZWxgLiBgcHJvcG9ydGlvbmAgc2hvdWxkIGNvbnRhaW4gdGhlIHByb3BvcnRpb24gb2YgYHVzYV9ib3JuX3dpbm5lcnNgIGZvciBlYWNoIGRlY2FkZS4NCiogRGlzcGxheSAvIHByaW50IG91dCBgcHJvcF91c2Ffd2lubmVyc2AuDQoNCioqKg0KWW91IGNhbiB1c2UgYG11dGF0ZWAgZm9yIHRoZSBmaXJzdCB0d28gYnVsbGV0IHBvaW50cy4NCg0KVG8gY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGBUUlVFYCB2YWx1ZXMgeW91IGNhbiB1c2UgdGhlIGBtZWFuYCBmdW5jdGlvbi4gSWYgdGhlIGNvbHVtbiBpbmNsdWRlcyBgTkFgIHZhbHVlcywgeW91IHdvdWxkIGhhdmUgdG8gdXNlIHRoZSBgbmEucm1gIGFyZ3VtZW50LiBIZXJlJ3MgaG93IHlvdSBjb3VsZCB1c2UgYG1lYW5gIHRvZ2V0aGVyIHdpdGggYHN1bW1hcml6ZWA6DQoNCj5teV9kYXRhICAlPiUgDQogIGdyb3VwX2J5KG15X2NhdGVnb3JpY2FsX3ZhcmlhYmxlKSAgJT4lIA0KICBzdW1tYXJpemUocHJvcG9ydGlvbiA9IA0KICAgICAgbWVhbihpc193aW5uZXIsIG5hLnJtID0gVFJVRSkpDQogICAgICANCmBgYHtyfQ0KIyBDYWxjdWxhdGluZyB0aGUgcHJvcG9ydGlvbiBvZiBVU0EgYm9ybiB3aW5uZXJzIHBlciBkZWNhZGUNCnByb3BfdXNhX3dpbm5lcnMgPC0gbm9iZWwgJT4lIA0KICAgIG11dGF0ZSh1c2FfYm9ybl93aW5uZXIgPSBiaXJ0aF9jb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQ0KDQojIERpc3BsYXkgdGhlIHByb3BvcnRpb25zIG9mIFVTQSBib3JuIHdpbm5lcnMgcGVyIGRlY2FkZQ0KcHJvcF91c2Ffd2lubmVycyA8LSBwcm9wX3VzYV93aW5uZXJzICU+JSANCiAgICAgICAgbXV0YXRlKGRlY2FkZSA9IGZsb29yKHllYXIgLyAxMCkgKiAxMCkgJT4lIA0KICAgICAgICBncm91cF9ieShkZWNhZGUpICAlPiUgDQogICAgICAgIHN1bW1hcml6ZShwcm9wb3J0aW9uID0gbWVhbih1c2FfYm9ybl93aW5uZXIsIG5hLnJtID0gVFJVRSkpDQpwcm9wX3VzYV93aW5uZXJzDQoNCmBgYA0KDQojNC4gVVNBIGRvbWluYW5jZSwgdmlzdWFsaXplZA0KQSB0YWJsZSBpcyBPSywgYnV0IHRvIHNlZSB3aGVuIHRoZSBVU0Egc3RhcnRlZCB0byBkb21pbmF0ZSB0aGUgTm9iZWwgY2hhcnRzIHdlIG5lZWQgYSBwbG90IQ0KDQojI1Rhc2sgNDogSW5zdHJ1Y3Rpb25zDQpQbG90IHRoZSBwcm9wb3J0aW9uIG9mIFVTQSBib3JuIHdpbm5lcnMgcGVyIGRlY2FkZS4NCg0KKiBVc2UgZ2dwbG90IHRvIHBsb3QgcHJvcF91c2Ffd2lubmVycyB3aXRoIGRlY2FkZSBvbiB0aGUgeC1heGlzIGFuZCBwcm9wb3J0aW9uIG9uIHRoZSB5LWF4aXMgYXMgYSBsaW5lLWFuZC1kb3QtcGxvdC4gVGhhdCBpcywgYWRkIGJvdGggZ2VvbV9saW5lKCkgYW5kIGdlb21fcG9pbnQoKS4NCiogRml4IHRoZSB5LXNjYWxlIHRvIHRoYXQgaXQgc2hvd3MgcGVyY2VudGFnZXMsIGl0cyBsaW1pdHMgZ28gZnJvbSAwLjAgdG8gMS4wLCBhbmQgZXh0cmEgc3BhY2luZyBpcyByZW1vdmVkIGFib3ZlIGFuZCBiZWxvdyAwLjAgYW5kIDEuMC4NCg0KKioqDQpUbyBjaGFuZ2UgdGhlIHktYXhpcyB1c2Ugc2NhbGVfeV9jb250aW51b3VzIGFuZCBzZXQgdGhlIGxhYmVscywgbGltaXRzLCBhbmQgZXhwYW5kIGFyZ3VtZW50cy4gQ2hlY2sgdGhlIGdncGxvdDIgZG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIHVzZSBsaW1pdHMgYW5kIGV4cGFuZC4gSGVyZSBpcyBhIFN0YWNrT3ZlcmZsb3cgcXVlc3Rpb24gdGhhdCBzaG93cyBob3cgdG8gc2V0IGxhYmVscyBjb3JyZWN0bHkuDQoNCmBgYHtyfQ0KIyBTZXR0aW5nIHRoZSBzaXplIG9mIHBsb3RzIGluIHRoaXMgbm90ZWJvb2sNCm9wdGlvbnMocmVwci5wbG90LndpZHRoPTcsIHJlcHIucGxvdC5oZWlnaHQ9NCkNCg0KIyBQbG90dGluZyBVU0EgYm9ybiB3aW5uZXJzDQpnZ3Bsb3QoZGF0YSA9IHByb3BfdXNhX3dpbm5lcnMsIGFlcyh4ID0gZGVjYWRlLCB5ID0gcHJvcG9ydGlvbikpKw0KICAgIGdlb21fbGluZSgpKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LA0KICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IDA6MSwgZXhwYW5kID0gYygwLDApKQ0KYGBgDQoNCiM1LiBXaGF0IGlzIHRoZSBnZW5kZXIgb2YgYSB0eXBpY2FsIE5vYmVsIFByaXplIHdpbm5lcj8NClNvIHRoZSBVU0EgYmVjYW1lIHRoZSBkb21pbmF0aW5nIHdpbm5lciBvZiB0aGUgTm9iZWwgUHJpemUgZmlyc3QgaW4gdGhlIDE5MzBzIGFuZCBoYXMga2VwdCB0aGUgbGVhZGluZyBwb3NpdGlvbiBldmVyIHNpbmNlLiBCdXQgb25lIGdyb3VwIHRoYXQgd2FzIGluIHRoZSBsZWFkIGZyb20gdGhlIHN0YXJ0LCBhbmQgbmV2ZXIgc2VlbXMgdG8gbGV0IGdvLCBhcmUgbWVuLiBNYXliZSBpdCBzaG91bGRuJ3QgY29tZSBhcyBhIHNob2NrIHRoYXQgdGhlcmUgaXMgc29tZSBpbWJhbGFuY2UgYmV0d2VlbiBob3cgbWFueSBtYWxlIGFuZCBmZW1hbGUgcHJpemUgd2lubmVycyB0aGVyZSBhcmUsIGJ1dCBob3cgc2lnbmlmaWNhbnQgaXMgdGhpcyBpbWJhbGFuY2U/IEFuZCBpcyBpdCBiZXR0ZXIgb3Igd29yc2Ugd2l0aGluIHNwZWNpZmljIHByaXplIGNhdGVnb3JpZXMgbGlrZSBwaHlzaWNzLCBtZWRpY2luZSwgbGl0ZXJhdHVyZSwgZXRjLj8NCg0KIyNUYXNrIDU6IEluc3RydWN0aW9ucw0KUGxvdCB0aGUgcHJvcG9ydGlvbiBvZiBmZW1hbGUgbGF1cmVhdGVzIGJ5IGRlY2FkZSBzcGxpdCBieSBwcml6ZSBjYXRlZ29yeS4NCg0KKiBBZGQgYGZlbWFsZV93aW5uZXJgIGNvbHVtbiwgd2hlcmUgdGhlIHZhbHVlIGlzIGBUUlVFYCB3aGVuIGBzZXhgIGlzIGAiRmVtYWxlImAuDQoqIEFkZCB0aGUgY29sdW1uIGBkZWNhZGVgIHNob3dpbmcgdGhlIGRlY2FkZSB0aGUgcHJpemUgd2FzIGF3YXJkZWQgKGAxOTUzYCBzaG91bGQgYmVjb21lIGAxOTUwYCwgZm9yIGV4YW1wbGUpLg0KKiBHcm91cCBieSBgZGVjYWRlYCBhbmQgYGNhdGVnb3J5YCBhbmQgc3VtbWFyaXplIHRoZSBwcm9wb3J0aW9uIG9mIGBmZW1hbGVfd2lubmVyYCBpbnRvIHRoZSBgcHJvcG9ydGlvbmAgY29sdW1uLg0KKiBDb3B5IGFuZCBwYXN0ZSB5b3VyIGdncGxvdCBjb2RlIGZyb20gdGFzayA0LCBleGNlcHQgcGxvdCB0aGUgYHByb3BfZmVtYWxlX3dpbm5lcnNgIGRhdGEgYW5kIG1hcCB0aGUgY2F0ZWdvcnkgdmFyaWFibGUgdG8gdGhlIGBjb2xvcmAgcGFyYW1ldGVyLg0KDQoqKioNClRoaXMgdGFzayBjYW4gYmUgc29sdmVkIGJ5IGNvcHlpbmcgYW5kIG1vZGlmeWluZyB0aGUgY29kZSBmcm9tIHRhc2sgMyBhbmQgNC4NCg0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRpbmcgdGhlIHByb3BvcnRpb24gb2YgZmVtYWxlIGxhdXJlYXRlcyBwZXIgZGVjYWRlDQpwcm9wX2ZlbWFsZV93aW5uZXJzIDwtIG5vYmVsICU+JQ0KICAgICAgICBtdXRhdGUoZmVtYWxlX3dpbm5lciA9IHNleCA9PSAiRmVtYWxlIikgJT4lIA0KICAgICAgICBtdXRhdGUoZGVjYWRlID0gZmxvb3IoeWVhci8xMCkqMTApICU+JSANCiAgICAgICAgZ3JvdXBfYnkoZGVjYWRlLCBjYXRlZ29yeSkgJT4lIA0KICAgICAgICBzdW1tYXJpemUocHJvcG9ydGlvbiA9IG1lYW4oZmVtYWxlX3dpbm5lciwgbmEucm0gPSBUUlVFKSkNCiAgICANCg0KIyBQbG90dGluZyB0aGUgcHJvcG9ydGlvbiBvZiBmZW1hbGUgbGF1cmVhdGVzIHBlciBkZWNhZGUNCmdncGxvdChkYXRhID0gcHJvcF9mZW1hbGVfd2lubmVycywgYWVzKHggPSBkZWNhZGUsIHkgPSBwcm9wb3J0aW9uLCBjb2xvciA9IGNhdGVnb3J5ICkpKw0KICAgIGdlb21fbGluZSgpKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LA0KICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IDA6MSwgZXhwYW5kID0gYygwLDApKQ0KYGBgDQoNCiM2LiBUaGUgZmlyc3Qgd29tYW4gdG8gd2luIHRoZSBOb2JlbCBQcml6ZQ0KVGhlIHBsb3QgYWJvdmUgaXMgYSBiaXQgbWVzc3kgYXMgdGhlIGxpbmVzIGFyZSBvdmVycGxvdHRpbmcuIEJ1dCBpdCBkb2VzIHNob3cgc29tZSBpbnRlcmVzdGluZyB0cmVuZHMgYW5kIHBhdHRlcm5zLiBPdmVyYWxsIHRoZSBpbWJhbGFuY2UgaXMgcHJldHR5IGxhcmdlIHdpdGggcGh5c2ljcywgZWNvbm9taWNzLCBhbmQgY2hlbWlzdHJ5IGhhdmluZyB0aGUgbGFyZ2VzdCBpbWJhbGFuY2UuIE1lZGljaW5lIGhhcyBhIHNvbWV3aGF0IHBvc2l0aXZlIHRyZW5kLCBhbmQgc2luY2UgdGhlIDE5OTBzIHRoZSBsaXRlcmF0dXJlIHByaXplIGlzIGFsc28gbm93IG1vcmUgYmFsYW5jZWQuIFRoZSBiaWcgb3V0bGllciBpcyB0aGUgcGVhY2UgcHJpemUgZHVyaW5nIHRoZSAyMDEwcywgYnV0IGtlZXAgaW4gbWluZCB0aGF0IHRoaXMganVzdCBjb3ZlcnMgdGhlIHllYXJzIDIwMTAgdG8gMjAxNi4NCg0KR2l2ZW4gdGhpcyBpbWJhbGFuY2UsIHdobyB3YXMgdGhlIGZpcnN0IHdvbWFuIHRvIHJlY2VpdmUgYSBOb2JlbCBQcml6ZT8gQW5kIGluIHdoYXQgY2F0ZWdvcnk/DQoNCiMjVGFzayA2OiBJbnN0cnVjdGlvbnMNCkV4dHJhY3QgYW5kIGRpc3BsYXkgdGhlIHJvdyBzaG93aW5nIHRoZSBmaXJzdCB3b21hbiB0byB3aW4gYSBOb2JlbCBQcml6ZS4NCg0KKiBVc2UgYGZpbHRlcmAgdG8gZmlsdGVyIGF3YXkgYWxsIG5vbi1gIkZlbWFsZSJgIGxhdXJlYXRlcy4NCiogVXNlIGB0b3BfbmAgdG8gcGljayBvdXQgdGhlIHJvdyB3aXRoIHRoZSBlYXJsaWVzdCB5ZWFyLg0KDQoqKioNCmB0b3Bfbih4LCBuLCB3dClgIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB0YWJsZSBgeGAgYW5kIHBpY2tzIG91dCB0aGUgdG9wIGBuYCByb3dzIGFzIG9yZGVyZWQgYnkgdGhlIGNvbHVtbiBgd3RgLiBCeSBkZWZhdWx0IGB0b3BfbmAgc29ydCBoaWdoZXN0LXRvLWxvd2VzdCBzbyB0byBwaWNrIG91dCBmaXZlIGJlc3Qgb2ZmZXJzIGluIHRoZSBiYXJnYWluIGJpbiwgeW91IHdvdWxkIGhhdmUgdG8gdXNlIGBkZXNjKClgOg0KDQo+YmFyZ2Fpbl9iaW4gICU+JSANCiAgICB0b3Bfbig1LCBkZXNjKHByaWNlKSkNCiAgICANCmBgYHtyfQ0Kbm9iZWwgJT4lDQogICAgZmlsdGVyKHNleCA9PSAiRmVtYWxlIikgJT4lIA0KICAgICAgICB0b3BfbigxLCBkZXNjKHllYXIpKQ0KYGBgDQogICAgDQojNy4gUmVwZWF0IGxhdXJlYXRlcw0KRm9yIG1vc3Qgc2NpZW50aXN0cy93cml0ZXJzL2FjdGl2aXN0cyBhIE5vYmVsIFByaXplIHdvdWxkIGJlIHRoZSBjcm93bmluZyBhY2hpZXZlbWVudCBvZiBhIGxvbmcgY2FyZWVyLiBCdXQgZm9yIHNvbWUgcGVvcGxlLCBvbmUgaXMganVzdCBub3QgZW5vdWdoLCBhbmQgdGhlcmUgYXJlIGZldyB0aGF0IGhhdmUgZ290dGVuIGl0IG1vcmUgdGhhbiBvbmNlLiBXaG8gYXJlIHRoZXNlIGx1Y2t5IGZldz8gKEhhdmluZyB3b24gbm8gTm9iZWwgUHJpemUgbXlzZWxmLCBJJ2xsIGFzc3VtZSBpdCdzIGp1c3QgYWJvdXQgbHVjay4pDQoNCiMjVGFzayA3OiBJbnN0cnVjdGlvbnMNCkV4dHJhY3QgYW5kIGRpc3BsYXkgdGhlIG5hbWVzIG9mIHJlcGVhdCBOb2JlbCBQcml6ZSB3aW5uZXJzLg0KDQoqIFVzZSBgY291bnRgIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygd2lucyBncm91cGVkIGJ5IGBmdWxsX25hbWVgLg0KKiBGaWx0ZXIgYXdheSBhbGwgd2lubmVycyB0aGF0ICJvbmx5IiB3b24gb25lIHRpbWUuDQoNCmBgYHtyfQ0KIyBTZWxlY3RpbmcgdGhlIGxhdXJlYXRlcyB0aGF0IGhhdmUgcmVjZWl2ZWQgMiBvciBtb3JlIHByaXplcy4NCm5vYmVsICU+JQ0KICAgIGdyb3VwX2J5KGZ1bGxfbmFtZSkgJT4lIA0KICAgICAgICBjb3VudCgpICU+JSANCiAgICAgICAgICAgIGZpbHRlcihuPjEpICU+JSBhcnJhbmdlKGRlc2MobikpDQpgYGANCg0KIzguIEhvdyBvbGQgYXJlIHlvdSB3aGVuIHlvdSBnZXQgdGhlIHByaXplPw0KVGhlIGxpc3Qgb2YgcmVwZWF0IHdpbm5lcnMgY29udGFpbnMgc29tZSBpbGx1c3RyaW91cyBuYW1lcyEgV2UgYWdhaW4gbWVldCBNYXJpZSBDdXJpZSwgd2hvIGdvdCB0aGUgcHJpemUgaW4gcGh5c2ljcyBmb3IgZGlzY292ZXJpbmcgcmFkaWF0aW9uIGFuZCBpbiBjaGVtaXN0cnkgZm9yIGlzb2xhdGluZyByYWRpdW0gYW5kIHBvbG9uaXVtLiBKb2huIEJhcmRlZW4gZ290IGl0IHR3aWNlIGluIHBoeXNpY3MgZm9yIHRyYW5zaXN0b3JzIGFuZCBzdXBlcmNvbmR1Y3Rpdml0eSwgRnJlZGVyaWNrIFNhbmdlciBnb3QgaXQgdHdpY2UgaW4gY2hlbWlzdHJ5LCBhbmQgTGludXMgQ2FybCBQYXVsaW5nIGdvdCBpdCBmaXJzdCBpbiBjaGVtaXN0cnkgYW5kIGxhdGVyIGluIHBlYWNlIGZvciBoaXMgd29yayBpbiBwcm9tb3RpbmcgbnVjbGVhciBkaXNhcm1hbWVudC4gV2UgYWxzbyBsZWFybiB0aGF0IG9yZ2FuaXphdGlvbnMgYWxzbyBnZXQgdGhlIHByaXplIGFzIGJvdGggdGhlIFJlZCBDcm9zcyBhbmQgdGhlIFVOSENSIGhhdmUgZ290dGVuIGl0IHR3aWNlLg0KDQpCdXQgaG93IG9sZCBhcmUgeW91IGdlbmVyYWxseSB3aGVuIHlvdSBnZXQgdGhlIHByaXplPw0KDQojI1Rhc2sgODogSW5zdHJ1Y3Rpb25zDQpDYWxjdWxhdGUgYW5kIHBsb3QgdGhlIGFnZSBvZiBlYWNoIHdpbm5lciB3aGVuIHRoZXkgd29uIHRoZWlyIE5vYmVsIFByaXplLg0KDQoqIExvYWQgdGhlIGBsdWJyaWRhdGVgIHBhY2thZ2UgKHlvdSdsbCBmaW5kIHRoZSBgeWVhcigpYCBmdW5jdGlvbiB1c2VmdWwpLg0KKiBgbXV0YXRlYCB0aGUgYG5vYmVsYCB0YWJsZSB0byBpbmNsdWRlIHRoZSBjb2x1bW4gYGFnZWAgd2hpY2ggc2hvdWxkIGJlIGhvdyBvbGQgcGVvcGxlIHdlcmUgd2hlbiB0aGV5IGdvdCB0aGVpciBwcmljZS4gQXNzaWduIHRoZSByZXN1bHRpbmcgdGFibGUgdG8gYG5vYmVsX2FnZWAuDQoqIFVzZSBgZ2dwbG90YCB0byBwbG90IGBhZ2VgIGFzIGEgZnVuY3Rpb24gb2YgYHllYXJgIGFzIGEgc2NhdHRlciBwbG90IChgZ2VvbV9wb2ludCgpYCkgd2l0aCBhIHNtb290aCB0cmVuZCAoYGdlb21fc21vb3RoKClgKS4NCg0KKioqDQpUaGUgYHllYXIoKWAgZnVuY3Rpb24gZnJvbSBsdWJyaWRhdGUgdGFrZXMgYSBkYXRlIGFuZCBleHRyYWN0cyB0aGUgeWVhcjoNCg0KPmRhdGVzIDwtIGFzLkRhdGUoDQogICAgYygiMTk4NS0wNC0wMiIsDQogICAgICAiMTk4OC0wNy0yNSIpKQ0KeWVhcihkYXRlcykNCiMjIFsxXSAxOTg1IDE5ODgNCiAgICAgIA0KYGBge3J9DQojIExvYWRpbmcgdGhlIGx1YnJpZGF0ZSBwYWNrYWdlDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KIyBDYWxjdWxhdGluZyB0aGUgYWdlIG9mIE5vYmVsIFByaXplIHdpbm5lcnMNCm5vYmVsX2FnZSA8LSBub2JlbCAlPiUNCiAgICBtdXRhdGUoYWdlID0geWVhciAtIHllYXIoYmlydGhfZGF0ZSkpDQoNCiMgUGxvdHRpbmcgdGhlIGFnZSBvZiBOb2JlbCBQcml6ZSB3aW5uZXJzDQpnZ3Bsb3QoZGF0YSA9IG5vYmVsX2FnZSwgYWVzKHggPSB5ZWFyLCB5ID0gYWdlKSkrDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fc21vb3RoKCkNCmBgYA0KICAgICAgDQojOS4gQWdlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJpemUgY2F0ZWdvcmllcw0KVGhlIHBsb3QgYWJvdmUgc2hvd3MgdXMgYSBsb3QhIFdlIHNlZSB0aGF0IHBlb3BsZSB1c2UgdG8gYmUgYXJvdW5kIDU1IHdoZW4gdGhleSByZWNlaXZlZCB0aGUgcHJpY2UsIGJ1dCBub3dhZGF5cyB0aGUgYXZlcmFnZSBpcyBjbG9zZXIgdG8gNjUuIEJ1dCB0aGVyZSBpcyBhIGxhcmdlIHNwcmVhZCBpbiB0aGUgbGF1cmVhdGVzJyBhZ2VzLCBhbmQgd2hpbGUgbW9zdCBhcmUgNTArLCBzb21lIGFyZSB2ZXJ5IHlvdW5nLg0KDQpXZSBhbHNvIHNlZSB0aGF0IHRoZSBkZW5zaXR5IG9mIHBvaW50cyBpcyBtdWNoIGhpZ2ggbm93YWRheXMgdGhhbiBpbiB0aGUgZWFybHkgMTkwMHMgLS0gbm93YWRheXMgbWFueSBtb3JlIG9mIHRoZSBwcml6ZXMgYXJlIHNoYXJlZCwgYW5kIHNvIHRoZXJlIGFyZSBtYW55IG1vcmUgd2lubmVycy4gV2UgYWxzbyBzZWUgdGhhdCB0aGVyZSB3YXMgYSBkaXNydXB0aW9uIGluIGF3YXJkZWQgcHJpemVzIGFyb3VuZCB0aGUgU2Vjb25kIFdvcmxkIFdhciAoMTkzOSAtIDE5NDUpLg0KDQpMZXQncyBsb29rIGF0IGFnZSB0cmVuZHMgd2l0aGluIGRpZmZlcmVudCBwcml6ZSBjYXRlZ29yaWVzLg0KDQojI1Rhc2sgOTogSW5zdHJ1Y3Rpb25zDQpQbG90IGhvdyBvbGQgd2lubmVycyBhcmUgd2l0aGluIHRoZSBkaWZmZXJlbnQgcHJpY2UgY2F0ZWdvcmllcy4NCg0KKiBVc2UgYGdncGxvdGAgdG8gcGxvdCBgYWdlYCBhcyBhIGZ1bmN0aW9uIG9mIGB5ZWFyYCBhcyBhIHNjYXR0ZXIgcGxvdCAoYGdlb21fcG9pbnQoKWApIHdpdGggYSBzbW9vdGggdHJlbmQgKGBnZW9tX3Ntb290aCgpYCkgYW5kIGBmYWNldGAgYnkgYGNhdGVnb3J5YCB1c2luZyBgZmFjZXRfd3JhcGAuDQoqIE9wdGlvbmFsOiBSZW1vdmUgdGhlIGNvbmZpZGVuY2UgYmFuZCBpbiBgZ2VvbV9zbW9vdGhgIGJ5IHNldHRpbmcgYHNlID0gRkFMU0VgLg0KDQoqKioNClRoaXMgaXMgdGhlIHNhbWUgcGxvdCBhcyBpbiB0YXNrIDgsIGV4Y2VwdCBmYWNldGVkIGJ5IGBjYXRlZ29yeWAuDQoNClJlbW92aW5nIHRoZSBjb25maWRlbmNlIGJhbmQgaW4gYGdlb21fc21vb3RoYCBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgdGhlIGJhbmRzIGFyZSBub3QgdGhhdCBtZWFuaW5nZnVsIGFuZCByZW1vdmluZyB0aGVtIG1ha2VzIHRoZSBwbG90IG1vcmUgZm9jdXNlZC4NCg0KSWYgeW91IGRvbid0IHJlbWVtYmVyIGhvdyBgZmFjZXRfd3JhcGAgd29ya3MgdGhlbiBsb29rIHVuZGVyIEZhY2V0aW5nIG9uIHRoZSBzZWNvbmQgcGFnZSBvZiB0aGUgYGdncGxvdDJgIGNoZWF0IHNoZWV0Lg0KDQoNCmBgYHtyfQ0KIyBTYW1lIHBsb3QgYXMgYWJvdmUsIGJ1dCBmYWNldGVkIGJ5IHRoZSBjYXRlZ29yeSBvZiB0aGUgTm9iZWwgUHJpemUNCmdncGxvdChkYXRhID0gbm9iZWxfYWdlLCBhZXMoeCA9IHllYXIsIHkgPSBhZ2UpKSsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSkrDQogICAgZmFjZXRfd3JhcCh+IGNhdGVnb3J5KQ0KYGBgDQoNCiMxMC4gT2xkZXN0IGFuZCB5b3VuZ2VzdCB3aW5uZXJzDQpBbm90aGVyIHBsb3Qgd2l0aCBsb3RzIG9mIGV4Y2l0aW5nIHN0dWZmIGdvaW5nIG9uISBXZSBzZWUgdGhhdCBib3RoIHdpbm5lcnMgb2YgdGhlIGNoZW1pc3RyeSwgbWVkaWNpbmUsIGFuZCBwaHlzaWNzIHByaXplIGhhdmUgZ290dGVuIG9sZGVyIG92ZXIgdGltZS4gVGhlIHRyZW5kIGlzIHN0cm9uZ2VzdCBmb3IgcGh5c2ljczogdGhlIGF2ZXJhZ2UgYWdlIHVzZWQgdG8gYmUgYmVsb3cgNTAsIGFuZCBub3cgaXQncyBhbG1vc3QgNzAuIExpdGVyYXR1cmUgYW5kIGVjb25vbWljcyBhcmUgbW9yZSBzdGFibGUsIGFuZCB3ZSBhbHNvIHNlZSB0aGF0IGVjb25vbWljcyBpcyBhIG5ld2VyIGNhdGVnb3J5LiBCdXQgcGVhY2Ugc2hvd3MgYW4gb3Bwb3NpdGUgdHJlbmQgd2hlcmUgd2lubmVycyBhcmUgZ2V0dGluZyB5b3VuZ2VyIQ0KDQpJbiB0aGUgcGVhY2UgY2F0ZWdvcnkgd2UgYWxzbyBhIHdpbm5lciBhcm91bmQgMjAxMCB0aGF0IHNlZW1zIGV4Y2VwdGlvbmFsbHkgeW91bmcuIFRoaXMgYmVncyB0aGUgcXVlc3Rpb25zLCB3aG8gYXJlIHRoZSBvbGRlc3QgYW5kIHlvdW5nZXN0IHBlb3BsZSBldmVyIHRvIGhhdmUgd29uIGEgTm9iZWwgUHJpemU/DQoNCiMjVGFzayAxMDogSW5zdHJ1Y3Rpb25zDQpQaWNrIG91dCB0aGUgcm93cyBvZiB0aGUgb2xkZXN0IGFuZCB0aGUgeW91bmdlc3Qgd2lubmVyIG9mIGEgTm9iZWwgUHJpemUuDQoNCiogVXNlIGB0b3BfbmAgdG8gcGljayBvdXQgYW5kIGRpc3BsYXkgdGhlIHJvdyBvZiB0aGUgb2xkZXN0IHdpbm5lci4NCiogVXNlIGB0b3BfbmAgdG8gcGljayBvdXQgYW5kIGRpc3BsYXkgdGhlIHJvdyBvZiB0aGUgeW91bmdlc3Qgd2lubmVyLg0KUmVtZW1iZXIgdGhhdCB5b3UgY2FuIHVzZSBkZXNjIHRvIHJldmVyc2UgdGhlIHNvcnRpbmc6DQoNCj4jIFRoZSBtb3N0IGV4cGVuc2l2ZSBpdGVtDQpiYXJnYWluX2JpbiAgJT4lIHRvcF9uKDEsIHByaWNlKQ0KDQo+IyBUaGUgY2hlYXBlc3QgaXRlbQ0KYmFyZ2Fpbl9iaW4gICU+JSB0b3BfbigxLCBkZXNjKHByaWNlKSkNCg0KDQpgYGB7cn0NCiMgVGhlIG9sZGVzdCB3aW5uZXIgb2YgYSBOb2JlbCBQcml6ZSBhcyBvZiAyMDE2DQpub2JlbF9hZ2UgJT4lIHRvcF9uKDEsIGFnZSkNCg0KIyBUaGUgeW91bmdlc3Qgd2lubmVyIG9mIGEgTm9iZWwgUHJpemUgYXMgb2YgMjAxNg0Kbm9iZWxfYWdlICU+JSB0b3BfbigxLCBkZXNjKGFnZSkpDQpgYGANCg0KIzExLiBZb3UgZ2V0IGEgcHJpemUhDQoNCg0KSGV5ISBZb3UgZ2V0IGEgcHJpemUgZm9yIG1ha2luZyBpdCB0byB0aGUgdmVyeSBlbmQgb2YgdGhpcyBub3RlYm9vayEgSXQgbWlnaHQgbm90IGJlIGEgTm9iZWwgUHJpemUsIGJ1dCBJIG1hZGUgaXQgbXlzZWxmIGluIHBhaW50IHNvIGl0IHNob3VsZCBjb3VudCBmb3Igc29tZXRoaW5nLiBCdXQgZG9uJ3QgZGVzcGFpciwgTGVvbmlkIEh1cndpY3ogd2FzIDkwIHllYXJzIG9sZCB3aGVuIGhlIGdvdCBoaXMgcHJpemUsIHNvIGl0IG1pZ2h0IG5vdCBiZSB0b28gbGF0ZSBmb3IgeW91LiBXaG8ga25vd3MuDQoNCkJlZm9yZSB5b3UgbGVhdmUsIHdoYXQgd2FzIGFnYWluIHRoZSBuYW1lIG9mIHRoZSB5b3VuZ2VzdCB3aW5uZXIgZXZlciB3aG8gaW4gMjAxNCBnb3QgdGhlIHByaXplIGZvciAiW2hlcl0gc3RydWdnbGUgYWdhaW5zdCB0aGUgc3VwcHJlc3Npb24gb2YgY2hpbGRyZW4gYW5kIHlvdW5nIHBlb3BsZSBhbmQgZm9yIHRoZSByaWdodCBvZiBhbGwgY2hpbGRyZW4gdG8gZWR1Y2F0aW9uIj8NCg0KIyNUYXNrIDExOiBJbnN0cnVjdGlvbnMNCiogQXNzaWduIHRoZSBuYW1lIG9mIHRoZSB5b3VuZ2VzdCB3aW5uZXIgb2YgYSBOb2JlbCBQcml6ZSB0byBgeW91bmdlc3Rfd2lubmVyYC4gVGhlIGZpcnN0IG5hbWUgd2lsbCBzdWZmaWNlLg0KDQoqKioNCklmIHlvdSB3YW50IHRvIGtub3cgbW9yZQ0KVGhlIE5vYmVsIFByaXplIGRhdGFzZXQgaXMgcmljaCBhbmQgdGhlcmUgYW5kIHRoaXMgUHJvamVjdCBqdXN0IHNjcmF0Y2hlZCB0aGUgc3VyZmFjZSAtLSB0aGVyZSBpcyBtdWNoIG1vcmUgdG8gZXhwbG9yZSEgQWZ0ZXIgeW91IGhhdmUgY29tcGxldGVkIHRoaXMgUHJvamVjdCB5b3UgY2FuIGRvd25sb2FkIGl0IGFuZCBjb250aW51ZSBleHBsb3Jpbmcgb24geW91ciBvd24gY29tcHV0ZXIhIFRvIGRvIHRoYXQgeW91IHdpbGwgaGF2ZSB0byBpbnN0YWxsIEp1cHl0ZXIgbm90ZWJvb2tzIHdpdGggc3VwcG9ydCBmb3IgUi4gSGVyZSBhcmUgaW5zdHJ1Y3Rpb25zIGZvciBob3cgdG8gaW5zdGFsbCB0aGUgSnVweXRlciBOb3RlYm9vayBpbnRlcmZhY2UgYW5kIGhlcmUgYXJlIGluc3RydWN0aW9ucyBmb3IgaG93IHRvIGFkZCBzdXBwb3J0IGZvciBSLiBHb29kIGx1Y2shDQoNCmBgYHtyfQ0KIyBUaGUgbmFtZSBvZiB0aGUgeW91bmdlc3Qgd2lubmVyIG9mIHRoZSBOb2JlbCBQcml6ZSBhcyBvZiAyMDE2DQp5b3VuZ2VzdF93aW5uZXIgPC0gIk1hbGFsYSBZb3VzYWZ6YWkiDQp5b3VuZ2VzdF93aW5uZXINCmBgYA0KDQo=