Project Introduction

For MAT147 Final Project, our group chose the “Sports” category with a focus on baseball. Specifically, we aim to tell the story of Hall of Fame player and former Red Sox pitching ace Pedro Martinez. In a sport with a rich history of data-driven analytics, Pedro Martinez stands out as one of the greatest players to ever grace America’s pastime. It is our aim as a group to visualize his dominance and tell his story through his stats.

Introduction to Sabermetrics

Defined by the Society for American Baseball Research (SABR) as “the search for objective knowledge about baseball”, Sabermetrics is a form of statistical analysis that has become the norm in Major League Baseball. In 1981, STATS inc. was created which helped teams electronically and more closely analyze statistics. These methods paved the way to amazing stories such as Michael Lewis’s best-selling novel “Moneyball”, detailing the exploits of the 2002 Oakland Athletics and General Manager Billy Beane. It highlights the Athletics use of Sabermetrics in producing a playoff caliber team despite their small budget ($41,000,000; Ranked 28th out of 30 teams). Data Scientists have become the hottest commodity as teams are now pivoting from traditional scouting and development methods in favor of cold hard stats. Front offices and scouting departments have found value in Sabermetrics for its ability to identify quality players using objective methods as opposed to having an “eye for talent”.

While statistical analysis regarding the bat-and-ball sport has existed since the invention of box scoring in 1858, Sabermetrics provides a way for both fans and statisticians alike to better understand the sport through an objective lens. Sabermetrics uses in depth, electronically calculated statistics and has been around since about the 1980’s. A simple way to put it would be that Sabermetrics is used to help teams analyze the “science of winning”. For example, lets say we’re coaching a team that’s winning 2-1 with 2 outs in the 9th inning. Up to bat a known home-run hitter who has a batting average of around .410 when facing right-handed pitchers, but drops to a .211 against left-handed ones. You’d know the smart thing to do would be to call in a left-handed relief pitcher (sometimes known as a specialist) and increase your odds of recording the final out and winning the game.

Its game-changing outlook on the sport was not met without it’s fair share of controversy. Critics argue that the widespread adoption of data analytics within the Major Leagues fails to account for things that cannot be measured with numbers, such as grit, heart, luck and experience. While at first it’s a seemingly antiquated argument, it does have its merits. Baseball is a game where anything goes, and sometimes there exists a dark horse team that defies all the odds and wins it all. The 2019 Washington Nationals started the season with a 19-31 record and were one of the worst teams in all of baseball. They had also lost their superstar outfielder Bryce Harper to the division rival Philadelphia Phillies during the off-season, resulting in a lack of substantial power hitting and outfield defense. In a stunning turn of events, the team managed to recover halfway through the season with a 93-69 record. This recovery lead to them making the playoffs as a Wild Card team. In the 8th inning, down 3-1 with two outs in a winner-take-all game against the Milwaukee Brewers, the Nationals rallied to score 3 runs thanks to a fielding error by Milwaukee outfielder Trent Grisham. They then went on to defeat two juggernaut teams in the Los Angeles Dodgers (106-56) and Houston Astros (107-55) to win their first ever World Series trophy.

Sabermetrics, Steroids, and Strikeouts: Why Pedro’s exellence stands above all

Many of the games legends hold multiple numerical records. These records provide context for the talent and athletic ability of many baseball greats. There exists the traditional records, such as Cy Young’s 511 career wins, Ty Cobb’s .366 Batting Average, and Ichiro’s 262 base hits in a single season (A record previously upheld for 84 years). Then there exists the more objective statistical records that merely solidify the position of the greats. Babe Ruth’s career .690 Slugging Percentage (SLG) and 1.164 On-base + Slugging (OPS), and Ed Walsh’s 1.82 career ERA are examples.

Of all these greats, there is few as dominant and memorable as Pedro Martinez. Hailing from Manoguayabo, Dominican Republic, the eight time all-star holds several impressive accolades from his 18 year major league career. From his 3 Cy Young Awards, 5 League-Best ERA seasons, 2004 World Series Championships, and a plaque at the Hall of Fame in Cooperstown, he made his case to many as one of the greatest pitchers of all time. Pedro Martinez dominated hitters for 18 seasons with a devastating five-pitch repertoire, including three different types of fastballs. Currently he holds the Major League record in single-season WHIP (0.7370) and ERA+ for starting pitchers so far (154) along with many other impressive stats.

While these stats are already impressive in normal circumstances, the era in which they occurred make them stand out even more. Pedro Martinez career lasted between from 1992-2009. This time in major league history is what was known as the “Steroid Era” of baseball. As the name suggests, many batters were using banned substances (such as anabolic steroids), coinciding with a surge of hits and home runs to an all time high. Examples of this would be Sammy Sosa and Mark McGwire’s home run race in 1998 and Barry Bonds becoming the single season home run champion with 73 in 1998. Bonds himself also became the all-time home run champion, passing Hank Aaron after he hit his 756th home run in 2007. Pedro Martinez pitched during the height of this era and still was one of the most dominant pitchers of all time. This is played up with a very high strikeout rate and tendency to not give up very many walks or runs throughout his illustrious, Hall of Fame career. What we plan on showing with Pedro Martinez’s career statistics is how dominant he truly was, during the peak of the home run era in the 150+ years of Major League Baseball.

Information about Data

The data was gathered from the Baseball-Reference page of Pedro Martinez (https://www.baseball-reference.com/players/m/martipe02.shtml). Baseball-Reference is powered by Stathead, the industry standard in sports data analysis. All the data presented is cross-checked and verified with publicly available information from Major League Baseball. Data pulled from Baseball-Reference is copied directly as raw data from the website, interpreted using read_csv.

There are 18 units of observation, coinciding with the 18 years Pedro Martinez played in the Major Leagues. There are 35 variables made up of various categorical and numerical baseball statistics. Examples of these include ERA, WHIP, and SO (Numerical) and Team/Tm, Year, and Awards (Categorical).

Pedro Martinez Baseball-Reference

Martinez <- read_csv("Year,Age,Tm,Lg,W,L,W-L%,ERA,G,GS,GF,CG,SHO,SV,IP,H,R,ER,HR,BB,IBB,SO,HBP,BK,WP,BF,ERA+,FIP,WHIP,H9,HR9,BB9,SO9,SO/W,Awards
1992,20,LAD,NL,0,1,.000,2.25,2,1,1,0,0,0,8.0,6,2,2,0,1,0,8,0,0,0,31,163,1.16,0.875,6.8,0.0,1.1,9.0,8.00,
1993,21,LAD,NL,10,5,.667,2.61,65,2,20,0,0,2,107.0,76,34,31,5,57,4,119,4,1,3,444,146,3.08,1.243,6.4,0.4,4.8,10.0,2.09,RoY-9
1994,22,MON,NL,11,5,.688,3.42,24,23,1,1,1,1,144.2,115,58,55,11,45,3,142,11,0,6,584,124,3.32,1.106,7.2,0.7,2.8,8.8,3.16,
1995,23,MON,NL,14,10,.583,3.51,30,30,0,2,2,0,194.2,158,79,76,21,66,1,174,11,2,5,784,123,3.90,1.151,7.3,1.0,3.1,8.0,2.64,
1996,24,MON,NL,13,10,.565,3.70,33,33,0,4,1,0,216.2,189,100,89,19,70,3,222,3,0,6,901,117,3.27,1.195,7.9,0.8,2.9,9.2,3.17,AS
1997,25,MON,NL,17,8,.680,1.90,31,31,0,13,4,0,241.1,158,65,51,16,67,5,305,9,1,3,947,219,2.39,0.932,5.9,0.6,2.5,11.4,4.55,ASCYA-1MVP-16
1998,26,BOS,AL,19,7,.731,2.89,33,33,0,3,2,0,233.2,188,82,75,26,67,3,251,8,0,9,951,163,3.40,1.091,7.2,1.0,2.6,9.7,3.75,ASCYA-2MVP-21
1999,27,BOS,AL,23,4,.852,2.07,31,29,1,5,1,0,213.1,160,56,49,9,37,1,313,9,0,6,835,243,1.39,0.923,6.8,0.4,1.6,13.2,8.46,ASCYA-1MVP-2
2000,28,BOS,AL,18,6,.750,1.74,29,29,0,7,4,0,217.0,128,44,42,17,32,0,284,14,0,1,817,291,2.17,0.737,5.3,0.7,1.3,11.8,8.88,ASCYA-1MVP-5
2001,29,BOS,AL,7,3,.700,2.39,18,18,0,1,0,0,116.2,84,33,31,5,25,0,163,6,0,4,456,188,1.61,0.934,6.5,0.4,1.9,12.6,6.52,
2002,30,BOS,AL,20,4,.833,2.26,30,30,0,2,0,0,199.1,144,62,50,13,40,1,239,15,0,3,787,202,2.24,0.923,6.5,0.6,1.8,10.8,5.98,ASCYA-2MVP-20
2003,31,BOS,AL,14,4,.778,2.22,29,29,0,3,0,0,186.2,147,52,46,7,47,0,206,9,0,5,749,211,2.21,1.039,7.1,0.3,2.3,9.9,4.38,CYA-3MVP-22
2004,32,BOS,AL,16,9,.640,3.90,33,33,0,1,1,0,217.0,193,99,94,26,61,0,227,16,0,2,903,124,3.58,1.171,8.0,1.1,2.5,9.4,3.72,CYA-4
2005,33,NYM,NL,15,8,.652,2.82,31,31,0,4,1,0,217.0,159,69,68,19,47,3,208,4,0,4,843,146,2.95,0.949,6.6,0.8,1.9,8.6,4.43,AS
2006,34,NYM,NL,9,8,.529,4.48,23,23,0,0,0,0,132.2,108,72,66,19,39,2,137,10,1,2,550,98,4.05,1.108,7.3,1.3,2.6,9.3,3.51,AS
2007,35,NYM,NL,3,1,.750,2.57,5,5,0,0,0,0,28.0,33,11,8,0,7,1,32,2,0,1,128,169,1.92,1.429,10.6,0.0,2.3,10.3,4.57,
2008,36,NYM,NL,5,6,.455,5.61,20,20,0,0,0,0,109.0,127,70,68,19,44,3,87,6,1,2,493,75,5.18,1.569,10.5,1.6,3.6,7.2,1.98,
2009,37,PHI,NL,5,1,.833,3.63,9,9,0,0,0,0,44.2,48,18,18,7,8,0,37,4,0,0,191,117,4.28,1.254,9.7,1.4,1.6,7.5,4.63,
")

kbl(Martinez) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Year Age Tm Lg W L W-L% ERA G GS GF CG SHO SV IP H R ER HR BB IBB SO HBP BK WP BF ERA+ FIP WHIP H9 HR9 BB9 SO9 SO/W Awards
1992 20 LAD NL 0 1 0.000 2.25 2 1 1 0 0 0 8.0 6 2 2 0 1 0 8 0 0 0 31 163 1.16 0.875 6.8 0.0 1.1 9.0 8.00 NA
1993 21 LAD NL 10 5 0.667 2.61 65 2 20 0 0 2 107.0 76 34 31 5 57 4 119 4 1 3 444 146 3.08 1.243 6.4 0.4 4.8 10.0 2.09 RoY-9
1994 22 MON NL 11 5 0.688 3.42 24 23 1 1 1 1 144.2 115 58 55 11 45 3 142 11 0 6 584 124 3.32 1.106 7.2 0.7 2.8 8.8 3.16 NA
1995 23 MON NL 14 10 0.583 3.51 30 30 0 2 2 0 194.2 158 79 76 21 66 1 174 11 2 5 784 123 3.90 1.151 7.3 1.0 3.1 8.0 2.64 NA
1996 24 MON NL 13 10 0.565 3.70 33 33 0 4 1 0 216.2 189 100 89 19 70 3 222 3 0 6 901 117 3.27 1.195 7.9 0.8 2.9 9.2 3.17 AS
1997 25 MON NL 17 8 0.680 1.90 31 31 0 13 4 0 241.1 158 65 51 16 67 5 305 9 1 3 947 219 2.39 0.932 5.9 0.6 2.5 11.4 4.55 ASCYA-1MVP-16
1998 26 BOS AL 19 7 0.731 2.89 33 33 0 3 2 0 233.2 188 82 75 26 67 3 251 8 0 9 951 163 3.40 1.091 7.2 1.0 2.6 9.7 3.75 ASCYA-2MVP-21
1999 27 BOS AL 23 4 0.852 2.07 31 29 1 5 1 0 213.1 160 56 49 9 37 1 313 9 0 6 835 243 1.39 0.923 6.8 0.4 1.6 13.2 8.46 ASCYA-1MVP-2
2000 28 BOS AL 18 6 0.750 1.74 29 29 0 7 4 0 217.0 128 44 42 17 32 0 284 14 0 1 817 291 2.17 0.737 5.3 0.7 1.3 11.8 8.88 ASCYA-1MVP-5
2001 29 BOS AL 7 3 0.700 2.39 18 18 0 1 0 0 116.2 84 33 31 5 25 0 163 6 0 4 456 188 1.61 0.934 6.5 0.4 1.9 12.6 6.52 NA
2002 30 BOS AL 20 4 0.833 2.26 30 30 0 2 0 0 199.1 144 62 50 13 40 1 239 15 0 3 787 202 2.24 0.923 6.5 0.6 1.8 10.8 5.98 ASCYA-2MVP-20
2003 31 BOS AL 14 4 0.778 2.22 29 29 0 3 0 0 186.2 147 52 46 7 47 0 206 9 0 5 749 211 2.21 1.039 7.1 0.3 2.3 9.9 4.38 CYA-3MVP-22
2004 32 BOS AL 16 9 0.640 3.90 33 33 0 1 1 0 217.0 193 99 94 26 61 0 227 16 0 2 903 124 3.58 1.171 8.0 1.1 2.5 9.4 3.72 CYA-4
2005 33 NYM NL 15 8 0.652 2.82 31 31 0 4 1 0 217.0 159 69 68 19 47 3 208 4 0 4 843 146 2.95 0.949 6.6 0.8 1.9 8.6 4.43 AS
2006 34 NYM NL 9 8 0.529 4.48 23 23 0 0 0 0 132.2 108 72 66 19 39 2 137 10 1 2 550 98 4.05 1.108 7.3 1.3 2.6 9.3 3.51 AS
2007 35 NYM NL 3 1 0.750 2.57 5 5 0 0 0 0 28.0 33 11 8 0 7 1 32 2 0 1 128 169 1.92 1.429 10.6 0.0 2.3 10.3 4.57 NA
2008 36 NYM NL 5 6 0.455 5.61 20 20 0 0 0 0 109.0 127 70 68 19 44 3 87 6 1 2 493 75 5.18 1.569 10.5 1.6 3.6 7.2 1.98 NA
2009 37 PHI NL 5 1 0.833 3.63 9 9 0 0 0 0 44.2 48 18 18 7 8 0 37 4 0 0 191 117 4.28 1.254 9.7 1.4 1.6 7.5 4.63 NA

Statistical Definitions

W-L% (Win to Loss Percentage) is the percentage of wins divided by the number of starts in a season (no decisions are a rare case in this stat and do not count as a “start”) Ex) if a pitcher had 15 starts that qualified in a season, and had 10 wins, their W-L% would be 10/15=0.667, or 66.7%

ERA (Earned Run Average) is one of the most important stats for pitchers. It is the average of earned runs allowed by a pitcher if the whole season was condensed to a 9-inning game. Ex) if a pitcher pitched 9 innings in a season and only gave up one run, their ERA is 1.00, but if they pitched 3 innings and gave up 1 run, then their ERA would be 3.00, since that 1 run in 3 innings is equivalent to 3 runs in 9 innings.

