#Loading Required Packages

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha

0.1 Table of Contents

  • Introduction

  • Data Requirements

  • Data Collection

  • Data Understanding

  • Analytical Approach

  • Data Exploration

  • Model Development

  • Model Evaluation

  • Conclusion

0.2 Introduction

American Football is a huge part of American tradition and It is very competitive on every level from 3rd grade to high school and college. In some cases College Football can be more competitive than NFL and teams do whatever it takes to win. Teams push themselves beyond their limits to add extra speed and strenght, from waking up 4:15 am every morning to lifting weights and running. The impact of this hard work is definately positive but are there other methods that can contribute the their victory? What about using bagpipes for motiovation or intimidation? Bagpipes were traditionality used during war by Scots to scare their enemies or encourage the Scots into battle. How about College Fight Songs? Would the songs all college students memorized and sang during every college football game have an impact of the game result? Would the lyrics of the College Fight Song have an impact on the victory or loss? Would it matter if the Collge Fight Song is fast or slow? Would it help if the song uses the word victory often?

The purpose of this study is to determine if College Football Fight Song attributes have an impact on College Football Team’s victory or loss. The business problem in question is " Can we find attributes in College Football Fight Song that can help College Football team win. The main group that may benefit from this study is the Athletic Department of the College. They may learn to identify that College Fight Songs have positive or negative impact to victory.

0.3 Data Requirements

There are variety of data that we require to collect in order to answer the problem statement and solve the business objectives. These can be loudness, rythm, tempo and lyrics. Considering the scope, we proceed with obvervational study rather than creating an experimental study and we use publicly available data rather than obtaining the data. The study is limited to all schools in the Power Five Conferences - The ACC, Big Ten, Big 12, Pac-12 and SEC- plus Notre Dame. For the purpose of this study, what constitues as the College Fight Song is defined as “official” by their schools and the ones fans sing out. The study is also limited to the lyrics sung most regularly and also published by the school.

0.4 Data Collection

https://fivethirtyeight.com/ published an article on August 30th 2019 around guide to College Fight Songs including a data that is collected by https://fivethirtyeight.com/ staff. The full dataset can be found here: https://github.com/fivethirtyeight/data/blob/master/fight-songs/fight-songs.csv . Addition to the “fight songs” dataset provided by five thirty eight, NCAA winnings are collected from google search. The complete dataset can be found in csv format here: https://raw.githubusercontent.com/anilak1978/data/master/fight-songs/fight-songs.csv

0.4.1 About the Data

Definitions of the variables are as follows:

  • school: School name

  • conference: School college football conference

  • song_name: Song title

  • writers: Song author

  • year: Year the song written. Some values are Unknown

  • student_writer: Was the author a student? Some values are Unknown

  • official_song: Is the song the official fight song according to the university?

  • contest: Was the song chosen as the result of a contest?

  • bpm: Beats per minute

  • sec_duration: Duration of song in seconds

  • fight: Does the song say “fight”?

  • number_fights: Number of times the song says “fight”?

  • victory: Does the song say “victory”?

  • win_won: Does the song say “win” or “won”?

  • victory_win_won: Does the song say “victory,” “win” or “won”?

  • rah: Does the song say “rah”?

  • nonsense: Does the song use nonsense syllables (e.g. “Whoo-Rah” or “Hooperay”)

  • colors: Does the song mention the school colors?

  • men: Does the song refer to a group of men (e.g. men, boys, sons, etc.)?

  • opponents: Does the song mention any opponents?

  • spelling: Does the song spell anything?

  • trope_count: Total number of tropes (fight, victory, win_won, rah, nonsense,colors, men, opponents, and spelling).

  • spotify_id: Spotify id for the song

0.4.2 Loading Data in R

fight_songs <- read.csv('https://raw.githubusercontent.com/anilak1978/data/master/fight-songs/fight-songs.csv')
head(fight_songs)
##         school  conference         song_name
## 1   Notre Dame Independent     Victory March
## 2       Baylor      Big 12         Old Fight
## 3   Iowa State      Big 12 Iowa State Fights
## 4       Kansas      Big 12     I'm a Jayhawk
## 5 Kansas State      Big 12   Wildcat Victory
## 6     Oklahoma      Big 12     Boomer Sooner
##                                                writers year student_writer
## 1                     Michael J. Shea and John F. Shea 1908             No
## 2                           Dick Baker and Frank Boggs 1947            Yes
## 3 Jack Barker, Manly Rice, Paul Gnam, Rosalind K. Cook 1930            Yes
## 4                                George "Dumpy" Bowles 1912            Yes
## 5                                    Harry E. Erickson 1927            Yes
## 6                                      Arthur M. Alden 1905            Yes
##   official_song contest bpm sec_duration fight number_fights victory
## 1           Yes      No 152           64   Yes             1     Yes
## 2           Yes      No  76           99   Yes             4     Yes
## 3           Yes      No 155           55   Yes             5      No
## 4           Yes      No 137           62    No             0      No
## 5           Yes      No  80           67   Yes             6     Yes
## 6           Yes      No 153           37    No             0      No
##   win_won victory_win_won rah nonsense colors men opponents spelling
## 1     Yes             Yes Yes       No    Yes Yes        No       No
## 2     Yes             Yes  No       No    Yes  No        No      Yes
## 3      No              No Yes       No     No Yes        No      Yes
## 4      No              No  No      Yes     No Yes       Yes       No
## 5      No             Yes  No       No    Yes  No        No       No
## 6      No              No Yes       No     No  No        No      Yes
##   trope_count             spotify_id ncaa_won
## 1           6 15a3ShKX3XWKzq0lSS48yr       13
## 2           5 2ZsaI0Cu4nz8DHfBkPt0Dl        9
## 3           4 3yyfoOXZQCtR6pfRJqu9pl        2
## 4           3 0JzbjZgcjugS0dmPjF9R89        0
## 5           3 4xxDK4g1OHhZ44sTFy8Ktm        0
## 6           2 0QXC8Gg1oKWkORegslTXoT       16

0.5 Data Understanding

str(fight_songs)
## 'data.frame':    65 obs. of  24 variables:
##  $ school         : Factor w/ 65 levels "Alabama","Arizona",..: 37 6 19 20 21 39 40 52 50 54 ...
##  $ conference     : Factor w/ 6 levels "ACC","Big 12",..: 4 2 2 2 2 2 2 2 2 2 ...
##  $ song_name      : Factor w/ 65 levels "Aggie War Hymn",..: 62 40 34 30 64 4 45 50 48 19 ...
##  $ writers        : Factor w/ 64 levels " Harold P. Williams and N. Loyall McLaren; Kelly James",..: 45 9 36 23 28 2 34 60 7 5 ...
##  $ year           : Factor w/ 44 levels "1893","1898",..: 6 34 25 10 23 4 28 19 24 29 ...
##  $ student_writer : Factor w/ 3 levels "No","Unknown",..: 1 3 3 3 3 3 1 1 1 3 ...
##  $ official_song  : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ contest        : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ bpm            : int  152 76 155 137 80 153 180 81 149 159 ...
##  $ sec_duration   : int  64 99 55 62 67 37 29 65 47 54 ...
##  $ fight          : Factor w/ 2 levels "No","Yes": 2 2 2 1 2 1 2 2 2 2 ...
##  $ number_fights  : int  1 4 5 0 6 0 5 17 2 8 ...
##  $ victory        : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 1 2 1 2 2 ...
##  $ win_won        : Factor w/ 2 levels "No","Yes": 2 2 1 1 1 1 1 2 1 1 ...
##  $ victory_win_won: Factor w/ 2 levels "No","Yes": 2 2 1 1 2 1 2 2 2 2 ...
##  $ rah            : Factor w/ 2 levels "No","Yes": 2 1 2 1 1 2 1 1 2 1 ...
##  $ nonsense       : Factor w/ 2 levels "No","Yes": 1 1 1 2 1 1 1 1 1 1 ...
##  $ colors         : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 1 1 2 2 2 ...
##  $ men            : Factor w/ 2 levels "No","Yes": 2 1 2 2 1 1 2 1 2 1 ...
##  $ opponents      : Factor w/ 2 levels "No","Yes": 1 1 1 2 1 1 2 2 1 1 ...
##  $ spelling       : Factor w/ 2 levels "No","Yes": 1 2 2 1 1 2 1 1 2 1 ...
##  $ trope_count    : int  6 5 4 3 3 2 4 4 6 3 ...
##  $ spotify_id     : Factor w/ 65 levels "06Qz83gVtmHtWTClrucgjX",..: 12 28 33 4 42 8 5 46 3 30 ...
##  $ ncaa_won       : int  13 9 2 0 0 16 1 47 2 2 ...

