Nathan Stewart 811847789

1. Initiate the Project

Remember to re-run this code every time you re-open this R Notebook.

#Set working directory
set_wd <- function() {
  library(rstudioapi)
  current_path <- getActiveDocumentContext()$path 
  setwd(dirname(current_path ))
  print( getwd() )
}
set_wd()
[1] "C:/Users/natha/OneDrive/Documents/KSU stuff/KSU 2020/Evolution"
#Load libraries
library(ggplot2)

1.1. Some Advice Before Getting Started

In this exercise you will conduct a number of simple calculations. R recognized all basic mathematical function for addition/substraction (+, -), multiplication/division (*, /), and exponents/logarithms (^, log10). Also, R can use these functions using basic algebra, as long as you first define symbols numercially first. So, you can solve the the multiplication of 11 and 13 in two ways:

Specific solution:

11*13
[1] 143

General solution:

x <- 11
y <- 13
x*y
[1] 143

Note that the general solution seems more cumbersome at first. However, it allows you to write some complex code that processes data, and if you want to do the same thing with different data, you don’t have to rewrite the code, you just redefine the input variables.

2. A Null Model of Evolution: the Hardy-Weinberg Principle

The Hardy–Weinberg principle states that allele and genotype frequencies in a population will remain constant from generation to generation in the absence of evolutionary influences. Evolutionary influences include genetic drift, natural selection, mutation, and migration. In the simplest case of a single locus with two alleles denoted A and a with frequencies f(A) = p and f(a) = q, respectively, the expected genotype frequencies under random mating are f(AA) = p^2 for the AA homozygotes, f(aa) = q^2 for the aa homozygotes, and f(Aa) = 2pq for the heterozygotes (see figure below for the modified Punnett square). Note that p^2 + 2pq + q^2 always equals 1, just as p + q equals 1 at biallelic loci. In the absence of selection, mutation, genetic drift, or other evolutionary forces, allele frequencies p and q are constant between generations, so equilibrium is reached.

The power of the principle is that it allows for a simple test of whether evolutionary influences are acting on a specific locus. We can go out into natural populations, measure genotype frequencies and infer allele frequencies from that. In the absence of any evolutionary forces, the measured genotype frequencies should be equal to the idealized genotype frequencies predicted by the Hardy-Weinberg principle. If measured and predicted and idealized genotype frequencies do not match, the population is in Hardy-Weinberg disequilibrium and some evolutionary force must be acting on that particular locus, causing some genotypes to be over or underrepresented.

3. Calculating Idealized Genotype Frequencies

Before we apply the Hardy-Weinberg principle in practice, we should think more clearly about the theoretical predictions. For any given allele frequency of p at a biallelic locus, there is a clear mathematical prediction of what the genotype frequencies should be. Here, you will explore the relationship between p and the frequency of all genotypes.

3.1. Basic Calculations

Imagine a locus with two alleles, A (with frequency p) and a (with frequency q). In this section you will calculate the frequency of genotypes for values of p between 0 and 1.

#Make a table with the allele frequency of A (p) between 0 and 1 (in 0.01-step increments) using the seq command
data <- as.data.frame(seq(0, 1, by = 0.01))

#Add column name
colnames(data) <- "p"

#Calculate alternate allele frequency (q)
data$q <- 1-data$p

#Calculate the theoretical frequencies for genotypes AA, Aa, and aa
data$AA <- data$p^2
data$Aa <- 2*data$p*data$q
data$aa <- data$q^2

#Calculate the total allele frequency (sum of all genotype frequencies)
data$total <- (data$p^2)+(2*data$p*data$q)+(data$q^2)

#write results into a table
#Show table
data

3.2. Visualizing Genotype Frequencies

Just to practice our visualization skills, let’s use ggplot to visualize these data using a line graph (geom_line) with p on the x axis and the genotype frequencies on the y axis. You can plot the values for AA, Aa, aa, and the sum of all three into a single plot.

#Visualize the possible allele frequencies as a function of p
#Note that you can add additional elements (lines) by just adding additional geoms, with the aesthetics specified within the brackets
ggplot(data, aes(x=p, y=AA)) +
  geom_line() +
  geom_line(aes(x=p, y=Aa), color="blue") +
  geom_line(aes(x=p, y=aa), color="red") +
  geom_line(aes(x=p, y=total), color="purple") +
  xlab("p (allele frequency)") +
  ylab("genotype frequency") +
  theme_classic()

In your own words, can you explain the Hardy-Weinberg principle and why the sum of all genotypes always equals 1?

The Hardy-Weinberg principle states that variation in a population is constant unless it is disturbed by things such as mutations. Mutations disrupt the equilibrium by introducing new alleles. Other factors that can disrupt the equilibrium would be natural selection and genetic drift. The sum of all genotypes will always equal 1 because 1 is including the whole population, and this means there can’t be more or less.