G (Games) the total games in a season a player participated in

GS (Games Started) total games in a season a player started in

GF (Games Finished) total games in a season where a pitcher was the last pitcher used for their team. If a pitcher started a game and threw a complete game, they do not get credited for a finished game.

CG (Complete Games) total games in a season where a pitcher started and finished the game.

SHO (Shutouts) complete games where a pitcher gave up 0 earned runs.

SV (Saves) a save occurs when a relief pitcher comes into a game when leading by no more than three runs and must pitch at least 1 inning with the potential to face the tying run. A save is recorded when that pitcher finishes the game.

IP (Innings Pitched) the total number of innings pitched by a pitcher in a season. ex) if a pitcher throws 234 and gets 2 outs of the 235th inning, they will be credited with 234 2/3 innings, or 234.2 innings.

H (Hits Allowed) total number of hits allowed in a season

R (Runs Allowed) total number of runs allowed in a season, earned and unearned.

ER (Earned Runs Allowed) total number of earned runs allowed in a season.

HR (Home Runs Allowed) total number of home runs allowed in a single season.

BB (Walks) total number of walks allowed in a single season.

IBB (Intentional Walks) total number of intentional walks in a season. An intentional walk is when the batter and opposing team are aware that a walk will occur, this usually happens to try to set up a doubly play, or the pitcher believes that the batter is going to perform well in the given at-bat.

SO (Strikeouts) total number of strikeouts in a season

HBP (Hit By Pitch) total numbers of times a pitcher hits opposing batters in a season.

BK (Balks) a balk occurs when there is at least one baserunner, and the pitcher performs an illegal movement when on the mound while they are in the set, a pitcher becomes set when both feet are touching the mound. Ex) an example of a balk would be if there was a baserunner on first base, and once the pitcher is in the set, they flinch. The baserunner would then be awarded second base as a result.

WP (Wild Pitches) Wild pitches could be described as an error committed by the pitcher. A wild pitch is any pitch that gets past the catcher that is not the catcher’s fault.

BF (Batters Faced) the total number of opponents faced in a single season.

ERA+ (“Normalized” ERA) this stat takes a pitcher’s ERA for a season and normalizes it across all other pitchers’ ERAs within the league. The league average is always 100 when this stat is calculated, so if a pitcher’s ERA+ is 125, then they have a 25% better ERA than the league average.

FIP (Fielding Independent Pitching) FIP is a newer stat which is calculates the average of a pitchers “true outcomes” which are homers, strikeouts, and walks (walks allowed by pitching ball 4 or hitting the batter). The stat is calculated by {[13*HR]+[3*(BB+HBP)]-[2*K]}/IP. FIP will end up looking like an ERA. 3.2 is the average FIP, similar to the average ERA, which is about 4.3.

WHIP (Walks and Hits per Innings Pitched) This is likely to be the most important stats to judge how good a pitcher actually is. The stat is calculated by adding up the total number of walks and hits allowed and that sum is divided by the total number of innings pitched. A good WHIP is anywhere less than 1.20 H9 (Hits per 9) Average number of hits given up in a 9-inning start.

HR9 (Home Runs per 9) Average number of home runs given up in a 9-inning start.

BB9 (Walks per 9) Average number of walks given up in a 9-inning game.

SO9 (Strikeouts per 9) Average number of strikeouts in a 9-inning game.

SO/W (Strikeout to Walk Ratio) the total number of strikeouts in a season divided by the total number of walks given up in a single season.

Swing and a miss: Pedro Martinez & the Strikeout

If you were to ask someone who watched baseball in the late 1990’s what the most impressive thing they saw was, chances are you’d hear about the litany of home runs. The steroid era of baseball lead to an unprecedented rise in the long ball, with the iconic “home run race” between sluggers Sammy Sosa and Mark McGwire serving as the main attraction. For Sosa and McGwire, it was a good thing that they were in the National League and Pedro in the American League. When the two leagues met in the annual All-Star Game in 1999, it was Pedro Martinez who got the start for the American League. Under the shadow of the Green Monster in Pedro’s home field Fenway Park, he pitched 2 scoreless innings, striking out 5 of 6 batters faced. Among them included both McGwire and Sosa and future Hall of Famers Barry Larkin, Larry Walker, and Jeff Bagwell. In a world where batters smashed balls with superhuman ability, Pedro Martinez was there to keep them grounded with some of the nastiest pitching in the league. With a career 3,154 strikeouts, Pedro could turn even the most experienced batter into a fool.

plot(Martinez$Year, Martinez$SO, xlab="Year", ylab="Frequency", main="Strikeouts (SO) Per Season", type="o", col="darkred")+
  grid()

## integer(0)
# Strikeout summary
summary(Martinez$SO)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     8.0   123.5   190.0   175.2   236.0   313.0

Here we can visualize just how dominant Pedro was with striking out the opposition. With the exception of his first season where he served mainly in relief, he showed a high progression in the number of recorded strikeouts. When looking at a summary of Pedro’s strikeouts, we find that he had a mean of 175.22 strikeouts. We’ll save this mean for a later calculation.

He managed to hit two distinct peaks in 1997 and 1999, coinciding with the height of the steroid era. As you may recall, 1999 also happened to be the season he made history with his 5 strikeout All Star performance. The prime of Pedro Martinez’s career, where he had his best strikeout seasons, was also at the height of an era that saw batters breaking home run records. As his career carried on, his strikeout numbers naturally regressed. One interesting outlier is his 2001 season, which shows a low strikeout season as a result of a rotator-cuff injury benching him for most of the year. His last three seasons in New York and Philadelphia were riddled with injury, relegating the former World Series champion into a veteran pitching role.

plot(Martinez$Year, Martinez$SO, xlab="Year", ylab="Frequency", main="Strikeouts (SO) vs Walks (BB) Per Season", type="o", col="darkred")+
lines(Martinez$Year, Martinez$BB, type="o", col="darkblue")+
  grid()

## integer(0)
# Walk summary
summary(Martinez$BB)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   33.25   44.50   42.22   60.00   70.00

What made Pedro such a dominant strikeout pitcher was his low tendency to walk batters. We can see above Pedro’s Walks (BB) per season we’re significantly lower than his strikeouts. When looking at a summary of Pedro’s career walks to strikeouts, we find that the mean of walks is 42.22. This can be attributed to not only the increase in players swinging for the fences, but also in his pitching style. Pedro threw five pitches with tremendous success; a four-seam fastball, two-seam fastball, cutter, curveball, and circle-changeup. Pedro’s fastball would register up to 98mph, where he’d then throw one of his two off-speed pitches to trick batters into swinging early. He also had excellent control of his pitches, rarely missing the strike zone. All those combined to make Pedro a menace on the mound for opposing batters.

Earlier we found the mean for strikeouts at 175.22 and mentioned it’s use for a later calculation. Baseball is a sport that adores math, and there exists a ranking for pitchers known as the Strikeout-to-walk ratio. This ratio is calculated by dividing the career average/mean of a pitchers strikeouts to their career average/mean walks (SO/BB). When dividing the two means we find that Pedro’s Strikeout-to-walk ratio becomes 4.15. This ties him for 4th best in MLB history among retired players and the 13th best when accounting for currently active pitchers through 2021.

The Hall Of Fame stat: Pedro Martinez & ERA

For baseball writers submitting their ballots to Cooperstown, there may not be a more important pitching statistic to them as Earned Run Average. The average ERA for consideration to the Hall is a 3.00, and none of the 81 pitchers currently inducted have a career ERA below 4.00 (Jack Morris holds the highest at 3.90).