There are 65 cases(observations) with 24 variables in our dataset. Each of the cases represents the name of the School. There are categorical variable types that needs to be character and date data types. Not all variables are required for the study.

0.5.1 Data Cleaning

# Update data types to correct format
fight_songs$school <- as.character(fight_songs$school)
fight_songs$school <- as.character(fight_songs$song_name)
fight_songs$school <- as.character(fight_songs$writers)
fight_songs$year <- format(as.Date(fight_songs$year, format='%Y'),"%Y")
fight_songs$spotify_id <- as.character(fight_songs$spotify_id)

Name of the conference , song name, writers, contest, opponents and spotify_id variables are not neccessarily required for our analysis. There were 5 missing values which are removed from the dataset.

# select the needed columns
fight_songs_df <- fight_songs %>%
  select(school, conference, year, student_writer, official_song, bpm, sec_duration, fight, number_fights, victory, win_won, victory_win_won, rah, nonsense, colors, men, opponents, ncaa_won)
# total na values in the dataset
sum(is.na(fight_songs_df))
## [1] 5
# we can remove na values
fight_songs_df <- na.omit(fight_songs_df)

head(fight_songs_df)
##                                                 school  conference year
## 1                     Michael J. Shea and John F. Shea Independent 1908
## 2                           Dick Baker and Frank Boggs      Big 12 1947
## 3 Jack Barker, Manly Rice, Paul Gnam, Rosalind K. Cook      Big 12 1930
## 4                                George "Dumpy" Bowles      Big 12 1912
## 5                                    Harry E. Erickson      Big 12 1927
## 6                                      Arthur M. Alden      Big 12 1905
##   student_writer official_song bpm sec_duration fight number_fights
## 1             No           Yes 152           64   Yes             1
## 2            Yes           Yes  76           99   Yes             4
## 3            Yes           Yes 155           55   Yes             5
## 4            Yes           Yes 137           62    No             0
## 5            Yes           Yes  80           67   Yes             6
## 6            Yes           Yes 153           37    No             0
##   victory win_won victory_win_won rah nonsense colors men opponents
## 1     Yes     Yes             Yes Yes       No    Yes Yes        No
## 2     Yes     Yes             Yes  No       No    Yes  No        No
## 3      No      No              No Yes       No     No Yes        No
## 4      No      No              No  No      Yes     No Yes       Yes
## 5     Yes      No             Yes  No       No    Yes  No        No
## 6      No      No              No Yes       No     No  No        No
##   ncaa_won
## 1       13
## 2        9
## 3        2
## 4        0
## 5        0
## 6       16
# summary of the dataset
summary(fight_songs_df)
##     school                conference     year           student_writer
##  Length:60          ACC        :11   Length:60          No     :29    
##  Class :character   Big 12     :10   Class :character   Unknown: 0    
##  Mode  :character   Big Ten    :14   Mode  :character   Yes    :31    
##                     Independent: 1                                    
##                     Pac-12     :11                                    
##                     SEC        :13                                    
##  official_song      bpm         sec_duration    fight    number_fights  
##  No : 7        Min.   : 65.0   Min.   : 27.00   No :18   Min.   : 0.00  
##  Yes:53        1st Qu.: 82.5   1st Qu.: 58.75   Yes:42   1st Qu.: 0.00  
##                Median :139.0   Median : 68.00            Median : 2.00  
##                Mean   :126.9   Mean   : 73.20            Mean   : 2.85  
##                3rd Qu.:150.2   3rd Qu.: 86.00            3rd Qu.: 5.00  
##                Max.   :180.0   Max.   :172.00            Max.   :17.00  
##  victory  win_won  victory_win_won  rah     nonsense colors    men    
##  No :29   No :31   No :21          No :43   No :50   No :27   No :37  
##  Yes:31   Yes:29   Yes:39          Yes:17   Yes:10   Yes:33   Yes:23  
##                                                                       
##                                                                       
##                                                                       
##                                                                       
##  opponents    ncaa_won     
##  No :49    Min.   : 0.000  
##  Yes:11    1st Qu.: 1.000  
##            Median : 3.000  
##            Mean   : 6.017  
##            3rd Qu.: 6.250  
##            Max.   :51.000
describe(fight_songs_df$bpm)
##    vars  n   mean    sd median trimmed   mad min max range skew kurtosis
## X1    1 60 126.92 33.82    139  128.48 20.76  65 180   115 -0.6    -1.16
##      se
## X1 4.37
describe(fight_songs_df$number_fights)
##    vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 60 2.85 3.21      2    2.33 2.97   0  17    17 1.75     4.48 0.41
describe(fight_songs_df$sec_duration)
##    vars  n mean    sd median trimmed   mad min max range skew kurtosis
## X1    1 60 73.2 24.94     68   71.15 20.76  27 172   145 1.19     2.83
##      se
## X1 3.22

Below outlines the basic measures of the College Fight Songs data.

  • After removing the 5 observations that had missing values, our dataset has 60 cases which are the names of the schools.

  • 31 of the songs are written by a student.

  • 53 of the songs are official school songs.

  • Average beat per minute is 126.9.

  • Average duration of the songs is 73.20.

  • 42 songs has the word fight in it.

  • Songs uses average 2.85 times the word “fight”

  • 31 of the songs have victory in it.

  • 10 of the songs have words that does not make sense.

  • 23 of the songs have word men in it.

  • 11 of the songs have opponents word in it.

  • Average win of ncaa is 6 times.

theme_set(theme_classic())

ggplot(fight_songs_df, aes(victory))+
  geom_bar(aes(fill=conference), width=0.5)

The songs that uses the word victory tends to use the word win and won as well.

theme_set(theme_bw())

ggplot(fight_songs_df, aes(sec_duration)) + scale_fill_brewer(palette = "Spectral")+
  geom_histogram(aes(fill=student_writer),
                 binwidth = 10,
                 col="black",
                 size=1)

The sec duration is slightly normal distributed and right skewed.

theme_set(theme_bw())

ggplot(fight_songs_df, aes(number_fights)) + scale_fill_brewer(palette = "Spectral")+
  geom_histogram(aes(fill=conference),
                 binwidth = 1,
                 col="black",
                 size=1)

The use of word “fight” is right skewed and not normally distributed.

theme_set(theme_bw())
ggplot(fight_songs_df, aes(bpm, ncaa_won))+
  geom_jitter(width = 0.5, size=1)

Majority of the Collge Football teams that won the Ncaa Won most frequently have College Fight Songs between 130-150 and 70-80 bpm.

theme_set(theme_bw())

ggplot(fight_songs_df, aes(bpm)) + scale_fill_brewer(palette = "Spectral")+
  geom_histogram(aes(fill=fight),
                 binwidth = 10,
                 col="black",
                 size=1)

If we look at the bpm >110 mark, we see normal distribution.

theme_set(theme_bw())

ggplot(fight_songs_df, aes(ncaa_won)) + scale_fill_brewer(palette = "Spectral")+
  geom_histogram(aes(fill=conference),
                 binwidth = 1,
                 col="black",
                 size=1)

The ncaa_won variable within the dataset is not normally distributed.

Based on the initial overview of the data set , we select the bpm, sec_duration, conference and ncaa_won. BPM is numerical variable which provides the information on song’s rythm, sec_duration is numerical variable provides the information on the song’s length, conference is a categorical variable, provides the information on what conference the College team is participating and ncaa_won numerical variable, which provides us the information on how many times that school won the ncaa chanmpionship.