4. Testing for HW Equilibrium

4.1. Variation in Eye Color

Fruit flies of the genus Drosophila are a workhorse for genetic and evolutionary studies. A frequently studied trait is the eye color polymorphism some populations exhibit. Wild-type flies have a bright red eye coloration. A mutation in a single gene controlling the expression of eye color, however, can turn the eyes white. The allele causing the white-eye phenotype (we call it e) is recessive, therefore the wild-type allele (we call it E) is dominant.

You collected 1000 flies in a natural population and bring your samples back to the laboratory for genotyping. You find that 720 flies are homozygous for the E allele, 120 flies are homozygous for the e allele, and 160 are heterozygous.

What are the relative frequencies (f) of each genotype in the population?

#Calculate observed genotype frequencies based on the results
f_EE = 720
f_Ee = 160
f_ee = 120

#Write results into a table
#Make a list of possible genotypes
genotype <- c("EE", "Ee", "ee")

#Make a list of observed genotype frequencies
f_observed <- c(f_EE, f_Ee, f_ee)

#Merge the two lists into a table
results1 <- data.frame(genotype, f_observed)
results1

Based on the measured genotype frequencies, you can calculate allele frequencies for E and e (hint: flies are diploid):

#Calculate allele frequency for E (p) and e (q) based on observed genotype frequencies
p = ((2*720)+160)/2000
q = ((2*120)+160)/2000

Based on the allele frequencies, we can apply the HW principle and calculate idealized genotype frequencies:

#Calculate idealized (i.e., theoretically predicted) genotype frequencies based on allele frequencies
f_EEi = p^2
f_Eei = 2*p*q
f_eei = q^2

#Make a list of idealized genotype frequencies
f_idealized <- c(f_EEi, f_Eei, f_eei)

#Add list to the results table
results2 <- cbind(results1, f_idealized)
results2

What do you observe? Is the population in HW equilibrium? If it is not, what could explain the difference between the observed and the predicted genotype frequencies?

The population is not in equilibrium, as the idealized has different ratios than the observed. This could be due to many factors, but any outside influence, genetic drift, or mutations can cause the equilibrium to be off. In this sampling, it could be possible that the sample flies collected do not represent the actual population.

4.2. Variation in Wing Morphology

Using the same flies, you also quantify genotype frequencies at a the bithorax locus, which has two alleles G and g, and causes an abnormal development of the fly’s halteres. You find that 10 flies are homozygous for the G allele, 810 flies are homozygous for the g allele and 180 are heterozygous.

f_GG = 10
f_Gg = 180
f_gg = 810

#Write results into a table
genotype <- c("GG", "Gg", "gg")
f_observed <- c(f_GG, f_Gg, f_gg)
results3 <- data.frame(genotype, f_observed)
results3

p = (2*10+180)/2000
q = (2*810+180)/2000

f_GGi = p^2
f_Ggi = 2*p*q
f_ggi = q^2

f_idealized <- c(f_GGi, f_Ggi, f_ggi)
results4 <- cbind(results3, f_idealized)
results4

Is the population in HW equilibrium? If it is not, what could explain the difference between the observed and the predicted genotype frequencies?

The population appears to be in equilibrium.

5. Resources

5.1. Data References

This exercise does not contain original data.

5.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 used the screenshots, and other questions in the discussion board to troubleshoot my equations.