ggplot(Martinez, aes(x=Year, y=ERA), xlab="Year", ylab="Earned Run Average (ERA)")+
  geom_point(col="red")+geom_smooth(color="darkorchid4")+
  ggtitle("Pedro Martinez ERA Per Season")+
  theme_bw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

  cor.test(Martinez$ERA, Martinez$Year, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  Martinez$ERA and Martinez$Year
## t = 1.7132, df = 16, p-value = 0.106
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.08962745  0.72696124
## sample estimates:
##       cor 
## 0.3937175

The regression line shows a positive correlation in conjunction with the scatterplot. This is also shown in the Pearson r value with a 95% confidence interval being 0.39, a medium correlation. As Pedro’s career progressed into his 18th season, his ERA regressed. Since a lower score indicates better seasonal production, a increasing ERA/positive correlation translates into a seasonal and career regression for Pedro. There are two noticeable outliers within this scatterplot; his ERA in 2000 and in 2008. Pedro Martinez recorded a 1.74 ERA in 2000. This is not only the best single season of his career, just merely beating out his 1994 Season, but also one of the bests single-season pitching performances of all time. He posted his worst single season ERA in 2008 with a 5.61 during his final year with the New York Mets. While a 5.61 is not necessarily bad, it is a long departure from his previous years. A multitude of factors play into this, including age, injury, and relegation as a bottom-of-the-rotation starter/relief pitcher. In the end, Pedro finished his career with an 2.93 ERA, placing him 43rd all time among pitchers and comfortably in the Hall of Fame.

The Darkhorse stat: Pedro Martinez & Fielding Independent Pitching

Unlike ERA, Fielding Independent Pitching (FIP) removes the assistance of fielders when recording a pitchers performance. It calculates the average of a pitchers “three true outcomes” which are homers, strikeouts, and walks. Detractors will often look at FIP as sometimes unreliable when compared to other advanced metrics such as ERA+, which takes playing conditions into account for ERA. While FIP is not perfect, it is meant to be a fair assessment of an individual pitchers performance without the outside interference of fielders. The null hypothesis here being that a pitchers FIP will fall closely in line with their ERA.

ggplot(Martinez, aes(x=Year, y=ERA), xlab="Year", ylab="Earned Run Average (ERA)")+
  geom_point(col="red")+geom_smooth(color="darkorchid4")+
  geom_point(aes(x=Year, y=FIP), col="blue")+
  ggtitle("Pedro Martinez ERA Per Season")+
  theme_bw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

# T-Test between ERA and FIP.
t.test(Martinez$ERA, Martinez$FIP)
## 
##  Welch Two Sample t-test
## 
## data:  Martinez$ERA and Martinez$FIP
## t = 0.29719, df = 33.803, p-value = 0.7681
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.6066726  0.8144504
## sample estimates:
## mean of x mean of y 
##  2.998333  2.894444

Above we see Pedro’s FIP alongside his ERA. When looking at the graph, we find that his FIP is very close with his ERA, with some seasons seeing a near overlap. In 1999 Pedro Martinez recorded a 1.39 FIP, a major league record that has stood since. When conducting a two sample t-test with 95% confidence interval, we find the p-value to be 0.7681. The mean of x(ERA) is 2.99 while mean of y(FIP) is 2.89. This indicates that the null hypothesis is true and that FIP falls closely in line with ERA.

Conclusions

Numbers don’t always tell the full story. While Pedro’s 2000 season is often considered one of the best seasons ever pitched, he and the Red Sox missed out on a shot at the World Series. Despite a historic performance by Boston’s Ace, the Red Sox went 85-77 placing in 2nd place in their division and missing out on the last playoff spot to the 91-71 Seattle Mariners. It wasn’t until 2004 that the Red Sox made history and won the World Series for their first time in 86 years. How did Pedro Martinez fair that year? He was the Sox #2 pitcher, the title of Ace now belonging to Curt Schilling, was not voted as an All-Star, and posted a 3.90 ERA. Despite all those achievements and records, baseball will always remain a team sport where even the greatest players of all time can go long periods without ever being a champion. Pedro is one of those who managed to be both.

While he may not have had as many wins as his contemporaries, there is no denying that when Pedro was at his peak there was no one else near him. All in all, Pedro Martinez was one of the most dominant strikeout pitchers, and will be remembered with the likes of Randy Johnson, Nolan Ryan, Greg Maddux, and Roger Clemens. The reason for his greatness was not in his velocity or even the success of the team surrounding him, but it was with his effectiveness on the mound. Pedro was one of the best all time when it came to striking out batters, as well as not allowing walks. The combinations of lots of strikeouts and few walks bodes very well for all pitchers who can accomplish such a feat. All of their stats will be heightened, their ERA and WHIP will drop considerably as a result, and opposing batters will be preparing extra hard when they see their name on the lineup card. Pedro Martinez did all of these things throughout the 18 seasons he played in the MLB, and he never took an off season. He personally did not allow the Steroid Era of baseball to negatively affect his career. In fact he flourished in an era where pitchers struggled. The argument for the greatest pitcher of all time is one with many candidates, but it would be foolish to not consider Pedro Martinez as a member of that conversation.

LS0tDQp0aXRsZTogIlZpc3VhbGl6aW5nIHRoZSBkb21pbmFudCBjYXJlZXIgb2YgUGVkcm8gTWFydGluZXoiDQphdXRob3I6ICJTaW1vbmUgVGF2aW5vICYgRWRkaWUgQ2FtcGJlbGwiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSgib3BlbmludHJvIikNCmxpYnJhcnkoImZvcmVpZ24iKQ0KbGlicmFyeSgiZ2dwbG90MiIpDQpsaWJyYXJ5KCJrYWJsZUV4dHJhIikNCmBgYA0KDQojIyBQcm9qZWN0IEludHJvZHVjdGlvbg0KDQpGb3IgTUFUMTQ3IEZpbmFsIFByb2plY3QsIG91ciBncm91cCBjaG9zZSB0aGUgIlNwb3J0cyIgY2F0ZWdvcnkgd2l0aCBhIGZvY3VzIG9uIGJhc2ViYWxsLiBTcGVjaWZpY2FsbHksIHdlIGFpbSB0byB0ZWxsIHRoZSBzdG9yeSBvZiBIYWxsIG9mIEZhbWUgcGxheWVyIGFuZCBmb3JtZXIgUmVkIFNveCBwaXRjaGluZyBhY2UgUGVkcm8gTWFydGluZXouIEluIGEgc3BvcnQgd2l0aCBhIHJpY2ggaGlzdG9yeSBvZiBkYXRhLWRyaXZlbiBhbmFseXRpY3MsIFBlZHJvIE1hcnRpbmV6IHN0YW5kcyBvdXQgYXMgb25lIG9mIHRoZSBncmVhdGVzdCBwbGF5ZXJzIHRvIGV2ZXIgZ3JhY2UgQW1lcmljYSdzIHBhc3RpbWUuIEl0IGlzIG91ciBhaW0gYXMgYSBncm91cCB0byB2aXN1YWxpemUgaGlzIGRvbWluYW5jZSBhbmQgdGVsbCBoaXMgc3RvcnkgdGhyb3VnaCBoaXMgc3RhdHMuDQoNCiMjIEludHJvZHVjdGlvbiB0byBTYWJlcm1ldHJpY3MNCg0KRGVmaW5lZCBieSB0aGUgU29jaWV0eSBmb3IgQW1lcmljYW4gQmFzZWJhbGwgUmVzZWFyY2ggKFNBQlIpIGFzIOKAnHRoZSBzZWFyY2ggZm9yIG9iamVjdGl2ZSBrbm93bGVkZ2UgYWJvdXQgYmFzZWJhbGzigJ0sIFNhYmVybWV0cmljcyBpcyBhIGZvcm0gb2Ygc3RhdGlzdGljYWwgYW5hbHlzaXMgdGhhdCBoYXMgYmVjb21lIHRoZSBub3JtIGluIE1ham9yIExlYWd1ZSBCYXNlYmFsbC4gSW4gMTk4MSwgU1RBVFMgaW5jLiB3YXMgY3JlYXRlZCB3aGljaCBoZWxwZWQgdGVhbXMgZWxlY3Ryb25pY2FsbHkgYW5kIG1vcmUgY2xvc2VseSBhbmFseXplIHN0YXRpc3RpY3MuIFRoZXNlIG1ldGhvZHMgcGF2ZWQgdGhlIHdheSB0byBhbWF6aW5nIHN0b3JpZXMgc3VjaCBhcyBNaWNoYWVsIExld2lzJ3MgYmVzdC1zZWxsaW5nIG5vdmVsICJNb25leWJhbGwiLCBkZXRhaWxpbmcgdGhlIGV4cGxvaXRzIG9mIHRoZSAyMDAyIE9ha2xhbmQgQXRobGV0aWNzIGFuZCBHZW5lcmFsIE1hbmFnZXIgQmlsbHkgQmVhbmUuIEl0IGhpZ2hsaWdodHMgdGhlIEF0aGxldGljcyB1c2Ugb2YgU2FiZXJtZXRyaWNzIGluIHByb2R1Y2luZyBhIHBsYXlvZmYgY2FsaWJlciB0ZWFtIGRlc3BpdGUgdGhlaXIgc21hbGwgYnVkZ2V0ICgkNDEsMDAwLDAwMDsgUmFua2VkIDI4dGggb3V0IG9mIDMwIHRlYW1zKS4gRGF0YSBTY2llbnRpc3RzIGhhdmUgYmVjb21lIHRoZSBob3R0ZXN0IGNvbW1vZGl0eSBhcyB0ZWFtcyBhcmUgbm93IHBpdm90aW5nIGZyb20gdHJhZGl0aW9uYWwgc2NvdXRpbmcgYW5kIGRldmVsb3BtZW50IG1ldGhvZHMgaW4gZmF2b3Igb2YgY29sZCBoYXJkIHN0YXRzLiBGcm9udCBvZmZpY2VzIGFuZCBzY291dGluZyBkZXBhcnRtZW50cyBoYXZlIGZvdW5kIHZhbHVlIGluIFNhYmVybWV0cmljcyBmb3IgaXRzIGFiaWxpdHkgdG8gaWRlbnRpZnkgcXVhbGl0eSBwbGF5ZXJzIHVzaW5nIG9iamVjdGl2ZSBtZXRob2RzIGFzIG9wcG9zZWQgdG8gaGF2aW5nIGFuICJleWUgZm9yIHRhbGVudCIuIA0KDQpXaGlsZSBzdGF0aXN0aWNhbCBhbmFseXNpcyByZWdhcmRpbmcgdGhlIGJhdC1hbmQtYmFsbCBzcG9ydCBoYXMgZXhpc3RlZCBzaW5jZSB0aGUgaW52ZW50aW9uIG9mIGJveCBzY29yaW5nIGluIDE4NTgsIFNhYmVybWV0cmljcyBwcm92aWRlcyBhIHdheSBmb3IgYm90aCBmYW5zIGFuZCBzdGF0aXN0aWNpYW5zIGFsaWtlIHRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBzcG9ydCB0aHJvdWdoIGFuIG9iamVjdGl2ZSBsZW5zLiBTYWJlcm1ldHJpY3MgdXNlcyBpbiBkZXB0aCwgZWxlY3Ryb25pY2FsbHkgY2FsY3VsYXRlZCBzdGF0aXN0aWNzIGFuZCBoYXMgYmVlbiBhcm91bmQgc2luY2UgYWJvdXQgdGhlIDE5ODDigJlzLiBBIHNpbXBsZSB3YXkgdG8gcHV0IGl0IHdvdWxkIGJlIHRoYXQgU2FiZXJtZXRyaWNzIGlzIHVzZWQgdG8gaGVscCB0ZWFtcyBhbmFseXplIHRoZSDigJxzY2llbmNlIG9mIHdpbm5pbmfigJ0uIEZvciBleGFtcGxlLCBsZXRzIHNheSB3ZSdyZSBjb2FjaGluZyBhIHRlYW0gdGhhdCdzIHdpbm5pbmcgMi0xIHdpdGggMiBvdXRzIGluIHRoZSA5dGggaW5uaW5nLiBVcCB0byBiYXQgYSBrbm93biBob21lLXJ1biBoaXR0ZXIgd2hvIGhhcyBhIGJhdHRpbmcgYXZlcmFnZSBvZiBhcm91bmQgLjQxMCB3aGVuIGZhY2luZyByaWdodC1oYW5kZWQgcGl0Y2hlcnMsIGJ1dCBkcm9wcyB0byBhIC4yMTEgYWdhaW5zdCBsZWZ0LWhhbmRlZCBvbmVzLiBZb3UnZCBrbm93IHRoZSBzbWFydCB0aGluZyB0byBkbyB3b3VsZCBiZSB0byBjYWxsIGluIGEgbGVmdC1oYW5kZWQgcmVsaWVmIHBpdGNoZXIgKHNvbWV0aW1lcyBrbm93biBhcyBhIHNwZWNpYWxpc3QpIGFuZCBpbmNyZWFzZSB5b3VyIG9kZHMgb2YgcmVjb3JkaW5nIHRoZSBmaW5hbCBvdXQgYW5kIHdpbm5pbmcgdGhlIGdhbWUuDQoNCkl0cyBnYW1lLWNoYW5naW5nIG91dGxvb2sgb24gdGhlIHNwb3J0IHdhcyBub3QgbWV0IHdpdGhvdXQgaXQncyBmYWlyIHNoYXJlIG9mIGNvbnRyb3ZlcnN5LiBDcml0aWNzIGFyZ3VlIHRoYXQgdGhlIHdpZGVzcHJlYWQgYWRvcHRpb24gb2YgZGF0YSBhbmFseXRpY3Mgd2l0aGluIHRoZSBNYWpvciBMZWFndWVzIGZhaWxzIHRvIGFjY291bnQgZm9yIHRoaW5ncyB0aGF0IGNhbm5vdCBiZSBtZWFzdXJlZCB3aXRoIG51bWJlcnMsIHN1Y2ggYXMgZ3JpdCwgaGVhcnQsIGx1Y2sgYW5kIGV4cGVyaWVuY2UuIFdoaWxlIGF0IGZpcnN0IGl0J3MgYSBzZWVtaW5nbHkgYW50aXF1YXRlZCBhcmd1bWVudCwgaXQgZG9lcyBoYXZlIGl0cyBtZXJpdHMuIEJhc2ViYWxsIGlzIGEgZ2FtZSB3aGVyZSBhbnl0aGluZyBnb2VzLCBhbmQgc29tZXRpbWVzIHRoZXJlIGV4aXN0cyBhIGRhcmsgaG9yc2UgdGVhbSB0aGF0IGRlZmllcyBhbGwgdGhlIG9kZHMgYW5kIHdpbnMgaXQgYWxsLiBUaGUgMjAxOSBXYXNoaW5ndG9uIE5hdGlvbmFscyBzdGFydGVkIHRoZSBzZWFzb24gd2l0aCBhIDE5LTMxIHJlY29yZCBhbmQgd2VyZSBvbmUgb2YgdGhlIHdvcnN0IHRlYW1zIGluIGFsbCBvZiBiYXNlYmFsbC4gVGhleSBoYWQgYWxzbyBsb3N0IHRoZWlyIHN1cGVyc3RhciBvdXRmaWVsZGVyIEJyeWNlIEhhcnBlciB0byB0aGUgZGl2aXNpb24gcml2YWwgUGhpbGFkZWxwaGlhIFBoaWxsaWVzIGR1cmluZyB0aGUgb2ZmLXNlYXNvbiwgcmVzdWx0aW5nIGluIGEgbGFjayBvZiBzdWJzdGFudGlhbCBwb3dlciBoaXR0aW5nIGFuZCBvdXRmaWVsZCBkZWZlbnNlLiBJbiBhIHN0dW5uaW5nIHR1cm4gb2YgZXZlbnRzLCB0aGUgdGVhbSBtYW5hZ2VkIHRvIHJlY292ZXIgaGFsZndheSB0aHJvdWdoIHRoZSBzZWFzb24gd2l0aCBhIDkzLTY5IHJlY29yZC4gVGhpcyByZWNvdmVyeSBsZWFkIHRvIHRoZW0gbWFraW5nIHRoZSBwbGF5b2ZmcyBhcyBhIFdpbGQgQ2FyZCB0ZWFtLiBJbiB0aGUgOHRoIGlubmluZywgZG93biAzLTEgd2l0aCB0d28gb3V0cyBpbiBhIHdpbm5lci10YWtlLWFsbCBnYW1lIGFnYWluc3QgdGhlIE1pbHdhdWtlZSBCcmV3ZXJzLCB0aGUgTmF0aW9uYWxzIHJhbGxpZWQgdG8gc2NvcmUgMyBydW5zIHRoYW5rcyB0byBhIGZpZWxkaW5nIGVycm9yIGJ5IE1pbHdhdWtlZSBvdXRmaWVsZGVyIFRyZW50IEdyaXNoYW0uIFRoZXkgdGhlbiB3ZW50IG9uIHRvIGRlZmVhdCB0d28ganVnZ2VybmF1dCB0ZWFtcyBpbiB0aGUgTG9zIEFuZ2VsZXMgRG9kZ2VycyAoMTA2LTU2KSBhbmQgSG91c3RvbiBBc3Ryb3MgKDEwNy01NSkgdG8gd2luIHRoZWlyIGZpcnN0IGV2ZXIgV29ybGQgU2VyaWVzIHRyb3BoeS4NCg0KIyMgU2FiZXJtZXRyaWNzLCBTdGVyb2lkcywgYW5kIFN0cmlrZW91dHM6IFdoeSBQZWRybydzIGV4ZWxsZW5jZSBzdGFuZHMgYWJvdmUgYWxsDQoNCk1hbnkgb2YgdGhlIGdhbWVzIGxlZ2VuZHMgaG9sZCBtdWx0aXBsZSBudW1lcmljYWwgcmVjb3Jkcy4gVGhlc2UgcmVjb3JkcyBwcm92aWRlIGNvbnRleHQgZm9yIHRoZSB0YWxlbnQgYW5kIGF0aGxldGljIGFiaWxpdHkgb2YgbWFueSBiYXNlYmFsbCBncmVhdHMuIFRoZXJlIGV4aXN0cyB0aGUgdHJhZGl0aW9uYWwgcmVjb3Jkcywgc3VjaCBhcyBDeSBZb3VuZydzIDUxMSBjYXJlZXIgd2lucywgVHkgQ29iYidzIC4zNjYgQmF0dGluZyBBdmVyYWdlLCBhbmQgSWNoaXJvJ3MgMjYyIGJhc2UgaGl0cyBpbiBhIHNpbmdsZSBzZWFzb24gKEEgcmVjb3JkIHByZXZpb3VzbHkgdXBoZWxkIGZvciA4NCB5ZWFycykuIFRoZW4gdGhlcmUgZXhpc3RzIHRoZSBtb3JlIG9iamVjdGl2ZSBzdGF0aXN0aWNhbCByZWNvcmRzIHRoYXQgbWVyZWx5IHNvbGlkaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgZ3JlYXRzLiBCYWJlIFJ1dGgncyBjYXJlZXIgLjY5MCBTbHVnZ2luZyBQZXJjZW50YWdlIChTTEcpIGFuZCAxLjE2NCBPbi1iYXNlICsgU2x1Z2dpbmcgKE9QUyksIGFuZCBFZCBXYWxzaCdzIDEuODIgY2FyZWVyIEVSQSBhcmUgZXhhbXBsZXMuDQoNCk9mIGFsbCB0aGVzZSBncmVhdHMsIHRoZXJlIGlzIGZldyBhcyBkb21pbmFudCBhbmQgbWVtb3JhYmxlIGFzIFBlZHJvIE1hcnRpbmV6LiBIYWlsaW5nIGZyb20gTWFub2d1YXlhYm8sIERvbWluaWNhbiBSZXB1YmxpYywgdGhlIGVpZ2h0IHRpbWUgYWxsLXN0YXIgaG9sZHMgc2V2ZXJhbCBpbXByZXNzaXZlIGFjY29sYWRlcyBmcm9tIGhpcyAxOCB5ZWFyIG1ham9yIGxlYWd1ZSBjYXJlZXIuIEZyb20gaGlzIDMgQ3kgWW91bmcgQXdhcmRzLCA1IExlYWd1ZS1CZXN0IEVSQSBzZWFzb25zLCAyMDA0IFdvcmxkIFNlcmllcyBDaGFtcGlvbnNoaXBzLCBhbmQgYSBwbGFxdWUgYXQgdGhlIEhhbGwgb2YgRmFtZSBpbiBDb29wZXJzdG93biwgaGUgbWFkZSBoaXMgY2FzZSB0byBtYW55IGFzIG9uZSBvZiB0aGUgZ3JlYXRlc3QgcGl0Y2hlcnMgb2YgYWxsIHRpbWUuIFBlZHJvIE1hcnRpbmV6IGRvbWluYXRlZCBoaXR0ZXJzIGZvciAxOCBzZWFzb25zIHdpdGggYSBkZXZhc3RhdGluZyBmaXZlLXBpdGNoIHJlcGVydG9pcmUsIGluY2x1ZGluZyB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YgZmFzdGJhbGxzLiBDdXJyZW50bHkgaGUgaG9sZHMgdGhlIE1ham9yIExlYWd1ZSByZWNvcmQgaW4gc2luZ2xlLXNlYXNvbiBXSElQICgwLjczNzApIGFuZCBFUkErIGZvciBzdGFydGluZyBwaXRjaGVycyBzbyBmYXIgKDE1NCkgYWxvbmcgd2l0aCBtYW55IG90aGVyIGltcHJlc3NpdmUgc3RhdHMuDQoNCldoaWxlIHRoZXNlIHN0YXRzIGFyZSBhbHJlYWR5IGltcHJlc3NpdmUgaW4gbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBlcmEgaW4gd2hpY2ggdGhleSBvY2N1cnJlZCBtYWtlIHRoZW0gc3RhbmQgb3V0IGV2ZW4gbW9yZS4gUGVkcm8gTWFydGluZXogY2FyZWVyIGxhc3RlZCBiZXR3ZWVuIGZyb20gMTk5Mi0yMDA5LiBUaGlzIHRpbWUgaW4gbWFqb3IgbGVhZ3VlIGhpc3RvcnkgaXMgd2hhdCB3YXMga25vd24gYXMgdGhlIOKAnFN0ZXJvaWQgRXJh4oCdIG9mIGJhc2ViYWxsLiBBcyB0aGUgbmFtZSBzdWdnZXN0cywgbWFueSBiYXR0ZXJzIHdlcmUgdXNpbmcgYmFubmVkIHN1YnN0YW5jZXMgKHN1Y2ggYXMgYW5hYm9saWMgc3Rlcm9pZHMpLCBjb2luY2lkaW5nIHdpdGggYSBzdXJnZSBvZiBoaXRzIGFuZCBob21lIHJ1bnMgdG8gYW4gYWxsIHRpbWUgaGlnaC4gRXhhbXBsZXMgb2YgdGhpcyB3b3VsZCBiZSBTYW1teSBTb3NhIGFuZCBNYXJrIE1jR3dpcmXigJlzIGhvbWUgcnVuIHJhY2UgaW4gMTk5OCBhbmQgQmFycnkgQm9uZHMgYmVjb21pbmcgdGhlIHNpbmdsZSBzZWFzb24gaG9tZSBydW4gY2hhbXBpb24gd2l0aCA3MyBpbiAxOTk4LiBCb25kcyBoaW1zZWxmIGFsc28gYmVjYW1lIHRoZSBhbGwtdGltZSBob21lIHJ1biBjaGFtcGlvbiwgcGFzc2luZyBIYW5rIEFhcm9uIGFmdGVyIGhlIGhpdCBoaXMgNzU2dGggaG9tZSBydW4gaW4gMjAwNy4gUGVkcm8gTWFydGluZXogcGl0Y2hlZCBkdXJpbmcgdGhlIGhlaWdodCBvZiB0aGlzIGVyYSBhbmQgc3RpbGwgd2FzIG9uZSBvZiB0aGUgbW9zdCBkb21pbmFudCBwaXRjaGVycyBvZiBhbGwgdGltZS4gVGhpcyBpcyBwbGF5ZWQgdXAgd2l0aCBhIHZlcnkgaGlnaCBzdHJpa2VvdXQgcmF0ZSBhbmQgdGVuZGVuY3kgdG8gbm90IGdpdmUgdXAgdmVyeSBtYW55IHdhbGtzIG9yIHJ1bnMgdGhyb3VnaG91dCBoaXMgaWxsdXN0cmlvdXMsIEhhbGwgb2YgRmFtZSBjYXJlZXIuIFdoYXQgd2UgcGxhbiBvbiBzaG93aW5nIHdpdGggUGVkcm8gTWFydGluZXrigJlzIGNhcmVlciBzdGF0aXN0aWNzIGlzIGhvdyBkb21pbmFudCBoZSB0cnVseSB3YXMsIGR1cmluZyB0aGUgcGVhayBvZiB0aGUgaG9tZSBydW4gZXJhIGluIHRoZSAxNTArIHllYXJzIG9mIE1ham9yIExlYWd1ZSBCYXNlYmFsbC4gDQoNCiMjIEluZm9ybWF0aW9uIGFib3V0IERhdGENCg0KVGhlIGRhdGEgd2FzIGdhdGhlcmVkIGZyb20gdGhlIEJhc2ViYWxsLVJlZmVyZW5jZSBwYWdlIG9mIFBlZHJvIE1hcnRpbmV6IChodHRwczovL3d3dy5iYXNlYmFsbC1yZWZlcmVuY2UuY29tL3BsYXllcnMvbS9tYXJ0aXBlMDIuc2h0bWwpLiBCYXNlYmFsbC1SZWZlcmVuY2UgaXMgcG93ZXJlZCBieSBTdGF0aGVhZCwgdGhlIGluZHVzdHJ5IHN0YW5kYXJkIGluIHNwb3J0cyBkYXRhIGFuYWx5c2lzLiBBbGwgdGhlIGRhdGEgcHJlc2VudGVkIGlzIGNyb3NzLWNoZWNrZWQgYW5kIHZlcmlmaWVkIHdpdGggcHVibGljbHkgYXZhaWxhYmxlIGluZm9ybWF0aW9uIGZyb20gTWFqb3IgTGVhZ3VlIEJhc2ViYWxsLiBEYXRhIHB1bGxlZCBmcm9tIEJhc2ViYWxsLVJlZmVyZW5jZSBpcyBjb3BpZWQgZGlyZWN0bHkgYXMgcmF3IGRhdGEgZnJvbSB0aGUgd2Vic2l0ZSwgaW50ZXJwcmV0ZWQgdXNpbmcgcmVhZF9jc3YuDQoNClRoZXJlIGFyZSAxOCB1bml0cyBvZiBvYnNlcnZhdGlvbiwgY29pbmNpZGluZyB3aXRoIHRoZSAxOCB5ZWFycyBQZWRybyBNYXJ0aW5leiBwbGF5ZWQgaW4gdGhlIE1ham9yIExlYWd1ZXMuIFRoZXJlIGFyZSAzNSB2YXJpYWJsZXMgbWFkZSB1cCBvZiB2YXJpb3VzIGNhdGVnb3JpY2FsIGFuZCBudW1lcmljYWwgYmFzZWJhbGwgc3RhdGlzdGljcy4gRXhhbXBsZXMgb2YgdGhlc2UgaW5jbHVkZSBFUkEsIFdISVAsIGFuZCBTTyAoTnVtZXJpY2FsKSBhbmQgVGVhbS9UbSwgWWVhciwgYW5kIEF3YXJkcyAoQ2F0ZWdvcmljYWwpLg0KDQojIyMgUGVkcm8gTWFydGluZXogQmFzZWJhbGwtUmVmZXJlbmNlDQpgYGB7ciBsb2FkLWRhdGF9DQpNYXJ0aW5leiA8LSByZWFkX2NzdigiWWVhcixBZ2UsVG0sTGcsVyxMLFctTCUsRVJBLEcsR1MsR0YsQ0csU0hPLFNWLElQLEgsUixFUixIUixCQixJQkIsU08sSEJQLEJLLFdQLEJGLEVSQSssRklQLFdISVAsSDksSFI5LEJCOSxTTzksU08vVyxBd2FyZHMNCjE5OTIsMjAsTEFELE5MLDAsMSwuMDAwLDIuMjUsMiwxLDEsMCwwLDAsOC4wLDYsMiwyLDAsMSwwLDgsMCwwLDAsMzEsMTYzLDEuMTYsMC44NzUsNi44LDAuMCwxLjEsOS4wLDguMDAsDQoxOTkzLDIxLExBRCxOTCwxMCw1LC42NjcsMi42MSw2NSwyLDIwLDAsMCwyLDEwNy4wLDc2LDM0LDMxLDUsNTcsNCwxMTksNCwxLDMsNDQ0LDE0NiwzLjA4LDEuMjQzLDYuNCwwLjQsNC44LDEwLjAsMi4wOSxSb1ktOQ0KMTk5NCwyMixNT04sTkwsMTEsNSwuNjg4LDMuNDIsMjQsMjMsMSwxLDEsMSwxNDQuMiwxMTUsNTgsNTUsMTEsNDUsMywxNDIsMTEsMCw2LDU4NCwxMjQsMy4zMiwxLjEwNiw3LjIsMC43LDIuOCw4LjgsMy4xNiwNCjE5OTUsMjMsTU9OLE5MLDE0LDEwLC41ODMsMy41MSwzMCwzMCwwLDIsMiwwLDE5NC4yLDE1OCw3OSw3NiwyMSw2NiwxLDE3NCwxMSwyLDUsNzg0LDEyMywzLjkwLDEuMTUxLDcuMywxLjAsMy4xLDguMCwyLjY0LA0KMTk5NiwyNCxNT04sTkwsMTMsMTAsLjU2NSwzLjcwLDMzLDMzLDAsNCwxLDAsMjE2LjIsMTg5LDEwMCw4OSwxOSw3MCwzLDIyMiwzLDAsNiw5MDEsMTE3LDMuMjcsMS4xOTUsNy45LDAuOCwyLjksOS4yLDMuMTcsQVMNCjE5OTcsMjUsTU9OLE5MLDE3LDgsLjY4MCwxLjkwLDMxLDMxLDAsMTMsNCwwLDI0MS4xLDE1OCw2NSw1MSwxNiw2Nyw1LDMwNSw5LDEsMyw5NDcsMjE5LDIuMzksMC45MzIsNS45LDAuNiwyLjUsMTEuNCw0LjU1LEFTQ1lBLTFNVlAtMTYNCjE5OTgsMjYsQk9TLEFMLDE5LDcsLjczMSwyLjg5LDMzLDMzLDAsMywyLDAsMjMzLjIsMTg4LDgyLDc1LDI2LDY3LDMsMjUxLDgsMCw5LDk1MSwxNjMsMy40MCwxLjA5MSw3LjIsMS4wLDIuNiw5LjcsMy43NSxBU0NZQS0yTVZQLTIxDQoxOTk5LDI3LEJPUyxBTCwyMyw0LC44NTIsMi4wNywzMSwyOSwxLDUsMSwwLDIxMy4xLDE2MCw1Niw0OSw5LDM3LDEsMzEzLDksMCw2LDgzNSwyNDMsMS4zOSwwLjkyMyw2LjgsMC40LDEuNiwxMy4yLDguNDYsQVNDWUEtMU1WUC0yDQoyMDAwLDI4LEJPUyxBTCwxOCw2LC43NTAsMS43NCwyOSwyOSwwLDcsNCwwLDIxNy4wLDEyOCw0NCw0MiwxNywzMiwwLDI4NCwxNCwwLDEsODE3LDI5MSwyLjE3LDAuNzM3LDUuMywwLjcsMS4zLDExLjgsOC44OCxBU0NZQS0xTVZQLTUNCjIwMDEsMjksQk9TLEFMLDcsMywuNzAwLDIuMzksMTgsMTgsMCwxLDAsMCwxMTYuMiw4NCwzMywzMSw1LDI1LDAsMTYzLDYsMCw0LDQ1NiwxODgsMS42MSwwLjkzNCw2LjUsMC40LDEuOSwxMi42LDYuNTIsDQoyMDAyLDMwLEJPUyxBTCwyMCw0LC44MzMsMi4yNiwzMCwzMCwwLDIsMCwwLDE5OS4xLDE0NCw2Miw1MCwxMyw0MCwxLDIzOSwxNSwwLDMsNzg3LDIwMiwyLjI0LDAuOTIzLDYuNSwwLjYsMS44LDEwLjgsNS45OCxBU0NZQS0yTVZQLTIwDQoyMDAzLDMxLEJPUyxBTCwxNCw0LC43NzgsMi4yMiwyOSwyOSwwLDMsMCwwLDE4Ni4yLDE0Nyw1Miw0Niw3LDQ3LDAsMjA2LDksMCw1LDc0OSwyMTEsMi4yMSwxLjAzOSw3LjEsMC4zLDIuMyw5LjksNC4zOCxDWUEtM01WUC0yMg0KMjAwNCwzMixCT1MsQUwsMTYsOSwuNjQwLDMuOTAsMzMsMzMsMCwxLDEsMCwyMTcuMCwxOTMsOTksOTQsMjYsNjEsMCwyMjcsMTYsMCwyLDkwMywxMjQsMy41OCwxLjE3MSw4LjAsMS4xLDIuNSw5LjQsMy43MixDWUEtNA0KMjAwNSwzMyxOWU0sTkwsMTUsOCwuNjUyLDIuODIsMzEsMzEsMCw0LDEsMCwyMTcuMCwxNTksNjksNjgsMTksNDcsMywyMDgsNCwwLDQsODQzLDE0NiwyLjk1LDAuOTQ5LDYuNiwwLjgsMS45LDguNiw0LjQzLEFTDQoyMDA2LDM0LE5ZTSxOTCw5LDgsLjUyOSw0LjQ4LDIzLDIzLDAsMCwwLDAsMTMyLjIsMTA4LDcyLDY2LDE5LDM5LDIsMTM3LDEwLDEsMiw1NTAsOTgsNC4wNSwxLjEwOCw3LjMsMS4zLDIuNiw5LjMsMy41MSxBUw0KMjAwNywzNSxOWU0sTkwsMywxLC43NTAsMi41Nyw1LDUsMCwwLDAsMCwyOC4wLDMzLDExLDgsMCw3LDEsMzIsMiwwLDEsMTI4LDE2OSwxLjkyLDEuNDI5LDEwLjYsMC4wLDIuMywxMC4zLDQuNTcsDQoyMDA4LDM2LE5ZTSxOTCw1LDYsLjQ1NSw1LjYxLDIwLDIwLDAsMCwwLDAsMTA5LjAsMTI3LDcwLDY4LDE5LDQ0LDMsODcsNiwxLDIsNDkzLDc1LDUuMTgsMS41NjksMTAuNSwxLjYsMy42LDcuMiwxLjk4LA0KMjAwOSwzNyxQSEksTkwsNSwxLC44MzMsMy42Myw5LDksMCwwLDAsMCw0NC4yLDQ4LDE4LDE4LDcsOCwwLDM3LDQsMCwwLDE5MSwxMTcsNC4yOCwxLjI1NCw5LjcsMS40LDEuNiw3LjUsNC42MywNCiIpDQoNCmtibChNYXJ0aW5leikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQpgYGANCiMjIyBTdGF0aXN0aWNhbCBEZWZpbml0aW9ucw0KDQpXLUwlIChXaW4gdG8gTG9zcyBQZXJjZW50YWdlKSAgaXMgdGhlIHBlcmNlbnRhZ2Ugb2Ygd2lucyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2Ygc3RhcnRzIGluIGEgc2Vhc29uIChubyBkZWNpc2lvbnMgYXJlIGEgcmFyZSBjYXNlIGluIHRoaXMgc3RhdCBhbmQgZG8gbm90IGNvdW50IGFzIGEg4oCcc3RhcnTigJ0pDQogRXgpIGlmIGEgcGl0Y2hlciBoYWQgMTUgc3RhcnRzIHRoYXQgcXVhbGlmaWVkIGluIGEgc2Vhc29uLCBhbmQgaGFkIDEwIHdpbnMsIHRoZWlyIFctTCUgd291bGQgYmUgMTAvMTU9MC42NjcsIG9yIDY2LjclDQoNCkVSQSAoRWFybmVkIFJ1biBBdmVyYWdlKSBpcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHN0YXRzIGZvciBwaXRjaGVycy4gSXQgaXMgdGhlIGF2ZXJhZ2Ugb2YgZWFybmVkIHJ1bnMgYWxsb3dlZCBieSBhIHBpdGNoZXIgaWYgdGhlIHdob2xlIHNlYXNvbiB3YXMgY29uZGVuc2VkIHRvIGEgOS1pbm5pbmcgZ2FtZS4NCiBFeCkgaWYgYSBwaXRjaGVyIHBpdGNoZWQgOSBpbm5pbmdzIGluIGEgc2Vhc29uIGFuZCBvbmx5IGdhdmUgdXAgb25lIHJ1biwgdGhlaXIgRVJBIGlzIDEuMDAsIGJ1dCBpZiB0aGV5IHBpdGNoZWQgMyBpbm5pbmdzIGFuZCBnYXZlIHVwIDEgcnVuLCB0aGVuIHRoZWlyIEVSQSB3b3VsZCBiZSAzLjAwLCBzaW5jZSB0aGF0IDEgcnVuIGluIDMgaW5uaW5ncyBpcyBlcXVpdmFsZW50IHRvIDMgcnVucyBpbiA5IGlubmluZ3MuDQoNCkcgKEdhbWVzKSB0aGUgdG90YWwgZ2FtZXMgaW4gYSBzZWFzb24gYSBwbGF5ZXIgcGFydGljaXBhdGVkIGluDQoNCkdTIChHYW1lcyBTdGFydGVkKSB0b3RhbCBnYW1lcyBpbiBhIHNlYXNvbiBhIHBsYXllciBzdGFydGVkIGluDQoNCkdGIChHYW1lcyBGaW5pc2hlZCkgdG90YWwgZ2FtZXMgaW4gYSBzZWFzb24gd2hlcmUgYSBwaXRjaGVyIHdhcyB0aGUgbGFzdCBwaXRjaGVyIHVzZWQgZm9yIHRoZWlyIHRlYW0uIElmIGEgcGl0Y2hlciBzdGFydGVkIGEgZ2FtZSBhbmQgdGhyZXcgYSBjb21wbGV0ZSBnYW1lLCB0aGV5IGRvIG5vdCBnZXQgY3JlZGl0ZWQgZm9yIGEgZmluaXNoZWQgZ2FtZS4NCg0KQ0cgKENvbXBsZXRlIEdhbWVzKSB0b3RhbCBnYW1lcyBpbiBhIHNlYXNvbiB3aGVyZSBhIHBpdGNoZXIgc3RhcnRlZCBhbmQgZmluaXNoZWQgdGhlIGdhbWUuDQoNClNITyAoU2h1dG91dHMpIGNvbXBsZXRlIGdhbWVzIHdoZXJlIGEgcGl0Y2hlciBnYXZlIHVwIDAgZWFybmVkIHJ1bnMuDQoNClNWIChTYXZlcykgYSBzYXZlIG9jY3VycyB3aGVuIGEgcmVsaWVmIHBpdGNoZXIgY29tZXMgaW50byBhIGdhbWUgd2hlbiBsZWFkaW5nIGJ5IG5vIG1vcmUgdGhhbiB0aHJlZSBydW5zIGFuZCBtdXN0IHBpdGNoIGF0IGxlYXN0IDEgaW5uaW5nIHdpdGggdGhlIHBvdGVudGlhbCB0byBmYWNlIHRoZSB0eWluZyBydW4uIEEgc2F2ZSBpcyByZWNvcmRlZCB3aGVuIHRoYXQgcGl0Y2hlciBmaW5pc2hlcyB0aGUgZ2FtZS4NCg0KSVAgKElubmluZ3MgUGl0Y2hlZCkgdGhlIHRvdGFsIG51bWJlciBvZiBpbm5pbmdzIHBpdGNoZWQgYnkgYSBwaXRjaGVyIGluIGEgc2Vhc29uLg0KIGV4KSBpZiBhIHBpdGNoZXIgdGhyb3dzIDIzNCBhbmQgZ2V0cyAyIG91dHMgb2YgdGhlIDIzNXRoIGlubmluZywgdGhleSB3aWxsIGJlIGNyZWRpdGVkIHdpdGggMjM0IDIvMyBpbm5pbmdzLCBvciAyMzQuMiBpbm5pbmdzLg0KDQpIIChIaXRzIEFsbG93ZWQpIHRvdGFsIG51bWJlciBvZiBoaXRzIGFsbG93ZWQgaW4gYSBzZWFzb24NCg0KUiAoUnVucyBBbGxvd2VkKSB0b3RhbCBudW1iZXIgb2YgcnVucyBhbGxvd2VkIGluIGEgc2Vhc29uLCBlYXJuZWQgYW5kIHVuZWFybmVkLg0KDQpFUiAoRWFybmVkIFJ1bnMgQWxsb3dlZCkgdG90YWwgbnVtYmVyIG9mIGVhcm5lZCBydW5zIGFsbG93ZWQgaW4gYSBzZWFzb24uDQoNCkhSIChIb21lIFJ1bnMgQWxsb3dlZCkgdG90YWwgbnVtYmVyIG9mIGhvbWUgcnVucyBhbGxvd2VkIGluIGEgc2luZ2xlIHNlYXNvbi4NCg0KQkIgKFdhbGtzKSB0b3RhbCBudW1iZXIgb2Ygd2Fsa3MgYWxsb3dlZCBpbiBhIHNpbmdsZSBzZWFzb24uDQoNCklCQiAoSW50ZW50aW9uYWwgV2Fsa3MpIHRvdGFsIG51bWJlciBvZiBpbnRlbnRpb25hbCB3YWxrcyBpbiBhIHNlYXNvbi4gQW4gaW50ZW50aW9uYWwgd2FsayBpcyB3aGVuIHRoZSBiYXR0ZXIgYW5kIG9wcG9zaW5nIHRlYW0gYXJlIGF3YXJlIHRoYXQgYSB3YWxrIHdpbGwgb2NjdXIsIHRoaXMgdXN1YWxseSBoYXBwZW5zIHRvIHRyeSB0byBzZXQgdXAgYSBkb3VibHkgcGxheSwgb3IgdGhlIHBpdGNoZXIgYmVsaWV2ZXMgdGhhdCB0aGUgYmF0dGVyIGlzIGdvaW5nIHRvIHBlcmZvcm0gd2VsbCBpbiB0aGUgZ2l2ZW4gYXQtYmF0Lg0KDQpTTyAoU3RyaWtlb3V0cykgdG90YWwgbnVtYmVyIG9mIHN0cmlrZW91dHMgaW4gYSBzZWFzb24NCg0KSEJQIChIaXQgQnkgUGl0Y2gpIHRvdGFsIG51bWJlcnMgb2YgdGltZXMgYSBwaXRjaGVyIGhpdHMgb3Bwb3NpbmcgYmF0dGVycyBpbiBhIHNlYXNvbi4NCg0KQksgKEJhbGtzKSBhIGJhbGsgb2NjdXJzIHdoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGJhc2VydW5uZXIsIGFuZCB0aGUgcGl0Y2hlciBwZXJmb3JtcyBhbiBpbGxlZ2FsIG1vdmVtZW50IHdoZW4gb24gdGhlIG1vdW5kIHdoaWxlIHRoZXkgYXJlIGluIHRoZSBzZXQsIGEgcGl0Y2hlciBiZWNvbWVzIHNldCB3aGVuIGJvdGggZmVldCBhcmUgdG91Y2hpbmcgdGhlIG1vdW5kLiANCiBFeCkgYW4gZXhhbXBsZSBvZiBhIGJhbGsgd291bGQgYmUgaWYgdGhlcmUgd2FzIGEgYmFzZXJ1bm5lciBvbiBmaXJzdCBiYXNlLCBhbmQgb25jZSB0aGUgcGl0Y2hlciBpcyBpbiB0aGUgc2V0LCB0aGV5IGZsaW5jaC4gVGhlIGJhc2VydW5uZXIgd291bGQgdGhlbiBiZSBhd2FyZGVkIHNlY29uZCBiYXNlIGFzIGEgcmVzdWx0Lg0KDQpXUCAoV2lsZCBQaXRjaGVzKSBXaWxkIHBpdGNoZXMgY291bGQgYmUgZGVzY3JpYmVkIGFzIGFuIGVycm9yIGNvbW1pdHRlZCBieSB0aGUgcGl0Y2hlci4gQSB3aWxkIHBpdGNoIGlzIGFueSBwaXRjaCB0aGF0IGdldHMgcGFzdCB0aGUgY2F0Y2hlciB0aGF0IGlzIG5vdCB0aGUgY2F0Y2hlcuKAmXMgZmF1bHQuDQoNCkJGIChCYXR0ZXJzIEZhY2VkKSB0aGUgdG90YWwgbnVtYmVyIG9mIG9wcG9uZW50cyBmYWNlZCBpbiBhIHNpbmdsZSBzZWFzb24uDQoNCkVSQSsgKOKAnE5vcm1hbGl6ZWTigJ0gRVJBKSB0aGlzIHN0YXQgdGFrZXMgYSBwaXRjaGVy4oCZcyBFUkEgZm9yIGEgc2Vhc29uIGFuZCBub3JtYWxpemVzIGl0IGFjcm9zcyBhbGwgb3RoZXIgcGl0Y2hlcnPigJkgRVJBcyB3aXRoaW4gdGhlIGxlYWd1ZS4gVGhlIGxlYWd1ZSBhdmVyYWdlIGlzIGFsd2F5cyAxMDAgd2hlbiB0aGlzIHN0YXQgaXMgY2FsY3VsYXRlZCwgc28gaWYgYSBwaXRjaGVy4oCZcyBFUkErIGlzIDEyNSwgdGhlbiB0aGV5IGhhdmUgYSAyNSUgYmV0dGVyIEVSQSB0aGFuIHRoZSBsZWFndWUgYXZlcmFnZS4NCg0KRklQIChGaWVsZGluZyBJbmRlcGVuZGVudCBQaXRjaGluZykgRklQIGlzIGEgbmV3ZXIgc3RhdCB3aGljaCBpcyBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIGEgcGl0Y2hlcnMg4oCcdHJ1ZSBvdXRjb21lc+KAnSB3aGljaCBhcmUgaG9tZXJzLCBzdHJpa2VvdXRzLCBhbmQgd2Fsa3MgKHdhbGtzIGFsbG93ZWQgYnkgcGl0Y2hpbmcgYmFsbCA0IG9yIGhpdHRpbmcgdGhlIGJhdHRlcikuIFRoZSBzdGF0IGlzIGNhbGN1bGF0ZWQgYnkge1sxMypIUl0rWzMqKEJCK0hCUCldLVsyKktdfS9JUC4gRklQIHdpbGwgZW5kIHVwIGxvb2tpbmcgbGlrZSBhbiBFUkEuIDMuMiBpcyB0aGUgYXZlcmFnZSBGSVAsIHNpbWlsYXIgdG8gdGhlIGF2ZXJhZ2UgRVJBLCB3aGljaCBpcyBhYm91dCA0LjMuDQoNCldISVAgKFdhbGtzIGFuZCBIaXRzIHBlciBJbm5pbmdzIFBpdGNoZWQpIFRoaXMgaXMgbGlrZWx5IHRvIGJlIHRoZSBtb3N0IGltcG9ydGFudCBzdGF0cyB0byBqdWRnZSBob3cgZ29vZCBhIHBpdGNoZXIgYWN0dWFsbHkgaXMuIFRoZSBzdGF0IGlzIGNhbGN1bGF0ZWQgYnkgYWRkaW5nIHVwIHRoZSB0b3RhbCBudW1iZXIgb2Ygd2Fsa3MgYW5kIGhpdHMgYWxsb3dlZCBhbmQgdGhhdCBzdW0gaXMgZGl2aWRlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIGlubmluZ3MgcGl0Y2hlZC4gQSBnb29kIFdISVAgaXMgYW55d2hlcmUgbGVzcyB0aGFuIDEuMjANCkg5IChIaXRzIHBlciA5KSBBdmVyYWdlIG51bWJlciBvZiBoaXRzIGdpdmVuIHVwIGluIGEgOS1pbm5pbmcgc3RhcnQuDQoNCkhSOSAoSG9tZSBSdW5zIHBlciA5KSBBdmVyYWdlIG51bWJlciBvZiBob21lIHJ1bnMgZ2l2ZW4gdXAgaW4gYSA5LWlubmluZyBzdGFydC4NCg0KQkI5IChXYWxrcyBwZXIgOSkgQXZlcmFnZSBudW1iZXIgb2Ygd2Fsa3MgZ2l2ZW4gdXAgaW4gYSA5LWlubmluZyBnYW1lLg0KDQpTTzkgKFN0cmlrZW91dHMgcGVyIDkpIEF2ZXJhZ2UgbnVtYmVyIG9mIHN0cmlrZW91dHMgaW4gYSA5LWlubmluZyBnYW1lLg0KDQpTTy9XIChTdHJpa2VvdXQgdG8gV2FsayBSYXRpbykgdGhlIHRvdGFsIG51bWJlciBvZiBzdHJpa2VvdXRzIGluIGEgc2Vhc29uIGRpdmlkZWQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiB3YWxrcyBnaXZlbiB1cCBpbiBhIHNpbmdsZSBzZWFzb24uDQoNCiMjIFN3aW5nIGFuZCBhIG1pc3M6IFBlZHJvIE1hcnRpbmV6ICYgdGhlIFN0cmlrZW91dA0KDQpJZiB5b3Ugd2VyZSB0byBhc2sgc29tZW9uZSB3aG8gd2F0Y2hlZCBiYXNlYmFsbCBpbiB0aGUgbGF0ZSAxOTkwJ3Mgd2hhdCB0aGUgbW9zdCBpbXByZXNzaXZlIHRoaW5nIHRoZXkgc2F3IHdhcywgY2hhbmNlcyBhcmUgeW91J2QgaGVhciBhYm91dCB0aGUgbGl0YW55IG9mIGhvbWUgcnVucy4gVGhlIHN0ZXJvaWQgZXJhIG9mIGJhc2ViYWxsIGxlYWQgdG8gYW4gdW5wcmVjZWRlbnRlZCByaXNlIGluIHRoZSBsb25nIGJhbGwsIHdpdGggdGhlIGljb25pYyAiaG9tZSBydW4gcmFjZSIgYmV0d2VlbiBzbHVnZ2VycyBTYW1teSBTb3NhIGFuZCBNYXJrIE1jR3dpcmUgc2VydmluZyBhcyB0aGUgbWFpbiBhdHRyYWN0aW9uLiBGb3IgU29zYSBhbmQgTWNHd2lyZSwgaXQgd2FzIGEgZ29vZCB0aGluZyB0aGF0IHRoZXkgd2VyZSBpbiB0aGUgTmF0aW9uYWwgTGVhZ3VlIGFuZCBQZWRybyBpbiB0aGUgQW1lcmljYW4gTGVhZ3VlLiBXaGVuIHRoZSB0d28gbGVhZ3VlcyBtZXQgaW4gdGhlIGFubnVhbCBBbGwtU3RhciBHYW1lIGluIDE5OTksIGl0IHdhcyBQZWRybyBNYXJ0aW5leiB3aG8gZ290IHRoZSBzdGFydCBmb3IgdGhlIEFtZXJpY2FuIExlYWd1ZS4gVW5kZXIgdGhlIHNoYWRvdyBvZiB0aGUgR3JlZW4gTW9uc3RlciBpbiBQZWRybydzIGhvbWUgZmllbGQgRmVud2F5IFBhcmssIGhlIHBpdGNoZWQgMiBzY29yZWxlc3MgaW5uaW5ncywgc3RyaWtpbmcgb3V0IDUgb2YgNiBiYXR0ZXJzIGZhY2VkLiBBbW9uZyB0aGVtIGluY2x1ZGVkIGJvdGggTWNHd2lyZSBhbmQgU29zYSBhbmQgZnV0dXJlIEhhbGwgb2YgRmFtZXJzIEJhcnJ5IExhcmtpbiwgTGFycnkgV2Fsa2VyLCBhbmQgSmVmZiBCYWd3ZWxsLiBJbiBhIHdvcmxkIHdoZXJlIGJhdHRlcnMgc21hc2hlZCBiYWxscyB3aXRoIHN1cGVyaHVtYW4gYWJpbGl0eSwgUGVkcm8gTWFydGluZXogd2FzIHRoZXJlIHRvIGtlZXAgdGhlbSBncm91bmRlZCB3aXRoIHNvbWUgb2YgdGhlIG5hc3RpZXN0IHBpdGNoaW5nIGluIHRoZSBsZWFndWUuIFdpdGggYSBjYXJlZXIgMywxNTQgc3RyaWtlb3V0cywgUGVkcm8gY291bGQgdHVybiBldmVuIHRoZSBtb3N0IGV4cGVyaWVuY2VkIGJhdHRlciBpbnRvIGEgZm9vbC4NCg0KYGBge3Igc3RyaWtlb3V0c30NCnBsb3QoTWFydGluZXokWWVhciwgTWFydGluZXokU08sIHhsYWI9IlllYXIiLCB5bGFiPSJGcmVxdWVuY3kiLCBtYWluPSJTdHJpa2VvdXRzIChTTykgUGVyIFNlYXNvbiIsIHR5cGU9Im8iLCBjb2w9ImRhcmtyZWQiKSsNCiAgZ3JpZCgpDQoNCmBgYCANCg0KYGBge3Igc3RyaWtlb3V0X3N1bW1hcnksIGVjaG89VFJVRX0NCiMgU3RyaWtlb3V0IHN1bW1hcnkNCnN1bW1hcnkoTWFydGluZXokU08pDQpgYGANCg0KSGVyZSB3ZSBjYW4gdmlzdWFsaXplIGp1c3QgaG93IGRvbWluYW50IFBlZHJvIHdhcyB3aXRoIHN0cmlraW5nIG91dCB0aGUgb3Bwb3NpdGlvbi4gV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGhpcyBmaXJzdCBzZWFzb24gd2hlcmUgaGUgc2VydmVkIG1haW5seSBpbiByZWxpZWYsIGhlIHNob3dlZCBhIGhpZ2ggcHJvZ3Jlc3Npb24gaW4gdGhlIG51bWJlciBvZiByZWNvcmRlZCBzdHJpa2VvdXRzLiBXaGVuIGxvb2tpbmcgYXQgYSBzdW1tYXJ5IG9mIFBlZHJvJ3Mgc3RyaWtlb3V0cywgd2UgZmluZCB0aGF0IGhlIGhhZCBhIG1lYW4gb2YgMTc1LjIyIHN0cmlrZW91dHMuIFdlJ2xsIHNhdmUgdGhpcyBtZWFuIGZvciBhIGxhdGVyIGNhbGN1bGF0aW9uLiANCg0KSGUgbWFuYWdlZCB0byBoaXQgdHdvIGRpc3RpbmN0IHBlYWtzIGluIDE5OTcgYW5kIDE5OTksIGNvaW5jaWRpbmcgd2l0aCB0aGUgaGVpZ2h0IG9mIHRoZSBzdGVyb2lkIGVyYS4gQXMgeW91IG1heSByZWNhbGwsIDE5OTkgYWxzbyBoYXBwZW5lZCB0byBiZSB0aGUgc2Vhc29uIGhlIG1hZGUgaGlzdG9yeSB3aXRoIGhpcyA1IHN0cmlrZW91dCBBbGwgU3RhciBwZXJmb3JtYW5jZS4gVGhlIHByaW1lIG9mIFBlZHJvIE1hcnRpbmV6J3MgY2FyZWVyLCB3aGVyZSBoZSBoYWQgaGlzIGJlc3Qgc3RyaWtlb3V0IHNlYXNvbnMsIHdhcyBhbHNvIGF0IHRoZSBoZWlnaHQgb2YgYW4gZXJhIHRoYXQgc2F3IGJhdHRlcnMgYnJlYWtpbmcgaG9tZSBydW4gcmVjb3Jkcy4gQXMgaGlzIGNhcmVlciBjYXJyaWVkIG9uLCBoaXMgc3RyaWtlb3V0IG51bWJlcnMgbmF0dXJhbGx5IHJlZ3Jlc3NlZC4gT25lIGludGVyZXN0aW5nIG91dGxpZXIgaXMgaGlzIDIwMDEgc2Vhc29uLCB3aGljaCBzaG93cyBhIGxvdyBzdHJpa2VvdXQgc2Vhc29uIGFzIGEgcmVzdWx0IG9mIGEgcm90YXRvci1jdWZmIGluanVyeSBiZW5jaGluZyBoaW0gZm9yIG1vc3Qgb2YgdGhlIHllYXIuIEhpcyBsYXN0IHRocmVlIHNlYXNvbnMgaW4gTmV3IFlvcmsgYW5kIFBoaWxhZGVscGhpYSB3ZXJlIHJpZGRsZWQgd2l0aCBpbmp1cnksIHJlbGVnYXRpbmcgdGhlIGZvcm1lciBXb3JsZCBTZXJpZXMgY2hhbXBpb24gaW50byBhIHZldGVyYW4gcGl0Y2hpbmcgcm9sZS4gDQoNCmBgYHtyIHN0cmlrZW91dHNfdG9fd2Fsa3MsIGVjaG89VFJVRX0NCnBsb3QoTWFydGluZXokWWVhciwgTWFydGluZXokU08sIHhsYWI9IlllYXIiLCB5bGFiPSJGcmVxdWVuY3kiLCBtYWluPSJTdHJpa2VvdXRzIChTTykgdnMgV2Fsa3MgKEJCKSBQZXIgU2Vhc29uIiwgdHlwZT0ibyIsIGNvbD0iZGFya3JlZCIpKw0KbGluZXMoTWFydGluZXokWWVhciwgTWFydGluZXokQkIsIHR5cGU9Im8iLCBjb2w9ImRhcmtibHVlIikrDQogIGdyaWQoKQ0KDQoNCmBgYCANCg0KYGBge3Igd2Fsa3MsIGVjaG89VFJVRX0NCiMgV2FsayBzdW1tYXJ5DQpzdW1tYXJ5KE1hcnRpbmV6JEJCKQ0KYGBgDQoNCldoYXQgbWFkZSBQZWRybyBzdWNoIGEgZG9taW5hbnQgc3RyaWtlb3V0IHBpdGNoZXIgd2FzIGhpcyBsb3cgdGVuZGVuY3kgdG8gd2FsayBiYXR0ZXJzLiBXZSBjYW4gc2VlIGFib3ZlIFBlZHJvJ3MgV2Fsa3MgKEJCKSBwZXIgc2Vhc29uIHdlJ3JlIHNpZ25pZmljYW50bHkgbG93ZXIgdGhhbiBoaXMgc3RyaWtlb3V0cy4gV2hlbiBsb29raW5nIGF0IGEgc3VtbWFyeSBvZiBQZWRybydzIGNhcmVlciB3YWxrcyB0byBzdHJpa2VvdXRzLCB3ZSBmaW5kIHRoYXQgdGhlIG1lYW4gb2Ygd2Fsa3MgaXMgNDIuMjIuIFRoaXMgY2FuIGJlIGF0dHJpYnV0ZWQgdG8gbm90IG9ubHkgdGhlIGluY3JlYXNlIGluIHBsYXllcnMgc3dpbmdpbmcgZm9yIHRoZSBmZW5jZXMsIGJ1dCBhbHNvIGluIGhpcyBwaXRjaGluZyBzdHlsZS4gUGVkcm8gdGhyZXcgZml2ZSBwaXRjaGVzIHdpdGggdHJlbWVuZG91cyBzdWNjZXNzOyBhIGZvdXItc2VhbSBmYXN0YmFsbCwgdHdvLXNlYW0gZmFzdGJhbGwsIGN1dHRlciwgY3VydmViYWxsLCBhbmQgY2lyY2xlLWNoYW5nZXVwLiBQZWRybydzIGZhc3RiYWxsIHdvdWxkIHJlZ2lzdGVyIHVwIHRvIDk4bXBoLCB3aGVyZSBoZSdkIHRoZW4gdGhyb3cgb25lIG9mIGhpcyB0d28gb2ZmLXNwZWVkIHBpdGNoZXMgdG8gdHJpY2sgYmF0dGVycyBpbnRvIHN3aW5naW5nIGVhcmx5LiBIZSBhbHNvIGhhZCBleGNlbGxlbnQgY29udHJvbCBvZiBoaXMgcGl0Y2hlcywgcmFyZWx5IG1pc3NpbmcgdGhlIHN0cmlrZSB6b25lLiBBbGwgdGhvc2UgY29tYmluZWQgdG8gbWFrZSBQZWRybyBhIG1lbmFjZSBvbiB0aGUgbW91bmQgZm9yIG9wcG9zaW5nIGJhdHRlcnMuDQoNCkVhcmxpZXIgd2UgZm91bmQgdGhlIG1lYW4gZm9yIHN0cmlrZW91dHMgYXQgMTc1LjIyIGFuZCBtZW50aW9uZWQgaXQncyB1c2UgZm9yIGEgbGF0ZXIgY2FsY3VsYXRpb24uIEJhc2ViYWxsIGlzIGEgc3BvcnQgdGhhdCBhZG9yZXMgbWF0aCwgYW5kIHRoZXJlIGV4aXN0cyBhIHJhbmtpbmcgZm9yIHBpdGNoZXJzIGtub3duIGFzIHRoZSBTdHJpa2VvdXQtdG8td2FsayByYXRpby4gVGhpcyByYXRpbyBpcyBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZSBjYXJlZXIgYXZlcmFnZS9tZWFuIG9mIGEgcGl0Y2hlcnMgc3RyaWtlb3V0cyB0byB0aGVpciBjYXJlZXIgYXZlcmFnZS9tZWFuIHdhbGtzIChTTy9CQikuIFdoZW4gZGl2aWRpbmcgdGhlIHR3byBtZWFucyB3ZSBmaW5kIHRoYXQgUGVkcm8ncyBTdHJpa2VvdXQtdG8td2FsayByYXRpbyBiZWNvbWVzIDQuMTUuIFRoaXMgdGllcyBoaW0gZm9yIDR0aCBiZXN0IGluIE1MQiBoaXN0b3J5IGFtb25nIHJldGlyZWQgcGxheWVycyBhbmQgdGhlIDEzdGggYmVzdCB3aGVuIGFjY291bnRpbmcgZm9yIGN1cnJlbnRseSBhY3RpdmUgcGl0Y2hlcnMgdGhyb3VnaCAyMDIxLg0KDQoNCiMjIFRoZSBIYWxsIE9mIEZhbWUgc3RhdDogUGVkcm8gTWFydGluZXogJiBFUkENCg0KRm9yIGJhc2ViYWxsIHdyaXRlcnMgc3VibWl0dGluZyB0aGVpciBiYWxsb3RzIHRvIENvb3BlcnN0b3duLCB0aGVyZSBtYXkgbm90IGJlIGEgbW9yZSBpbXBvcnRhbnQgcGl0Y2hpbmcgc3RhdGlzdGljIHRvIHRoZW0gYXMgRWFybmVkIFJ1biBBdmVyYWdlLiBUaGUgYXZlcmFnZSBFUkEgZm9yIGNvbnNpZGVyYXRpb24gdG8gdGhlIEhhbGwgaXMgYSAzLjAwLCBhbmQgbm9uZSBvZiB0aGUgODEgcGl0Y2hlcnMgY3VycmVudGx5IGluZHVjdGVkIGhhdmUgYSBjYXJlZXIgRVJBIGJlbG93IDQuMDAgKEphY2sgTW9ycmlzIGhvbGRzIHRoZSBoaWdoZXN0IGF0IDMuOTApLiANCg0KDQpgYGB7ciBFUkFfUHJvZ3Jlc3Npb259DQoNCmdncGxvdChNYXJ0aW5leiwgYWVzKHg9WWVhciwgeT1FUkEpLCB4bGFiPSJZZWFyIiwgeWxhYj0iRWFybmVkIFJ1biBBdmVyYWdlIChFUkEpIikrDQogIGdlb21fcG9pbnQoY29sPSJyZWQiKStnZW9tX3Ntb290aChjb2xvcj0iZGFya29yY2hpZDQiKSsNCiAgZ2d0aXRsZSgiUGVkcm8gTWFydGluZXogRVJBIFBlciBTZWFzb24iKSsNCiAgdGhlbWVfYncoKQ0KDQpgYGAgDQoNCmBgYCB7ciBQZWFyc29ufQ0KIA0KICBjb3IudGVzdChNYXJ0aW5leiRFUkEsIE1hcnRpbmV6JFllYXIsIG1ldGhvZCA9ICJwZWFyc29uIikNCg0KYGBgICANClRoZSByZWdyZXNzaW9uIGxpbmUgc2hvd3MgYSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzY2F0dGVycGxvdC4gVGhpcyBpcyBhbHNvIHNob3duIGluIHRoZSBQZWFyc29uIHIgdmFsdWUgd2l0aCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGJlaW5nIDAuMzksIGEgbWVkaXVtIGNvcnJlbGF0aW9uLiBBcyBQZWRybydzIGNhcmVlciBwcm9ncmVzc2VkIGludG8gaGlzIDE4dGggc2Vhc29uLCBoaXMgRVJBIHJlZ3Jlc3NlZC4gU2luY2UgYSBsb3dlciBzY29yZSBpbmRpY2F0ZXMgYmV0dGVyIHNlYXNvbmFsIHByb2R1Y3Rpb24sIGEgaW5jcmVhc2luZyBFUkEvcG9zaXRpdmUgY29ycmVsYXRpb24gdHJhbnNsYXRlcyBpbnRvIGEgc2Vhc29uYWwgYW5kIGNhcmVlciByZWdyZXNzaW9uIGZvciBQZWRyby4gVGhlcmUgYXJlIHR3byBub3RpY2VhYmxlIG91dGxpZXJzIHdpdGhpbiB0aGlzIHNjYXR0ZXJwbG90OyBoaXMgRVJBIGluIDIwMDAgYW5kIGluIDIwMDguIFBlZHJvIE1hcnRpbmV6IHJlY29yZGVkIGEgMS43NCBFUkEgaW4gMjAwMC4gVGhpcyBpcyBub3Qgb25seSB0aGUgYmVzdCBzaW5nbGUgc2Vhc29uIG9mIGhpcyBjYXJlZXIsIGp1c3QgbWVyZWx5IGJlYXRpbmcgb3V0IGhpcyAxOTk0IFNlYXNvbiwgYnV0IGFsc28gb25lIG9mIHRoZSBiZXN0cyBzaW5nbGUtc2Vhc29uIHBpdGNoaW5nIHBlcmZvcm1hbmNlcyBvZiBhbGwgdGltZS4gSGUgcG9zdGVkIGhpcyB3b3JzdCBzaW5nbGUgc2Vhc29uIEVSQSBpbiAyMDA4IHdpdGggYSA1LjYxIGR1cmluZyBoaXMgZmluYWwgeWVhciB3aXRoIHRoZSBOZXcgWW9yayBNZXRzLiBXaGlsZSBhIDUuNjEgaXMgbm90IG5lY2Vzc2FyaWx5IGJhZCwgaXQgaXMgYSBsb25nIGRlcGFydHVyZSBmcm9tIGhpcyBwcmV2aW91cyB5ZWFycy4gQSBtdWx0aXR1ZGUgb2YgZmFjdG9ycyBwbGF5IGludG8gdGhpcywgaW5jbHVkaW5nIGFnZSwgaW5qdXJ5LCBhbmQgcmVsZWdhdGlvbiBhcyBhIGJvdHRvbS1vZi10aGUtcm90YXRpb24gc3RhcnRlci9yZWxpZWYgcGl0Y2hlci4gSW4gdGhlIGVuZCwgUGVkcm8gZmluaXNoZWQgaGlzIGNhcmVlciB3aXRoIGFuIDIuOTMgRVJBLCBwbGFjaW5nIGhpbSA0M3JkIGFsbCB0aW1lIGFtb25nIHBpdGNoZXJzIGFuZCBjb21mb3J0YWJseSBpbiB0aGUgSGFsbCBvZiBGYW1lLg0KDQoNCiMjIFRoZSBEYXJraG9yc2Ugc3RhdDogUGVkcm8gTWFydGluZXogJiBGaWVsZGluZyBJbmRlcGVuZGVudCBQaXRjaGluZw0KDQpVbmxpa2UgRVJBLCBGaWVsZGluZyBJbmRlcGVuZGVudCBQaXRjaGluZyAoRklQKSByZW1vdmVzIHRoZSBhc3Npc3RhbmNlIG9mIGZpZWxkZXJzIHdoZW4gcmVjb3JkaW5nIGEgcGl0Y2hlcnMgcGVyZm9ybWFuY2UuIEl0IGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgYSBwaXRjaGVycyDigJx0aHJlZSB0cnVlIG91dGNvbWVz4oCdIHdoaWNoIGFyZSBob21lcnMsIHN0cmlrZW91dHMsIGFuZCB3YWxrcy4gRGV0cmFjdG9ycyB3aWxsIG9mdGVuIGxvb2sgYXQgRklQIGFzIHNvbWV0aW1lcyB1bnJlbGlhYmxlIHdoZW4gY29tcGFyZWQgdG8gb3RoZXIgYWR2YW5jZWQgbWV0cmljcyBzdWNoIGFzIEVSQSssIHdoaWNoIHRha2VzIHBsYXlpbmcgY29uZGl0aW9ucyBpbnRvIGFjY291bnQgZm9yIEVSQS4gV2hpbGUgRklQIGlzIG5vdCBwZXJmZWN0LCBpdCBpcyBtZWFudCB0byBiZSBhIGZhaXIgYXNzZXNzbWVudCBvZiBhbiBpbmRpdmlkdWFsIHBpdGNoZXJzIHBlcmZvcm1hbmNlIHdpdGhvdXQgdGhlIG91dHNpZGUgaW50ZXJmZXJlbmNlIG9mIGZpZWxkZXJzLiBUaGUgbnVsbCBoeXBvdGhlc2lzIGhlcmUgYmVpbmcgdGhhdCBhIHBpdGNoZXJzIEZJUCB3aWxsIGZhbGwgY2xvc2VseSBpbiBsaW5lIHdpdGggdGhlaXIgRVJBLiANCg0KYGBge3IgRklQX1Byb2dyZXNzaW9ufQ0KDQpnZ3Bsb3QoTWFydGluZXosIGFlcyh4PVllYXIsIHk9RVJBKSwgeGxhYj0iWWVhciIsIHlsYWI9IkVhcm5lZCBSdW4gQXZlcmFnZSAoRVJBKSIpKw0KICBnZW9tX3BvaW50KGNvbD0icmVkIikrZ2VvbV9zbW9vdGgoY29sb3I9ImRhcmtvcmNoaWQ0IikrDQogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1GSVApLCBjb2w9ImJsdWUiKSsNCiAgZ2d0aXRsZSgiUGVkcm8gTWFydGluZXogRVJBIFBlciBTZWFzb24iKSsNCiAgdGhlbWVfYncoKQ0KDQpgYGAgDQpgYGB7ciB0d29fc2FtcGxlLCBlY2hvPVRSVUV9DQojIFQtVGVzdCBiZXR3ZWVuIEVSQSBhbmQgRklQLg0KdC50ZXN0KE1hcnRpbmV6JEVSQSwgTWFydGluZXokRklQKQ0KYGBgDQpBYm92ZSB3ZSBzZWUgUGVkcm8ncyBGSVAgYWxvbmdzaWRlIGhpcyBFUkEuIFdoZW4gbG9va2luZyBhdCB0aGUgZ3JhcGgsIHdlIGZpbmQgdGhhdCBoaXMgRklQIGlzIHZlcnkgY2xvc2Ugd2l0aCBoaXMgRVJBLCB3aXRoIHNvbWUgc2Vhc29ucyBzZWVpbmcgYSBuZWFyIG92ZXJsYXAuIEluIDE5OTkgUGVkcm8gTWFydGluZXogcmVjb3JkZWQgYSAxLjM5IEZJUCwgYSBtYWpvciBsZWFndWUgcmVjb3JkIHRoYXQgaGFzIHN0b29kIHNpbmNlLiBXaGVuIGNvbmR1Y3RpbmcgYSB0d28gc2FtcGxlIHQtdGVzdCB3aXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsLCB3ZSBmaW5kIHRoZSBwLXZhbHVlIHRvIGJlIDAuNzY4MS4gVGhlIG1lYW4gb2YgeChFUkEpIGlzIDIuOTkgd2hpbGUgbWVhbiBvZiB5KEZJUCkgaXMgMi44OS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRydWUgYW5kIHRoYXQgRklQIGZhbGxzIGNsb3NlbHkgaW4gbGluZSB3aXRoIEVSQS4gDQoNCiMjIENvbmNsdXNpb25zDQoNCg0KTnVtYmVycyBkb24ndCBhbHdheXMgdGVsbCB0aGUgZnVsbCBzdG9yeS4gV2hpbGUgUGVkcm8ncyAyMDAwIHNlYXNvbiBpcyBvZnRlbiBjb25zaWRlcmVkIG9uZSBvZiB0aGUgYmVzdCBzZWFzb25zIGV2ZXIgcGl0Y2hlZCwgaGUgYW5kIHRoZSBSZWQgU294IG1pc3NlZCBvdXQgb24gYSBzaG90IGF0IHRoZSBXb3JsZCBTZXJpZXMuIERlc3BpdGUgYSBoaXN0b3JpYyBwZXJmb3JtYW5jZSBieSBCb3N0b24ncyBBY2UsIHRoZSBSZWQgU294IHdlbnQgODUtNzcgcGxhY2luZyBpbiAybmQgcGxhY2UgaW4gdGhlaXIgZGl2aXNpb24gYW5kIG1pc3Npbmcgb3V0IG9uIHRoZSBsYXN0IHBsYXlvZmYgc3BvdCB0byB0aGUgOTEtNzEgU2VhdHRsZSBNYXJpbmVycy4gSXQgd2Fzbid0IHVudGlsIDIwMDQgdGhhdCB0aGUgUmVkIFNveCBtYWRlIGhpc3RvcnkgYW5kIHdvbiB0aGUgV29ybGQgU2VyaWVzIGZvciB0aGVpciBmaXJzdCB0aW1lIGluIDg2IHllYXJzLiBIb3cgZGlkIFBlZHJvIE1hcnRpbmV6IGZhaXIgdGhhdCB5ZWFyPyBIZSB3YXMgdGhlIFNveCAjMiBwaXRjaGVyLCB0aGUgdGl0bGUgb2YgQWNlIG5vdyBiZWxvbmdpbmcgdG8gQ3VydCBTY2hpbGxpbmcsIHdhcyBub3Qgdm90ZWQgYXMgYW4gQWxsLVN0YXIsIGFuZCBwb3N0ZWQgYSAzLjkwIEVSQS4gRGVzcGl0ZSBhbGwgdGhvc2UgYWNoaWV2ZW1lbnRzIGFuZCByZWNvcmRzLCBiYXNlYmFsbCB3aWxsIGFsd2F5cyByZW1haW4gYSB0ZWFtIHNwb3J0IHdoZXJlIGV2ZW4gdGhlIGdyZWF0ZXN0IHBsYXllcnMgb2YgYWxsIHRpbWUgY2FuIGdvIGxvbmcgcGVyaW9kcyB3aXRob3V0IGV2ZXIgYmVpbmcgYSBjaGFtcGlvbi4gUGVkcm8gaXMgb25lIG9mIHRob3NlIHdobyBtYW5hZ2VkIHRvIGJlIGJvdGguDQoNCldoaWxlIGhlIG1heSBub3QgaGF2ZSBoYWQgYXMgbWFueSB3aW5zIGFzIGhpcyBjb250ZW1wb3JhcmllcywgdGhlcmUgaXMgbm8gZGVueWluZyB0aGF0IHdoZW4gUGVkcm8gd2FzIGF0IGhpcyBwZWFrIHRoZXJlIHdhcyBubyBvbmUgZWxzZSBuZWFyIGhpbS4gQWxsIGluIGFsbCwgUGVkcm8gTWFydGluZXogd2FzIG9uZSBvZiB0aGUgbW9zdCBkb21pbmFudCBzdHJpa2VvdXQgcGl0Y2hlcnMsIGFuZCB3aWxsIGJlIHJlbWVtYmVyZWQgd2l0aCB0aGUgbGlrZXMgb2YgUmFuZHkgSm9obnNvbiwgTm9sYW4gUnlhbiwgR3JlZyBNYWRkdXgsIGFuZCBSb2dlciBDbGVtZW5zLiBUaGUgcmVhc29uIGZvciBoaXMgZ3JlYXRuZXNzIHdhcyBub3QgaW4gaGlzIHZlbG9jaXR5IG9yIGV2ZW4gdGhlIHN1Y2Nlc3Mgb2YgdGhlIHRlYW0gc3Vycm91bmRpbmcgaGltLCBidXQgaXQgd2FzIHdpdGggaGlzIGVmZmVjdGl2ZW5lc3Mgb24gdGhlIG1vdW5kLiBQZWRybyB3YXMgb25lIG9mIHRoZSBiZXN0IGFsbCB0aW1lIHdoZW4gaXQgY2FtZSB0byBzdHJpa2luZyBvdXQgYmF0dGVycywgYXMgd2VsbCBhcyBub3QgYWxsb3dpbmcgd2Fsa3MuIFRoZSBjb21iaW5hdGlvbnMgb2YgbG90cyBvZiBzdHJpa2VvdXRzIGFuZCBmZXcgd2Fsa3MgYm9kZXMgdmVyeSB3ZWxsIGZvciBhbGwgcGl0Y2hlcnMgd2hvIGNhbiBhY2NvbXBsaXNoIHN1Y2ggYSBmZWF0LiBBbGwgb2YgdGhlaXIgc3RhdHMgd2lsbCBiZSBoZWlnaHRlbmVkLCB0aGVpciBFUkEgYW5kIFdISVAgd2lsbCBkcm9wIGNvbnNpZGVyYWJseSBhcyBhIHJlc3VsdCwgYW5kIG9wcG9zaW5nIGJhdHRlcnMgd2lsbCBiZSBwcmVwYXJpbmcgZXh0cmEgaGFyZCB3aGVuIHRoZXkgc2VlIHRoZWlyIG5hbWUgb24gdGhlIGxpbmV1cCBjYXJkLiBQZWRybyBNYXJ0aW5leiBkaWQgYWxsIG9mIHRoZXNlIHRoaW5ncyB0aHJvdWdob3V0IHRoZSAxOCBzZWFzb25zIGhlIHBsYXllZCBpbiB0aGUgTUxCLCBhbmQgaGUgbmV2ZXIgdG9vayBhbiBvZmYgc2Vhc29uLiBIZSBwZXJzb25hbGx5IGRpZCBub3QgYWxsb3cgdGhlIFN0ZXJvaWQgRXJhIG9mIGJhc2ViYWxsIHRvIG5lZ2F0aXZlbHkgYWZmZWN0IGhpcyBjYXJlZXIuIEluIGZhY3QgaGUgZmxvdXJpc2hlZCBpbiBhbiBlcmEgd2hlcmUgcGl0Y2hlcnMgc3RydWdnbGVkLiBUaGUgYXJndW1lbnQgZm9yIHRoZSBncmVhdGVzdCBwaXRjaGVyIG9mIGFsbCB0aW1lIGlzIG9uZSB3aXRoIG1hbnkgY2FuZGlkYXRlcywgYnV0IGl0IHdvdWxkIGJlIGZvb2xpc2ggdG8gbm90IGNvbnNpZGVyIFBlZHJvIE1hcnRpbmV6IGFzIGEgbWVtYmVyIG9mIHRoYXQgY29udmVyc2F0aW9uLiAgDQo=