The potential explnatory variables we focus on are bpm and sec_duration. The response variable is ncaa_won.

0.6 Analytical Approach

This study is an observational study. The collected data is not a census data, it does not include all the schools but rather subset of the schools. The data is not collected ramdonly as the cases are from the Five Conferences and Notrada Dame. The cases are independent from each other however there might be a sampling bias, since the samples are not collected randomly. One important factor to keep in mind is that majority of the schools which participate the championship are included in the dataset. The cases for each conference is normally distributed.

The analysis can not be generalized for all the population (which is all the Colleges that has a Football team), however, can be generalized for the subsection of the population which is all the Colleges that participates in the Five Conferences for NCAA Championship. The The expectation from the study is to find association between the explanatory feature bpm and response target variable ncaa_won. We can safely say that the result of the study probably holds true for all the College’s that participate in the NCAA Championship within the Five Conferences. This study is not an experimential design as there is no control group. The sampling captures most of the population of schools and expected conclusion is casual and possibly might be generalized.

0.6.1 Hypothesis

Based on the business problem in question, our hypothesis is as follows.

\(H_{0}:\) College Fight Song Attributes can be predictive of NCAA championship.

\(H_{1}:\) College Fight Song Attributes can not be predictive of NCAA championship.

0.7 Data Exploration

# create the dataframe with only the variables we need

fight_songs_df_2 <- fight_songs_df %>%
  select(school, conference,bpm, sec_duration, ncaa_won)

head(fight_songs_df_2)
##                                                 school  conference bpm
## 1                     Michael J. Shea and John F. Shea Independent 152
## 2                           Dick Baker and Frank Boggs      Big 12  76
## 3 Jack Barker, Manly Rice, Paul Gnam, Rosalind K. Cook      Big 12 155
## 4                                George "Dumpy" Bowles      Big 12 137
## 5                                    Harry E. Erickson      Big 12  80
## 6                                      Arthur M. Alden      Big 12 153
##   sec_duration ncaa_won
## 1           64       13
## 2           99        9
## 3           55        2
## 4           62        0
## 5           67        0
## 6           37       16
describe(fight_songs_df_2)
## Warning in describe(fight_songs_df_2): NAs introduced by coercion
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning
## Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning
## -Inf
##              vars  n   mean    sd median trimmed   mad min  max range
## school*         1 60    NaN    NA     NA     NaN    NA Inf -Inf  -Inf
## conference*     2 60   3.50  1.85      3    3.50  2.97   1    6     5
## bpm             3 60 126.92 33.82    139  128.48 20.76  65  180   115
## sec_duration    4 60  73.20 24.94     68   71.15 20.76  27  172   145
## ncaa_won        5 60   6.02  9.50      3    4.00  4.45   0   51    51
##               skew kurtosis   se
## school*         NA       NA   NA
## conference*   0.09    -1.50 0.24
## bpm          -0.60    -1.16 4.37
## sec_duration  1.19     2.83 3.22
## ncaa_won      3.27    11.65 1.23
# see correlation between bpm and ncaa_won
options(scipen=999)
theme_set(theme_bw())

ggplot(fight_songs_df_2, aes(bpm, ncaa_won))+
  geom_point(aes(conference, size=sec_duration))

options(scipen=999)
theme_set(theme_bw())

ggplot(fight_songs_df_2, aes(sec_duration, ncaa_won))+
  geom_point()

# see linearity and distribution

qqnorm(fight_songs_df_2$bpm)
qqline(fight_songs_df_2$bpm)

hist(fight_songs_df_2$bpm)

# filter bpm above 110 to simulate normal distribution

fight_songs_df_3 <- filter(fight_songs_df_2, fight_songs_df_2$bpm >110)
theme_set(theme_bw())

ggplot(fight_songs_df_3, aes(bpm)) + scale_fill_brewer(palette = "Spectral")+
  geom_histogram(aes(fill=conference),
                 binwidth = 10,
                 col="black",
                 size=1)

qqnorm(fight_songs_df_3$bpm)
qqline(fight_songs_df_3$bpm)

When we look at the bpm above 110, we see that it is normally distributed and there are some residuals towards both top and bottom of the line.

qqnorm(fight_songs_df_3$sec_duration)
qqline(fight_songs_df_3$sec_duration)

hist(fight_songs_df_3$sec_duration)

When we look at the sec_duration , we see that it is normally distributed and there are some residuals towards the top of the line.

The sample size is 60, the dataset for bpm follows close to normal distribution and sample set are randomly selected for Five conference College Fight Songs.

0.8 Model Development

Based on our analytical approach, we use simple regression model.

options(scipen=999)
theme_set(theme_bw())

ggplot(fight_songs_df_3, aes(bpm, ncaa_won))+
  geom_point()

cor(fight_songs_df_3$bpm, fight_songs_df_3$ncaa_won)
## [1] -0.2099433
cor(fight_songs_df_3$sec_duration, fight_songs_df_3$ncaa_won)
## [1] 0.003739684

There is a very weak , negative linear correlation between bpm and ncaa_won , explantory and response variable. There is almost no linear correlation between sec_duration and ncaa_won.

# creating regrresion model

model <- lm(ncaa_won ~ bpm, data = fight_songs_df_3)
summary(model)
## 
## Call:
## lm(formula = ncaa_won ~ bpm, data = fight_songs_df_3)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.558 -4.594 -1.977  1.317 45.095 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  25.8783    14.7559   1.754   0.0869 .
## bpm          -0.1377     0.1002  -1.375   0.1766  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.824 on 41 degrees of freedom
## Multiple R-squared:  0.04408,    Adjusted R-squared:  0.02076 
## F-statistic:  1.89 on 1 and 41 DF,  p-value: 0.1766

0.9 Model Evaluation

# check for linearity of the model

qqnorm(model$residuals)
qqline(model$residuals)

hist(model$residuals)

The model meets the linearity, nearly normal residuals condition. The strength of the fit defined by \(R^2\) is 0.020 which is not that strong. 2% of the variablity can be explained by the NCAA championship variable within the model.

0.10 Conclusion

Our study of College Fight Songs findings are as follow;

  • The strength of the model fit defined by \(R^2\) is 0.020 which is not that strong. 2% of the variablity can be explained by the NCAA championship variable within the model.

  • P value is not low p-value which means bpm explantory variable is not a good predictor.

  • Every additional bpm increase , we can expect to reduce ncaa championship by 1.

  • With simple linear regression, we can not select available College Fight Song Attributes to predict the victory of NCAA Championship conference. We reject the null hypothesis.

