Emma Landry


1. Introduction to R, R studio, R Markdown, and R Notebooks


1.1 The General Structure of an R Notebook

R Notebook files (*.Rmd) allow you to combine text elements with snippets of code and the outputs generated from said code. There are three main parts to an R Notebook file, which are introduced in this section. In addition, each R Notebook automatically generates an *.html file that provides you with the formatted document including all components, which you will ultimately submit for your homework.


1.1.1 The Header

The header, which you can see at the beginning of this document, is delineated with three dashes (---) at the beginning and the end. It includes some code that is important for the formatting of output files, so I would recommend not altering that section. In general, there should be no reason for you to change the header for any exercises in this course. However, if you would like to learn more about the different header options, you can find a good tutorial here.


1.1.2 Code Chunks

R code chunks are delineated with three ticks (''') at the beginning and the end, and {r} after the first set of ticks lets your computer know that you will be using the R programming language. You can always add a code chunk by clicking “Insert > Code Chunk > R” above or by clicking the “+C” icon, although we usually already created all the chunks you will need in the template. Any text within a code chunk, if written correctly, represents executable code, which the computer can interpret as a command to perform certain tasks. You can make your computer execute the code in a chunk by pressing the small, green play arrow on the top right corner of each chunk, or you can just highlight the code and press command+enter (control+enter on PC). When you execute the code, the output will automatically appear below a chunk. Sometimes you will find us using hash tags (#) within code chunks. Hash tags “silence” the text that follows on the same line, such that the computer jumps over that section when executing the code. That is useful for code annotation, and you will frequently see us using the hash tags to add further descriptions or explanations within code chunks.

Pro tip: If you want to execute all code chunks in a document automatically, you can click “Run > Run All” in the RStudio menu.


1.1.3 Text

The text in between code snippets is just that: text. We will use these sections to provide you with background information and discussion prompts, and you will use these sections to respond to questions and offer your interpretations of data. Sections where you need to write something are always highlighted in italics. You can use a variety of prompts to format your text if you are working with basic Markdown (see here for a cheat sheet). Most of you, however, will prefer the text editor that is implemented in R Studio to format text with the click of a button.

Pro tip: You can toggle back and forth between source code (with Markdown formatting) and the WYSIWYG editor (with text formatting through clicking) by using the Source/Visual buttons in the RStudio menu


1.1.4 HTML Preview and Output

As already mentioned, your R Notebook (including text, code chunks, and the outputs from your code) can be automatically knitted into an *.html file. You can click “Preview > Preview Notebook” or “Preview > Knit to HTML” to see the live html version as you are working on your R Notebook (just make sure to save to update), and you can find the shareable *.html file in the same folder as your *.Rmd file (same file name with .nb appended).

Note: Sometime R will prompt you to update some packages in the Console before you can knit the html file. If it is not working on the first try, make sure to check for prompts in the Console.


1.2 Getting Started in R


1.2.1 Setting Your Working Directory

Having a well-organized file structure is critical to avoid issues with coding, because you will frequently read in data files, and you need to make sure that R knows where to look for those files. To facilitate this process, we will provide you with all the necessary files in a single zipped folder: *.zip. If you are working through this, you have already found the first file. We recommend that you unzip that folder and all of its contents in the location where you want it (e.g., your folder for this course) before starting.

Note that an easy way to set your working directory is to simply create a new project in R Studio using the icon with a blue box and a green plus sign (located at the upper left of your R Studio environment). When you are prompted, selected “Existing Directory” and choose the folder you downloaded from Canvas for this lab: “Introduction to R and Darwinian Natural Selection R Tutorial”. Another advantage of creating an R Studio project is that it will save not only your R Markdown file, but all associated files and preferences you have set up during your work session.

The folder containing the files for a particular exercise is called a “Working Directory”, and opening an *.Rmd file automatically sets the working directory to the directory of that R Notebook file. So after unzipping, it is important not to move any files out of the folder we provide you with, unless you want to manually tell R where to look for readable files. If so, you can use the setwd() command to point R toward the location of your files. Additionally, if you don’t know what your working directory is, you can always find it using the getwd() command, which you can type directly into your R Console; then, you can simply copy that path and paste it into your setwd() command.


1.2.2 Loading Your Libraries

When you install R, your computer can understand and execute a number of commands. This is what is known as “Base R”. The power of R, however, is that you can expand the number of commands your computer understands by installing and loading additional R packages (also called libraries). There are R packages specialized for pretty much any area of biology, providing the capability to analyze data from the level of genes and genomes to ecosystem level processes. We will frequently use a package called ggplot2, which allows for plotting data. Depending on the module, you will need to install additional libraries. To download and install new R packages, go to “Tools > Install Packages…” and type in the name of the package you want to install. Alternatively, you can use the install.packages() function. Fore example, execute the following code chunk to install ggplot2:

#Install ggplot2
install.packages("ggplot2")
Installing package into ‘C:/Users/emmal/AppData/Local/R/win-library/4.4’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/ggplot2_3.5.1.zip'
Content type 'application/zip' length 5021717 bytes (4.8 MB)
downloaded 4.8 MB
package ‘ggplot2’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\emmal\AppData\Local\Temp\Rtmp0ILsFU\downloaded_packages

Note that you only need to install every package once (unless you reinstall R). I recommend deleting the code chunk above after you run it successfully, or you can silence it by a hash tag in the beginning of install.packages("ggplot2"). Failure to do so can cause problems during the export (knitting) of your R Notebook as an *.html file.

To make use of installed packages, you also need to load the packages every time you use R (i.e., every time you restart the program). You can do this with the library() command, and you will find a code snippet prompting you to load all needed libraries at the beginning of each R Notebook (in a section that is typically called dependencies). You can try it here by executing the code chunk below to load ggplot2:

#Note that loading a library does not lead to an output
library(ggplot2)

1.2.3 Importing Data

One of the reasons we’re working through the coding basics here is of course that you will work with actual data. To do that, you will need to import data into R. With every exercise, we will provide you with one or more data sets. These data sets will mostly come as *.csv files (which stands for comma-separated values). They are essentially text files containing data tables, and you can also open these files in Excel or other programs. To import data, we will use the read.csv() function. In the code chunk below, you can import a simple test data set (“test_data.csv”) that includes the variables sex, length, and mass for a population of an animal. Note that the fileEncoding argument simply indicates that I generated the input files on a Mac, which will prevent some import issues for those of you that use a PC.

#The line of code simply prompts the computer to read the "test_data.csv" file and generate a data.frame called test.data
test.data <- read.csv("test_data.csv", fileEncoding = 'UTF-8-BOM')

If this worked correctly, you should now see this data set as test.data in your global environment (top right panel). You can double click it to view it. There should be three columns: sex, length, and mass.


1.3 Making Figures

A key learning objective of this course is that you learn to visualize data in different ways to facilitate data interpretation in the context of different evolutionary hypotheses. In the following sections, I will explain step by step (that is code line by code line) how to make a simple graph with our sample data set. Let’s aim to make a scatter plot showing the relationship between length and mass in our species. The process is not much different than sketching a graph by hand and layering different parts of the graph on top of each other, just that you use words (code) to make the computer draw.


1.3.1 Define the Axes and Coordinate System

The first step of making any graph is to define the axes and establish the coordinate grid that allows for the plotting of the data. You can do this by calling the ggplot() function within which you first need to specify the data source (in our case the data frame we just created, called test.data) and then the so called aesthetics—aes()—that contain information about what variables define the x and y axes. In practice, this is accomplished with the following line of code:

#This line of code calls for the ggplot function (a plotting function) and make a grid based on the test.data data frame, using length as the x axis and mass as the y axis
ggplot(test.data, aes(x=length, y=mass))


1.3.2 Adding a Layer with Data Points

The second step is to draw the data into the established coordinate system. To do so, you just need to tell the program what kind of graph you want to draw. Different graph types in ggplot2 are referred to as geoms (geometries), and a scatter plot is designated as geom_point. You can just add that to your existing code with a plus sign. For an overview of some of the graph types (geoms) ggplot2 offers, check the appendix of our textbook.

ggplot(test.data, aes(x=length, y=mass)) +
  geom_point()


1.3.3 Adding a Trendline

Whenever we look at the relationship between two variables, we may want to add a trendline. You can add a trendline by adding the geom_smooth() function to your existing code, and method="lm" designates that your trendline should be linear. The se argument designates whether or not you want to draw an error estimate around your trendline.

#The code within the brackets of the geom_smooth command specified some additional options, namely that we want to draw a straight line (method="lm") and that we do not want to show the confidence interval (se=FALSE). Set the se=TRUE and see what happens.
ggplot(test.data, aes(x=length, y=mass)) +
  geom_point() +
  geom_smooth(method="lm", se=FALSE)


1.3.4 Changing the Axes Labels

The variable names in the data set do not always provide the clearest description of what a variable means. We can modify the x and y axis labels using the xlab() and ylab() functions, respectively. The actual titles need to be written within quotation marks:

#Simply add the new label text in quotation marks
ggplot(test.data, aes(x=length, y=mass)) +
  geom_point() +
  geom_smooth(method="lm", se=FALSE) +
  xlab("Body length in cm") +
  ylab("Body mass in kg")


1.3.5 Changing the Theme

I honestly hate the default theme of ggplot with its gray background. But you can quickly alter the look of the graph by switching to a number of other possible themes. I personally like the theme_classic(), but you can customize the look of your graph with themes listed here.

ggplot(test.data, aes(x=length, y=mass)) +
  geom_point() +
  geom_smooth(method="lm", se=FALSE) +
  xlab("Body length in cm") +
  ylab("Body mass in kg") +
  theme_classic()

Et voilà! You got yourself a perfectly good graph! As you exercise building graphs throughout the semester, make sure to check the “Practical Skills” sections of individual chapters refer to the appendix of the book as needed.

To get additional advice on how to work with different color schemes in gglot(), including the use of colorblind-friendly palettes, please check the corresponding textbook section.


1.4 Your First Data Set: Darwin’s Finches

One of the most iconic study systems in evolutionary biology are Darwin’s finches on the Galapagos Islands. Rosemary and Peter Grant spent much of their lives devoted to the study of these bird, examining how their traits change in response to major ecological perturbations. To do so, they collected a massive, long-term data set on different traits of the medium ground finch (Geospiza fortis) population on Daphne Major Island. For this exercise, we will take a look at their beak size data from 1972-1994.


1.4.1 Importing Data

The beak size data can be found in file called “finches.csv”. The file includes three variables: year, the average relative beak size (rel.beak.size), and the standard error (st.err) that describes the variability of beak size in any given year.

finch <- read.csv("finches.csv", fileEncoding = 'UTF-8-BOM')

1.4.2 Plotting the Data

The following code chunk provides the base code to make a scatter plot as above. You will only have to specify the x and y variables and label the axes correctly.

ggplot(finch, aes(x=year, y=rel.beak.size)) +
  geom_point() +
  xlab("Year") +
  ylab("Relative Beak Size") +
  theme_classic()


1.4.3 Adding Additional Graphical Elements

There are two graphical elements that we can add to facilitate the interpretation of the data:

  1. Since this is a time series, it makes sense to connect the dots representing the means from year to year. You can do this by simply adding another geom: geom_line().
  2. We want to know how much the average beak size changes relative to the variability in the population. If variability is high, year to year variation in may be negligible. But if variability is low, changes across year may actually be substantial. You can do this by adding another geom: geom_errorbar(). Make sure to specify the x and y axes variables as above
ggplot(finch, aes(x=year, y=rel.beak.size)) +
  geom_point() +
  geom_line() +
  geom_errorbar(aes(ymin=rel.beak.size-st.err, ymax=rel.beak.size+st.err))  +
  xlab("Year") +
  ylab("Relative Beak Size") +
  theme_classic()


1.4.4 Interpretation of Patterns


1.4.4.1 General patterns

Based on the graphs you just made, what do you observe? How do you interpret the data if I told you that 1977 was a massive drought year?

Variability was high before the 1970s, when food availability was broad. During a drought, food sources shift to larger, harder seeds that can withstand the drought. This shift added pressure to the survival of birds with smaller beaks, leading in a rise of survival and reproduction among larger beaked birds.


1.4.4.2 Evolution… or Not?

Do you think these data reflect evolutionary change through time? What is a potential alternative explanation? What additional information would you need to either accept or reject the hypothesis that these patterns reflect evolutionary change?

No I do not believe that this would be classified as evolutionary change over time. It represents an event that added pressure resulting in a different allelic ratio, however the genetics of small beaks are still embedded in the population. This can be seen in the resurgence of small beaks about 10 years after the drought.

2. Introduction to Darwinian Natural Selection


2.1 Initiate the Project


2.1.1 Dependencies

#This command loads required packages
library(ggplot2)

2.2 The Cave Molly and its Ancestors

To wrap our head around some of the basic observations that led Darwin to infer natural selection, we will spend a little bit of time with the cave molly. The cave molly (Poecilia mexicana) is a small species of livebearing fish that occurs in a couple of small caves in Southern Mexico. One of the caves, the Cueva Luna Azufre, has a wetted area of only 39 square-meters. Even though the available habitat is really small, there has been an isolated population of cave mollies in this cave for several thousand years. Interestingly, mollies also occur in adjacent surface habitats. In the picture below, you can see the a male and a female of the surface (top two pictures) and the cave form (bottom two pictures) side by side.


2.3 The Struggle for Existence

The first set of observations that led Darwin to infer the process of natural selection related to the imbalance of organisms’ reproductive power and limitations of resource availability. Quantifying the effective reproductive output and resource availability in nature can be difficult. However, what we can do is to measure proxies for these traits and then use simple mathematical models to test whether our predictions and inferences are valid. Here, we use exponential and logistic population growth models to explore whether there is really a struggle for existence in cave mollies.


2.3.1 Observation 1: Populations Have a Huge Reproductive Potential

Even large animals with long generation times have an incredible reproductive potential. Cave mollies—as many other cave organisms—have a comparatively low fecundity, and females only give birth to one or two fully developed young at a time. Life history analyses based on female longevity and fecundity have revealed that the average female gives birth to about 3 offspring over her life; not exactly what you would call huge reproductive potential, right? But in reality, it is not the reproductive potential of individuals that counts, but the reproductive potential of populations. To illustrate this point, we want you to model population growth for a hypothetical population of cave mollies. Specifically, use the code below to simulate and graph the population growth of an initial cave molly population of 2 individuals (the initial colonizers of the cave).

How many generations would it take for the population to grow to a million? Under what circumstances might you see population growth like this? Do you think Darwin’s observation that “species have great potential fertility” holds true for cave mollies?

#Choose an initial population size
N0 = 2

#Choose the average number of offspring
b = 3

#Choose a range of generations you want to estimate population size for; default is generation 0 to 15
t = 0:15

#Calculate the population size for each generation
N = N0*b^t

#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))

#You can view the results by just calling the data frame
print(final.results)

#Plot the results, make sure you properly label the axes
ggplot(final.results, aes(x=t, y=N)) + 
  geom_point() + 
  xlab("Generations") + 
  ylab("Population Size") +
  theme_classic()

Around 12 generations


2.3.2 Observation 2: Natural Resources are Limited

Exponential growth only occurs in very specific circumstances. In a cave that is only the fraction of the size of a football field, you would obviously never find a cave molly population of a million. The logistic model more accurately describes population growth in nature. Based on our past analyses, we estimate the population growth coefficient (𝛌) to be around 1.3 and the carrying capacity (K) of the cave around 360 individuals.

How long would it take for the population to reach the carrying capacity if there were two initial colonizers? What do you think determines K for the population of cave mollies in the Cueva Luna Azufre?

#Choose an initial population size
N0 = 2
#Choose population growth rate
lamda = 1.3
#Choose a range of generations you want to estimate population size for
t = 0:15
#Choose a carrying capacity
K = 360
#Calculate the population size for each generation
N = (N0*K)/(N0+(K-N0)*exp(-lamda*t))
#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))
#Use the ggplot function to plot the results, make sure you properly label the axes
ggplot(final.results, aes(x=t, y=N)) + 
  geom_point() + 
  xlab("Generations") + 
  ylab("Population Size") +
  theme_classic()

The population reaches carrying capacity after around 7 generations. Carrying capacity of cave mollies depends on limiting factors within the cave like food availability, space, predation, and dissolved oxygen.


2.3.3 Where Do All the Missing Offspring Go?

Compare the two models (exponential and logistic) that were ran with the same initial parameters. What do the different outcomes mean for individual offspring that are born in any given generation? How might this discrepancy important in the context of evolution?

A smaller population size makes it more likely for evolutionary change to occur. If there was an infinite spawn of these fish, limiting factors and environmental factors would apply no evolutionary forces.


2.4 Individuals Vary in Their Traits

Another of Darwin’s key observations was just how variable individuals of the same species are. Let’s explore some of that variation in cave mollies. To do that, we first need to load some data into R. These data were collected as part of my dissertation and include the following variables: habitat (cave or surface), sex (male or female), standard length (in mm, from the snout to the caudal fin base), eye diameter (in mm), head length (in mm), head width (in mm), predorsal length (in mm, from the snout to the insertion of the dorsal fin), and gape width (in mm, from one corner of the mouth to the other).

#Use the read.csv function to import a dataset; take a look at the data structure once you imported the file!
morph.data <- read.csv("morphological_variation.csv", fileEncoding = 'UTF-8-BOM')

2.4.1 Comparing Body Size Variation Within and Between Populations

A simple way to compare variation within and between populations is to plot a frequency histogram (which represents the raw counts) along with a density plot (which represents the approximated statistical distribution). You can generate a histogram with the geom_histogram() function and designate any trait you may want as the x axis. You can calculate the density with aes(y=..density..) within geom_histogram() and then plot it with geom_density(). Note that when you have more than two groups (in our case we have samples from a cave and a surface population), you can visualize them separately by designating a different color for each group in the aesthetics (fill=Habitat).

When you visualize body size variation in this manner what do you observe? Is there more variation within or between populations?

#Use the ggplot function to graph the histogram (see: http://www.sthda.com/english/wiki/ggplot2-histogram-plot-quick-start-guide-r-software-and-data-visualization)
ggplot(morph.data, aes(x=Standard.length, fill=Habitat)) + 
  geom_histogram(aes(y=..density..)) +
  geom_density(alpha=0.5)+
  xlab("standard length") + 
  ylab("density") +
  theme_classic()

The surface population appears to have more variation in length than teh cave fish. The modes of length seem similar between habitats. Cave species are more abundant at smaller lengths than surface species.


2.4.2 Comparing Predorsal Length Variation Within and Between Populations

Let’s also compare a second trait, predorsal length. With the previous graph you hopefully saw how variable overall body size is within populations. If we want to compare other traits, we have to account for that. We want to know whether variation in predorsal length is due to variation in size (small fish have small predorsal lengths) or whether other patterns might be at play. To do so, we can calculate the residual predorsal length as from a regression between predorsal and standard length using the lm(y ~ x, data) and residuals() functions:

#Calculating regression line
fit1 <- lm(Predorsal.length ~ Standard.length, data = morph.data)

#Extract residuals and create a new variable res.predorsal in the morph.data data frame
morph.data$res.predorsal <- residuals(fit1)

You can then use the new variable to plot the residual predorsal length, which is corrected for body size:

##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=res.predorsal, fill=Habitat)) +
  geom_histogram(aes(y=..density..)) +
  geom_density(alpha=0.5)+
  xlab("Pre-dorsal length (corrected for body size)") + 
  ylab("Density") +
  theme_classic()

When you plot relative predorsal length, what do you observe? How does variation in predorsal length vary within and between populations, and how does it compare to variation in standard length?

The variations among cave and surface are very similar according to the histogram. There is a fairly uniform distributions for both populations, unlike the variation in standard length.

2.4.3 Comparing Eye Size Variation Within and Between Populations

Using the same approach as for predorsal variation, compare variation in relative eye diameter:

#Your code goes here
fit1 <- lm(Eye.diameter ~ Standard.length, data = morph.data)

#Extract residuals and create a new variable res.predorsal in the morph.data data frame
morph.data$res.eye<- residuals(fit1)

##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=res.eye, fill=Habitat)) + geom_histogram(aes(y=..density..)) + geom_density(alpha=0.5)+ xlab("Relative Eye Diameter (corrected for body size)")

What do you observe? How does variation in eye diameter vary within and between populations, and how does it compare to variation in the other traits?

Unlike the other histograms, the variation in Eye diameter is more dependent on habitat. The Cave habitat is distributed to the left, with a generally smaller eye diameter.


2.5 Variation in Traits is Heritable

An avid breeder of fancy pigeons, Darwin observed that specific traits are passed from parents to offspring, even though he had no clue how this might actually work (genetics was not really a thing yet). Even without an ability to conduct molecular genetic analyses, we can estimate heritability of traits by comparing the traits of offspring to the traits of the parents.

Let’s load some data that compares parent and offspring traits in cave mollies. To do this, we brought cave mollies into the lab and bred them under standardized conditions. Data represent the average trait values of the mother and father and of all offspring from a specific brood. The easiest way to compare parent and offspring traits is through a scatter plot, which we already used in Exercise 1. If a trait is heritable, we would expect to see a correlation between parent and offspring traits (e.g., parents with small eyes should have offspring with small eyes).

The following dataset includes measurements of parental and offspring standard length as well as eye size.

#Use the read.csv function to import a dataset; take a look at the data structure once you imported the file!
heritability <- read.csv("heritability.csv", fileEncoding = 'UTF-8-BOM')

2.5.1. Heritability of Standard Length

First, let us explore whether there is evidence for heritability in standard length.

What do you observe? Is standard length a heritable trait?

ggplot(heritability, aes(x=parent.standard.length, y=offspring.standard.length)) + 
  geom_point() + 
  geom_smooth(method = "lm") +
  xlab("Parent Size") + 
  ylab("Offspring Size") +
  theme_classic()

There is no r value, so this does not tell me a whole lot. If there was an r value I would assume it to be very low, because this graph demonstrates a low strength in correlation between parent size and offspring size. Based off this visual, I would suggest that standard length is not heritable, or more likely there are many factors that contribute to it.

2.5.2 Heritability of Eye Size

Now let us explore whether there is any heritability in eye size. Remember, there is substantial variation in body size, and in such cases, we want to control for body size by calculating residual eye size first.

##Calculate residual eye sizes for the parents and the offspring
#Your code goes here:
fit1 <- lm(parent.eye.size ~ parent.standard.length, data = heritability)
#extract
heritability$res.parent.eye <-residuals(fit1)
fit1 <-lm(offspring.eye.size ~ offspring.standard.length, data = heritability)
heritability$res.offspring.eye <- residuals(fit1)

#Plot the results
ggplot(heritability, aes(x=res.parent.eye, y=res.offspring.eye)) + 
  geom_point() + 
  geom_smooth(method = "lm") +
  xlab("Parent Relative Eye Diameter (Corrected for Body Size)") + 
  ylab("Offspring Relative Eye Diameter (Correcred for Body Size)") +
  theme_classic()

What do you observe? Is standard length a heritable trait? #is this a typo?

These two values seem to have a strong positive correlation. I would observe that eye size is heritable.

I am not sure if I did this section correctly because it does not properly answer the questions above or below, so here is another graph showing the relationship of size accounting for eye size which I also do not know if that makes sense.

##Calculate residual eye sizes for the parents and the offspring
#Your code goes here:
fit1 <- lm(parent.standard.length ~ parent.eye.size, data = heritability)
#extract
heritability$res.parent.standard.length <-residuals(fit1)
fit1 <-lm(offspring.standard.length ~ offspring.eye.size, data = heritability)
heritability$res.offspring.standard.length <- residuals(fit1)

#Plot the results
ggplot(heritability, aes(x=res.parent.standard.length, y=res.offspring.standard.length)) + 
  geom_point() + 
  geom_smooth(method = "lm") +
  xlab("Parent Relative Body Size (Corrected for Eye Size)") + 
  ylab("Offspring Relative Body Size (Correcred for Eye Size)") +
  theme_classic()

This is interesting. I would not think as eye size as something that may explain body size. But this correlation does appear much more strong and positive accounting for eye size.


2.6 What Would Happen If…?

Imagine for a moment that smaller fish have a higher likelihood of survival in the cave. Would you expect evolution of body size upon cave colonization?

Imagine for a moment that fish with smaller eyes have a higher likelihood of survival in the cave. Would you expect evolution of eye size upon cave colonization? Justify your response.

Yes, if survival is increased with smaller body size, then reproductive power would also increase, leading to evolutionary change over a long period of time. Similarly, if smaller eyed fish have a survival advantage then I would expect this trait to grow in the species. This is because my analysis has shown that both characteristics have a strong positive correlation meaning that they are likely heritable.

3. Resources


3.1 Data References

This tutorial was adapted from an open-source textbook that teaches Evolution in R:

Data on beak size variation in Darwin’s finches came from the following publication:

The eye size data was published in the following paper. Other measurements are unpublished data by M. Tobler.


3.2 Resources You Consulted

Consulting additional resources to solve this assignment is absolutely allowed, but failure to disclose those resources is plagiarism. Please list any collaborators you worked with and resources you used below or state that you have not used any.

I did not use any alternative resources.

LS0tDQp0aXRsZTogIkFuIEludHJvZHVjdGlvbiB0byBSIGFuZCBEYXJ3aW5pYW4gTmF0dXJhbCBTZWxlY3Rpb24gUiBMYWIiDQphdXRob3I6IFphY2NoYWV1cyBDb21wc29uIGFuZCBLYWxleSBDYXZlIChhZGFwdGVkIGZyb20gTWljaGkgVG9ibGVyKQ0KZGF0ZTogOC8yNy8yMDI0DQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAga2VlcF9tZDogVFJVRQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICczJw0KICBodG1sX25vdGVib29rOg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KIyMgRW1tYSBMYW5kcnkNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgMS4gSW50cm9kdWN0aW9uIHRvIFIsIFIgc3R1ZGlvLCBSIE1hcmtkb3duLCBhbmQgUiBOb3RlYm9va3MNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDEuMSBUaGUgR2VuZXJhbCBTdHJ1Y3R1cmUgb2YgYW4gUiBOb3RlYm9vaw0KDQpSIE5vdGVib29rIGZpbGVzIChcKi5SbWQpIGFsbG93IHlvdSB0byBjb21iaW5lIHRleHQgZWxlbWVudHMgd2l0aCBzbmlwcGV0cyBvZiBjb2RlIGFuZCB0aGUgb3V0cHV0cyBnZW5lcmF0ZWQgZnJvbSBzYWlkIGNvZGUuIFRoZXJlIGFyZSB0aHJlZSBtYWluIHBhcnRzIHRvIGFuIFIgTm90ZWJvb2sgZmlsZSwgd2hpY2ggYXJlIGludHJvZHVjZWQgaW4gdGhpcyBzZWN0aW9uLiBJbiBhZGRpdGlvbiwgZWFjaCBSIE5vdGVib29rIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGFuIFwqLmh0bWwgZmlsZSB0aGF0IHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBmb3JtYXR0ZWQgZG9jdW1lbnQgaW5jbHVkaW5nIGFsbCBjb21wb25lbnRzLCB3aGljaCB5b3Ugd2lsbCB1bHRpbWF0ZWx5IHN1Ym1pdCBmb3IgeW91ciBob21ld29yay4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjEuMSBUaGUgSGVhZGVyDQoNClRoZSBoZWFkZXIsIHdoaWNoIHlvdSBjYW4gc2VlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBkb2N1bWVudCwgaXMgZGVsaW5lYXRlZCB3aXRoIHRocmVlIGRhc2hlcyAoYC0tLWApIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQuIEl0IGluY2x1ZGVzIHNvbWUgY29kZSB0aGF0IGlzIGltcG9ydGFudCBmb3IgdGhlIGZvcm1hdHRpbmcgb2Ygb3V0cHV0IGZpbGVzLCBzbyBJIHdvdWxkIHJlY29tbWVuZCBub3QgYWx0ZXJpbmcgdGhhdCBzZWN0aW9uLiBJbiBnZW5lcmFsLCB0aGVyZSBzaG91bGQgYmUgbm8gcmVhc29uIGZvciB5b3UgdG8gY2hhbmdlIHRoZSBoZWFkZXIgZm9yIGFueSBleGVyY2lzZXMgaW4gdGhpcyBjb3Vyc2UuIEhvd2V2ZXIsIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGRpZmZlcmVudCBoZWFkZXIgb3B0aW9ucywgeW91IGNhbiBmaW5kIGEgZ29vZCB0dXRvcmlhbCBbaGVyZV0oaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2h0bWwtZG9jdW1lbnQuaHRtbCN0YWJsZS1vZi1jb250ZW50cykuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMS4xLjIgQ29kZSBDaHVua3MNCg0KUiBjb2RlIGNodW5rcyBhcmUgZGVsaW5lYXRlZCB3aXRoIHRocmVlIHRpY2tzIChgJycnYCkgYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZCwgYW5kIGB7cn1gIGFmdGVyIHRoZSBmaXJzdCBzZXQgb2YgdGlja3MgbGV0cyB5b3VyIGNvbXB1dGVyIGtub3cgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgUiBwcm9ncmFtbWluZyBsYW5ndWFnZS4gWW91IGNhbiBhbHdheXMgYWRkIGEgY29kZSBjaHVuayBieSBjbGlja2luZyAiSW5zZXJ0IFw+IENvZGUgQ2h1bmsgXD4gUiIgYWJvdmUgb3IgYnkgY2xpY2tpbmcgdGhlICIrQyIgaWNvbiwgYWx0aG91Z2ggd2UgdXN1YWxseSBhbHJlYWR5IGNyZWF0ZWQgYWxsIHRoZSBjaHVua3MgeW91IHdpbGwgbmVlZCBpbiB0aGUgdGVtcGxhdGUuIEFueSB0ZXh0IHdpdGhpbiBhIGNvZGUgY2h1bmssIGlmIHdyaXR0ZW4gY29ycmVjdGx5LCByZXByZXNlbnRzIGV4ZWN1dGFibGUgY29kZSwgd2hpY2ggdGhlIGNvbXB1dGVyIGNhbiBpbnRlcnByZXQgYXMgYSBjb21tYW5kIHRvIHBlcmZvcm0gY2VydGFpbiB0YXNrcy4gWW91IGNhbiBtYWtlIHlvdXIgY29tcHV0ZXIgZXhlY3V0ZSB0aGUgY29kZSBpbiBhIGNodW5rIGJ5IHByZXNzaW5nIHRoZSBzbWFsbCwgZ3JlZW4gcGxheSBhcnJvdyBvbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiBlYWNoIGNodW5rLCBvciB5b3UgY2FuIGp1c3QgaGlnaGxpZ2h0IHRoZSBjb2RlIGFuZCBwcmVzcyBjb21tYW5kK2VudGVyIChjb250cm9sK2VudGVyIG9uIFBDKS4gV2hlbiB5b3UgZXhlY3V0ZSB0aGUgY29kZSwgdGhlIG91dHB1dCB3aWxsIGF1dG9tYXRpY2FsbHkgYXBwZWFyIGJlbG93IGEgY2h1bmsuIFNvbWV0aW1lcyB5b3Ugd2lsbCBmaW5kIHVzIHVzaW5nIGhhc2ggdGFncyAoYCNgKSB3aXRoaW4gY29kZSBjaHVua3MuIEhhc2ggdGFncyAic2lsZW5jZSIgdGhlIHRleHQgdGhhdCBmb2xsb3dzIG9uIHRoZSBzYW1lIGxpbmUsIHN1Y2ggdGhhdCB0aGUgY29tcHV0ZXIganVtcHMgb3ZlciB0aGF0IHNlY3Rpb24gd2hlbiBleGVjdXRpbmcgdGhlIGNvZGUuIFRoYXQgaXMgdXNlZnVsIGZvciBjb2RlIGFubm90YXRpb24sIGFuZCB5b3Ugd2lsbCBmcmVxdWVudGx5IHNlZSB1cyB1c2luZyB0aGUgaGFzaCB0YWdzIHRvIGFkZCBmdXJ0aGVyIGRlc2NyaXB0aW9ucyBvciBleHBsYW5hdGlvbnMgd2l0aGluIGNvZGUgY2h1bmtzLg0KDQpQcm8gdGlwOiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIGFsbCBjb2RlIGNodW5rcyBpbiBhIGRvY3VtZW50IGF1dG9tYXRpY2FsbHksIHlvdSBjYW4gY2xpY2sgIlJ1biBcPiBSdW4gQWxsIiBpbiB0aGUgUlN0dWRpbyBtZW51Lg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDEuMS4zIFRleHQNCg0KVGhlIHRleHQgaW4gYmV0d2VlbiBjb2RlIHNuaXBwZXRzIGlzIGp1c3QgdGhhdDogdGV4dC4gV2Ugd2lsbCB1c2UgdGhlc2Ugc2VjdGlvbnMgdG8gcHJvdmlkZSB5b3Ugd2l0aCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFuZCBkaXNjdXNzaW9uIHByb21wdHMsIGFuZCB5b3Ugd2lsbCB1c2UgdGhlc2Ugc2VjdGlvbnMgdG8gcmVzcG9uZCB0byBxdWVzdGlvbnMgYW5kIG9mZmVyIHlvdXIgaW50ZXJwcmV0YXRpb25zIG9mIGRhdGEuIFNlY3Rpb25zIHdoZXJlIHlvdSBuZWVkIHRvIHdyaXRlIHNvbWV0aGluZyBhcmUgYWx3YXlzIGhpZ2hsaWdodGVkIGluICppdGFsaWNzKi4gWW91IGNhbiB1c2UgYSB2YXJpZXR5IG9mIHByb21wdHMgdG8gZm9ybWF0IHlvdXIgdGV4dCBpZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBiYXNpYyBNYXJrZG93biAoc2VlIFtoZXJlXShodHRwczovL3JzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzAyL3JtYXJrZG93bi1jaGVhdHNoZWV0LnBkZikgZm9yIGEgY2hlYXQgc2hlZXQpLiBNb3N0IG9mIHlvdSwgaG93ZXZlciwgd2lsbCBwcmVmZXIgdGhlIHRleHQgZWRpdG9yIHRoYXQgaXMgaW1wbGVtZW50ZWQgaW4gUiBTdHVkaW8gdG8gZm9ybWF0IHRleHQgd2l0aCB0aGUgY2xpY2sgb2YgYSBidXR0b24uDQoNClBybyB0aXA6IFlvdSBjYW4gdG9nZ2xlIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gc291cmNlIGNvZGUgKHdpdGggTWFya2Rvd24gZm9ybWF0dGluZykgYW5kIHRoZSBXWVNJV1lHIGVkaXRvciAod2l0aCB0ZXh0IGZvcm1hdHRpbmcgdGhyb3VnaCBjbGlja2luZykgYnkgdXNpbmcgdGhlIFNvdXJjZS9WaXN1YWwgYnV0dG9ucyBpbiB0aGUgUlN0dWRpbyBtZW51DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMS4xLjQgSFRNTCBQcmV2aWV3IGFuZCBPdXRwdXQNCg0KQXMgYWxyZWFkeSBtZW50aW9uZWQsIHlvdXIgUiBOb3RlYm9vayAoaW5jbHVkaW5nIHRleHQsIGNvZGUgY2h1bmtzLCBhbmQgdGhlIG91dHB1dHMgZnJvbSB5b3VyIGNvZGUpIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGtuaXR0ZWQgaW50byBhbiBcKi5odG1sIGZpbGUuIFlvdSBjYW4gY2xpY2sgIlByZXZpZXcgXD4gUHJldmlldyBOb3RlYm9vayIgb3IgIlByZXZpZXcgXD4gS25pdCB0byBIVE1MIiB0byBzZWUgdGhlIGxpdmUgaHRtbCB2ZXJzaW9uIGFzIHlvdSBhcmUgd29ya2luZyBvbiB5b3VyIFIgTm90ZWJvb2sgKGp1c3QgbWFrZSBzdXJlIHRvIHNhdmUgdG8gdXBkYXRlKSwgYW5kIHlvdSBjYW4gZmluZCB0aGUgc2hhcmVhYmxlIFwqLmh0bWwgZmlsZSBpbiB0aGUgc2FtZSBmb2xkZXIgYXMgeW91ciBcKi5SbWQgZmlsZSAoc2FtZSBmaWxlIG5hbWUgd2l0aCAubmIgYXBwZW5kZWQpLg0KDQpOb3RlOiBTb21ldGltZSBSIHdpbGwgcHJvbXB0IHlvdSB0byB1cGRhdGUgc29tZSBwYWNrYWdlcyBpbiB0aGUgQ29uc29sZSBiZWZvcmUgeW91IGNhbiBrbml0IHRoZSBodG1sIGZpbGUuIElmIGl0IGlzIG5vdCB3b3JraW5nIG9uIHRoZSBmaXJzdCB0cnksIG1ha2Ugc3VyZSB0byBjaGVjayBmb3IgcHJvbXB0cyBpbiB0aGUgQ29uc29sZS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDEuMiBHZXR0aW5nIFN0YXJ0ZWQgaW4gUg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDEuMi4xIFNldHRpbmcgWW91ciBXb3JraW5nIERpcmVjdG9yeQ0KDQpIYXZpbmcgYSB3ZWxsLW9yZ2FuaXplZCBmaWxlIHN0cnVjdHVyZSBpcyBjcml0aWNhbCB0byBhdm9pZCBpc3N1ZXMgd2l0aCBjb2RpbmcsIGJlY2F1c2UgeW91IHdpbGwgZnJlcXVlbnRseSByZWFkIGluIGRhdGEgZmlsZXMsIGFuZCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBSIGtub3dzIHdoZXJlIHRvIGxvb2sgZm9yIHRob3NlIGZpbGVzLiBUbyBmYWNpbGl0YXRlIHRoaXMgcHJvY2Vzcywgd2Ugd2lsbCBwcm92aWRlIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IGZpbGVzIGluIGEgc2luZ2xlIHppcHBlZCBmb2xkZXI6IFwqLnppcC4gSWYgeW91IGFyZSB3b3JraW5nIHRocm91Z2ggdGhpcywgeW91IGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgZmlyc3QgZmlsZS4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVuemlwIHRoYXQgZm9sZGVyIGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzIGluIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3Ugd2FudCBpdCAoZS5nLiwgeW91ciBmb2xkZXIgZm9yIHRoaXMgY291cnNlKSBiZWZvcmUgc3RhcnRpbmcuDQoNCk5vdGUgdGhhdCBhbiBlYXN5IHdheSB0byBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBpcyB0byBzaW1wbHkgY3JlYXRlIGEgbmV3IHByb2plY3QgaW4gUiBTdHVkaW8gdXNpbmcgdGhlIGljb24gd2l0aCBhIGJsdWUgYm94IGFuZCBhIGdyZWVuIHBsdXMgc2lnbiAobG9jYXRlZCBhdCB0aGUgdXBwZXIgbGVmdCBvZiB5b3VyIFIgU3R1ZGlvIGVudmlyb25tZW50KS4gV2hlbiB5b3UgYXJlIHByb21wdGVkLCBzZWxlY3RlZCAiRXhpc3RpbmcgRGlyZWN0b3J5IiBhbmQgY2hvb3NlIHRoZSBmb2xkZXIgeW91IGRvd25sb2FkZWQgZnJvbSBDYW52YXMgZm9yIHRoaXMgbGFiOiAiSW50cm9kdWN0aW9uIHRvIFIgYW5kIERhcndpbmlhbiBOYXR1cmFsIFNlbGVjdGlvbiBSIFR1dG9yaWFsIi4gQW5vdGhlciBhZHZhbnRhZ2Ugb2YgY3JlYXRpbmcgYW4gUiBTdHVkaW8gcHJvamVjdCBpcyB0aGF0IGl0IHdpbGwgc2F2ZSBub3Qgb25seSB5b3VyIFIgTWFya2Rvd24gZmlsZSwgYnV0IGFsbCBhc3NvY2lhdGVkIGZpbGVzIGFuZCBwcmVmZXJlbmNlcyB5b3UgaGF2ZSBzZXQgdXAgZHVyaW5nIHlvdXIgd29yayBzZXNzaW9uLg0KDQpUaGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGZpbGVzIGZvciBhIHBhcnRpY3VsYXIgZXhlcmNpc2UgaXMgY2FsbGVkIGEgIldvcmtpbmcgRGlyZWN0b3J5IiwgYW5kIG9wZW5pbmcgYW4gXCouUm1kIGZpbGUgYXV0b21hdGljYWxseSBzZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IG9mIHRoYXQgUiBOb3RlYm9vayBmaWxlLiBTbyBhZnRlciB1bnppcHBpbmcsIGl0IGlzIGltcG9ydGFudCBub3QgdG8gbW92ZSBhbnkgZmlsZXMgb3V0IG9mIHRoZSBmb2xkZXIgd2UgcHJvdmlkZSB5b3Ugd2l0aCwgdW5sZXNzIHlvdSB3YW50IHRvIG1hbnVhbGx5IHRlbGwgUiB3aGVyZSB0byBsb29rIGZvciByZWFkYWJsZSBmaWxlcy4gSWYgc28sIHlvdSBjYW4gdXNlIHRoZSBgc2V0d2QoKWAgY29tbWFuZCB0byBwb2ludCBSIHRvd2FyZCB0aGUgbG9jYXRpb24gb2YgeW91ciBmaWxlcy4gQWRkaXRpb25hbGx5LCBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgaXMsIHlvdSBjYW4gYWx3YXlzIGZpbmQgaXQgdXNpbmcgdGhlIGBnZXR3ZCgpYCBjb21tYW5kLCB3aGljaCB5b3UgY2FuIHR5cGUgZGlyZWN0bHkgaW50byB5b3VyIFIgQ29uc29sZTsgdGhlbiwgeW91IGNhbiBzaW1wbHkgY29weSB0aGF0IHBhdGggYW5kIHBhc3RlIGl0IGludG8geW91ciBgc2V0d2QoKWAgY29tbWFuZC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjIuMiBMb2FkaW5nIFlvdXIgTGlicmFyaWVzDQoNCldoZW4geW91IGluc3RhbGwgUiwgeW91ciBjb21wdXRlciBjYW4gdW5kZXJzdGFuZCBhbmQgZXhlY3V0ZSBhIG51bWJlciBvZiBjb21tYW5kcy4gVGhpcyBpcyB3aGF0IGlzIGtub3duIGFzICJCYXNlIFIiLiBUaGUgcG93ZXIgb2YgUiwgaG93ZXZlciwgaXMgdGhhdCB5b3UgY2FuIGV4cGFuZCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIHlvdXIgY29tcHV0ZXIgdW5kZXJzdGFuZHMgYnkgaW5zdGFsbGluZyBhbmQgbG9hZGluZyBhZGRpdGlvbmFsIFIgcGFja2FnZXMgKGFsc28gY2FsbGVkIGxpYnJhcmllcykuIFRoZXJlIGFyZSBSIHBhY2thZ2VzIHNwZWNpYWxpemVkIGZvciBwcmV0dHkgbXVjaCBhbnkgYXJlYSBvZiBiaW9sb2d5LCBwcm92aWRpbmcgdGhlIGNhcGFiaWxpdHkgdG8gYW5hbHl6ZSBkYXRhIGZyb20gdGhlIGxldmVsIG9mIGdlbmVzIGFuZCBnZW5vbWVzIHRvIGVjb3N5c3RlbSBsZXZlbCBwcm9jZXNzZXMuIFdlIHdpbGwgZnJlcXVlbnRseSB1c2UgYSBwYWNrYWdlIGNhbGxlZCBgZ2dwbG90MmAsIHdoaWNoIGFsbG93cyBmb3IgcGxvdHRpbmcgZGF0YS4gRGVwZW5kaW5nIG9uIHRoZSBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIGxpYnJhcmllcy4gVG8gZG93bmxvYWQgYW5kIGluc3RhbGwgbmV3IFIgcGFja2FnZXMsIGdvIHRvICJUb29scyBcPiBJbnN0YWxsIFBhY2thZ2VzLi4uIiBhbmQgdHlwZSBpbiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB5b3Ugd2FudCB0byBpbnN0YWxsLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgYGluc3RhbGwucGFja2FnZXMoKWAgZnVuY3Rpb24uIEZvcmUgZXhhbXBsZSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvZGUgY2h1bmsgdG8gaW5zdGFsbCBgZ2dwbG90MmA6DQoNCmBgYHtyfQ0KI0luc3RhbGwgZ2dwbG90Mg0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpgYGANCg0KTm90ZSB0aGF0IHlvdSBvbmx5IG5lZWQgdG8gaW5zdGFsbCBldmVyeSBwYWNrYWdlIG9uY2UgKHVubGVzcyB5b3UgcmVpbnN0YWxsIFIpLiBJIHJlY29tbWVuZCBkZWxldGluZyB0aGUgY29kZSBjaHVuayBhYm92ZSBhZnRlciB5b3UgcnVuIGl0IHN1Y2Nlc3NmdWxseSwgb3IgeW91IGNhbiBzaWxlbmNlIGl0IGJ5IGEgaGFzaCB0YWcgaW4gdGhlIGJlZ2lubmluZyBvZiBgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpYC4gRmFpbHVyZSB0byBkbyBzbyBjYW4gY2F1c2UgcHJvYmxlbXMgZHVyaW5nIHRoZSBleHBvcnQgKGtuaXR0aW5nKSBvZiB5b3VyIFIgTm90ZWJvb2sgYXMgYW4gXCouaHRtbCBmaWxlLg0KDQpUbyBtYWtlIHVzZSBvZiBpbnN0YWxsZWQgcGFja2FnZXMsIHlvdSBhbHNvIG5lZWQgdG8gbG9hZCB0aGUgcGFja2FnZXMgKmV2ZXJ5IHRpbWUqIHlvdSB1c2UgUiAoKmkuZS4qLCBldmVyeSB0aW1lIHlvdSByZXN0YXJ0IHRoZSBwcm9ncmFtKS4gWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIGBsaWJyYXJ5KClgIGNvbW1hbmQsIGFuZCB5b3Ugd2lsbCBmaW5kIGEgY29kZSBzbmlwcGV0IHByb21wdGluZyB5b3UgdG8gbG9hZCBhbGwgbmVlZGVkIGxpYnJhcmllcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggUiBOb3RlYm9vayAoaW4gYSBzZWN0aW9uIHRoYXQgaXMgdHlwaWNhbGx5IGNhbGxlZCBkZXBlbmRlbmNpZXMpLiBZb3UgY2FuIHRyeSBpdCBoZXJlIGJ5IGV4ZWN1dGluZyB0aGUgY29kZSBjaHVuayBiZWxvdyB0byBsb2FkIGBnZ3Bsb3QyYDoNCg0KYGBge3J9DQojTm90ZSB0aGF0IGxvYWRpbmcgYSBsaWJyYXJ5IGRvZXMgbm90IGxlYWQgdG8gYW4gb3V0cHV0DQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjIuMyBJbXBvcnRpbmcgRGF0YQ0KDQpPbmUgb2YgdGhlIHJlYXNvbnMgd2UncmUgd29ya2luZyB0aHJvdWdoIHRoZSBjb2RpbmcgYmFzaWNzIGhlcmUgaXMgb2YgY291cnNlIHRoYXQgeW91IHdpbGwgd29yayB3aXRoIGFjdHVhbCBkYXRhLiBUbyBkbyB0aGF0LCB5b3Ugd2lsbCBuZWVkIHRvIGltcG9ydCBkYXRhIGludG8gUi4gV2l0aCBldmVyeSBleGVyY2lzZSwgd2Ugd2lsbCBwcm92aWRlIHlvdSB3aXRoIG9uZSBvciBtb3JlIGRhdGEgc2V0cy4gVGhlc2UgZGF0YSBzZXRzIHdpbGwgbW9zdGx5IGNvbWUgYXMgXCouY3N2IGZpbGVzICh3aGljaCBzdGFuZHMgZm9yIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMpLiBUaGV5IGFyZSBlc3NlbnRpYWxseSB0ZXh0IGZpbGVzIGNvbnRhaW5pbmcgZGF0YSB0YWJsZXMsIGFuZCB5b3UgY2FuIGFsc28gb3BlbiB0aGVzZSBmaWxlcyBpbiBFeGNlbCBvciBvdGhlciBwcm9ncmFtcy4gVG8gaW1wb3J0IGRhdGEsIHdlIHdpbGwgdXNlIHRoZSBgcmVhZC5jc3YoKWAgZnVuY3Rpb24uIEluIHRoZSBjb2RlIGNodW5rIGJlbG93LCB5b3UgY2FuIGltcG9ydCBhIHNpbXBsZSB0ZXN0IGRhdGEgc2V0ICgidGVzdF9kYXRhLmNzdiIpIHRoYXQgaW5jbHVkZXMgdGhlIHZhcmlhYmxlcyBzZXgsIGxlbmd0aCwgYW5kIG1hc3MgZm9yIGEgcG9wdWxhdGlvbiBvZiBhbiBhbmltYWwuIE5vdGUgdGhhdCB0aGUgYGZpbGVFbmNvZGluZ2AgYXJndW1lbnQgc2ltcGx5IGluZGljYXRlcyB0aGF0IEkgZ2VuZXJhdGVkIHRoZSBpbnB1dCBmaWxlcyBvbiBhIE1hYywgd2hpY2ggd2lsbCBwcmV2ZW50IHNvbWUgaW1wb3J0IGlzc3VlcyBmb3IgdGhvc2Ugb2YgeW91IHRoYXQgdXNlIGEgUEMuDQoNCmBgYHtyfQ0KI1RoZSBsaW5lIG9mIGNvZGUgc2ltcGx5IHByb21wdHMgdGhlIGNvbXB1dGVyIHRvIHJlYWQgdGhlICJ0ZXN0X2RhdGEuY3N2IiBmaWxlIGFuZCBnZW5lcmF0ZSBhIGRhdGEuZnJhbWUgY2FsbGVkIHRlc3QuZGF0YQ0KdGVzdC5kYXRhIDwtIHJlYWQuY3N2KCJ0ZXN0X2RhdGEuY3N2IiwgZmlsZUVuY29kaW5nID0gJ1VURi04LUJPTScpDQpgYGANCg0KSWYgdGhpcyB3b3JrZWQgY29ycmVjdGx5LCB5b3Ugc2hvdWxkIG5vdyBzZWUgdGhpcyBkYXRhIHNldCBhcyBgdGVzdC5kYXRhYCBpbiB5b3VyIGdsb2JhbCBlbnZpcm9ubWVudCAodG9wIHJpZ2h0IHBhbmVsKS4gWW91IGNhbiBkb3VibGUgY2xpY2sgaXQgdG8gdmlldyBpdC4gVGhlcmUgc2hvdWxkIGJlIHRocmVlIGNvbHVtbnM6IHNleCwgbGVuZ3RoLCBhbmQgbWFzcy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDEuMyBNYWtpbmcgRmlndXJlcw0KDQpBIGtleSBsZWFybmluZyBvYmplY3RpdmUgb2YgdGhpcyBjb3Vyc2UgaXMgdGhhdCB5b3UgbGVhcm4gdG8gdmlzdWFsaXplIGRhdGEgaW4gZGlmZmVyZW50IHdheXMgdG8gZmFjaWxpdGF0ZSBkYXRhIGludGVycHJldGF0aW9uIGluIHRoZSBjb250ZXh0IG9mIGRpZmZlcmVudCBldm9sdXRpb25hcnkgaHlwb3RoZXNlcy4gSW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucywgSSB3aWxsIGV4cGxhaW4gc3RlcCBieSBzdGVwICh0aGF0IGlzIGNvZGUgbGluZSBieSBjb2RlIGxpbmUpIGhvdyB0byBtYWtlIGEgc2ltcGxlIGdyYXBoIHdpdGggb3VyIHNhbXBsZSBkYXRhIHNldC4gTGV0J3MgYWltIHRvIG1ha2UgYSBzY2F0dGVyIHBsb3Qgc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbGVuZ3RoIGFuZCBtYXNzIGluIG91ciBzcGVjaWVzLiBUaGUgcHJvY2VzcyBpcyBub3QgbXVjaCBkaWZmZXJlbnQgdGhhbiBza2V0Y2hpbmcgYSBncmFwaCBieSBoYW5kIGFuZCBsYXllcmluZyBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGdyYXBoIG9uIHRvcCBvZiBlYWNoIG90aGVyLCBqdXN0IHRoYXQgeW91IHVzZSB3b3JkcyAoY29kZSkgdG8gbWFrZSB0aGUgY29tcHV0ZXIgZHJhdy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjMuMSBEZWZpbmUgdGhlIEF4ZXMgYW5kIENvb3JkaW5hdGUgU3lzdGVtDQoNClRoZSBmaXJzdCBzdGVwIG9mIG1ha2luZyBhbnkgZ3JhcGggaXMgdG8gZGVmaW5lIHRoZSBheGVzIGFuZCBlc3RhYmxpc2ggdGhlIGNvb3JkaW5hdGUgZ3JpZCB0aGF0IGFsbG93cyBmb3IgdGhlIHBsb3R0aW5nIG9mIHRoZSBkYXRhLiBZb3UgY2FuIGRvIHRoaXMgYnkgY2FsbGluZyB0aGUgYGdncGxvdCgpYCBmdW5jdGlvbiB3aXRoaW4gd2hpY2ggeW91IGZpcnN0IG5lZWQgdG8gc3BlY2lmeSB0aGUgZGF0YSBzb3VyY2UgKGluIG91ciBjYXNlIHRoZSBkYXRhIGZyYW1lIHdlIGp1c3QgY3JlYXRlZCwgY2FsbGVkIGB0ZXN0LmRhdGFgKSBhbmQgdGhlbiB0aGUgc28gY2FsbGVkIGFlc3RoZXRpY3MtLS1gYWVzKClgLS0tdGhhdCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdmFyaWFibGVzIGRlZmluZSB0aGUgeCBhbmQgeSBheGVzLiBJbiBwcmFjdGljZSwgdGhpcyBpcyBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgZm9sbG93aW5nIGxpbmUgb2YgY29kZToNCg0KYGBge3J9DQojVGhpcyBsaW5lIG9mIGNvZGUgY2FsbHMgZm9yIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gKGEgcGxvdHRpbmcgZnVuY3Rpb24pIGFuZCBtYWtlIGEgZ3JpZCBiYXNlZCBvbiB0aGUgdGVzdC5kYXRhIGRhdGEgZnJhbWUsIHVzaW5nIGxlbmd0aCBhcyB0aGUgeCBheGlzIGFuZCBtYXNzIGFzIHRoZSB5IGF4aXMNCmdncGxvdCh0ZXN0LmRhdGEsIGFlcyh4PWxlbmd0aCwgeT1tYXNzKSkNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDEuMy4yIEFkZGluZyBhIExheWVyIHdpdGggRGF0YSBQb2ludHMNCg0KVGhlIHNlY29uZCBzdGVwIGlzIHRvIGRyYXcgdGhlIGRhdGEgaW50byB0aGUgZXN0YWJsaXNoZWQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRvIGRvIHNvLCB5b3UganVzdCBuZWVkIHRvIHRlbGwgdGhlIHByb2dyYW0gd2hhdCBraW5kIG9mIGdyYXBoIHlvdSB3YW50IHRvIGRyYXcuIERpZmZlcmVudCBncmFwaCB0eXBlcyBpbiBgZ2dwbG90MmAgYXJlIHJlZmVycmVkIHRvIGFzIGdlb21zIChnZW9tZXRyaWVzKSwgYW5kIGEgc2NhdHRlciBwbG90IGlzIGRlc2lnbmF0ZWQgYXMgYGdlb21fcG9pbnRgLiBZb3UgY2FuIGp1c3QgYWRkIHRoYXQgdG8geW91ciBleGlzdGluZyBjb2RlIHdpdGggYSBwbHVzIHNpZ24uIEZvciBhbiBvdmVydmlldyBvZiBzb21lIG9mIHRoZSBncmFwaCB0eXBlcyAoZ2VvbXMpIGBnZ3Bsb3QyYCBvZmZlcnMsIGNoZWNrIHRoZSBbYXBwZW5kaXhdKGh0dHBzOi8vd3d3Lmstc3RhdGUuZWR1L2Jpb2xvZ3kvcDJlL2dyYXBoLWxpYnJhcnkuaHRtbCkgb2Ygb3VyIHRleHRib29rLg0KDQpgYGB7cn0NCmdncGxvdCh0ZXN0LmRhdGEsIGFlcyh4PWxlbmd0aCwgeT1tYXNzKSkgKw0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDEuMy4zIEFkZGluZyBhIFRyZW5kbGluZQ0KDQpXaGVuZXZlciB3ZSBsb29rIGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gdmFyaWFibGVzLCB3ZSBtYXkgd2FudCB0byBhZGQgYSB0cmVuZGxpbmUuIFlvdSBjYW4gYWRkIGEgdHJlbmRsaW5lIGJ5IGFkZGluZyB0aGUgYGdlb21fc21vb3RoKClgIGZ1bmN0aW9uIHRvIHlvdXIgZXhpc3RpbmcgY29kZSwgYW5kIGBtZXRob2Q9ImxtImAgZGVzaWduYXRlcyB0aGF0IHlvdXIgdHJlbmRsaW5lIHNob3VsZCBiZSBsaW5lYXIuIFRoZSBgc2VgIGFyZ3VtZW50IGRlc2lnbmF0ZXMgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8gZHJhdyBhbiBlcnJvciBlc3RpbWF0ZSBhcm91bmQgeW91ciB0cmVuZGxpbmUuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQojVGhlIGNvZGUgd2l0aGluIHRoZSBicmFja2V0cyBvZiB0aGUgZ2VvbV9zbW9vdGggY29tbWFuZCBzcGVjaWZpZWQgc29tZSBhZGRpdGlvbmFsIG9wdGlvbnMsIG5hbWVseSB0aGF0IHdlIHdhbnQgdG8gZHJhdyBhIHN0cmFpZ2h0IGxpbmUgKG1ldGhvZD0ibG0iKSBhbmQgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBjb25maWRlbmNlIGludGVydmFsIChzZT1GQUxTRSkuIFNldCB0aGUgc2U9VFJVRSBhbmQgc2VlIHdoYXQgaGFwcGVucy4NCmdncGxvdCh0ZXN0LmRhdGEsIGFlcyh4PWxlbmd0aCwgeT1tYXNzKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjMuNCBDaGFuZ2luZyB0aGUgQXhlcyBMYWJlbHMNCg0KVGhlIHZhcmlhYmxlIG5hbWVzIGluIHRoZSBkYXRhIHNldCBkbyBub3QgYWx3YXlzIHByb3ZpZGUgdGhlIGNsZWFyZXN0IGRlc2NyaXB0aW9uIG9mIHdoYXQgYSB2YXJpYWJsZSBtZWFucy4gV2UgY2FuIG1vZGlmeSB0aGUgeCBhbmQgeSBheGlzIGxhYmVscyB1c2luZyB0aGUgYHhsYWIoKWAgYW5kIGB5bGFiKClgIGZ1bmN0aW9ucywgcmVzcGVjdGl2ZWx5LiBUaGUgYWN0dWFsIHRpdGxlcyBuZWVkIHRvIGJlIHdyaXR0ZW4gd2l0aGluIHF1b3RhdGlvbiBtYXJrczoNCg0KYGBge3J9DQojU2ltcGx5IGFkZCB0aGUgbmV3IGxhYmVsIHRleHQgaW4gcXVvdGF0aW9uIG1hcmtzDQpnZ3Bsb3QodGVzdC5kYXRhLCBhZXMoeD1sZW5ndGgsIHk9bWFzcykpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFKSArDQogIHhsYWIoIkJvZHkgbGVuZ3RoIGluIGNtIikgKw0KICB5bGFiKCJCb2R5IG1hc3MgaW4ga2ciKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMS4zLjUgQ2hhbmdpbmcgdGhlIFRoZW1lDQoNCkkgaG9uZXN0bHkgaGF0ZSB0aGUgZGVmYXVsdCB0aGVtZSBvZiBgZ2dwbG90YCB3aXRoIGl0cyBncmF5IGJhY2tncm91bmQuIEJ1dCB5b3UgY2FuIHF1aWNrbHkgYWx0ZXIgdGhlIGxvb2sgb2YgdGhlIGdyYXBoIGJ5IHN3aXRjaGluZyB0byBhIG51bWJlciBvZiBvdGhlciBwb3NzaWJsZSB0aGVtZXMuIEkgcGVyc29uYWxseSBsaWtlIHRoZSBgdGhlbWVfY2xhc3NpYygpYCwgYnV0IHlvdSBjYW4gY3VzdG9taXplIHRoZSBsb29rIG9mIHlvdXIgZ3JhcGggd2l0aCB0aGVtZXMgbGlzdGVkIFtoZXJlXShodHRwczovL3d3dy5kYXRhbm92aWEuY29tL2VuL2Jsb2cvZ2dwbG90LXRoZW1lcy1nYWxsZXJ5LyNiYXNpYy1nZ3Bsb3QpLg0KDQpgYGB7cn0NCmdncGxvdCh0ZXN0LmRhdGEsIGFlcyh4PWxlbmd0aCwgeT1tYXNzKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpICsNCiAgeGxhYigiQm9keSBsZW5ndGggaW4gY20iKSArDQogIHlsYWIoIkJvZHkgbWFzcyBpbiBrZyIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KRXQgdm9pbMOgISBZb3UgZ290IHlvdXJzZWxmIGEgcGVyZmVjdGx5IGdvb2QgZ3JhcGghIEFzIHlvdSBleGVyY2lzZSBidWlsZGluZyBncmFwaHMgdGhyb3VnaG91dCB0aGUgc2VtZXN0ZXIsIG1ha2Ugc3VyZSB0byBjaGVjayB0aGUgIlByYWN0aWNhbCBTa2lsbHMiIHNlY3Rpb25zIG9mIGluZGl2aWR1YWwgY2hhcHRlcnMgcmVmZXIgdG8gdGhlIGFwcGVuZGl4IG9mIHRoZSBib29rIGFzIG5lZWRlZC4NCg0KVG8gZ2V0IGFkZGl0aW9uYWwgYWR2aWNlIG9uIGhvdyB0byB3b3JrIHdpdGggZGlmZmVyZW50IGNvbG9yIHNjaGVtZXMgaW4gYGdnbG90KClgLCBpbmNsdWRpbmcgdGhlIHVzZSBvZiBjb2xvcmJsaW5kLWZyaWVuZGx5IHBhbGV0dGVzLCBwbGVhc2UgY2hlY2sgdGhlIFtjb3JyZXNwb25kaW5nIHRleHRib29rIHNlY3Rpb25dKGh0dHBzOi8vd3d3Lmstc3RhdGUuZWR1L2Jpb2xvZ3kvcDJlL2V2aWRlbmNlLWZvci1ldm9sdXRpb24uaHRtbCNncmFwaGluZy1kYXRhKS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDEuNCBZb3VyIEZpcnN0IERhdGEgU2V0OiBEYXJ3aW4ncyBGaW5jaGVzDQoNCk9uZSBvZiB0aGUgbW9zdCBpY29uaWMgc3R1ZHkgc3lzdGVtcyBpbiBldm9sdXRpb25hcnkgYmlvbG9neSBhcmUgRGFyd2luJ3MgZmluY2hlcyBvbiB0aGUgR2FsYXBhZ29zIElzbGFuZHMuIFJvc2VtYXJ5IGFuZCBQZXRlciBHcmFudCBzcGVudCBtdWNoIG9mIHRoZWlyIGxpdmVzIGRldm90ZWQgdG8gdGhlIHN0dWR5IG9mIHRoZXNlIGJpcmQsIGV4YW1pbmluZyBob3cgdGhlaXIgdHJhaXRzIGNoYW5nZSBpbiByZXNwb25zZSB0byBtYWpvciBlY29sb2dpY2FsIHBlcnR1cmJhdGlvbnMuIFRvIGRvIHNvLCB0aGV5IGNvbGxlY3RlZCBhIG1hc3NpdmUsIGxvbmctdGVybSBkYXRhIHNldCBvbiBkaWZmZXJlbnQgdHJhaXRzIG9mIHRoZSBtZWRpdW0gZ3JvdW5kIGZpbmNoICgqR2Vvc3BpemEgZm9ydGlzKikgcG9wdWxhdGlvbiBvbiBEYXBobmUgTWFqb3IgSXNsYW5kLiBGb3IgdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCB0YWtlIGEgbG9vayBhdCB0aGVpciBiZWFrIHNpemUgZGF0YSBmcm9tIDE5NzItMTk5NC4NCg0KIVtdKGZpbmNoLmpwZykNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjQuMSBJbXBvcnRpbmcgRGF0YQ0KDQpUaGUgYmVhayBzaXplIGRhdGEgY2FuIGJlIGZvdW5kIGluIGZpbGUgY2FsbGVkICJmaW5jaGVzLmNzdiIuIFRoZSBmaWxlIGluY2x1ZGVzIHRocmVlIHZhcmlhYmxlczogeWVhciwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgYmVhayBzaXplIChyZWwuYmVhay5zaXplKSwgYW5kIHRoZSBzdGFuZGFyZCBlcnJvciAoc3QuZXJyKSB0aGF0IGRlc2NyaWJlcyB0aGUgdmFyaWFiaWxpdHkgb2YgYmVhayBzaXplIGluIGFueSBnaXZlbiB5ZWFyLg0KDQpgYGB7cn0NCmZpbmNoIDwtIHJlYWQuY3N2KCJmaW5jaGVzLmNzdiIsIGZpbGVFbmNvZGluZyA9ICdVVEYtOC1CT00nKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMS40LjIgUGxvdHRpbmcgdGhlIERhdGENCg0KVGhlIGZvbGxvd2luZyBjb2RlIGNodW5rIHByb3ZpZGVzIHRoZSBiYXNlIGNvZGUgdG8gbWFrZSBhIHNjYXR0ZXIgcGxvdCBhcyBhYm92ZS4gWW91IHdpbGwgb25seSBoYXZlIHRvIHNwZWNpZnkgdGhlIHggYW5kIHkgdmFyaWFibGVzIGFuZCBsYWJlbCB0aGUgYXhlcyBjb3JyZWN0bHkuDQoNCmBgYHtyfQ0KZ2dwbG90KGZpbmNoLCBhZXMoeD15ZWFyLCB5PXJlbC5iZWFrLnNpemUpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHhsYWIoIlllYXIiKSArDQogIHlsYWIoIlJlbGF0aXZlIEJlYWsgU2l6ZSIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAxLjQuMyBBZGRpbmcgQWRkaXRpb25hbCBHcmFwaGljYWwgRWxlbWVudHMNCg0KVGhlcmUgYXJlIHR3byBncmFwaGljYWwgZWxlbWVudHMgdGhhdCB3ZSBjYW4gYWRkIHRvIGZhY2lsaXRhdGUgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBkYXRhOg0KDQoxLiAgU2luY2UgdGhpcyBpcyBhIHRpbWUgc2VyaWVzLCBpdCBtYWtlcyBzZW5zZSB0byBjb25uZWN0IHRoZSBkb3RzIHJlcHJlc2VudGluZyB0aGUgbWVhbnMgZnJvbSB5ZWFyIHRvIHllYXIuIFlvdSBjYW4gZG8gdGhpcyBieSBzaW1wbHkgYWRkaW5nIGFub3RoZXIgZ2VvbTogYGdlb21fbGluZSgpYC4NCjIuICBXZSB3YW50IHRvIGtub3cgaG93IG11Y2ggdGhlIGF2ZXJhZ2UgYmVhayBzaXplIGNoYW5nZXMgcmVsYXRpdmUgdG8gdGhlIHZhcmlhYmlsaXR5IGluIHRoZSBwb3B1bGF0aW9uLiBJZiB2YXJpYWJpbGl0eSBpcyBoaWdoLCB5ZWFyIHRvIHllYXIgdmFyaWF0aW9uIGluIG1heSBiZSBuZWdsaWdpYmxlLiBCdXQgaWYgdmFyaWFiaWxpdHkgaXMgbG93LCBjaGFuZ2VzIGFjcm9zcyB5ZWFyIG1heSBhY3R1YWxseSBiZSBzdWJzdGFudGlhbC4gWW91IGNhbiBkbyB0aGlzIGJ5IGFkZGluZyBhbm90aGVyIGdlb206IGBnZW9tX2Vycm9yYmFyKClgLiBNYWtlIHN1cmUgdG8gc3BlY2lmeSB0aGUgeCBhbmQgeSBheGVzIHZhcmlhYmxlcyBhcyBhYm92ZQ0KDQpgYGB7cn0NCmdncGxvdChmaW5jaCwgYWVzKHg9eWVhciwgeT1yZWwuYmVhay5zaXplKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49cmVsLmJlYWsuc2l6ZS1zdC5lcnIsIHltYXg9cmVsLmJlYWsuc2l6ZStzdC5lcnIpKSAgKw0KICB4bGFiKCJZZWFyIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBCZWFrIFNpemUiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMS40LjQgSW50ZXJwcmV0YXRpb24gb2YgUGF0dGVybnMNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyMgMS40LjQuMSBHZW5lcmFsIHBhdHRlcm5zDQoNCkJhc2VkIG9uIHRoZSBncmFwaHMgeW91IGp1c3QgbWFkZSwgd2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSG93IGRvIHlvdSBpbnRlcnByZXQgdGhlIGRhdGEgaWYgSSB0b2xkIHlvdSB0aGF0IDE5Nzcgd2FzIGEgbWFzc2l2ZSBkcm91Z2h0IHllYXI/DQoNClZhcmlhYmlsaXR5IHdhcyBoaWdoIGJlZm9yZSB0aGUgMTk3MHMsIHdoZW4gZm9vZCBhdmFpbGFiaWxpdHkgd2FzIGJyb2FkLiBEdXJpbmcgYSBkcm91Z2h0LCBmb29kIHNvdXJjZXMgc2hpZnQgdG8gbGFyZ2VyLCBoYXJkZXIgc2VlZHMgdGhhdCBjYW4gd2l0aHN0YW5kIHRoZSBkcm91Z2h0LiBUaGlzIHNoaWZ0IGFkZGVkIHByZXNzdXJlIHRvIHRoZSBzdXJ2aXZhbCBvZiBiaXJkcyB3aXRoIHNtYWxsZXIgYmVha3MsIGxlYWRpbmcgaW4gYSByaXNlIG9mIHN1cnZpdmFsIGFuZCByZXByb2R1Y3Rpb24gYW1vbmcgbGFyZ2VyIGJlYWtlZCBiaXJkcy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyMgMS40LjQuMiBFdm9sdXRpb24uLi4gb3IgTm90Pw0KDQpEbyB5b3UgdGhpbmsgdGhlc2UgZGF0YSByZWZsZWN0IGV2b2x1dGlvbmFyeSBjaGFuZ2UgdGhyb3VnaCB0aW1lPyBXaGF0IGlzIGEgcG90ZW50aWFsIGFsdGVybmF0aXZlIGV4cGxhbmF0aW9uPyBXaGF0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd291bGQgeW91IG5lZWQgdG8gZWl0aGVyIGFjY2VwdCBvciByZWplY3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGVzZSBwYXR0ZXJucyByZWZsZWN0IGV2b2x1dGlvbmFyeSBjaGFuZ2U/DQoNCk5vIEkgZG8gbm90IGJlbGlldmUgdGhhdCB0aGlzIHdvdWxkIGJlIGNsYXNzaWZpZWQgYXMgZXZvbHV0aW9uYXJ5IGNoYW5nZSBvdmVyIHRpbWUuIEl0IHJlcHJlc2VudHMgYW4gZXZlbnQgdGhhdCBhZGRlZCBwcmVzc3VyZSByZXN1bHRpbmcgaW4gYSBkaWZmZXJlbnQgYWxsZWxpYyByYXRpbywgaG93ZXZlciB0aGUgZ2VuZXRpY3Mgb2Ygc21hbGwgYmVha3MgYXJlIHN0aWxsIGVtYmVkZGVkIGluIHRoZSBwb3B1bGF0aW9uLiBUaGlzIGNhbiBiZSBzZWVuIGluIHRoZSByZXN1cmdlbmNlIG9mIHNtYWxsIGJlYWtzIGFib3V0IDEwIHllYXJzIGFmdGVyIHRoZSBkcm91Z2h0Lg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgMi4gSW50cm9kdWN0aW9uIHRvIERhcndpbmlhbiBOYXR1cmFsIFNlbGVjdGlvbg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgMi4xIEluaXRpYXRlIHRoZSBQcm9qZWN0DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMi4xLjEgRGVwZW5kZW5jaWVzDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQojVGhpcyBjb21tYW5kIGxvYWRzIHJlcXVpcmVkIHBhY2thZ2VzDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDIuMiBUaGUgQ2F2ZSBNb2xseSBhbmQgaXRzIEFuY2VzdG9ycw0KDQpUbyB3cmFwIG91ciBoZWFkIGFyb3VuZCBzb21lIG9mIHRoZSBiYXNpYyBvYnNlcnZhdGlvbnMgdGhhdCBsZWQgRGFyd2luIHRvIGluZmVyIG5hdHVyYWwgc2VsZWN0aW9uLCB3ZSB3aWxsIHNwZW5kIGEgbGl0dGxlIGJpdCBvZiB0aW1lIHdpdGggdGhlIGNhdmUgbW9sbHkuIFRoZSBjYXZlIG1vbGx5ICgqUG9lY2lsaWEgbWV4aWNhbmEqKSBpcyBhIHNtYWxsIHNwZWNpZXMgb2YgbGl2ZWJlYXJpbmcgZmlzaCB0aGF0IG9jY3VycyBpbiBhIGNvdXBsZSBvZiBzbWFsbCBjYXZlcyBpbiBTb3V0aGVybiBNZXhpY28uIE9uZSBvZiB0aGUgY2F2ZXMsIHRoZSBDdWV2YSBMdW5hIEF6dWZyZSwgaGFzIGEgd2V0dGVkIGFyZWEgb2Ygb25seSAzOSBzcXVhcmUtbWV0ZXJzLiBFdmVuIHRob3VnaCB0aGUgYXZhaWxhYmxlIGhhYml0YXQgaXMgcmVhbGx5IHNtYWxsLCB0aGVyZSBoYXMgYmVlbiBhbiBpc29sYXRlZCBwb3B1bGF0aW9uIG9mIGNhdmUgbW9sbGllcyBpbiB0aGlzIGNhdmUgZm9yIHNldmVyYWwgdGhvdXNhbmQgeWVhcnMuIEludGVyZXN0aW5nbHksIG1vbGxpZXMgYWxzbyBvY2N1ciBpbiBhZGphY2VudCBzdXJmYWNlIGhhYml0YXRzLiBJbiB0aGUgcGljdHVyZSBiZWxvdywgeW91IGNhbiBzZWUgdGhlIGEgbWFsZSBhbmQgYSBmZW1hbGUgb2YgdGhlIHN1cmZhY2UgKHRvcCB0d28gcGljdHVyZXMpIGFuZCB0aGUgY2F2ZSBmb3JtIChib3R0b20gdHdvIHBpY3R1cmVzKSBzaWRlIGJ5IHNpZGUuDQoNCiFbXShtb2xsaWVzLnBuZykNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDIuMyBUaGUgU3RydWdnbGUgZm9yIEV4aXN0ZW5jZQ0KDQpUaGUgZmlyc3Qgc2V0IG9mIG9ic2VydmF0aW9ucyB0aGF0IGxlZCBEYXJ3aW4gdG8gaW5mZXIgdGhlIHByb2Nlc3Mgb2YgbmF0dXJhbCBzZWxlY3Rpb24gcmVsYXRlZCB0byB0aGUgaW1iYWxhbmNlIG9mIG9yZ2FuaXNtcycgcmVwcm9kdWN0aXZlIHBvd2VyIGFuZCBsaW1pdGF0aW9ucyBvZiByZXNvdXJjZSBhdmFpbGFiaWxpdHkuIFF1YW50aWZ5aW5nIHRoZSBlZmZlY3RpdmUgcmVwcm9kdWN0aXZlIG91dHB1dCBhbmQgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IGluIG5hdHVyZSBjYW4gYmUgZGlmZmljdWx0LiBIb3dldmVyLCB3aGF0IHdlIGNhbiBkbyBpcyB0byBtZWFzdXJlIHByb3hpZXMgZm9yIHRoZXNlIHRyYWl0cyBhbmQgdGhlbiB1c2Ugc2ltcGxlIG1hdGhlbWF0aWNhbCBtb2RlbHMgdG8gdGVzdCB3aGV0aGVyIG91ciBwcmVkaWN0aW9ucyBhbmQgaW5mZXJlbmNlcyBhcmUgdmFsaWQuIEhlcmUsIHdlIHVzZSBleHBvbmVudGlhbCBhbmQgbG9naXN0aWMgcG9wdWxhdGlvbiBncm93dGggbW9kZWxzIHRvIGV4cGxvcmUgd2hldGhlciB0aGVyZSBpcyByZWFsbHkgYSBzdHJ1Z2dsZSBmb3IgZXhpc3RlbmNlIGluIGNhdmUgbW9sbGllcy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAyLjMuMSBPYnNlcnZhdGlvbiAxOiBQb3B1bGF0aW9ucyBIYXZlIGEgSHVnZSBSZXByb2R1Y3RpdmUgUG90ZW50aWFsDQoNCkV2ZW4gbGFyZ2UgYW5pbWFscyB3aXRoIGxvbmcgZ2VuZXJhdGlvbiB0aW1lcyBoYXZlIGFuIGluY3JlZGlibGUgcmVwcm9kdWN0aXZlIHBvdGVudGlhbC4gQ2F2ZSBtb2xsaWVzLS0tYXMgbWFueSBvdGhlciBjYXZlIG9yZ2FuaXNtcy0tLWhhdmUgYSBjb21wYXJhdGl2ZWx5IGxvdyBmZWN1bmRpdHksIGFuZCBmZW1hbGVzIG9ubHkgZ2l2ZSBiaXJ0aCB0byBvbmUgb3IgdHdvIGZ1bGx5IGRldmVsb3BlZCB5b3VuZyBhdCBhIHRpbWUuIExpZmUgaGlzdG9yeSBhbmFseXNlcyBiYXNlZCBvbiBmZW1hbGUgbG9uZ2V2aXR5IGFuZCBmZWN1bmRpdHkgaGF2ZSByZXZlYWxlZCB0aGF0IHRoZSBhdmVyYWdlIGZlbWFsZSBnaXZlcyBiaXJ0aCB0byBhYm91dCAzIG9mZnNwcmluZyBvdmVyIGhlciBsaWZlOyBub3QgZXhhY3RseSB3aGF0IHlvdSB3b3VsZCBjYWxsIGh1Z2UgcmVwcm9kdWN0aXZlIHBvdGVudGlhbCwgcmlnaHQ/IEJ1dCBpbiByZWFsaXR5LCBpdCBpcyBub3QgdGhlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwgb2YgaW5kaXZpZHVhbHMgdGhhdCBjb3VudHMsIGJ1dCB0aGUgcmVwcm9kdWN0aXZlIHBvdGVudGlhbCBvZiBwb3B1bGF0aW9ucy4gVG8gaWxsdXN0cmF0ZSB0aGlzIHBvaW50LCB3ZSB3YW50IHlvdSB0byBtb2RlbCBwb3B1bGF0aW9uIGdyb3d0aCBmb3IgYSBoeXBvdGhldGljYWwgcG9wdWxhdGlvbiBvZiBjYXZlIG1vbGxpZXMuIFNwZWNpZmljYWxseSwgdXNlIHRoZSBjb2RlIGJlbG93IHRvIHNpbXVsYXRlIGFuZCBncmFwaCB0aGUgcG9wdWxhdGlvbiBncm93dGggb2YgYW4gaW5pdGlhbCBjYXZlIG1vbGx5IHBvcHVsYXRpb24gb2YgMiBpbmRpdmlkdWFscyAodGhlIGluaXRpYWwgY29sb25pemVycyBvZiB0aGUgY2F2ZSkuDQoNCkhvdyBtYW55IGdlbmVyYXRpb25zIHdvdWxkIGl0IHRha2UgZm9yIHRoZSBwb3B1bGF0aW9uIHRvIGdyb3cgdG8gYSBtaWxsaW9uPyBVbmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgbWlnaHQgeW91IHNlZSBwb3B1bGF0aW9uIGdyb3d0aCBsaWtlIHRoaXM/IERvIHlvdSB0aGluayBEYXJ3aW4ncyBvYnNlcnZhdGlvbiB0aGF0ICJzcGVjaWVzIGhhdmUgZ3JlYXQgcG90ZW50aWFsIGZlcnRpbGl0eSIgaG9sZHMgdHJ1ZSBmb3IgY2F2ZSBtb2xsaWVzPw0KDQpgYGB7cn0NCiNDaG9vc2UgYW4gaW5pdGlhbCBwb3B1bGF0aW9uIHNpemUNCk4wID0gMg0KDQojQ2hvb3NlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBvZmZzcHJpbmcNCmIgPSAzDQoNCiNDaG9vc2UgYSByYW5nZSBvZiBnZW5lcmF0aW9ucyB5b3Ugd2FudCB0byBlc3RpbWF0ZSBwb3B1bGF0aW9uIHNpemUgZm9yOyBkZWZhdWx0IGlzIGdlbmVyYXRpb24gMCB0byAxNQ0KdCA9IDA6MTUNCg0KI0NhbGN1bGF0ZSB0aGUgcG9wdWxhdGlvbiBzaXplIGZvciBlYWNoIGdlbmVyYXRpb24NCk4gPSBOMCpiXnQNCg0KI01lcmdlIHRoZSByZXN1bHRzIG9mIHRoZSBzaW11bGF0aW9uIGludG8gYSBzaW5nbGUgdGFibGUNCmZpbmFsLnJlc3VsdHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh0LE4pKQ0KDQojWW91IGNhbiB2aWV3IHRoZSByZXN1bHRzIGJ5IGp1c3QgY2FsbGluZyB0aGUgZGF0YSBmcmFtZQ0KcHJpbnQoZmluYWwucmVzdWx0cykNCg0KI1Bsb3QgdGhlIHJlc3VsdHMsIG1ha2Ugc3VyZSB5b3UgcHJvcGVybHkgbGFiZWwgdGhlIGF4ZXMNCmdncGxvdChmaW5hbC5yZXN1bHRzLCBhZXMoeD10LCB5PU4pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgeGxhYigiR2VuZXJhdGlvbnMiKSArIA0KICB5bGFiKCJQb3B1bGF0aW9uIFNpemUiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQpgYGANCipBcm91bmQgMTIgZ2VuZXJhdGlvbnMqDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMi4zLjIgT2JzZXJ2YXRpb24gMjogTmF0dXJhbCBSZXNvdXJjZXMgYXJlIExpbWl0ZWQNCg0KRXhwb25lbnRpYWwgZ3Jvd3RoIG9ubHkgb2NjdXJzIGluIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcy4gSW4gYSBjYXZlIHRoYXQgaXMgb25seSB0aGUgZnJhY3Rpb24gb2YgdGhlIHNpemUgb2YgYSBmb290YmFsbCBmaWVsZCwgeW91IHdvdWxkIG9idmlvdXNseSBuZXZlciBmaW5kIGEgY2F2ZSBtb2xseSBwb3B1bGF0aW9uIG9mIGEgbWlsbGlvbi4gVGhlIGxvZ2lzdGljIG1vZGVsIG1vcmUgYWNjdXJhdGVseSBkZXNjcmliZXMgcG9wdWxhdGlvbiBncm93dGggaW4gbmF0dXJlLiBCYXNlZCBvbiBvdXIgcGFzdCBhbmFseXNlcywgd2UgZXN0aW1hdGUgdGhlIHBvcHVsYXRpb24gZ3Jvd3RoIGNvZWZmaWNpZW50ICjwnZuMKSB0byBiZSBhcm91bmQgMS4zIGFuZCB0aGUgY2FycnlpbmcgY2FwYWNpdHkgKCpLKikgb2YgdGhlIGNhdmUgYXJvdW5kIDM2MCBpbmRpdmlkdWFscy4NCg0KSG93IGxvbmcgd291bGQgaXQgdGFrZSBmb3IgdGhlIHBvcHVsYXRpb24gdG8gcmVhY2ggdGhlIGNhcnJ5aW5nIGNhcGFjaXR5IGlmIHRoZXJlIHdlcmUgdHdvIGluaXRpYWwgY29sb25pemVycz8gV2hhdCBkbyB5b3UgdGhpbmsgZGV0ZXJtaW5lcyAqSyogZm9yIHRoZSBwb3B1bGF0aW9uIG9mIGNhdmUgbW9sbGllcyBpbiB0aGUgQ3VldmEgTHVuYSBBenVmcmU/DQoNCmBgYHtyfQ0KI0Nob29zZSBhbiBpbml0aWFsIHBvcHVsYXRpb24gc2l6ZQ0KTjAgPSAyDQojQ2hvb3NlIHBvcHVsYXRpb24gZ3Jvd3RoIHJhdGUNCmxhbWRhID0gMS4zDQojQ2hvb3NlIGEgcmFuZ2Ugb2YgZ2VuZXJhdGlvbnMgeW91IHdhbnQgdG8gZXN0aW1hdGUgcG9wdWxhdGlvbiBzaXplIGZvcg0KdCA9IDA6MTUNCiNDaG9vc2UgYSBjYXJyeWluZyBjYXBhY2l0eQ0KSyA9IDM2MA0KI0NhbGN1bGF0ZSB0aGUgcG9wdWxhdGlvbiBzaXplIGZvciBlYWNoIGdlbmVyYXRpb24NCk4gPSAoTjAqSykvKE4wKyhLLU4wKSpleHAoLWxhbWRhKnQpKQ0KI01lcmdlIHRoZSByZXN1bHRzIG9mIHRoZSBzaW11bGF0aW9uIGludG8gYSBzaW5nbGUgdGFibGUNCmZpbmFsLnJlc3VsdHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh0LE4pKQ0KI1VzZSB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIHBsb3QgdGhlIHJlc3VsdHMsIG1ha2Ugc3VyZSB5b3UgcHJvcGVybHkgbGFiZWwgdGhlIGF4ZXMNCmdncGxvdChmaW5hbC5yZXN1bHRzLCBhZXMoeD10LCB5PU4pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgeGxhYigiR2VuZXJhdGlvbnMiKSArIA0KICB5bGFiKCJQb3B1bGF0aW9uIFNpemUiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCipUaGUgcG9wdWxhdGlvbiByZWFjaGVzIGNhcnJ5aW5nIGNhcGFjaXR5IGFmdGVyIGFyb3VuZCA3IGdlbmVyYXRpb25zLiBDYXJyeWluZyBjYXBhY2l0eSBvZiBjYXZlIG1vbGxpZXMgZGVwZW5kcyBvbiBsaW1pdGluZyBmYWN0b3JzIHdpdGhpbiB0aGUgY2F2ZSBsaWtlIGZvb2QgYXZhaWxhYmlsaXR5LCBzcGFjZSwgcHJlZGF0aW9uLCBhbmQgZGlzc29sdmVkIG94eWdlbi4qIA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDIuMy4zIFdoZXJlIERvIEFsbCB0aGUgTWlzc2luZyBPZmZzcHJpbmcgR28/DQoNCkNvbXBhcmUgdGhlIHR3byBtb2RlbHMgKGV4cG9uZW50aWFsIGFuZCBsb2dpc3RpYykgdGhhdCB3ZXJlIHJhbiB3aXRoIHRoZSBzYW1lIGluaXRpYWwgcGFyYW1ldGVycy4gV2hhdCBkbyB0aGUgZGlmZmVyZW50IG91dGNvbWVzIG1lYW4gZm9yIGluZGl2aWR1YWwgb2Zmc3ByaW5nIHRoYXQgYXJlIGJvcm4gaW4gYW55IGdpdmVuIGdlbmVyYXRpb24/IEhvdyBtaWdodCB0aGlzIGRpc2NyZXBhbmN5IGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBldm9sdXRpb24/DQoNCkEgc21hbGxlciBwb3B1bGF0aW9uIHNpemUgbWFrZXMgaXQgbW9yZSBsaWtlbHkgZm9yIGV2b2x1dGlvbmFyeSBjaGFuZ2UgdG8gb2NjdXIuIElmIHRoZXJlIHdhcyBhbiBpbmZpbml0ZSBzcGF3biBvZiB0aGVzZSBmaXNoLCBsaW1pdGluZyBmYWN0b3JzIGFuZCBlbnZpcm9ubWVudGFsIGZhY3RvcnMgd291bGQgYXBwbHkgbm8gZXZvbHV0aW9uYXJ5IGZvcmNlcy4gDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAyLjQgSW5kaXZpZHVhbHMgVmFyeSBpbiBUaGVpciBUcmFpdHMNCg0KQW5vdGhlciBvZiBEYXJ3aW4ncyBrZXkgb2JzZXJ2YXRpb25zIHdhcyBqdXN0IGhvdyB2YXJpYWJsZSBpbmRpdmlkdWFscyBvZiB0aGUgc2FtZSBzcGVjaWVzIGFyZS4gTGV0J3MgZXhwbG9yZSBzb21lIG9mIHRoYXQgdmFyaWF0aW9uIGluIGNhdmUgbW9sbGllcy4gVG8gZG8gdGhhdCwgd2UgZmlyc3QgbmVlZCB0byBsb2FkIHNvbWUgZGF0YSBpbnRvIFIuIFRoZXNlIGRhdGEgd2VyZSBjb2xsZWN0ZWQgYXMgcGFydCBvZiBteSBkaXNzZXJ0YXRpb24gYW5kIGluY2x1ZGUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6IGhhYml0YXQgKGNhdmUgb3Igc3VyZmFjZSksIHNleCAobWFsZSBvciBmZW1hbGUpLCBzdGFuZGFyZCBsZW5ndGggKGluIG1tLCBmcm9tIHRoZSBzbm91dCB0byB0aGUgY2F1ZGFsIGZpbiBiYXNlKSwgZXllIGRpYW1ldGVyIChpbiBtbSksIGhlYWQgbGVuZ3RoIChpbiBtbSksIGhlYWQgd2lkdGggKGluIG1tKSwgcHJlZG9yc2FsIGxlbmd0aCAoaW4gbW0sIGZyb20gdGhlIHNub3V0IHRvIHRoZSBpbnNlcnRpb24gb2YgdGhlIGRvcnNhbCBmaW4pLCBhbmQgZ2FwZSB3aWR0aCAoaW4gbW0sIGZyb20gb25lIGNvcm5lciBvZiB0aGUgbW91dGggdG8gdGhlIG90aGVyKS4NCg0KYGBge3J9DQojVXNlIHRoZSByZWFkLmNzdiBmdW5jdGlvbiB0byBpbXBvcnQgYSBkYXRhc2V0OyB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgb25jZSB5b3UgaW1wb3J0ZWQgdGhlIGZpbGUhDQptb3JwaC5kYXRhIDwtIHJlYWQuY3N2KCJtb3JwaG9sb2dpY2FsX3ZhcmlhdGlvbi5jc3YiLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgtQk9NJykNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDIuNC4xIENvbXBhcmluZyBCb2R5IFNpemUgVmFyaWF0aW9uIFdpdGhpbiBhbmQgQmV0d2VlbiBQb3B1bGF0aW9ucw0KDQpBIHNpbXBsZSB3YXkgdG8gY29tcGFyZSB2YXJpYXRpb24gd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zIGlzIHRvIHBsb3QgYSBmcmVxdWVuY3kgaGlzdG9ncmFtICh3aGljaCByZXByZXNlbnRzIHRoZSByYXcgY291bnRzKSBhbG9uZyB3aXRoIGEgZGVuc2l0eSBwbG90ICh3aGljaCByZXByZXNlbnRzIHRoZSBhcHByb3hpbWF0ZWQgc3RhdGlzdGljYWwgZGlzdHJpYnV0aW9uKS4gWW91IGNhbiBnZW5lcmF0ZSBhIGhpc3RvZ3JhbSB3aXRoIHRoZSBgZ2VvbV9oaXN0b2dyYW0oKWAgZnVuY3Rpb24gYW5kIGRlc2lnbmF0ZSBhbnkgdHJhaXQgeW91IG1heSB3YW50IGFzIHRoZSB4IGF4aXMuIFlvdSBjYW4gY2FsY3VsYXRlIHRoZSBkZW5zaXR5IHdpdGggYGFlcyh5PS4uZGVuc2l0eS4uKWAgd2l0aGluIGBnZW9tX2hpc3RvZ3JhbSgpYCBhbmQgdGhlbiBwbG90IGl0IHdpdGggYGdlb21fZGVuc2l0eSgpYC4gTm90ZSB0aGF0IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIHR3byBncm91cHMgKGluIG91ciBjYXNlIHdlIGhhdmUgc2FtcGxlcyBmcm9tIGEgY2F2ZSBhbmQgYSBzdXJmYWNlIHBvcHVsYXRpb24pLCB5b3UgY2FuIHZpc3VhbGl6ZSB0aGVtIHNlcGFyYXRlbHkgYnkgZGVzaWduYXRpbmcgYSBkaWZmZXJlbnQgY29sb3IgZm9yIGVhY2ggZ3JvdXAgaW4gdGhlIGFlc3RoZXRpY3MgKGBmaWxsPUhhYml0YXRgKS4NCg0KV2hlbiB5b3UgdmlzdWFsaXplIGJvZHkgc2l6ZSB2YXJpYXRpb24gaW4gdGhpcyBtYW5uZXIgd2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSXMgdGhlcmUgbW9yZSB2YXJpYXRpb24gd2l0aGluIG9yIGJldHdlZW4gcG9wdWxhdGlvbnM/DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQojVXNlIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gdG8gZ3JhcGggdGhlIGhpc3RvZ3JhbSAoc2VlOiBodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL3dpa2kvZ2dwbG90Mi1oaXN0b2dyYW0tcGxvdC1xdWljay1zdGFydC1ndWlkZS1yLXNvZnR3YXJlLWFuZC1kYXRhLXZpc3VhbGl6YXRpb24pDQpnZ3Bsb3QobW9ycGguZGF0YSwgYWVzKHg9U3RhbmRhcmQubGVuZ3RoLCBmaWxsPUhhYml0YXQpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLikpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuNSkrDQogIHhsYWIoInN0YW5kYXJkIGxlbmd0aCIpICsgDQogIHlsYWIoImRlbnNpdHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoqVGhlIHN1cmZhY2UgcG9wdWxhdGlvbiBhcHBlYXJzIHRvIGhhdmUgbW9yZSB2YXJpYXRpb24gaW4gbGVuZ3RoIHRoYW4gdGVoIGNhdmUgZmlzaC4gVGhlIG1vZGVzIG9mIGxlbmd0aCBzZWVtIHNpbWlsYXIgYmV0d2VlbiBoYWJpdGF0cy4gQ2F2ZSBzcGVjaWVzIGFyZSBtb3JlIGFidW5kYW50IGF0IHNtYWxsZXIgbGVuZ3RocyB0aGFuIHN1cmZhY2Ugc3BlY2llcy4qDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAyLjQuMiBDb21wYXJpbmcgUHJlZG9yc2FsIExlbmd0aCBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zDQoNCkxldCdzIGFsc28gY29tcGFyZSBhIHNlY29uZCB0cmFpdCwgcHJlZG9yc2FsIGxlbmd0aC4gV2l0aCB0aGUgcHJldmlvdXMgZ3JhcGggeW91IGhvcGVmdWxseSBzYXcgaG93IHZhcmlhYmxlIG92ZXJhbGwgYm9keSBzaXplIGlzIHdpdGhpbiBwb3B1bGF0aW9ucy4gSWYgd2Ugd2FudCB0byBjb21wYXJlIG90aGVyIHRyYWl0cywgd2UgaGF2ZSB0byBhY2NvdW50IGZvciB0aGF0LiBXZSB3YW50IHRvIGtub3cgd2hldGhlciB2YXJpYXRpb24gaW4gcHJlZG9yc2FsIGxlbmd0aCBpcyBkdWUgdG8gdmFyaWF0aW9uIGluIHNpemUgKHNtYWxsIGZpc2ggaGF2ZSBzbWFsbCBwcmVkb3JzYWwgbGVuZ3Rocykgb3Igd2hldGhlciBvdGhlciBwYXR0ZXJucyBtaWdodCBiZSBhdCBwbGF5LiBUbyBkbyBzbywgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgcmVzaWR1YWwgcHJlZG9yc2FsIGxlbmd0aCBhcyBmcm9tIGEgcmVncmVzc2lvbiBiZXR3ZWVuIHByZWRvcnNhbCBhbmQgc3RhbmRhcmQgbGVuZ3RoIHVzaW5nIHRoZSBgbG0oeSB+IHgsIGRhdGEpYCBhbmQgYHJlc2lkdWFscygpYCBmdW5jdGlvbnM6DQoNCmBgYHtyfQ0KI0NhbGN1bGF0aW5nIHJlZ3Jlc3Npb24gbGluZQ0KZml0MSA8LSBsbShQcmVkb3JzYWwubGVuZ3RoIH4gU3RhbmRhcmQubGVuZ3RoLCBkYXRhID0gbW9ycGguZGF0YSkNCg0KI0V4dHJhY3QgcmVzaWR1YWxzIGFuZCBjcmVhdGUgYSBuZXcgdmFyaWFibGUgcmVzLnByZWRvcnNhbCBpbiB0aGUgbW9ycGguZGF0YSBkYXRhIGZyYW1lDQptb3JwaC5kYXRhJHJlcy5wcmVkb3JzYWwgPC0gcmVzaWR1YWxzKGZpdDEpDQpgYGANCg0KWW91IGNhbiB0aGVuIHVzZSB0aGUgbmV3IHZhcmlhYmxlIHRvIHBsb3QgdGhlIHJlc2lkdWFsIHByZWRvcnNhbCBsZW5ndGgsIHdoaWNoIGlzIGNvcnJlY3RlZCBmb3IgYm9keSBzaXplOg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KIyNVc2UgdGhlIGdncGxvdCBmdW5jdGlvbiB0byBncmFwaCB0aGUgaGlzdG9ncmFtIGFuZCBjb2xvciBkYXRhIGJhc2VkIG9uIGhhYml0YXQNCmdncGxvdChtb3JwaC5kYXRhLCBhZXMoeD1yZXMucHJlZG9yc2FsLCBmaWxsPUhhYml0YXQpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGE9MC41KSsNCiAgeGxhYigiUHJlLWRvcnNhbCBsZW5ndGggKGNvcnJlY3RlZCBmb3IgYm9keSBzaXplKSIpICsgDQogIHlsYWIoIkRlbnNpdHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCldoZW4geW91IHBsb3QgcmVsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCwgd2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSG93IGRvZXMgdmFyaWF0aW9uIGluIHByZWRvcnNhbCBsZW5ndGggdmFyeSB3aXRoaW4gYW5kIGJldHdlZW4gcG9wdWxhdGlvbnMsIGFuZCBob3cgZG9lcyBpdCBjb21wYXJlIHRvIHZhcmlhdGlvbiBpbiBzdGFuZGFyZCBsZW5ndGg/DQoNCipUaGUgdmFyaWF0aW9ucyBhbW9uZyBjYXZlIGFuZCBzdXJmYWNlIGFyZSB2ZXJ5IHNpbWlsYXIgYWNjb3JkaW5nIHRvIHRoZSBoaXN0b2dyYW0uIFRoZXJlIGlzIGEgZmFpcmx5IHVuaWZvcm0gZGlzdHJpYnV0aW9ucyBmb3IgYm90aCBwb3B1bGF0aW9ucywgdW5saWtlIHRoZSB2YXJpYXRpb24gaW4gc3RhbmRhcmQgbGVuZ3RoLioNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgMi40LjMgQ29tcGFyaW5nIEV5ZSBTaXplIFZhcmlhdGlvbiBXaXRoaW4gYW5kIEJldHdlZW4gUG9wdWxhdGlvbnMNCg0KVXNpbmcgdGhlIHNhbWUgYXBwcm9hY2ggYXMgZm9yIHByZWRvcnNhbCB2YXJpYXRpb24sIGNvbXBhcmUgdmFyaWF0aW9uIGluIHJlbGF0aXZlIGV5ZSBkaWFtZXRlcjoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCiNZb3VyIGNvZGUgZ29lcyBoZXJlDQpmaXQxIDwtIGxtKEV5ZS5kaWFtZXRlciB+IFN0YW5kYXJkLmxlbmd0aCwgZGF0YSA9IG1vcnBoLmRhdGEpDQoNCiNFeHRyYWN0IHJlc2lkdWFscyBhbmQgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHJlcy5wcmVkb3JzYWwgaW4gdGhlIG1vcnBoLmRhdGEgZGF0YSBmcmFtZQ0KbW9ycGguZGF0YSRyZXMuZXllPC0gcmVzaWR1YWxzKGZpdDEpDQoNCiMjVXNlIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gdG8gZ3JhcGggdGhlIGhpc3RvZ3JhbSBhbmQgY29sb3IgZGF0YSBiYXNlZCBvbiBoYWJpdGF0DQpnZ3Bsb3QobW9ycGguZGF0YSwgYWVzKHg9cmVzLmV5ZSwgZmlsbD1IYWJpdGF0KSkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLikpICsgZ2VvbV9kZW5zaXR5KGFscGhhPTAuNSkrIHhsYWIoIlJlbGF0aXZlIEV5ZSBEaWFtZXRlciAoY29ycmVjdGVkIGZvciBib2R5IHNpemUpIikNCmBgYA0KDQpXaGF0IGRvIHlvdSBvYnNlcnZlPyBIb3cgZG9lcyB2YXJpYXRpb24gaW4gZXllIGRpYW1ldGVyIHZhcnkgd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zLCBhbmQgaG93IGRvZXMgaXQgY29tcGFyZSB0byB2YXJpYXRpb24gaW4gdGhlIG90aGVyIHRyYWl0cz8NCg0KKlVubGlrZSB0aGUgb3RoZXIgaGlzdG9ncmFtcywgdGhlIHZhcmlhdGlvbiBpbiBFeWUgZGlhbWV0ZXIgaXMgbW9yZSBkZXBlbmRlbnQgb24gaGFiaXRhdC4gVGhlIENhdmUgaGFiaXRhdCBpcyBkaXN0cmlidXRlZCB0byB0aGUgbGVmdCwgd2l0aCBhIGdlbmVyYWxseSBzbWFsbGVyIGV5ZSBkaWFtZXRlci4qICANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDIuNSBWYXJpYXRpb24gaW4gVHJhaXRzIGlzIEhlcml0YWJsZQ0KDQpBbiBhdmlkIGJyZWVkZXIgb2YgZmFuY3kgcGlnZW9ucywgRGFyd2luIG9ic2VydmVkIHRoYXQgc3BlY2lmaWMgdHJhaXRzIGFyZSBwYXNzZWQgZnJvbSBwYXJlbnRzIHRvIG9mZnNwcmluZywgZXZlbiB0aG91Z2ggaGUgaGFkIG5vIGNsdWUgaG93IHRoaXMgbWlnaHQgYWN0dWFsbHkgd29yayAoZ2VuZXRpY3Mgd2FzIG5vdCByZWFsbHkgYSB0aGluZyB5ZXQpLiBFdmVuIHdpdGhvdXQgYW4gYWJpbGl0eSB0byBjb25kdWN0IG1vbGVjdWxhciBnZW5ldGljIGFuYWx5c2VzLCB3ZSBjYW4gZXN0aW1hdGUgaGVyaXRhYmlsaXR5IG9mIHRyYWl0cyBieSBjb21wYXJpbmcgdGhlIHRyYWl0cyBvZiBvZmZzcHJpbmcgdG8gdGhlIHRyYWl0cyBvZiB0aGUgcGFyZW50cy4NCg0KTGV0J3MgbG9hZCBzb21lIGRhdGEgdGhhdCBjb21wYXJlcyBwYXJlbnQgYW5kIG9mZnNwcmluZyB0cmFpdHMgaW4gY2F2ZSBtb2xsaWVzLiBUbyBkbyB0aGlzLCB3ZSBicm91Z2h0IGNhdmUgbW9sbGllcyBpbnRvIHRoZSBsYWIgYW5kIGJyZWQgdGhlbSB1bmRlciBzdGFuZGFyZGl6ZWQgY29uZGl0aW9ucy4gRGF0YSByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgdHJhaXQgdmFsdWVzIG9mIHRoZSBtb3RoZXIgYW5kIGZhdGhlciBhbmQgb2YgYWxsIG9mZnNwcmluZyBmcm9tIGEgc3BlY2lmaWMgYnJvb2QuIFRoZSBlYXNpZXN0IHdheSB0byBjb21wYXJlIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyBpcyB0aHJvdWdoIGEgc2NhdHRlciBwbG90LCB3aGljaCB3ZSBhbHJlYWR5IHVzZWQgaW4gRXhlcmNpc2UgMS4gSWYgYSB0cmFpdCBpcyBoZXJpdGFibGUsIHdlIHdvdWxkIGV4cGVjdCB0byBzZWUgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyAoZS5nLiwgcGFyZW50cyB3aXRoIHNtYWxsIGV5ZXMgc2hvdWxkIGhhdmUgb2Zmc3ByaW5nIHdpdGggc21hbGwgZXllcykuDQoNClRoZSBmb2xsb3dpbmcgZGF0YXNldCBpbmNsdWRlcyBtZWFzdXJlbWVudHMgb2YgcGFyZW50YWwgYW5kIG9mZnNwcmluZyBzdGFuZGFyZCBsZW5ndGggYXMgd2VsbCBhcyBleWUgc2l6ZS4NCg0KYGBge3J9DQojVXNlIHRoZSByZWFkLmNzdiBmdW5jdGlvbiB0byBpbXBvcnQgYSBkYXRhc2V0OyB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgb25jZSB5b3UgaW1wb3J0ZWQgdGhlIGZpbGUhDQpoZXJpdGFiaWxpdHkgPC0gcmVhZC5jc3YoImhlcml0YWJpbGl0eS5jc3YiLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgtQk9NJykNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIDIuNS4xLiBIZXJpdGFiaWxpdHkgb2YgU3RhbmRhcmQgTGVuZ3RoDQoNCkZpcnN0LCBsZXQgdXMgZXhwbG9yZSB3aGV0aGVyIHRoZXJlIGlzIGV2aWRlbmNlIGZvciBoZXJpdGFiaWxpdHkgaW4gc3RhbmRhcmQgbGVuZ3RoLg0KDQpXaGF0IGRvIHlvdSBvYnNlcnZlPyBJcyBzdGFuZGFyZCBsZW5ndGggYSBoZXJpdGFibGUgdHJhaXQ/DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQpnZ3Bsb3QoaGVyaXRhYmlsaXR5LCBhZXMoeD1wYXJlbnQuc3RhbmRhcmQubGVuZ3RoLCB5PW9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgpKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKw0KICB4bGFiKCJQYXJlbnQgU2l6ZSIpICsgDQogIHlsYWIoIk9mZnNwcmluZyBTaXplIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQoqVGhlcmUgaXMgbm8gciB2YWx1ZSwgc28gdGhpcyBkb2VzIG5vdCB0ZWxsIG1lIGEgd2hvbGUgbG90LiBJZiB0aGVyZSB3YXMgYW4gciB2YWx1ZSBJIHdvdWxkIGFzc3VtZSBpdCB0byBiZSB2ZXJ5IGxvdywgYmVjYXVzZSB0aGlzIGdyYXBoIGRlbW9uc3RyYXRlcyBhIGxvdyBzdHJlbmd0aCBpbiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBhcmVudCBzaXplIGFuZCBvZmZzcHJpbmcgc2l6ZS4gQmFzZWQgb2ZmIHRoaXMgdmlzdWFsLCBJIHdvdWxkIHN1Z2dlc3QgdGhhdCBzdGFuZGFyZCBsZW5ndGggaXMgbm90IGhlcml0YWJsZSwgb3IgbW9yZSBsaWtlbHkgdGhlcmUgYXJlIG1hbnkgZmFjdG9ycyB0aGF0IGNvbnRyaWJ1dGUgdG8gaXQuKg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAyLjUuMiBIZXJpdGFiaWxpdHkgb2YgRXllIFNpemUNCg0KTm93IGxldCB1cyBleHBsb3JlIHdoZXRoZXIgdGhlcmUgaXMgYW55IGhlcml0YWJpbGl0eSBpbiBleWUgc2l6ZS4gUmVtZW1iZXIsIHRoZXJlIGlzIHN1YnN0YW50aWFsIHZhcmlhdGlvbiBpbiBib2R5IHNpemUsIGFuZCBpbiBzdWNoIGNhc2VzLCB3ZSB3YW50IHRvIGNvbnRyb2wgZm9yIGJvZHkgc2l6ZSBieSBjYWxjdWxhdGluZyByZXNpZHVhbCBleWUgc2l6ZSBmaXJzdC4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCiMjQ2FsY3VsYXRlIHJlc2lkdWFsIGV5ZSBzaXplcyBmb3IgdGhlIHBhcmVudHMgYW5kIHRoZSBvZmZzcHJpbmcNCiNZb3VyIGNvZGUgZ29lcyBoZXJlOg0KZml0MSA8LSBsbShwYXJlbnQuZXllLnNpemUgfiBwYXJlbnQuc3RhbmRhcmQubGVuZ3RoLCBkYXRhID0gaGVyaXRhYmlsaXR5KQ0KI2V4dHJhY3QNCmhlcml0YWJpbGl0eSRyZXMucGFyZW50LmV5ZSA8LXJlc2lkdWFscyhmaXQxKQ0KZml0MSA8LWxtKG9mZnNwcmluZy5leWUuc2l6ZSB+IG9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgsIGRhdGEgPSBoZXJpdGFiaWxpdHkpDQpoZXJpdGFiaWxpdHkkcmVzLm9mZnNwcmluZy5leWUgPC0gcmVzaWR1YWxzKGZpdDEpDQoNCiNQbG90IHRoZSByZXN1bHRzDQpnZ3Bsb3QoaGVyaXRhYmlsaXR5LCBhZXMoeD1yZXMucGFyZW50LmV5ZSwgeT1yZXMub2Zmc3ByaW5nLmV5ZSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIHhsYWIoIlBhcmVudCBSZWxhdGl2ZSBFeWUgRGlhbWV0ZXIgKENvcnJlY3RlZCBmb3IgQm9keSBTaXplKSIpICsgDQogIHlsYWIoIk9mZnNwcmluZyBSZWxhdGl2ZSBFeWUgRGlhbWV0ZXIgKENvcnJlY3JlZCBmb3IgQm9keSBTaXplKSIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KV2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSXMgc3RhbmRhcmQgbGVuZ3RoIGEgaGVyaXRhYmxlIHRyYWl0PyAjaXMgdGhpcyBhIHR5cG8/DQoNCipUaGVzZSB0d28gdmFsdWVzIHNlZW0gdG8gaGF2ZSBhIHN0cm9uZyBwb3NpdGl2ZSBjb3JyZWxhdGlvbi4gSSB3b3VsZCBvYnNlcnZlIHRoYXQgZXllIHNpemUgaXMgaGVyaXRhYmxlLioNCg0KKkkgYW0gbm90IHN1cmUgaWYgSSBkaWQgdGhpcyBzZWN0aW9uIGNvcnJlY3RseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb3Blcmx5IGFuc3dlciB0aGUgcXVlc3Rpb25zIGFib3ZlIG9yIGJlbG93LCBzbyBoZXJlIGlzIGFub3RoZXIgZ3JhcGggc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwIG9mIHNpemUgYWNjb3VudGluZyBmb3IgZXllIHNpemUgd2hpY2ggSSBhbHNvIGRvIG5vdCBrbm93IGlmIHRoYXQgbWFrZXMgc2Vuc2UuKg0KYGBge3J9DQojI0NhbGN1bGF0ZSByZXNpZHVhbCBleWUgc2l6ZXMgZm9yIHRoZSBwYXJlbnRzIGFuZCB0aGUgb2Zmc3ByaW5nDQojWW91ciBjb2RlIGdvZXMgaGVyZToNCmZpdDEgPC0gbG0ocGFyZW50LnN0YW5kYXJkLmxlbmd0aCB+IHBhcmVudC5leWUuc2l6ZSwgZGF0YSA9IGhlcml0YWJpbGl0eSkNCiNleHRyYWN0DQpoZXJpdGFiaWxpdHkkcmVzLnBhcmVudC5zdGFuZGFyZC5sZW5ndGggPC1yZXNpZHVhbHMoZml0MSkNCmZpdDEgPC1sbShvZmZzcHJpbmcuc3RhbmRhcmQubGVuZ3RoIH4gb2Zmc3ByaW5nLmV5ZS5zaXplLCBkYXRhID0gaGVyaXRhYmlsaXR5KQ0KaGVyaXRhYmlsaXR5JHJlcy5vZmZzcHJpbmcuc3RhbmRhcmQubGVuZ3RoIDwtIHJlc2lkdWFscyhmaXQxKQ0KDQojUGxvdCB0aGUgcmVzdWx0cw0KZ2dwbG90KGhlcml0YWJpbGl0eSwgYWVzKHg9cmVzLnBhcmVudC5zdGFuZGFyZC5sZW5ndGgsIHk9cmVzLm9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgpKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKw0KICB4bGFiKCJQYXJlbnQgUmVsYXRpdmUgQm9keSBTaXplIChDb3JyZWN0ZWQgZm9yIEV5ZSBTaXplKSIpICsgDQogIHlsYWIoIk9mZnNwcmluZyBSZWxhdGl2ZSBCb2R5IFNpemUgKENvcnJlY3JlZCBmb3IgRXllIFNpemUpIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KKlRoaXMgaXMgaW50ZXJlc3RpbmcuIEkgd291bGQgbm90IHRoaW5rIGFzIGV5ZSBzaXplIGFzIHNvbWV0aGluZyB0aGF0IG1heSBleHBsYWluIGJvZHkgc2l6ZS4gQnV0IHRoaXMgY29ycmVsYXRpb24gZG9lcyBhcHBlYXIgbXVjaCBtb3JlIHN0cm9uZyBhbmQgcG9zaXRpdmUgYWNjb3VudGluZyBmb3IgZXllIHNpemUuKg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgMi42IFdoYXQgV291bGQgSGFwcGVuIElmLi4uPw0KDQpJbWFnaW5lIGZvciBhIG1vbWVudCB0aGF0IHNtYWxsZXIgZmlzaCBoYXZlIGEgaGlnaGVyIGxpa2VsaWhvb2Qgb2Ygc3Vydml2YWwgaW4gdGhlIGNhdmUuIFdvdWxkIHlvdSBleHBlY3QgZXZvbHV0aW9uIG9mIGJvZHkgc2l6ZSB1cG9uIGNhdmUgY29sb25pemF0aW9uPw0KDQpJbWFnaW5lIGZvciBhIG1vbWVudCB0aGF0IGZpc2ggd2l0aCBzbWFsbGVyIGV5ZXMgaGF2ZSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHN1cnZpdmFsIGluIHRoZSBjYXZlLiBXb3VsZCB5b3UgZXhwZWN0IGV2b2x1dGlvbiBvZiBleWUgc2l6ZSB1cG9uIGNhdmUgY29sb25pemF0aW9uPyBKdXN0aWZ5IHlvdXIgcmVzcG9uc2UuDQoNClllcywgaWYgc3Vydml2YWwgaXMgaW5jcmVhc2VkIHdpdGggc21hbGxlciBib2R5IHNpemUsIHRoZW4gcmVwcm9kdWN0aXZlIHBvd2VyIHdvdWxkIGFsc28gaW5jcmVhc2UsIGxlYWRpbmcgdG8gZXZvbHV0aW9uYXJ5IGNoYW5nZSBvdmVyIGEgbG9uZyBwZXJpb2Qgb2YgdGltZS4gU2ltaWxhcmx5LCBpZiBzbWFsbGVyIGV5ZWQgZmlzaCBoYXZlIGEgc3Vydml2YWwgYWR2YW50YWdlIHRoZW4gSSB3b3VsZCBleHBlY3QgdGhpcyB0cmFpdCB0byBncm93IGluIHRoZSBzcGVjaWVzLiBUaGlzIGlzIGJlY2F1c2UgbXkgYW5hbHlzaXMgaGFzIHNob3duIHRoYXQgYm90aCBjaGFyYWN0ZXJpc3RpY3MgaGF2ZSBhIHN0cm9uZyBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBtZWFuaW5nIHRoYXQgdGhleSBhcmUgbGlrZWx5IGhlcml0YWJsZS4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIDMuIFJlc291cmNlcw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgMy4xIERhdGEgUmVmZXJlbmNlcw0KDQpUaGlzIHR1dG9yaWFsIHdhcyBhZGFwdGVkIGZyb20gYW4gb3Blbi1zb3VyY2UgdGV4dGJvb2sgdGhhdCB0ZWFjaGVzIEV2b2x1dGlvbiBpbiBSOg0KDQotICAgVG9ibGVyLCBNICgyMDIzKSBbQSBQcmltZXIgb2YgRXZvbHV0aW9uOiBBbiBJbnRyb2R1Y3Rpb24gdG8gRXZvbHV0aW9uYXJ5IFRob3VnaHQ6IFRoZW9yeSwgRXZpZGVuY2UsIGFuZCBQcmFjdGljZV0oaHR0cHM6Ly9taWNoaXRvYmxlci5naXRodWIuaW8vcHJpbWVyLW9mLWV2b2x1dGlvbi9pbmRleC5odG1sKQ0KDQpEYXRhIG9uIGJlYWsgc2l6ZSB2YXJpYXRpb24gaW4gRGFyd2luJ3MgZmluY2hlcyBjYW1lIGZyb20gdGhlIGZvbGxvd2luZyBwdWJsaWNhdGlvbjoNCg0KLSAgIEdyYW50LCBQUiAmIEJSIEdyYW50LiAyMDAyLiBbVW5wcmVkaWN0YWJsZSBldm9sdXRpb24gaW4gYSAzMC15ZWFyIHN0dWR5IG9mIERhcndpbidzIGZpbmNoZXNdKGh0dHBzOi8vc2NpZW5jZS5zY2llbmNlbWFnLm9yZy9jb250ZW50LzI5Ni81NTY4LzcwNykuICpTY2llbmNlKiAyOTYsIDcwNy03MTEuDQoNClRoZSBleWUgc2l6ZSBkYXRhIHdhcyBwdWJsaXNoZWQgaW4gdGhlIGZvbGxvd2luZyBwYXBlci4gT3RoZXIgbWVhc3VyZW1lbnRzIGFyZSB1bnB1Ymxpc2hlZCBkYXRhIGJ5IE0uIFRvYmxlci4NCg0KLSAgIE1jR293YW4sIEsuIEwuLCBDLiBOLiBQYXNzb3csIEwuIEFyaWFzIFJvZHJpZ3VleiwgTS4gVG9ibGVyICYgSi4gTC4gS2VsbGV5ICgyMDE5KTogW0V4cHJlc3Npb24gYW5hbHlzZXMgb2YgY2F2ZSBtb2xsaWVzICgqUG9lY2lsaWEgbWV4aWNhbmEqKSByZXZlYWwga2V5IGdlbmVzIGludm9sdmVkIGluIHRoZSBlYXJseSBldm9sdXRpb24gb2YgZXllIHJlZ3Jlc3Npb25dKGh0dHBzOi8vcm95YWxzb2NpZXR5cHVibGlzaGluZy5vcmcvZG9pLzEwLjEwOTgvcnNibC4yMDE5LjA1NTQpLiAqQmlvbG9neSBMZXR0ZXJzKiAxNSAoMTApOiAyMDE5MDU1NC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDMuMiBSZXNvdXJjZXMgWW91IENvbnN1bHRlZA0KDQpDb25zdWx0aW5nIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRvIHNvbHZlIHRoaXMgYXNzaWdubWVudCBpcyBhYnNvbHV0ZWx5IGFsbG93ZWQsIGJ1dCBmYWlsdXJlIHRvIGRpc2Nsb3NlIHRob3NlIHJlc291cmNlcyBpcyBwbGFnaWFyaXNtLiBQbGVhc2UgbGlzdCBhbnkgY29sbGFib3JhdG9ycyB5b3Ugd29ya2VkIHdpdGggYW5kIHJlc291cmNlcyB5b3UgdXNlZCBiZWxvdyBvciBzdGF0ZSB0aGF0IHlvdSBoYXZlIG5vdCB1c2VkIGFueS4NCg0KKkkgZGlkIG5vdCB1c2UgYW55IGFsdGVybmF0aXZlIHJlc291cmNlcy4q