LS0tDQp0aXRsZTogIlRoZSBIYXJkeS1XZWluYmVyZyBQcmluY2lwbGUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnMycNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBrZWVwX21kOiBUUlVFDQotLS0NCg0KIyMgTmF0aGFuIFN0ZXdhcnQgODExODQ3Nzg5DQoNCiMgMS4gSW5pdGlhdGUgdGhlIFByb2plY3QNClJlbWVtYmVyIHRvIHJlLXJ1biB0aGlzIGNvZGUgZXZlcnkgdGltZSB5b3UgcmUtb3BlbiB0aGlzIFIgTm90ZWJvb2suDQpgYGB7cn0NCiNTZXQgd29ya2luZyBkaXJlY3RvcnkNCnNldF93ZCA8LSBmdW5jdGlvbigpIHsNCiAgbGlicmFyeShyc3R1ZGlvYXBpKQ0KICBjdXJyZW50X3BhdGggPC0gZ2V0QWN0aXZlRG9jdW1lbnRDb250ZXh0KCkkcGF0aCANCiAgc2V0d2QoZGlybmFtZShjdXJyZW50X3BhdGggKSkNCiAgcHJpbnQoIGdldHdkKCkgKQ0KfQ0Kc2V0X3dkKCkNCg0KI0xvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KIyMgMS4xLiBTb21lIEFkdmljZSBCZWZvcmUgR2V0dGluZyBTdGFydGVkDQpJbiB0aGlzIGV4ZXJjaXNlIHlvdSB3aWxsIGNvbmR1Y3QgYSBudW1iZXIgb2Ygc2ltcGxlIGNhbGN1bGF0aW9ucy4gUiByZWNvZ25pemVkIGFsbCBiYXNpYyBtYXRoZW1hdGljYWwgZnVuY3Rpb24gZm9yIGFkZGl0aW9uL3N1YnN0cmFjdGlvbiAoKywgLSksIG11bHRpcGxpY2F0aW9uL2RpdmlzaW9uICgqLCAvKSwgYW5kIGV4cG9uZW50cy9sb2dhcml0aG1zICheLCBsb2cxMCkuIEFsc28sIFIgY2FuIHVzZSB0aGVzZSBmdW5jdGlvbnMgdXNpbmcgYmFzaWMgYWxnZWJyYSwgYXMgbG9uZyBhcyB5b3UgZmlyc3QgZGVmaW5lIHN5bWJvbHMgbnVtZXJjaWFsbHkgZmlyc3QuIFNvLCB5b3UgY2FuIHNvbHZlIHRoZSB0aGUgbXVsdGlwbGljYXRpb24gb2YgMTEgYW5kIDEzIGluIHR3byB3YXlzOg0KDQpTcGVjaWZpYyBzb2x1dGlvbjoNCmBgYHtyfQ0KMTEqMTMNCmBgYA0KDQpHZW5lcmFsIHNvbHV0aW9uOg0KYGBge3J9DQp4IDwtIDExDQp5IDwtIDEzDQp4KnkNCmBgYA0KDQpOb3RlIHRoYXQgdGhlIGdlbmVyYWwgc29sdXRpb24gc2VlbXMgbW9yZSBjdW1iZXJzb21lIGF0IGZpcnN0LiBIb3dldmVyLCBpdCBhbGxvd3MgeW91IHRvIHdyaXRlIHNvbWUgY29tcGxleCBjb2RlIHRoYXQgcHJvY2Vzc2VzIGRhdGEsIGFuZCBpZiB5b3Ugd2FudCB0byBkbyB0aGUgc2FtZSB0aGluZyB3aXRoIGRpZmZlcmVudCBkYXRhLCB5b3UgZG9uJ3QgaGF2ZSB0byByZXdyaXRlIHRoZSBjb2RlLCB5b3UganVzdCByZWRlZmluZSB0aGUgaW5wdXQgdmFyaWFibGVzLg0KDQojIDIuIEEgTnVsbCBNb2RlbCBvZiBFdm9sdXRpb246IHRoZSBIYXJkeS1XZWluYmVyZyBQcmluY2lwbGUNClRoZSBbSGFyZHnigJNXZWluYmVyZyBwcmluY2lwbGVdKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vc2NpdGFibGUvZGVmaW5pdGlvbi9oYXJkeS13ZWluYmVyZy1lcXVpbGlicml1bS0xMjIvKSBzdGF0ZXMgdGhhdCBhbGxlbGUgYW5kIGdlbm90eXBlIGZyZXF1ZW5jaWVzIGluIGEgcG9wdWxhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudCBmcm9tIGdlbmVyYXRpb24gdG8gZ2VuZXJhdGlvbiBpbiB0aGUgYWJzZW5jZSBvZiBldm9sdXRpb25hcnkgaW5mbHVlbmNlcy4gRXZvbHV0aW9uYXJ5IGluZmx1ZW5jZXMgaW5jbHVkZSBnZW5ldGljIGRyaWZ0LCBuYXR1cmFsIHNlbGVjdGlvbiwgbXV0YXRpb24sIGFuZCBtaWdyYXRpb24uIEluIHRoZSBzaW1wbGVzdCBjYXNlIG9mIGEgc2luZ2xlIGxvY3VzIHdpdGggdHdvIGFsbGVsZXMgZGVub3RlZCBBIGFuZCBhIHdpdGggZnJlcXVlbmNpZXMgZihBKSA9IHAgYW5kIGYoYSkgPSBxLCByZXNwZWN0aXZlbHksIHRoZSBleHBlY3RlZCBnZW5vdHlwZSBmcmVxdWVuY2llcyB1bmRlciByYW5kb20gbWF0aW5nIGFyZSBmKEFBKSA9IHBeMiBmb3IgdGhlIEFBIGhvbW96eWdvdGVzLCBmKGFhKSA9IHFeMiBmb3IgdGhlIGFhIGhvbW96eWdvdGVzLCBhbmQgZihBYSkgPSAycHEgZm9yIHRoZSBoZXRlcm96eWdvdGVzIChzZWUgZmlndXJlIGJlbG93IGZvciB0aGUgbW9kaWZpZWQgUHVubmV0dCBzcXVhcmUpLiBOb3RlIHRoYXQgcF4yICsgMnBxICsgcV4yIGFsd2F5cyBlcXVhbHMgMSwganVzdCBhcyBwICsgcSBlcXVhbHMgMSBhdCBiaWFsbGVsaWMgbG9jaS4gSW4gdGhlIGFic2VuY2Ugb2Ygc2VsZWN0aW9uLCBtdXRhdGlvbiwgZ2VuZXRpYyBkcmlmdCwgb3Igb3RoZXIgZXZvbHV0aW9uYXJ5IGZvcmNlcywgYWxsZWxlIGZyZXF1ZW5jaWVzIHAgYW5kIHEgYXJlIGNvbnN0YW50IGJldHdlZW4gZ2VuZXJhdGlvbnMsIHNvIGVxdWlsaWJyaXVtIGlzIHJlYWNoZWQuDQoNCiFbXShIV19mcmVxdWVuY3kucG5nKQ0KDQpUaGUgcG93ZXIgb2YgdGhlIHByaW5jaXBsZSBpcyB0aGF0IGl0IGFsbG93cyBmb3IgYSBzaW1wbGUgdGVzdCBvZiB3aGV0aGVyIGV2b2x1dGlvbmFyeSBpbmZsdWVuY2VzIGFyZSBhY3Rpbmcgb24gYSBzcGVjaWZpYyBsb2N1cy4gV2UgY2FuIGdvIG91dCBpbnRvIG5hdHVyYWwgcG9wdWxhdGlvbnMsIG1lYXN1cmUgZ2Vub3R5cGUgZnJlcXVlbmNpZXMgYW5kIGluZmVyIGFsbGVsZSBmcmVxdWVuY2llcyBmcm9tIHRoYXQuIEluIHRoZSBhYnNlbmNlIG9mIGFueSBldm9sdXRpb25hcnkgZm9yY2VzLCB0aGUgbWVhc3VyZWQgZ2Vub3R5cGUgZnJlcXVlbmNpZXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBpZGVhbGl6ZWQgZ2Vub3R5cGUgZnJlcXVlbmNpZXMgcHJlZGljdGVkIGJ5IHRoZSBIYXJkeS1XZWluYmVyZyBwcmluY2lwbGUuIElmIG1lYXN1cmVkIGFuZCBwcmVkaWN0ZWQgYW5kIGlkZWFsaXplZCBnZW5vdHlwZSBmcmVxdWVuY2llcyBkbyBub3QgbWF0Y2gsIHRoZSBwb3B1bGF0aW9uIGlzIGluIEhhcmR5LVdlaW5iZXJnIGRpc2VxdWlsaWJyaXVtIGFuZCBzb21lIGV2b2x1dGlvbmFyeSBmb3JjZSBtdXN0IGJlIGFjdGluZyBvbiB0aGF0IHBhcnRpY3VsYXIgbG9jdXMsIGNhdXNpbmcgc29tZSBnZW5vdHlwZXMgdG8gYmUgb3ZlciBvciB1bmRlcnJlcHJlc2VudGVkLg0KDQohW10oSFdfcHJpbmNpcGxlLmpwZykNCg0KIyAzLiBDYWxjdWxhdGluZyBJZGVhbGl6ZWQgR2Vub3R5cGUgRnJlcXVlbmNpZXMNCkJlZm9yZSB3ZSBhcHBseSB0aGUgSGFyZHktV2VpbmJlcmcgcHJpbmNpcGxlIGluIHByYWN0aWNlLCB3ZSBzaG91bGQgdGhpbmsgbW9yZSBjbGVhcmx5IGFib3V0IHRoZSB0aGVvcmV0aWNhbCBwcmVkaWN0aW9ucy4gRm9yIGFueSBnaXZlbiBhbGxlbGUgZnJlcXVlbmN5IG9mIHAgYXQgYSBiaWFsbGVsaWMgbG9jdXMsIHRoZXJlIGlzIGEgY2xlYXIgbWF0aGVtYXRpY2FsIHByZWRpY3Rpb24gb2Ygd2hhdCB0aGUgZ2Vub3R5cGUgZnJlcXVlbmNpZXMgc2hvdWxkIGJlLiBIZXJlLCB5b3Ugd2lsbCBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwIGFuZCB0aGUgZnJlcXVlbmN5IG9mIGFsbCBnZW5vdHlwZXMuIA0KDQojIyAzLjEuIEJhc2ljIENhbGN1bGF0aW9ucw0KSW1hZ2luZSBhIGxvY3VzIHdpdGggdHdvIGFsbGVsZXMsIEEgKHdpdGggZnJlcXVlbmN5IHApIGFuZCBhICh3aXRoIGZyZXF1ZW5jeSBxKS4gSW4gdGhpcyBzZWN0aW9uIHlvdSB3aWxsIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IG9mIGdlbm90eXBlcyBmb3IgdmFsdWVzIG9mIHAgYmV0d2VlbiAwIGFuZCAxLiANCg0KYGBge3J9DQojTWFrZSBhIHRhYmxlIHdpdGggdGhlIGFsbGVsZSBmcmVxdWVuY3kgb2YgQSAocCkgYmV0d2VlbiAwIGFuZCAxIChpbiAwLjAxLXN0ZXAgaW5jcmVtZW50cykgdXNpbmcgdGhlIHNlcSBjb21tYW5kDQpkYXRhIDwtIGFzLmRhdGEuZnJhbWUoc2VxKDAsIDEsIGJ5ID0gMC4wMSkpDQoNCiNBZGQgY29sdW1uIG5hbWUNCmNvbG5hbWVzKGRhdGEpIDwtICJwIg0KDQojQ2FsY3VsYXRlIGFsdGVybmF0ZSBhbGxlbGUgZnJlcXVlbmN5IChxKQ0KZGF0YSRxIDwtIDEtZGF0YSRwDQoNCiNDYWxjdWxhdGUgdGhlIHRoZW9yZXRpY2FsIGZyZXF1ZW5jaWVzIGZvciBnZW5vdHlwZXMgQUEsIEFhLCBhbmQgYWENCmRhdGEkQUEgPC0gZGF0YSRwXjINCmRhdGEkQWEgPC0gMipkYXRhJHAqZGF0YSRxDQpkYXRhJGFhIDwtIGRhdGEkcV4yDQoNCiNDYWxjdWxhdGUgdGhlIHRvdGFsIGFsbGVsZSBmcmVxdWVuY3kgKHN1bSBvZiBhbGwgZ2Vub3R5cGUgZnJlcXVlbmNpZXMpDQpkYXRhJHRvdGFsIDwtIChkYXRhJHBeMikrKDIqZGF0YSRwKmRhdGEkcSkrKGRhdGEkcV4yKQ0KDQojd3JpdGUgcmVzdWx0cyBpbnRvIGEgdGFibGUNCiNTaG93IHRhYmxlDQpkYXRhDQpgYGANCg0KIyMgMy4yLiBWaXN1YWxpemluZyBHZW5vdHlwZSBGcmVxdWVuY2llcw0KSnVzdCB0byBwcmFjdGljZSBvdXIgdmlzdWFsaXphdGlvbiBza2lsbHMsIGxldCdzIHVzZSBnZ3Bsb3QgdG8gdmlzdWFsaXplIHRoZXNlIGRhdGEgdXNpbmcgYSBsaW5lIGdyYXBoIChnZW9tX2xpbmUpIHdpdGggcCBvbiB0aGUgeCBheGlzIGFuZCB0aGUgZ2Vub3R5cGUgZnJlcXVlbmNpZXMgb24gdGhlIHkgYXhpcy4gWW91IGNhbiBwbG90IHRoZSB2YWx1ZXMgZm9yIEFBLCBBYSwgYWEsIGFuZCB0aGUgc3VtIG9mIGFsbCB0aHJlZSBpbnRvIGEgc2luZ2xlIHBsb3QuDQoNCmBgYHtyfQ0KI1Zpc3VhbGl6ZSB0aGUgcG9zc2libGUgYWxsZWxlIGZyZXF1ZW5jaWVzIGFzIGEgZnVuY3Rpb24gb2YgcA0KI05vdGUgdGhhdCB5b3UgY2FuIGFkZCBhZGRpdGlvbmFsIGVsZW1lbnRzIChsaW5lcykgYnkganVzdCBhZGRpbmcgYWRkaXRpb25hbCBnZW9tcywgd2l0aCB0aGUgYWVzdGhldGljcyBzcGVjaWZpZWQgd2l0aGluIHRoZSBicmFja2V0cw0KZ2dwbG90KGRhdGEsIGFlcyh4PXAsIHk9QUEpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9saW5lKGFlcyh4PXAsIHk9QWEpLCBjb2xvcj0iYmx1ZSIpICsNCiAgZ2VvbV9saW5lKGFlcyh4PXAsIHk9YWEpLCBjb2xvcj0icmVkIikgKw0KICBnZW9tX2xpbmUoYWVzKHg9cCwgeT10b3RhbCksIGNvbG9yPSJwdXJwbGUiKSArDQogIHhsYWIoInAgKGFsbGVsZSBmcmVxdWVuY3kpIikgKw0KICB5bGFiKCJnZW5vdHlwZSBmcmVxdWVuY3kiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCkluIHlvdXIgb3duIHdvcmRzLCBjYW4geW91IGV4cGxhaW4gdGhlIEhhcmR5LVdlaW5iZXJnIHByaW5jaXBsZSBhbmQgd2h5IHRoZSBzdW0gb2YgYWxsIGdlbm90eXBlcyBhbHdheXMgZXF1YWxzIDE/DQoNCipUaGUgSGFyZHktV2VpbmJlcmcgcHJpbmNpcGxlIHN0YXRlcyB0aGF0IHZhcmlhdGlvbiBpbiBhIHBvcHVsYXRpb24gaXMgY29uc3RhbnQgdW5sZXNzIGl0IGlzIGRpc3R1cmJlZCBieSB0aGluZ3Mgc3VjaCBhcyBtdXRhdGlvbnMuIE11dGF0aW9ucyBkaXNydXB0IHRoZSBlcXVpbGlicml1bSBieSBpbnRyb2R1Y2luZyBuZXcgYWxsZWxlcy4gT3RoZXIgZmFjdG9ycyB0aGF0IGNhbiBkaXNydXB0IHRoZSBlcXVpbGlicml1bSB3b3VsZCBiZSBuYXR1cmFsIHNlbGVjdGlvbiBhbmQgZ2VuZXRpYyBkcmlmdC4gVGhlIHN1bSBvZiBhbGwgZ2Vub3R5cGVzIHdpbGwgYWx3YXlzIGVxdWFsIDEgYmVjYXVzZSAxIGlzIGluY2x1ZGluZyB0aGUgd2hvbGUgcG9wdWxhdGlvbiwgYW5kIHRoaXMgbWVhbnMgdGhlcmUgY2FuJ3QgYmUgbW9yZSBvciBsZXNzLioNCg0KIyA0LiBUZXN0aW5nIGZvciBIVyBFcXVpbGlicml1bQ0KIyMgNC4xLiBWYXJpYXRpb24gaW4gRXllIENvbG9yDQpGcnVpdCBmbGllcyBvZiB0aGUgZ2VudXMgKkRyb3NvcGhpbGEqIGFyZSBhIHdvcmtob3JzZSBmb3IgZ2VuZXRpYyBhbmQgZXZvbHV0aW9uYXJ5IHN0dWRpZXMuIEEgZnJlcXVlbnRseSBzdHVkaWVkIHRyYWl0IGlzIHRoZSBleWUgY29sb3IgcG9seW1vcnBoaXNtIHNvbWUgcG9wdWxhdGlvbnMgZXhoaWJpdC4gV2lsZC10eXBlIGZsaWVzIGhhdmUgYSBicmlnaHQgcmVkIGV5ZSBjb2xvcmF0aW9uLiBBIG11dGF0aW9uIGluIGEgc2luZ2xlIGdlbmUgY29udHJvbGxpbmcgdGhlIGV4cHJlc3Npb24gb2YgZXllIGNvbG9yLCBob3dldmVyLCBjYW4gdHVybiB0aGUgZXllcyB3aGl0ZS4gVGhlIGFsbGVsZSBjYXVzaW5nIHRoZSB3aGl0ZS1leWUgcGhlbm90eXBlICh3ZSBjYWxsIGl0IGUpIGlzIHJlY2Vzc2l2ZSwgdGhlcmVmb3JlIHRoZSB3aWxkLXR5cGUgYWxsZWxlICh3ZSBjYWxsIGl0IEUpIGlzIGRvbWluYW50Lg0KDQohW10oZXllX2NvbG9yLmpwZykNCg0KWW91IGNvbGxlY3RlZCAxMDAwIGZsaWVzIGluIGEgbmF0dXJhbCBwb3B1bGF0aW9uIGFuZCBicmluZyB5b3VyIHNhbXBsZXMgYmFjayB0byB0aGUgbGFib3JhdG9yeSBmb3IgZ2Vub3R5cGluZy4gWW91IGZpbmQgdGhhdCA3MjAgZmxpZXMgYXJlIGhvbW96eWdvdXMgZm9yIHRoZSBFIGFsbGVsZSwgMTIwIGZsaWVzIGFyZSBob21venlnb3VzIGZvciB0aGUgZSBhbGxlbGUsIGFuZCAxNjAgYXJlIGhldGVyb3p5Z291cy4gDQoNCldoYXQgYXJlIHRoZSByZWxhdGl2ZSBmcmVxdWVuY2llcyAoZikgb2YgZWFjaCBnZW5vdHlwZSBpbiB0aGUgcG9wdWxhdGlvbj8NCg0KYGBge3J9DQojQ2FsY3VsYXRlIG9ic2VydmVkIGdlbm90eXBlIGZyZXF1ZW5jaWVzIGJhc2VkIG9uIHRoZSByZXN1bHRzDQpmX0VFID0gNzIwDQpmX0VlID0gMTYwDQpmX2VlID0gMTIwDQoNCiNXcml0ZSByZXN1bHRzIGludG8gYSB0YWJsZQ0KI01ha2UgYSBsaXN0IG9mIHBvc3NpYmxlIGdlbm90eXBlcw0KZ2Vub3R5cGUgPC0gYygiRUUiLCAiRWUiLCAiZWUiKQ0KDQojTWFrZSBhIGxpc3Qgb2Ygb2JzZXJ2ZWQgZ2Vub3R5cGUgZnJlcXVlbmNpZXMNCmZfb2JzZXJ2ZWQgPC0gYyhmX0VFLCBmX0VlLCBmX2VlKQ0KDQojTWVyZ2UgdGhlIHR3byBsaXN0cyBpbnRvIGEgdGFibGUNCnJlc3VsdHMxIDwtIGRhdGEuZnJhbWUoZ2Vub3R5cGUsIGZfb2JzZXJ2ZWQpDQpyZXN1bHRzMQ0KYGBgDQoNCkJhc2VkIG9uIHRoZSBtZWFzdXJlZCBnZW5vdHlwZSBmcmVxdWVuY2llcywgeW91IGNhbiBjYWxjdWxhdGUgYWxsZWxlIGZyZXF1ZW5jaWVzIGZvciBFIGFuZCBlIChoaW50OiBmbGllcyBhcmUgZGlwbG9pZCk6DQoNCmBgYHtyfQ0KI0NhbGN1bGF0ZSBhbGxlbGUgZnJlcXVlbmN5IGZvciBFIChwKSBhbmQgZSAocSkgYmFzZWQgb24gb2JzZXJ2ZWQgZ2Vub3R5cGUgZnJlcXVlbmNpZXMNCnAgPSAoKDIqNzIwKSsxNjApLzIwMDANCnEgPSAoKDIqMTIwKSsxNjApLzIwMDANCmBgYA0KDQpCYXNlZCBvbiB0aGUgYWxsZWxlIGZyZXF1ZW5jaWVzLCB3ZSBjYW4gYXBwbHkgdGhlIEhXIHByaW5jaXBsZSBhbmQgY2FsY3VsYXRlIGlkZWFsaXplZCBnZW5vdHlwZSBmcmVxdWVuY2llczoNCg0KYGBge3J9DQojQ2FsY3VsYXRlIGlkZWFsaXplZCAoaS5lLiwgdGhlb3JldGljYWxseSBwcmVkaWN0ZWQpIGdlbm90eXBlIGZyZXF1ZW5jaWVzIGJhc2VkIG9uIGFsbGVsZSBmcmVxdWVuY2llcw0KZl9FRWkgPSBwXjINCmZfRWVpID0gMipwKnENCmZfZWVpID0gcV4yDQoNCiNNYWtlIGEgbGlzdCBvZiBpZGVhbGl6ZWQgZ2Vub3R5cGUgZnJlcXVlbmNpZXMNCmZfaWRlYWxpemVkIDwtIGMoZl9FRWksIGZfRWVpLCBmX2VlaSkNCg0KI0FkZCBsaXN0IHRvIHRoZSByZXN1bHRzIHRhYmxlDQpyZXN1bHRzMiA8LSBjYmluZChyZXN1bHRzMSwgZl9pZGVhbGl6ZWQpDQpyZXN1bHRzMg0KYGBgDQoNCldoYXQgZG8geW91IG9ic2VydmU/IElzIHRoZSBwb3B1bGF0aW9uIGluIEhXIGVxdWlsaWJyaXVtPyBJZiBpdCBpcyBub3QsIHdoYXQgY291bGQgZXhwbGFpbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvYnNlcnZlZCBhbmQgdGhlIHByZWRpY3RlZCBnZW5vdHlwZSBmcmVxdWVuY2llcz8NCg0KKlRoZSBwb3B1bGF0aW9uIGlzIG5vdCBpbiBlcXVpbGlicml1bSwgYXMgdGhlIGlkZWFsaXplZCBoYXMgZGlmZmVyZW50IHJhdGlvcyB0aGFuIHRoZSBvYnNlcnZlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gbWFueSBmYWN0b3JzLCBidXQgYW55IG91dHNpZGUgaW5mbHVlbmNlLCBnZW5ldGljIGRyaWZ0LCBvciBtdXRhdGlvbnMgY2FuIGNhdXNlIHRoZSBlcXVpbGlicml1bSB0byBiZSBvZmYuIEluIHRoaXMgc2FtcGxpbmcsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIHRoYXQgdGhlIHNhbXBsZSBmbGllcyBjb2xsZWN0ZWQgZG8gbm90IHJlcHJlc2VudCB0aGUgYWN0dWFsIHBvcHVsYXRpb24uKg0KDQojIyA0LjIuIFZhcmlhdGlvbiBpbiBXaW5nIE1vcnBob2xvZ3kNClVzaW5nIHRoZSBzYW1lIGZsaWVzLCB5b3UgYWxzbyBxdWFudGlmeSBnZW5vdHlwZSBmcmVxdWVuY2llcyBhdCBhIHRoZSBiaXRob3JheCBsb2N1cywgd2hpY2ggaGFzIHR3byBhbGxlbGVzIEcgYW5kIGcsIGFuZCBjYXVzZXMgYW4gYWJub3JtYWwgZGV2ZWxvcG1lbnQgb2YgdGhlIGZseSdzIGhhbHRlcmVzLiBZb3UgZmluZCB0aGF0IDEwIGZsaWVzIGFyZSBob21venlnb3VzIGZvciB0aGUgRyBhbGxlbGUsIDgxMCBmbGllcyBhcmUgaG9tb3p5Z291cyBmb3IgdGhlIGcgYWxsZWxlIGFuZCAxODAgYXJlIGhldGVyb3p5Z291cy4NCg0KIVtdKHdpbmdfbW9ycGhvbG9neS5wbmcpDQoNCmBgYHtyfQ0KZl9HRyA9IDEwDQpmX0dnID0gMTgwDQpmX2dnID0gODEwDQoNCiNXcml0ZSByZXN1bHRzIGludG8gYSB0YWJsZQ0KZ2Vub3R5cGUgPC0gYygiR0ciLCAiR2ciLCAiZ2ciKQ0KZl9vYnNlcnZlZCA8LSBjKGZfR0csIGZfR2csIGZfZ2cpDQpyZXN1bHRzMyA8LSBkYXRhLmZyYW1lKGdlbm90eXBlLCBmX29ic2VydmVkKQ0KcmVzdWx0czMNCg0KcCA9ICgyKjEwKzE4MCkvMjAwMA0KcSA9ICgyKjgxMCsxODApLzIwMDANCg0KZl9HR2kgPSBwXjINCmZfR2dpID0gMipwKnENCmZfZ2dpID0gcV4yDQoNCmZfaWRlYWxpemVkIDwtIGMoZl9HR2ksIGZfR2dpLCBmX2dnaSkNCnJlc3VsdHM0IDwtIGNiaW5kKHJlc3VsdHMzLCBmX2lkZWFsaXplZCkNCnJlc3VsdHM0DQpgYGANCg0KSXMgdGhlIHBvcHVsYXRpb24gaW4gSFcgZXF1aWxpYnJpdW0/IElmIGl0IGlzIG5vdCwgd2hhdCBjb3VsZCBleHBsYWluIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9ic2VydmVkIGFuZCB0aGUgcHJlZGljdGVkIGdlbm90eXBlIGZyZXF1ZW5jaWVzPw0KDQoqVGhlIHBvcHVsYXRpb24gYXBwZWFycyB0byBiZSBpbiBlcXVpbGlicml1bS4qDQoNCiMgNS4gUmVzb3VyY2VzDQojIyA1LjEuIERhdGEgUmVmZXJlbmNlcw0KVGhpcyBleGVyY2lzZSBkb2VzIG5vdCBjb250YWluIG9yaWdpbmFsIGRhdGEuDQoNCiMjIDUuMi4gUmVzb3VyY2VzIFlvdSBDb25zdWx0ZWQNCkNvbnN1bHRpbmcgYWRkaXRpb25hbCByZXNvdXJjZXMgdG8gc29sdmUgdGhpcyBhc3NpZ25tZW50IGlzIGFic29sdXRlbHkgYWxsb3dlZCwgYnV0IGZhaWx1cmUgdG8gZGlzY2xvc2UgdGhvc2UgcmVzb3VyY2VzIGlzIHBsYWdpYXJpc20uIFBsZWFzZSBsaXN0IGFueSBjb2xsYWJvcmF0b3JzIHlvdSB3b3JrZWQgd2l0aCBhbmQgcmVzb3VyY2VzIHlvdSB1c2VkIGJlbG93IG9yIHN0YXRlIHRoYXQgeW91IGhhdmUgbm90IHVzZWQgYW55Lg0KDQoqSSB1c2VkIHRoZSBzY3JlZW5zaG90cywgYW5kIG90aGVyIHF1ZXN0aW9ucyBpbiB0aGUgZGlzY3Vzc2lvbiBib2FyZCB0byB0cm91Ymxlc2hvb3QgbXkgZXF1YXRpb25zLioNCg==