LS0tDQp0aXRsZTogIkNvbGxlZ2UgRm9vdGJhbGwgRmlnaHQgU29uZ3MiDQphdXRob3I6IEFuaWwgQWt5aWxkaXJpbQ0KZGF0ZTogIjEyLzA0LzIwMTkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiBweWdtZW50cw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3J9DQojTG9hZGluZyBSZXF1aXJlZCBQYWNrYWdlcw0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHBzeWNoKQ0KDQoNCg0KDQpgYGANCg0KDQojIyBUYWJsZSBvZiBDb250ZW50cw0KDQoqIEludHJvZHVjdGlvbg0KDQoqIERhdGEgUmVxdWlyZW1lbnRzDQoNCiogRGF0YSBDb2xsZWN0aW9uDQoNCiogRGF0YSBVbmRlcnN0YW5kaW5nDQoNCiogQW5hbHl0aWNhbCBBcHByb2FjaA0KDQoqIERhdGEgRXhwbG9yYXRpb24NCg0KKiBNb2RlbCBEZXZlbG9wbWVudA0KDQoqIE1vZGVsIEV2YWx1YXRpb24NCg0KKiBDb25jbHVzaW9uDQoNCg0KIyMgSW50cm9kdWN0aW9uDQoNCkFtZXJpY2FuIEZvb3RiYWxsIGlzIGEgaHVnZSBwYXJ0IG9mIEFtZXJpY2FuIHRyYWRpdGlvbiBhbmQgSXQgaXMgdmVyeSBjb21wZXRpdGl2ZSBvbiBldmVyeSBsZXZlbCBmcm9tIDNyZCBncmFkZSB0byBoaWdoIHNjaG9vbCBhbmQgY29sbGVnZS4gSW4gc29tZSBjYXNlcyBDb2xsZWdlIEZvb3RiYWxsIGNhbiBiZSBtb3JlIGNvbXBldGl0aXZlIHRoYW4gTkZMIGFuZCB0ZWFtcyBkbyB3aGF0ZXZlciBpdCB0YWtlcyB0byB3aW4uIFRlYW1zIHB1c2ggdGhlbXNlbHZlcyBiZXlvbmQgdGhlaXIgbGltaXRzIHRvIGFkZCBleHRyYSBzcGVlZCBhbmQgc3RyZW5naHQsIGZyb20gd2FraW5nIHVwIDQ6MTUgYW0gZXZlcnkgbW9ybmluZyB0byBsaWZ0aW5nIHdlaWdodHMgYW5kIHJ1bm5pbmcuIFRoZSBpbXBhY3Qgb2YgdGhpcyBoYXJkIHdvcmsgaXMgZGVmaW5hdGVseSBwb3NpdGl2ZSBidXQgYXJlIHRoZXJlIG90aGVyIG1ldGhvZHMgdGhhdCBjYW4gY29udHJpYnV0ZSB0aGUgdGhlaXIgdmljdG9yeT8gIFdoYXQgYWJvdXQgdXNpbmcgYmFncGlwZXMgZm9yIG1vdGlvdmF0aW9uIG9yIGludGltaWRhdGlvbj8gQmFncGlwZXMgd2VyZSB0cmFkaXRpb25hbGl0eSB1c2VkIGR1cmluZyB3YXIgYnkgU2NvdHMgdG8gc2NhcmUgdGhlaXIgZW5lbWllcyBvciBlbmNvdXJhZ2UgdGhlIFNjb3RzIGludG8gYmF0dGxlLiBIb3cgYWJvdXQgQ29sbGVnZSBGaWdodCBTb25ncz8gV291bGQgdGhlIHNvbmdzIGFsbCBjb2xsZWdlIHN0dWRlbnRzIG1lbW9yaXplZCBhbmQgc2FuZyBkdXJpbmcgZXZlcnkgY29sbGVnZSBmb290YmFsbCBnYW1lIGhhdmUgYW4gaW1wYWN0IG9mIHRoZSBnYW1lIHJlc3VsdD8gV291bGQgdGhlIGx5cmljcyBvZiB0aGUgQ29sbGVnZSBGaWdodCBTb25nIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSB2aWN0b3J5IG9yIGxvc3M/IFdvdWxkIGl0IG1hdHRlciBpZiB0aGUgQ29sbGdlIEZpZ2h0IFNvbmcgaXMgZmFzdCBvciBzbG93PyBXb3VsZCBpdCBoZWxwIGlmIHRoZSBzb25nIHVzZXMgdGhlIHdvcmQgdmljdG9yeSBvZnRlbj8gDQoNClRoZSBwdXJwb3NlIG9mIHRoaXMgc3R1ZHkgaXMgdG8gZGV0ZXJtaW5lIGlmIENvbGxlZ2UgRm9vdGJhbGwgRmlnaHQgU29uZyBhdHRyaWJ1dGVzIGhhdmUgYW4gaW1wYWN0IG9uIENvbGxlZ2UgRm9vdGJhbGwgVGVhbSdzIHZpY3Rvcnkgb3IgbG9zcy4gVGhlIGJ1c2luZXNzIHByb2JsZW0gaW4gcXVlc3Rpb24gaXMgIiBDYW4gd2UgZmluZCBhdHRyaWJ1dGVzIGluIENvbGxlZ2UgRm9vdGJhbGwgRmlnaHQgU29uZyB0aGF0IGNhbiBoZWxwIENvbGxlZ2UgRm9vdGJhbGwgdGVhbSB3aW4uIFRoZSBtYWluIGdyb3VwIHRoYXQgbWF5IGJlbmVmaXQgZnJvbSB0aGlzIHN0dWR5IGlzIHRoZSBBdGhsZXRpYyBEZXBhcnRtZW50IG9mIHRoZSBDb2xsZWdlLiBUaGV5IG1heSBsZWFybiB0byBpZGVudGlmeSB0aGF0IENvbGxlZ2UgRmlnaHQgU29uZ3MgaGF2ZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbXBhY3QgdG8gdmljdG9yeS4gDQoNCg0KIyMgRGF0YSBSZXF1aXJlbWVudHMNCg0KVGhlcmUgYXJlIHZhcmlldHkgb2YgZGF0YSB0aGF0IHdlIHJlcXVpcmUgdG8gY29sbGVjdCBpbiBvcmRlciB0byBhbnN3ZXIgdGhlIHByb2JsZW0gc3RhdGVtZW50IGFuZCBzb2x2ZSB0aGUgYnVzaW5lc3Mgb2JqZWN0aXZlcy4gVGhlc2UgY2FuIGJlIGxvdWRuZXNzLCByeXRobSwgdGVtcG8gYW5kIGx5cmljcy4gQ29uc2lkZXJpbmcgdGhlIHNjb3BlLCB3ZSBwcm9jZWVkIHdpdGggb2J2ZXJ2YXRpb25hbCBzdHVkeSByYXRoZXIgdGhhbiBjcmVhdGluZyBhbiBleHBlcmltZW50YWwgc3R1ZHkgYW5kIHdlIHVzZSBwdWJsaWNseSBhdmFpbGFibGUgZGF0YSByYXRoZXIgdGhhbiBvYnRhaW5pbmcgdGhlIGRhdGEuIFRoZSBzdHVkeSBpcyBsaW1pdGVkIHRvIGFsbCBzY2hvb2xzIGluIHRoZSBQb3dlciBGaXZlIENvbmZlcmVuY2VzIC0gVGhlIEFDQywgQmlnIFRlbiwgQmlnIDEyLCBQYWMtMTIgYW5kIFNFQy0gcGx1cyBOb3RyZSBEYW1lLiBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHVkeSwgd2hhdCBjb25zdGl0dWVzIGFzIHRoZSBDb2xsZWdlIEZpZ2h0IFNvbmcgaXMgZGVmaW5lZCBhcyAib2ZmaWNpYWwiIGJ5IHRoZWlyIHNjaG9vbHMgYW5kIHRoZSBvbmVzIGZhbnMgc2luZyBvdXQuIFRoZSBzdHVkeSBpcyBhbHNvIGxpbWl0ZWQgdG8gdGhlIGx5cmljcyBzdW5nIG1vc3QgcmVndWxhcmx5IGFuZCBhbHNvIHB1Ymxpc2hlZCBieSB0aGUgc2Nob29sLiANCg0KDQojIyBEYXRhIENvbGxlY3Rpb24NCg0KaHR0cHM6Ly9maXZldGhpcnR5ZWlnaHQuY29tLyBwdWJsaXNoZWQgYW4gYXJ0aWNsZSBvbiBBdWd1c3QgMzB0aCAyMDE5IGFyb3VuZCBndWlkZSB0byBDb2xsZWdlIEZpZ2h0IFNvbmdzIGluY2x1ZGluZyBhIGRhdGEgdGhhdCBpcyBjb2xsZWN0ZWQgYnkgaHR0cHM6Ly9maXZldGhpcnR5ZWlnaHQuY29tLyBzdGFmZi4gVGhlIGZ1bGwgZGF0YXNldCBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2ZpdmV0aGlydHllaWdodC9kYXRhL2Jsb2IvbWFzdGVyL2ZpZ2h0LXNvbmdzL2ZpZ2h0LXNvbmdzLmNzdiAuIEFkZGl0aW9uIHRvIHRoZSAiZmlnaHQgc29uZ3MiIGRhdGFzZXQgcHJvdmlkZWQgYnkgZml2ZSB0aGlydHkgZWlnaHQsICBOQ0FBIHdpbm5pbmdzIGFyZSBjb2xsZWN0ZWQgZnJvbSBnb29nbGUgc2VhcmNoLiBUaGUgY29tcGxldGUgZGF0YXNldCBjYW4gYmUgZm91bmQgaW4gY3N2IGZvcm1hdCBoZXJlOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYW5pbGFrMTk3OC9kYXRhL21hc3Rlci9maWdodC1zb25ncy9maWdodC1zb25ncy5jc3YgDQoNCiMjIyBBYm91dCB0aGUgRGF0YQ0KDQpEZWZpbml0aW9ucyBvZiB0aGUgdmFyaWFibGVzIGFyZSBhcyBmb2xsb3dzOiANCg0KKiBzY2hvb2w6IFNjaG9vbCBuYW1lDQoNCiogY29uZmVyZW5jZTogU2Nob29sIGNvbGxlZ2UgZm9vdGJhbGwgY29uZmVyZW5jZQ0KDQoqIHNvbmdfbmFtZTogU29uZyB0aXRsZQ0KDQoqIHdyaXRlcnM6IFNvbmcgYXV0aG9yDQoNCiogeWVhcjogWWVhciB0aGUgc29uZyB3cml0dGVuLiBTb21lIHZhbHVlcyBhcmUgVW5rbm93bg0KDQoqIHN0dWRlbnRfd3JpdGVyOiBXYXMgdGhlIGF1dGhvciBhIHN0dWRlbnQ/IFNvbWUgdmFsdWVzIGFyZSBVbmtub3duDQoNCiogb2ZmaWNpYWxfc29uZzogSXMgdGhlIHNvbmcgdGhlIG9mZmljaWFsIGZpZ2h0IHNvbmcgYWNjb3JkaW5nIHRvIHRoZSB1bml2ZXJzaXR5Pw0KDQoqIGNvbnRlc3Q6IFdhcyB0aGUgc29uZyBjaG9zZW4gYXMgdGhlIHJlc3VsdCBvZiBhIGNvbnRlc3Q/DQoNCiogYnBtOiBCZWF0cyBwZXIgbWludXRlDQoNCiogc2VjX2R1cmF0aW9uOiBEdXJhdGlvbiBvZiBzb25nIGluIHNlY29uZHMNCg0KKiBmaWdodDogRG9lcyB0aGUgc29uZyBzYXkg4oCcZmlnaHTigJ0/DQoNCiogbnVtYmVyX2ZpZ2h0czogTnVtYmVyIG9mIHRpbWVzIHRoZSBzb25nIHNheXMg4oCcZmlnaHTigJ0/DQoNCiogdmljdG9yeTogRG9lcyB0aGUgc29uZyBzYXkg4oCcdmljdG9yeeKAnT8NCg0KKiB3aW5fd29uOiBEb2VzIHRoZSBzb25nIHNheSDigJx3aW7igJ0gb3Ig4oCcd29u4oCdPw0KDQoqIHZpY3Rvcnlfd2luX3dvbjogRG9lcyB0aGUgc29uZyBzYXkg4oCcdmljdG9yeSzigJ0g4oCcd2lu4oCdIG9yIOKAnHdvbuKAnT8NCg0KKiByYWg6IERvZXMgdGhlIHNvbmcgc2F5IOKAnHJhaOKAnT8NCg0KKiBub25zZW5zZTogRG9lcyB0aGUgc29uZyB1c2Ugbm9uc2Vuc2Ugc3lsbGFibGVzIChlLmcuICJXaG9vLVJhaCIgb3IgIkhvb3BlcmF5IikNCg0KKiBjb2xvcnM6IERvZXMgdGhlIHNvbmcgbWVudGlvbiB0aGUgc2Nob29sIGNvbG9ycz8NCg0KKiBtZW46IERvZXMgdGhlIHNvbmcgcmVmZXIgdG8gYSBncm91cCBvZiBtZW4gKGUuZy4gbWVuLCBib3lzLCBzb25zLCBldGMuKT8NCg0KKiBvcHBvbmVudHM6IERvZXMgdGhlIHNvbmcgbWVudGlvbiBhbnkgb3Bwb25lbnRzPw0KDQoqIHNwZWxsaW5nOiBEb2VzIHRoZSBzb25nIHNwZWxsIGFueXRoaW5nPw0KDQoqIHRyb3BlX2NvdW50OiBUb3RhbCBudW1iZXIgb2YgdHJvcGVzIChmaWdodCwgdmljdG9yeSwgd2luX3dvbiwgcmFoLCBub25zZW5zZSxjb2xvcnMsIG1lbiwgb3Bwb25lbnRzLCBhbmQgc3BlbGxpbmcpLg0KDQoqIHNwb3RpZnlfaWQ6IFNwb3RpZnkgaWQgZm9yIHRoZSBzb25nDQoNCiMjIyBMb2FkaW5nIERhdGEgaW4gUg0KDQpgYGB7cn0NCg0KZmlnaHRfc29uZ3MgPC0gcmVhZC5jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbmlsYWsxOTc4L2RhdGEvbWFzdGVyL2ZpZ2h0LXNvbmdzL2ZpZ2h0LXNvbmdzLmNzdicpDQpoZWFkKGZpZ2h0X3NvbmdzKQ0KDQpgYGANCg0KIyMgRGF0YSBVbmRlcnN0YW5kaW5nDQoNCmBgYHtyfQ0KDQpzdHIoZmlnaHRfc29uZ3MpDQoNCmBgYA0KDQoNClRoZXJlIGFyZSA2NSBjYXNlcyhvYnNlcnZhdGlvbnMpIHdpdGggMjQgdmFyaWFibGVzIGluIG91ciBkYXRhc2V0LiBFYWNoIG9mIHRoZSBjYXNlcyByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBTY2hvb2wuIFRoZXJlIGFyZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0eXBlcyB0aGF0IG5lZWRzIHRvIGJlIGNoYXJhY3RlciBhbmQgZGF0ZSBkYXRhIHR5cGVzLiBOb3QgYWxsIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBzdHVkeS4gDQoNCiMjIyBEYXRhIENsZWFuaW5nDQoNCmBgYHtyfQ0KIyBVcGRhdGUgZGF0YSB0eXBlcyB0byBjb3JyZWN0IGZvcm1hdA0KZmlnaHRfc29uZ3Mkc2Nob29sIDwtIGFzLmNoYXJhY3RlcihmaWdodF9zb25ncyRzY2hvb2wpDQpmaWdodF9zb25ncyRzY2hvb2wgPC0gYXMuY2hhcmFjdGVyKGZpZ2h0X3NvbmdzJHNvbmdfbmFtZSkNCmZpZ2h0X3NvbmdzJHNjaG9vbCA8LSBhcy5jaGFyYWN0ZXIoZmlnaHRfc29uZ3Mkd3JpdGVycykNCmZpZ2h0X3NvbmdzJHllYXIgPC0gZm9ybWF0KGFzLkRhdGUoZmlnaHRfc29uZ3MkeWVhciwgZm9ybWF0PSclWScpLCIlWSIpDQpmaWdodF9zb25ncyRzcG90aWZ5X2lkIDwtIGFzLmNoYXJhY3RlcihmaWdodF9zb25ncyRzcG90aWZ5X2lkKQ0KYGBgDQoNCk5hbWUgb2YgdGhlIGNvbmZlcmVuY2UgLCBzb25nIG5hbWUsIHdyaXRlcnMsIGNvbnRlc3QsIG9wcG9uZW50cyBhbmQgc3BvdGlmeV9pZCB2YXJpYWJsZXMgYXJlIG5vdCBuZWNjZXNzYXJpbHkgcmVxdWlyZWQgZm9yIG91ciBhbmFseXNpcy4gVGhlcmUgd2VyZSA1IG1pc3NpbmcgdmFsdWVzIHdoaWNoIGFyZSByZW1vdmVkIGZyb20gdGhlIGRhdGFzZXQuIA0KDQpgYGB7cn0NCiMgc2VsZWN0IHRoZSBuZWVkZWQgY29sdW1ucw0KZmlnaHRfc29uZ3NfZGYgPC0gZmlnaHRfc29uZ3MgJT4lDQogIHNlbGVjdChzY2hvb2wsIGNvbmZlcmVuY2UsIHllYXIsIHN0dWRlbnRfd3JpdGVyLCBvZmZpY2lhbF9zb25nLCBicG0sIHNlY19kdXJhdGlvbiwgZmlnaHQsIG51bWJlcl9maWdodHMsIHZpY3RvcnksIHdpbl93b24sIHZpY3Rvcnlfd2luX3dvbiwgcmFoLCBub25zZW5zZSwgY29sb3JzLCBtZW4sIG9wcG9uZW50cywgbmNhYV93b24pDQojIHRvdGFsIG5hIHZhbHVlcyBpbiB0aGUgZGF0YXNldA0Kc3VtKGlzLm5hKGZpZ2h0X3NvbmdzX2RmKSkNCiMgd2UgY2FuIHJlbW92ZSBuYSB2YWx1ZXMNCmZpZ2h0X3NvbmdzX2RmIDwtIG5hLm9taXQoZmlnaHRfc29uZ3NfZGYpDQoNCmhlYWQoZmlnaHRfc29uZ3NfZGYpDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyBzdW1tYXJ5IG9mIHRoZSBkYXRhc2V0DQpzdW1tYXJ5KGZpZ2h0X3NvbmdzX2RmKQ0KZGVzY3JpYmUoZmlnaHRfc29uZ3NfZGYkYnBtKQ0KZGVzY3JpYmUoZmlnaHRfc29uZ3NfZGYkbnVtYmVyX2ZpZ2h0cykNCmRlc2NyaWJlKGZpZ2h0X3NvbmdzX2RmJHNlY19kdXJhdGlvbikNCg0KYGBgDQoNCkJlbG93IG91dGxpbmVzIHRoZSBiYXNpYyBtZWFzdXJlcyBvZiB0aGUgQ29sbGVnZSBGaWdodCBTb25ncyBkYXRhLg0KDQoqIEFmdGVyIHJlbW92aW5nIHRoZSA1IG9ic2VydmF0aW9ucyB0aGF0IGhhZCBtaXNzaW5nIHZhbHVlcywgb3VyIGRhdGFzZXQgaGFzIDYwIGNhc2VzIHdoaWNoIGFyZSB0aGUgbmFtZXMgb2YgdGhlIHNjaG9vbHMuDQoNCiogMzEgb2YgdGhlIHNvbmdzIGFyZSB3cml0dGVuIGJ5IGEgc3R1ZGVudC4NCg0KKiA1MyBvZiB0aGUgc29uZ3MgYXJlIG9mZmljaWFsIHNjaG9vbCBzb25ncy4NCg0KKiBBdmVyYWdlIGJlYXQgcGVyIG1pbnV0ZSBpcyAxMjYuOS4NCg0KKiBBdmVyYWdlIGR1cmF0aW9uIG9mIHRoZSBzb25ncyBpcyA3My4yMC4NCg0KKiA0MiBzb25ncyBoYXMgdGhlIHdvcmQgZmlnaHQgaW4gaXQuDQoNCiogU29uZ3MgdXNlcyBhdmVyYWdlIDIuODUgdGltZXMgdGhlIHdvcmQgImZpZ2h0Ig0KDQoqIDMxIG9mIHRoZSBzb25ncyBoYXZlIHZpY3RvcnkgaW4gaXQuDQoNCiogMTAgb2YgdGhlIHNvbmdzIGhhdmUgd29yZHMgdGhhdCBkb2VzIG5vdCBtYWtlIHNlbnNlLg0KDQoqIDIzIG9mIHRoZSBzb25ncyBoYXZlIHdvcmQgbWVuIGluIGl0Lg0KDQoqIDExIG9mIHRoZSBzb25ncyBoYXZlIG9wcG9uZW50cyB3b3JkIGluIGl0Lg0KDQoqIEF2ZXJhZ2Ugd2luIG9mIG5jYWEgaXMgNiB0aW1lcy4NCg0KDQpgYGB7cn0NCnRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpDQoNCmdncGxvdChmaWdodF9zb25nc19kZiwgYWVzKHZpY3RvcnkpKSsNCiAgZ2VvbV9iYXIoYWVzKGZpbGw9Y29uZmVyZW5jZSksIHdpZHRoPTAuNSkNCg0KYGBgDQoNClRoZSBzb25ncyB0aGF0IHVzZXMgdGhlIHdvcmQgdmljdG9yeSB0ZW5kcyB0byB1c2UgdGhlIHdvcmQgd2luIGFuZCB3b24gYXMgd2VsbC4gDQoNCmBgYHtyfQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQoNCmdncGxvdChmaWdodF9zb25nc19kZiwgYWVzKHNlY19kdXJhdGlvbikpICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbD1zdHVkZW50X3dyaXRlciksDQogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMTAsDQogICAgICAgICAgICAgICAgIGNvbD0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBzaXplPTEpDQoNCg0KYGBgDQoNCg0KVGhlIHNlYyBkdXJhdGlvbiBpcyBzbGlnaHRseSBub3JtYWwgZGlzdHJpYnV0ZWQgYW5kIHJpZ2h0IHNrZXdlZC4gDQoNCmBgYHtyfQ0KDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0KZ2dwbG90KGZpZ2h0X3NvbmdzX2RmLCBhZXMobnVtYmVyX2ZpZ2h0cykpICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbD1jb25mZXJlbmNlKSwNCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICBjb2w9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgc2l6ZT0xKQ0KDQoNCg0KYGBgDQoNClRoZSB1c2Ugb2Ygd29yZCAiZmlnaHQiIGlzIHJpZ2h0IHNrZXdlZCBhbmQgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiANCg0KYGBge3J9DQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCmdncGxvdChmaWdodF9zb25nc19kZiwgYWVzKGJwbSwgbmNhYV93b24pKSsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjUsIHNpemU9MSkNCiAgICAgICAgIA0KDQpgYGANCg0KTWFqb3JpdHkgb2YgdGhlIENvbGxnZSBGb290YmFsbCB0ZWFtcyB0aGF0IHdvbiB0aGUgTmNhYSBXb24gbW9zdCBmcmVxdWVudGx5IGhhdmUgQ29sbGVnZSBGaWdodCBTb25ncyBiZXR3ZWVuIDEzMC0xNTAgYW5kIDcwLTgwIGJwbS4gDQoNCmBgYHtyfQ0KDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0KZ2dwbG90KGZpZ2h0X3NvbmdzX2RmLCBhZXMoYnBtKSkgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikrDQogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsPWZpZ2h0KSwNCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAxMCwNCiAgICAgICAgICAgICAgICAgY29sPSJibGFjayIsDQogICAgICAgICAgICAgICAgIHNpemU9MSkNCg0KDQoNCmBgYA0KDQpJZiB3ZSBsb29rIGF0IHRoZSBicG0gPjExMCBtYXJrLCB3ZSBzZWUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gDQoNCmBgYHtyfQ0KDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0KZ2dwbG90KGZpZ2h0X3NvbmdzX2RmLCBhZXMobmNhYV93b24pKSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGw9Y29uZmVyZW5jZSksDQogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMSwNCiAgICAgICAgICAgICAgICAgY29sPSJibGFjayIsDQogICAgICAgICAgICAgICAgIHNpemU9MSkNCg0KDQoNCmBgYA0KDQpUaGUgbmNhYV93b24gdmFyaWFibGUgd2l0aGluIHRoZSBkYXRhc2V0IGlzIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4gDQoNCkJhc2VkIG9uIHRoZSBpbml0aWFsIG92ZXJ2aWV3IG9mIHRoZSBkYXRhIHNldCAsIHdlIHNlbGVjdCB0aGUgYnBtLCBzZWNfZHVyYXRpb24sIGNvbmZlcmVuY2UgYW5kIG5jYWFfd29uLiBCUE0gaXMgbnVtZXJpY2FsIHZhcmlhYmxlIHdoaWNoIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvbiBzb25nJ3Mgcnl0aG0sIHNlY19kdXJhdGlvbiBpcyBudW1lcmljYWwgdmFyaWFibGUgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBzb25nJ3MgbGVuZ3RoLCBjb25mZXJlbmNlIGlzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUsIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvbiB3aGF0IGNvbmZlcmVuY2UgdGhlIENvbGxlZ2UgdGVhbSBpcyBwYXJ0aWNpcGF0aW5nIGFuZCBuY2FhX3dvbiBudW1lcmljYWwgdmFyaWFibGUsIHdoaWNoIHByb3ZpZGVzIHVzIHRoZSBpbmZvcm1hdGlvbiBvbiBob3cgbWFueSB0aW1lcyB0aGF0IHNjaG9vbCB3b24gdGhlIG5jYWEgY2hhbm1waW9uc2hpcC4NCg0KVGhlIHBvdGVudGlhbCBleHBsbmF0b3J5IHZhcmlhYmxlcyB3ZSBmb2N1cyBvbiBhcmUgYnBtIGFuZCBzZWNfZHVyYXRpb24uIFRoZSByZXNwb25zZSB2YXJpYWJsZSBpcyBuY2FhX3dvbi4NCg0KIyMgQW5hbHl0aWNhbCBBcHByb2FjaA0KDQpUaGlzIHN0dWR5IGlzIGFuIG9ic2VydmF0aW9uYWwgc3R1ZHkuIFRoZSBjb2xsZWN0ZWQgZGF0YSBpcyBub3QgYSBjZW5zdXMgZGF0YSwgaXQgZG9lcyBub3QgaW5jbHVkZSBhbGwgdGhlIHNjaG9vbHMgYnV0IHJhdGhlciBzdWJzZXQgb2YgdGhlIHNjaG9vbHMuIFRoZSBkYXRhIGlzIG5vdCBjb2xsZWN0ZWQgcmFtZG9ubHkgYXMgdGhlIGNhc2VzIGFyZSBmcm9tIHRoZSBGaXZlIENvbmZlcmVuY2VzIGFuZCBOb3RyYWRhIERhbWUuIFRoZSBjYXNlcyBhcmUgaW5kZXBlbmRlbnQgZnJvbSBlYWNoIG90aGVyIGhvd2V2ZXIgdGhlcmUgbWlnaHQgYmUgYSBzYW1wbGluZyBiaWFzLCBzaW5jZSB0aGUgc2FtcGxlcyBhcmUgbm90IGNvbGxlY3RlZCByYW5kb21seS4gT25lIGltcG9ydGFudCBmYWN0b3IgdG8ga2VlcCBpbiBtaW5kIGlzIHRoYXQgIG1ham9yaXR5IG9mIHRoZSBzY2hvb2xzIHdoaWNoIHBhcnRpY2lwYXRlIHRoZSBjaGFtcGlvbnNoaXAgYXJlIGluY2x1ZGVkIGluIHRoZSBkYXRhc2V0LiBUaGUgY2FzZXMgZm9yIGVhY2ggY29uZmVyZW5jZSBpcyBub3JtYWxseSBkaXN0cmlidXRlZC4gDQoNClRoZSBhbmFseXNpcyBjYW4gbm90IGJlIGdlbmVyYWxpemVkIGZvciBhbGwgdGhlIHBvcHVsYXRpb24gKHdoaWNoIGlzIGFsbCB0aGUgQ29sbGVnZXMgdGhhdCBoYXMgYSBGb290YmFsbCB0ZWFtKSwgaG93ZXZlciwgY2FuIGJlIGdlbmVyYWxpemVkIGZvciB0aGUgc3Vic2VjdGlvbiBvZiB0aGUgcG9wdWxhdGlvbiB3aGljaCBpcyBhbGwgdGhlIENvbGxlZ2VzIHRoYXQgcGFydGljaXBhdGVzIGluIHRoZSBGaXZlIENvbmZlcmVuY2VzIGZvciBOQ0FBIENoYW1waW9uc2hpcC4gVGhlIFRoZSBleHBlY3RhdGlvbiBmcm9tIHRoZSBzdHVkeSBpcyB0byBmaW5kIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGV4cGxhbmF0b3J5IGZlYXR1cmUgYnBtIGFuZCByZXNwb25zZSB0YXJnZXQgdmFyaWFibGUgbmNhYV93b24uIFdlIGNhbiBzYWZlbHkgc2F5IHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgc3R1ZHkgcHJvYmFibHkgaG9sZHMgdHJ1ZSBmb3IgYWxsIHRoZSBDb2xsZWdlJ3MgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgTkNBQSBDaGFtcGlvbnNoaXAgd2l0aGluIHRoZSBGaXZlIENvbmZlcmVuY2VzLiBUaGlzIHN0dWR5IGlzIG5vdCBhbiBleHBlcmltZW50aWFsIGRlc2lnbiBhcyB0aGVyZSBpcyBubyBjb250cm9sIGdyb3VwLiBUaGUgc2FtcGxpbmcgY2FwdHVyZXMgbW9zdCBvZiB0aGUgcG9wdWxhdGlvbiBvZiBzY2hvb2xzIGFuZCBleHBlY3RlZCBjb25jbHVzaW9uIGlzIGNhc3VhbCBhbmQgcG9zc2libHkgbWlnaHQgYmUgZ2VuZXJhbGl6ZWQuIA0KDQojIyMgSHlwb3RoZXNpcw0KDQpCYXNlZCBvbiB0aGUgYnVzaW5lc3MgcHJvYmxlbSBpbiBxdWVzdGlvbiwgb3VyIGh5cG90aGVzaXMgaXMgYXMgZm9sbG93cy4NCg0KJEhfezB9OiQgQ29sbGVnZSBGaWdodCBTb25nIEF0dHJpYnV0ZXMgY2FuIGJlIHByZWRpY3RpdmUgb2YgTkNBQSBjaGFtcGlvbnNoaXAuDQoNCiRIX3sxfTokIENvbGxlZ2UgRmlnaHQgU29uZyBBdHRyaWJ1dGVzIGNhbiBub3QgYmUgcHJlZGljdGl2ZSBvZiBOQ0FBIGNoYW1waW9uc2hpcC4NCg0KDQojIyBEYXRhIEV4cGxvcmF0aW9uDQoNCmBgYHtyfQ0KIyBjcmVhdGUgdGhlIGRhdGFmcmFtZSB3aXRoIG9ubHkgdGhlIHZhcmlhYmxlcyB3ZSBuZWVkDQoNCmZpZ2h0X3NvbmdzX2RmXzIgPC0gZmlnaHRfc29uZ3NfZGYgJT4lDQogIHNlbGVjdChzY2hvb2wsIGNvbmZlcmVuY2UsYnBtLCBzZWNfZHVyYXRpb24sIG5jYWFfd29uKQ0KDQpoZWFkKGZpZ2h0X3NvbmdzX2RmXzIpDQpkZXNjcmliZShmaWdodF9zb25nc19kZl8yKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiMgc2VlIGNvcnJlbGF0aW9uIGJldHdlZW4gYnBtIGFuZCBuY2FhX3dvbg0Kb3B0aW9ucyhzY2lwZW49OTk5KQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQoNCmdncGxvdChmaWdodF9zb25nc19kZl8yLCBhZXMoYnBtLCBuY2FhX3dvbikpKw0KICBnZW9tX3BvaW50KGFlcyhjb25mZXJlbmNlLCBzaXplPXNlY19kdXJhdGlvbikpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KDQpvcHRpb25zKHNjaXBlbj05OTkpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0KZ2dwbG90KGZpZ2h0X3NvbmdzX2RmXzIsIGFlcyhzZWNfZHVyYXRpb24sIG5jYWFfd29uKSkrDQogIGdlb21fcG9pbnQoKQ0KDQoNCg0KYGBgDQoNCg0KYGBge3J9DQojIHNlZSBsaW5lYXJpdHkgYW5kIGRpc3RyaWJ1dGlvbg0KDQpxcW5vcm0oZmlnaHRfc29uZ3NfZGZfMiRicG0pDQpxcWxpbmUoZmlnaHRfc29uZ3NfZGZfMiRicG0pDQpoaXN0KGZpZ2h0X3NvbmdzX2RmXzIkYnBtKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiMgZmlsdGVyIGJwbSBhYm92ZSAxMTAgdG8gc2ltdWxhdGUgbm9ybWFsIGRpc3RyaWJ1dGlvbg0KDQpmaWdodF9zb25nc19kZl8zIDwtIGZpbHRlcihmaWdodF9zb25nc19kZl8yLCBmaWdodF9zb25nc19kZl8yJGJwbSA+MTEwKQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQoNCmdncGxvdChmaWdodF9zb25nc19kZl8zLCBhZXMoYnBtKSkgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikrDQogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsPWNvbmZlcmVuY2UpLA0KICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IDEwLA0KICAgICAgICAgICAgICAgICBjb2w9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgc2l6ZT0xKQ0KDQoNCg0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KcXFub3JtKGZpZ2h0X3NvbmdzX2RmXzMkYnBtKQ0KcXFsaW5lKGZpZ2h0X3NvbmdzX2RmXzMkYnBtKQ0KDQpgYGANCg0KDQpXaGVuIHdlIGxvb2sgYXQgdGhlIGJwbSBhYm92ZSAxMTAsIHdlIHNlZSB0aGF0IGl0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCB0aGVyZSBhcmUgc29tZSByZXNpZHVhbHMgdG93YXJkcyBib3RoIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBsaW5lLiANCg0KYGBge3J9DQoNCnFxbm9ybShmaWdodF9zb25nc19kZl8zJHNlY19kdXJhdGlvbikNCnFxbGluZShmaWdodF9zb25nc19kZl8zJHNlY19kdXJhdGlvbikNCmhpc3QoZmlnaHRfc29uZ3NfZGZfMyRzZWNfZHVyYXRpb24pDQoNCg0KYGBgDQoNCg0KV2hlbiB3ZSBsb29rIGF0IHRoZSBzZWNfZHVyYXRpb24gLCB3ZSBzZWUgdGhhdCBpdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgdGhlcmUgYXJlIHNvbWUgcmVzaWR1YWxzIHRvd2FyZHMgdGhlIHRvcCBvZiB0aGUgbGluZS4gDQoNClRoZSBzYW1wbGUgc2l6ZSBpcyA2MCwgdGhlIGRhdGFzZXQgZm9yIGJwbSBmb2xsb3dzIGNsb3NlIHRvIG5vcm1hbCBkaXN0cmlidXRpb24gYW5kIHNhbXBsZSBzZXQgYXJlIHJhbmRvbWx5IHNlbGVjdGVkIGZvciBGaXZlIGNvbmZlcmVuY2UgQ29sbGVnZSBGaWdodCBTb25ncy4gDQoNCiMjIE1vZGVsIERldmVsb3BtZW50DQoNCkJhc2VkIG9uIG91ciBhbmFseXRpY2FsIGFwcHJvYWNoLCB3ZSB1c2Ugc2ltcGxlIHJlZ3Jlc3Npb24gbW9kZWwuIA0KDQpgYGB7cn0NCg0KDQpvcHRpb25zKHNjaXBlbj05OTkpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0KZ2dwbG90KGZpZ2h0X3NvbmdzX2RmXzMsIGFlcyhicG0sIG5jYWFfd29uKSkrDQogIGdlb21fcG9pbnQoKQ0KDQpjb3IoZmlnaHRfc29uZ3NfZGZfMyRicG0sIGZpZ2h0X3NvbmdzX2RmXzMkbmNhYV93b24pDQpjb3IoZmlnaHRfc29uZ3NfZGZfMyRzZWNfZHVyYXRpb24sIGZpZ2h0X3NvbmdzX2RmXzMkbmNhYV93b24pDQoNCmBgYA0KDQoNClRoZXJlIGlzIGEgdmVyeSB3ZWFrICwgbmVnYXRpdmUgbGluZWFyIGNvcnJlbGF0aW9uIGJldHdlZW4gYnBtIGFuZCBuY2FhX3dvbiAsIGV4cGxhbnRvcnkgYW5kIHJlc3BvbnNlIHZhcmlhYmxlLiBUaGVyZSBpcyBhbG1vc3Qgbm8gbGluZWFyIGNvcnJlbGF0aW9uIGJldHdlZW4gc2VjX2R1cmF0aW9uIGFuZCBuY2FhX3dvbi4gDQoNCmBgYHtyfQ0KIyBjcmVhdGluZyByZWdycmVzaW9uIG1vZGVsDQoNCm1vZGVsIDwtIGxtKG5jYWFfd29uIH4gYnBtLCBkYXRhID0gZmlnaHRfc29uZ3NfZGZfMykNCnN1bW1hcnkobW9kZWwpDQoNCg0KDQpgYGANCg0KIyMgTW9kZWwgRXZhbHVhdGlvbg0KDQpgYGB7cn0NCg0KIyBjaGVjayBmb3IgbGluZWFyaXR5IG9mIHRoZSBtb2RlbA0KDQpxcW5vcm0obW9kZWwkcmVzaWR1YWxzKQ0KcXFsaW5lKG1vZGVsJHJlc2lkdWFscykNCmhpc3QobW9kZWwkcmVzaWR1YWxzKQ0KDQpgYGANCg0KDQoNClRoZSBtb2RlbCBtZWV0cyB0aGUgbGluZWFyaXR5LCBuZWFybHkgbm9ybWFsIHJlc2lkdWFscyBjb25kaXRpb24uIFRoZSBzdHJlbmd0aCBvZiB0aGUgZml0IGRlZmluZWQgYnkgJFJeMiQgaXMgMC4wMjAgd2hpY2ggaXMgbm90IHRoYXQgc3Ryb25nLiAyJSBvZiB0aGUgdmFyaWFibGl0eSBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSBOQ0FBIGNoYW1waW9uc2hpcCB2YXJpYWJsZSB3aXRoaW4gdGhlIG1vZGVsLiANCg0KDQojIyBDb25jbHVzaW9uDQoNCk91ciBzdHVkeSBvZiBDb2xsZWdlIEZpZ2h0IFNvbmdzIGZpbmRpbmdzIGFyZSBhcyBmb2xsb3c7DQoNCiogVGhlIHN0cmVuZ3RoIG9mIHRoZSBtb2RlbCBmaXQgZGVmaW5lZCBieSAkUl4yJCBpcyAwLjAyMCB3aGljaCBpcyBub3QgdGhhdCBzdHJvbmcuIDIlIG9mIHRoZSB2YXJpYWJsaXR5IGNhbiBiZSBleHBsYWluZWQgYnkgdGhlIE5DQUEgY2hhbXBpb25zaGlwIHZhcmlhYmxlIHdpdGhpbiB0aGUgbW9kZWwuIA0KDQoqIFAgdmFsdWUgaXMgbm90IGxvdyBwLXZhbHVlIHdoaWNoIG1lYW5zIGJwbSBleHBsYW50b3J5IHZhcmlhYmxlIGlzIG5vdCBhIGdvb2QgcHJlZGljdG9yLiANCg0KKiBFdmVyeSBhZGRpdGlvbmFsIGJwbSBpbmNyZWFzZSAsIHdlIGNhbiBleHBlY3QgdG8gcmVkdWNlIG5jYWEgY2hhbXBpb25zaGlwIGJ5IDEuIA0KDQoqIFdpdGggc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uLCB3ZSBjYW4gbm90IHNlbGVjdCBhdmFpbGFibGUgQ29sbGVnZSBGaWdodCBTb25nIEF0dHJpYnV0ZXMgdG8gcHJlZGljdCB0aGUgdmljdG9yeSBvZiBOQ0FBIENoYW1waW9uc2hpcCBjb25mZXJlbmNlLiBXZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4g