Results

  1. Score (which is user generated) has a strong relationship with the popularity of a show. There appears to be a cubic relationship between these variables.

  2. The number of producers on the committee board of a given anime have a quadratic relationship with members (concave). The same can be said about the age of an anime.

  3. Rating also has an impact. Anime rated as Children and All Ages are less popular than anime with a PG 13 rating. On the other hand, shows rated as Mild Nudity and R +17 are more popular than PG 13 rated anime.

  4. Shows animated by studios: Kyoto Animation, Bones or A-1 Pictures are more popular than shows animated by other studios.

  5. Anime genres are very important as well: Harem, Action, Romance, School, Psychological, Supernatural, Shounen, Horror, and Fantasy have a positive impact on popularity. On the other hand, Historical, Music, Space, Mecha, Sports, Demons and Police have a negative impact on popularity.

  6. Light Novel adaptations are more popular than original anime, and anime with a different source material (Manga, Visual Novel, Books, etc).

  7. Producers Sanrio and Shogakukan have a negative effect on popularity. On the other hand, Shueshia, Toho Animation and Pony Canyon have a positive impact on popularity.

  8. Shows with more than 26 episodes are less popular than shows with fewer episodes.

Intro

A few months ago I stumbled upon a tutorial about how to do web scraping in R. So i decided to try on My Anime List. Which is a huge anime and manga database. Some data on the website is user-generated, like the scores and reviews given to an anime. My goal was to discover what makes an anime popular. In terms of methodology I used linear regressions. With that in mind I selected a few features: Genres, Anime Studio, Producers, Rating, how old an anime is, Source Material, Number of producers (as a proxy of budget) and number of episodes.

To measure “popularity” I used the variable “members” which is the sum of users that are currently watching a show, completed a show, have a show on-hold, dropped it or are planning to watch a show in the future.

Selecting Observations

First, I decided to only analyze tv shows, not movies, onas or ovas. Second, I picked shows whose episodes ran longer than 18 minutes. Third, I only considered shows from 2005 to the spring season of 2020. My AnimeList was launched at the end of 2004, so it makes sense to start in 2005. I scraped MAL at the beginning of the 2020 summer season so that’s why the newest shows in the database are from the spring 2020 season.

For feature selection I used my knowledge about the anime industry and I ran a lot of Anova tests to select variables. (I also ran a lasso regression, and picked the variables that were not dropped as a starting point). I had to drop the genre Ecchi because it created multicollinearity with the ratings. Specifically with “Mild-Nudity”.

Methodology

After a lot of trials and errors, this is the model I came out with:

log(Members) = 𝛽0 + 𝛽1 Score + 𝛽2 Score ∧ 2 + 𝛽3 Score ∧ 3 + 𝛽4 Epi + 𝛽5 Producers + 𝛽6 Producers ∧ 2 + 𝛽7 Age+ 𝛽8 Age ∧ 2 + 𝛽9 Children + 𝛽10 All Ages + 𝛽11 R 17 + 𝛽12 Mild Nudity + 𝛽13 Kyoto Animation + 𝛽14 A 1 Pictures + 𝛽15 Bones + 𝛽16 Shin-Ei Animation + 𝛽17 Historical + 𝛽18 Harem + 𝛽19 Music + 𝛽20 Action + 𝛽21 Romance + 𝛽22 School + 𝛽23 Space + 𝛽24 Psychological + 𝛽25 Supernatural+𝛽26 Horror + 𝛽27 Fantasy + 𝛽28 Mecha + 𝛽29 Sports + 𝛽30 Game + 𝛽31 Demons + 𝛽32 Police + 𝛽33 Shounen + 𝛽34 Light.novel + 𝛽35 Sanrio + 𝛽36 Shueisha + 𝛽37 Toho Animation + 𝛽38 TBS + 𝛽39 Pony.Canyon + 𝛽40 Shogakukan + 𝜀

Now, I’ll go over the coefficients. It makes sense to start with the outcome we want to understand: the members variable.

The data is right-skewed; there are more “not that popular” shows than very popular ones. The median was 89418 and the most popular show had 2116123 members. When modeling this outcome, a strong argument can be made that it should be log-transformed.

Here’s the transformed data:

While not perfect (now it looks a bit left-skewed), our model results will probably be better.

Score is a user-generated variable that indicates the evaluation of MAL users towards a particular anime from 1 to 10. The mean and median are 7.2.

Epi is a dummy variable which takes the value 1 for shows with more than 26 episodes and 0 for shows with 26 or fewer episodes. Producers is the number of producers on the committee board of a given anime. Age is how old an anime is (in years). For example, 0 means 2020 and 15 means 2005. Here’s the number of shows animated by year.

Children, All Ages, R 17+ y Mild Nudity are part of the categorical variable rating. The reference level is the PG-13 category. A-1 Pictures, Bones, Kyoto Animation and Shin Ei Animation are dummy variables for those studios. Also, I made dummy variables for the studios:

Toei Animation, Sunrise, J.C Staff, Madhouse, TMS Entertainment, Production.I.G, Studio.Deen, Studio.Pierrot, OLM, Nippon.Animation, DLE, Tatsunoko.Production, Gonzo, Xebec, AIC, Shaft, Brain.Base, ufotable, Gainax and feel.

They were not considered in the final model, because the anova tests that I carried out reported that these studios did not contribute statistically to the model.

The coefficients from 𝛽17 to 𝛽33 are dummy variables for anime genres. It is necessary to mention that as with anime studios, I created variables for many genres that were not considered in the final model because they did not contribute statistically to our model: Among the genres dropped are:

Comedy, Adventure, Slice of Life, Drama, Sci Fi, Mystery, Seinen, Martial Arts, Samurai, Shoujo, Shoujo Ai, Shounen Ai, Josei, Vampire, Military, Demons, Magic and Thriller

Light Novel is a variable which takes the value 1, when the source material of a show is a light novel and 0 for anime with a different source. Finally, from 𝛽35 to 𝛽40 correspond to dummy variables for different anime production companies. As with genres and studios, there were many producers who were initially considered but were dropped for the same reasons. Among them were:

Kodansha, Bandai, Square Enix, Kadokawa, Aniplex, NHK, TV Tokyo, TV Asahi, Fuji TV, Gakken, Dentsu, Media Factory, Lantis, KlockWorx, Frontier Works, flying DOG, Nippon Television Network, Showgate, Starchild Records, Sony Music y VAP.

There were some influential observations so I decided to eliminate them one by one until there were no more shows with high leverage. The anime involved in the process were: “Naikaku Kenryoku Hanzai Kyousei Torishimarikan Zaizen Joutarou”, “Death Note”, ”Kaitou Joker 4th Season”, “Active Raid: Kidou Kyoushuushitsu Dai Hachi Gakari” and “Tsurune: Kazemai Koukou Kyuudoubu”.

After doing this it is possible to point out that the most important change is that the Shin Ei animation coefficient is no longer statistically significant. In addition, there are significant increases in the impact of certain variables such as “Police” and “Kyoto Animation”

I ran a Shapiro test to assess normality. And there wasn’t normality. So I decided to winsorize the data. There were 24 anime involved in the process, all of them had less than 1700 members. Lastly, I decided to run the model with robust standard errors because I detected heteroscedasticity.

Understanding Anime Popularity
Dependent Variable: Log (Members)
Model 1 Model 2 Model 3
Score -13.849*** -14.570*** -14.570***
(3.396) (3.374) (3.555)
Score^2 1.970*** 2.074*** 2.074***
(0.482) (0.479) (0.503)
Score^3 -0.086*** -0.091*** -0.091***
(0.023) (0.022) (0.024)
Episode -0.282*** -0.328*** -0.328***
(0.085) (0.085) (0.101)
Producers 0.210*** 0.210*** 0.210***
(0.026) (0.026) (0.030)
Producers^2 -0.013*** -0.013*** -0.013***
(0.002) (0.002) (0.003)
Anime Age 0.113*** 0.111*** 0.111***
(0.019) (0.019) (0.019)
Anime Age^2 -0.009*** -0.009*** -0.009***
(0.001) (0.001) (0.001)
Children -0.940*** -0.878*** -0.878***
(0.108) (0.109) (0.125)
All Ages -0.993*** -0.974*** -0.974***
(0.116) (0.115) (0.143)
R 17+ 0.393*** 0.402*** 0.402***
(0.060) (0.060) (0.059)
Mild Nudity 0.369*** 0.369*** 0.369***
(0.079) (0.078) (0.080)
Kyoto Animation 0.792*** 0.864*** 0.864***
(0.175) (0.177) (0.129)
A1 Pictures 0.432*** 0.435*** 0.435***
(0.093) (0.092) (0.096)
Bones 0.276** 0.279** 0.279**
(0.128) (0.127) (0.122)
Shin Ei Animation -0.559** -0.289 -0.289
(0.228) (0.243) (0.258)
Historical -0.594*** -0.592*** -0.592***
(0.080) (0.080) (0.083)
Harem 0.442*** 0.447*** 0.447***
(0.083) (0.083) (0.074)
Music -0.592*** -0.599*** -0.599***
(0.094) (0.093) (0.095)
Action 0.372*** 0.382*** 0.382***
(0.047) (0.047) (0.048)
Romance 0.363*** 0.360*** 0.360***
(0.052) (0.051) (0.051)
School 0.316*** 0.315*** 0.315***
(0.050) (0.049) (0.047)
Space -0.487*** -0.479*** -0.479***
(0.140) (0.139) (0.132)
Psychological 0.390*** 0.364*** 0.364***
(0.101) (0.101) (0.094)
Supernatural 0.249*** 0.235*** 0.235***
(0.054) (0.054) (0.052)
Horror 0.314*** 0.322*** 0.322***
(0.120) (0.119) (0.116)
Fantasy 0.234*** 0.226*** 0.226***
(0.050) (0.049) (0.049)
Mecha -0.224*** -0.250*** -0.250***
(0.086) (0.085) (0.087)
Sports -0.252*** -0.239*** -0.239***
(0.086) (0.086) (0.090)
Game -0.206** -0.208** -0.208*
(0.097) (0.096) (0.116)
Demons -0.307*** -0.299*** -0.299***
(0.093) (0.092) (0.099)
Police -0.393** -0.453** -0.453**
(0.185) (0.199) (0.185)
Shounen 0.117** 0.122** 0.122**
(0.055) (0.055) (0.061)
Light Novel 0.416*** 0.420*** 0.420***
(0.059) (0.059) (0.055)
Sanrio -0.813*** -0.819*** -0.819***
(0.265) (0.263) (0.266)
Shueisha 0.224** 0.207** 0.207**
(0.088) (0.088) (0.081)
Toho Animation 0.280** 0.272** 0.272**
(0.125) (0.124) (0.111)
TBS 0.175** 0.166** 0.166*
(0.084) (0.084) (0.085)
Pony Canyon 0.152** 0.158** 0.158**
(0.075) (0.074) (0.078)
Shogakukan -0.362*** -0.347*** -0.347**
(0.114) (0.113) (0.142)
Constant 39.778*** 41.433*** 41.433***
(7.918) (7.867) (8.322)
Observations 1,718 1,712
R2 0.710 0.712
Adjusted R2 0.703 0.705
Residual Std. Error 0.797 (df = 1677) 0.791 (df = 1671)
F Statistic 102.633*** (df = 40; 1677) 103.043*** (df = 40; 1671)
Note: p<0.1; p<0.05; p<0.01


Model 1 is the first model I came up with. Model 2 shows the results after I dropped the high leverage observations and fixed the normality issues. Model 3 is Model 2 with robust standard errors. All 3 models are present in the table so you can see how the results change. The most important model is number 3 and therefore, when I refer to the results from now on, I will be talking about the coefficients of this model. Finally, it is necessary to point out that when I interpret a coefficient in the way: “this or that variable has an effect of X% on popularity”. These effects are always on average and keeping the rest of the variables constant. I find it a bit repetitive to have to write it every time I interpret a coefficient, so I prefer to make it clear here.

Findings

Score

It is possible to say that, in general terms, shows with a high score tend to be more popular. That being said, the data show us that there is a cubic relationship between the variables members and score. As you can see on the graph. The curve (in orange) goes down, back up, then back down again. Which means that for shows with very low scores one more point in the score has a negative effect on popularity. Then, for shows over 5.5 an increase in the score has a positive effect on popularity. Finally, for shows with a high score (over 8.4 or 8.5) the marginal effect of a point seems to flatten out.

Age

There is a quadratic relationship between the age of an anime and its popularity. Specifically, an additional year has a positive effect until 2014 (6 years), which makes sense, since shows need time to gain members. After 6 years the effect of an additional year becomes negative, which also makes sense, since intuition would tell us that old shows are less popular.

Producers

When it comes to the number of producers, the relationship with the variable members is also quadratic. Because the coefficient on producers is positive and the coefficient on producers ^2 is negative, this equation literally implies that, at low numbers of “producers”, an additional producer has a positive effect on log(members). At 8 producers, the effect becomes negative. The quadratic shape means that the semi-elasticity of producers with respect to members is decreasing as the number of producers increases.

Number of Episodes

While I was exploring the database looking for a relationship between the number of episodes and the member variable. I noticed that shows with more than 26 episodes seemed to be less popular. Therefore, I decided to create a dummy variable, which takes the value 1, for shows with more than 26 episodes and 0 for shows with 26 or fewer episodes. The results indicate that shows with more than 26 episodes are on average 33% less popular than shows with fewer episodes.

Rating

Anime under the categories “Children” and “All Ages” are on average 85% and 92% less popular than shows listed as PG-13. This perhaps has to do with the variable “members” being generated by users. Children, who are the target audience for these shows, probably don’t have MAL accounts, hence why they are less popular. In relation to the above, anime under the categories “Mild Nudity” and “R +17” are 40% and 36% more popular than those in the PG-13 category.

Anime Studios

There are 3 studios that have a positive impact on the popularity of a show. The first one is Kyoto Animation, on average, the shows animated by this studio are 86% more popular than the rest of the anime (without considering the anime produced by Bones, A1 Pictures and Shin Ei Animation, it is necessary to clarify this, since the anime studios in this model are a categorical variable and not a mere dummy variable). On the other hand, Bones has a positive effect of 28% while A.1 Pictures has one of 44%. Shin Ei Animation doesn’t seem to have a statistically significant effect.

These results make sense to me. Kyoto Animation is probably one of the best studios in terms of animation quality. Despite not animating many shows, it must be considered that during the past decade each anime they made was a commercial success, (Air, Kanon, Clannad, Lucky Star, Suzumiya Haruhi, K-On!).

Top 10 Most Popular Anime Made by Kyoto Animation .
Anime Members Year
Clannad 965840 2007
Clannad: After Story 806320 2008
Chuunibyou demo Koi ga Shitai! 791911 2012
Hyouka 778324 2012
Violet Evergarden 776039 2018
Kyoukai no Kanata 725282 2013
Suzumiya Haruhi no Yuuutsu 681322 2006
K-On! 671464 2009
Kobayashi-san Chi no Maid Dragon 619021 2017
Nichijou 557696 2011

On the other hand, Bones is perhaps one of the most important anime studios ever. Many of their “old” shows like Eureka Seven, Darker than Black, Ouran Koukou Host Club or Soul Eater, have many members. Also, as you can see in the table, they are animating Boku No Hero Academia, which is one of the most popular anime shows at the moment.

Top 10 Most Popular Anime Made by Bones.
Anime Members Year
Fullmetal Alchemist: Brotherhood 1844434 2009
Boku no Hero Academia 1465688 2016
Noragami 1270201 2014
Boku no Hero Academia 2nd Season 1236998 2017
Soul Eater 1067021 2008
Boku no Hero Academia 3rd Season 986716 2018
Mob Psycho 100 965277 2016
Noragami Aragoto 858029 2015
Ouran Koukou Host Club 707578 2006
Darker than Black: Kuro no Keiyakusha 696411 2007

Finally, A-1 Pictures is the one that surprises me the least. In the past decade they became the powerhouse of anime production (Sword Art Online, Ao no Exorcist, Shigatsu wa Kimi no Uso, Fairy Tail, Nanatsu no Taizai). Between 2014 and 2016 they produced 10 or more television shows per year. Which is a very high figure comparatively. The only studio that has done something similar is JC Staff in 2012 and 2017.

Top 10 Most Popular Anime Made by A-1 Pictures
Anime Members Year
Sword Art Online 1864435 2012
Ao no Exorcist 1210116 2011
Sword Art Online II 1202263 2014
Shigatsu wa Kimi no Uso 1146702 2014
Fairy Tail 1137434 2009
Nanatsu no Taizai 1106646 2014
Boku dake ga Inai Machi 1087139 2016
Ano Hi Mita Hana no Namae wo Bokutachi wa Mada Shiranai. 963519 2011
Kuroshitsuji 755402 2008
Darling in the FranXX 709474 2018

As you can see on the boxplot behind, It is clear that these 3 studios animate shows that are more popular than the shows animated by the rest of the anime studios.

Genres

The genre of an anime is perhaps one of the most important elements in determining the popularity of a show. Surprisingly, the genre that has the highest positive effect on the member variable is Harem, on average a show of this type is 45% more popular than a show that is not listed as Harem. Other genres that have a positive effect on popularity are: Action, Romance, School, Psychological, Supernatural, Horror, Shounen and Fantasy.

The genres with the biggest negative effect are “Music” and “Historical”. A show with these genres is, on average, 59% less popular than a show that’s not listed as “Music” or “Historical”. The other genres that have a negative effect are Space, Mecha, Sports, Demons and Police. In the graph behind you can look at the popularity density distribution of some of the most influential genres. I picked the two genres with the highest negative and positive effect on popularity.

Source Material

Of all the sources, the only one that has a significant effect is light novel. If you don’t know what a light novel is read this. Light novels adaptations are on average 42% more popular than anime whose source material comes from another medium. I think this is partly due to the rise in popularity of Isekai in the last decade, as Isekai anime are predominantly adaptations of light novels. If you don’t know what an isekai anime is read this

Most Popular Light Novel Adaptations
Anime Members Year
Sword Art Online 1864435 2012
No Game No Life 1459578 2014
Toradora! 1287796 2008
Sword Art Online II 1202263 2014
Re:Zero kara Hajimeru Isekai Seikatsu 1177143 2016
Another 1049527 2012
Kono Subarashii Sekai ni Shukufuku wo! 1017264 2016
Durarara!! 983181 2010
Fate/Zero 938115 2011
Bakemonogatari 921784 2009

Producers

There are two producers that have a negative effect on popularity. The first one is Sanrio. Shows Sanrio is part of the production committee are on average 82% less popular than shows Sanrio is not part of the committee. From wikipedia: “Sanrio is a Japanese company that designs, licenses and produces products focusing on the kawaii (‘cute’) segment of Japanese popular culture”. The other producer that has a negative effect is the publisher Shogakukan, the shows in which Shogakukan is involved are on average 35% less popular than the shows in which this publisher is not on the production committee.

The producers Shueisha, Toho Animation, and Pony Canyon have a positive effect on popularity. Shows in which Shūeisha is involved are on average 21% more popular than the anime in which this publisher is not involved. This makes sense since this publisher publishes the Weekly Shōnen Jump magazine.

Top 10 Most Popular Anime Produced by Shueisha
Anime Members Year
Death Note 2116123 2006
One Punch Man 1702381 2015
Tokyo Ghoul 1526793 2014
Boku no Hero Academia 1465688 2016
Hunter x Hunter (2011) 1264941 2011
Boku no Hero Academia 2nd Season 1236998 2017
Naruto: Shippuuden 1222099 2007
Ao no Exorcist 1210116 2011
Boku no Hero Academia 3rd Season 986716 2018
Ansatsu Kyoushitsu 970173 2015

Here’s a boxplot with the most important manga/light novel publishers (Kadokawa,Kodansha,Shogakukan and Shueisha). As can be seen, Shueisha has the highest log(members) median. On the other hand Shogakukan has the lowest one.

The other two producers that have a positive effect are 1) Toho Animation, which is an animation studio and film distributor. 2) Pony Canyon, which according to wikipedia is: “a Japanese company, which publishes music, DVD and VHS videos, movies, and video games”. Toho Animation has a positive effect of 27% while Pony Canyon has an effect of 16%. Finally, the television company TBS does not seem to have a statistically significant effect on the popularity of an anime.

Final Thoughts

Our adjusted r squared tells us that the variables included in the model are explaining about 70% of the variability of the members variable. However there are certain things to keep in mind when analyzing these results. First, I don’t know the geographic distribution of MAL users. I suspect that they are mostly from English-speaking countries. Therefore, one must be careful when making generalizations regarding these results.

Second, I couldn’t find a way to control the effect prequels have on sequels. If the first season of a show is popular, this will make the sequels to that show very popular as well. With the data I have there is no way to control this effect. Third, I cannot control the effect that certain streaming platforms such as Netflix, Amazon or Crunchyroll may have. Fourth, the data may show numbers that are not very favorable towards shows whose target audience is children since children probably do not have MAL accounts.

Despite all of the above, I think this first approach sheds some light on what elements contribute to the popularity of anime. In the future I would like to create machine learning models that predict the popularity of anime.

LS0tDQp0aXRsZTogIldoYXQgTWFrZXMgYW4gQW5pbWUgUG9wdWxhcj8gU3RhdGlzdGljYWwgQW5hbHlzaXMgVXNpbmcgTUFMIERhdGEiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMjIyBSZXN1bHRzDQoNCg0KMSkgU2NvcmUgKHdoaWNoIGlzIHVzZXIgZ2VuZXJhdGVkKSBoYXMgYSBzdHJvbmcgcmVsYXRpb25zaGlwIHdpdGggdGhlIHBvcHVsYXJpdHkgb2YgYSBzaG93LiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgY3ViaWMgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzLg0KDQoyKSBUaGUgbnVtYmVyIG9mIHByb2R1Y2VycyBvbiB0aGUgY29tbWl0dGVlIGJvYXJkIG9mIGEgZ2l2ZW4gYW5pbWUgaGF2ZSBhIHF1YWRyYXRpYyByZWxhdGlvbnNoaXAgd2l0aCBtZW1iZXJzIChjb25jYXZlKS4gVGhlIHNhbWUgY2FuIGJlIHNhaWQgYWJvdXQgdGhlIGFnZSBvZiBhbiBhbmltZS4gDQoNCjMpIFJhdGluZyBhbHNvIGhhcyBhbiBpbXBhY3QuIEFuaW1lIHJhdGVkIGFzIENoaWxkcmVuIGFuZCBBbGwgQWdlcyBhcmUgbGVzcyBwb3B1bGFyIHRoYW4gYW5pbWUgd2l0aCBhIFBHIDEzIHJhdGluZy4gT24gdGhlIG90aGVyIGhhbmQsIHNob3dzIHJhdGVkIGFzIE1pbGQgTnVkaXR5IGFuZCBSICsxNyBhcmUgbW9yZSBwb3B1bGFyIHRoYW4gUEcgMTMgcmF0ZWQgYW5pbWUuDQoNCjQpIFNob3dzIGFuaW1hdGVkIGJ5IHN0dWRpb3M6IEt5b3RvIEFuaW1hdGlvbiwgQm9uZXMgb3IgQS0xIFBpY3R1cmVzIGFyZSBtb3JlIHBvcHVsYXIgdGhhbiBzaG93cyBhbmltYXRlZCBieSBvdGhlciBzdHVkaW9zLg0KDQo1KSBBbmltZSBnZW5yZXMgYXJlIHZlcnkgaW1wb3J0YW50IGFzIHdlbGw6IEhhcmVtLCBBY3Rpb24sIFJvbWFuY2UsIFNjaG9vbCwgUHN5Y2hvbG9naWNhbCwgU3VwZXJuYXR1cmFsLCAgU2hvdW5lbiwgSG9ycm9yLCBhbmQgRmFudGFzeSBoYXZlIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHBvcHVsYXJpdHkuIE9uIHRoZSBvdGhlciBoYW5kLCBIaXN0b3JpY2FsLCBNdXNpYywgU3BhY2UsIE1lY2hhLCBTcG9ydHMsIERlbW9ucyBhbmQgUG9saWNlIGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gcG9wdWxhcml0eS4NCg0KNikgTGlnaHQgTm92ZWwgYWRhcHRhdGlvbnMgYXJlIG1vcmUgcG9wdWxhciB0aGFuIG9yaWdpbmFsIGFuaW1lLCBhbmQgYW5pbWUgd2l0aCBhIGRpZmZlcmVudCBzb3VyY2UgbWF0ZXJpYWwgKE1hbmdhLCBWaXN1YWwgTm92ZWwsIEJvb2tzLCBldGMpLg0KDQo3KSBQcm9kdWNlcnMgU2FucmlvIGFuZCBTaG9nYWt1a2FuIGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gcG9wdWxhcml0eS4gT24gdGhlIG90aGVyIGhhbmQsIFNodWVzaGlhLCBUb2hvIEFuaW1hdGlvbiBhbmQgUG9ueSBDYW55b24gaGF2ZSBhIHBvc2l0aXZlIGltcGFjdCBvbiBwb3B1bGFyaXR5Lg0KDQo4KSBTaG93cyB3aXRoIG1vcmUgdGhhbiAyNiBlcGlzb2RlcyBhcmUgbGVzcyBwb3B1bGFyIHRoYW4gc2hvd3Mgd2l0aCBmZXdlciBlcGlzb2Rlcy4gDQoNCg0KIyMjIEludHJvDQoNCg0KQSBmZXcgbW9udGhzIGFnbyBJIHN0dW1ibGVkIHVwb24gYSB0dXRvcmlhbCBhYm91dCBob3cgdG8gZG8gd2ViIHNjcmFwaW5nIGluIFIuIFNvIGkgZGVjaWRlZCB0byB0cnkgb24gW015IEFuaW1lIExpc3QuXShodHRwczovL215YW5pbWVsaXN0Lm5ldC8pIFdoaWNoIGlzIGEgaHVnZSBhbmltZSBhbmQgbWFuZ2EgZGF0YWJhc2UuIFNvbWUgZGF0YSBvbiB0aGUgd2Vic2l0ZSBpcyB1c2VyLWdlbmVyYXRlZCwgbGlrZSB0aGUgc2NvcmVzIGFuZCByZXZpZXdzIGdpdmVuIHRvIGFuIGFuaW1lLiBNeSBnb2FsIHdhcyB0byBkaXNjb3ZlciB3aGF0IG1ha2VzIGFuIGFuaW1lIHBvcHVsYXIuIEluIHRlcm1zIG9mIG1ldGhvZG9sb2d5IEkgdXNlZCBsaW5lYXIgcmVncmVzc2lvbnMuIFdpdGggdGhhdCBpbiBtaW5kIEkgc2VsZWN0ZWQgYSBmZXcgZmVhdHVyZXM6IEdlbnJlcywgQW5pbWUgU3R1ZGlvLCBQcm9kdWNlcnMsIFJhdGluZywgaG93IG9sZCBhbiBhbmltZSBpcywgU291cmNlIE1hdGVyaWFsLCBOdW1iZXIgb2YgcHJvZHVjZXJzIChhcyBhIHByb3h5IG9mIGJ1ZGdldCkgYW5kIG51bWJlciBvZiBlcGlzb2Rlcy4gDQoNClRvIG1lYXN1cmUg4oCccG9wdWxhcml0eeKAnSBJIHVzZWQgdGhlIHZhcmlhYmxlIOKAnG1lbWJlcnMiIHdoaWNoIGlzIHRoZSBzdW0gb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHdhdGNoaW5nIGEgc2hvdywgY29tcGxldGVkIGEgc2hvdywgaGF2ZSBhIHNob3cgb24taG9sZCwgZHJvcHBlZCBpdCBvciBhcmUgcGxhbm5pbmcgdG8gd2F0Y2ggYSBzaG93IGluIHRoZSBmdXR1cmUuIA0KDQoNCiMjIyBTZWxlY3RpbmcgT2JzZXJ2YXRpb25zDQoNCg0KRmlyc3QsIEkgZGVjaWRlZCB0byBvbmx5IGFuYWx5emUgdHYgc2hvd3MsIG5vdCBtb3ZpZXMsIG9uYXMgb3Igb3Zhcy4gU2Vjb25kLCBJIHBpY2tlZCBzaG93cyB3aG9zZSBlcGlzb2RlcyByYW4gbG9uZ2VyIHRoYW4gMTggbWludXRlcy4gVGhpcmQsIEkgb25seSBjb25zaWRlcmVkIHNob3dzIGZyb20gMjAwNSB0byB0aGUgc3ByaW5nIHNlYXNvbiBvZiAyMDIwLiBNeSBBbmltZUxpc3Qgd2FzIGxhdW5jaGVkIGF0IHRoZSBlbmQgb2YgMjAwNCwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gc3RhcnQgaW4gMjAwNS4gSSBzY3JhcGVkIE1BTCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAyMDIwIHN1bW1lciBzZWFzb24gc28gdGhhdCdzIHdoeSB0aGUgbmV3ZXN0IHNob3dzIGluIHRoZSBkYXRhYmFzZSBhcmUgZnJvbSB0aGUgc3ByaW5nIDIwMjAgc2Vhc29uLg0KDQpGb3IgZmVhdHVyZSBzZWxlY3Rpb24gSSB1c2VkIG15IGtub3dsZWRnZSBhYm91dCB0aGUgYW5pbWUgaW5kdXN0cnkgYW5kIEkgcmFuIGEgbG90IG9mIEFub3ZhIHRlc3RzIHRvIHNlbGVjdCB2YXJpYWJsZXMuIChJIGFsc28gcmFuIGEgbGFzc28gcmVncmVzc2lvbiwgYW5kIHBpY2tlZCB0aGUgdmFyaWFibGVzIHRoYXQgd2VyZSBub3QgZHJvcHBlZCBhcyBhIHN0YXJ0aW5nIHBvaW50KS4gSSBoYWQgdG8gZHJvcCB0aGUgZ2VucmUgRWNjaGkgYmVjYXVzZSBpdCBjcmVhdGVkIG11bHRpY29sbGluZWFyaXR5IHdpdGggdGhlIHJhdGluZ3MuIFNwZWNpZmljYWxseSB3aXRoIOKAnE1pbGQtTnVkaXR54oCdLg0KDQojIyMgTWV0aG9kb2xvZ3kNCg0KQWZ0ZXIgYSBsb3Qgb2YgdHJpYWxzIGFuZCBlcnJvcnMsIHRoaXMgaXMgdGhlIG1vZGVsIEkgY2FtZSBvdXQgd2l0aDoNCg0KKmxvZyhNZW1iZXJzKSA9ICDwnZu9MCArIPCdm70xIFNjb3JlICsg8J2bvTIgU2NvcmUg4oinIDIgKyDwnZu9MyBTY29yZSDiiKcgMyArIPCdm700ICBFcGkgKyDwnZu9NSBQcm9kdWNlcnMgKyDwnZu9NiBQcm9kdWNlcnMg4oinIDIgKyDwnZu9NyBBZ2UrIPCdm704IEFnZSDiiKcgMiArICDwnZu9OSBDaGlsZHJlbiArIPCdm70xMCBBbGwgQWdlcyArIPCdm70xMSBSIDE3ICsg8J2bvTEyIE1pbGQgTnVkaXR5ICsg8J2bvTEzIEt5b3RvIEFuaW1hdGlvbiArIPCdm70xNCBBIDEgUGljdHVyZXMgKyAg8J2bvTE1IEJvbmVzICsgIPCdm70xNiBTaGluLUVpIEFuaW1hdGlvbiArIPCdm70xNyBIaXN0b3JpY2FsICsg8J2bvTE4IEhhcmVtICsg8J2bvTE5ICBNdXNpYyArICDwnZu9MjAgQWN0aW9uICsgIPCdm70yMSBSb21hbmNlICsgIPCdm70yMiBTY2hvb2wgKyDwnZu9MjMgU3BhY2UgKyDwnZu9MjQgIFBzeWNob2xvZ2ljYWwgKyAg8J2bvTI1IFN1cGVybmF0dXJhbCvwnZu9MjYgIEhvcnJvciArIPCdm70yNyBGYW50YXN5ICsg8J2bvTI4IE1lY2hhICsgIPCdm70yOSBTcG9ydHMgKyAg8J2bvTMwIEdhbWUgKyDwnZu9MzEgRGVtb25zICsgIPCdm70zMiBQb2xpY2UgKyDwnZu9MzMgU2hvdW5lbiArIPCdm70zNCAgTGlnaHQubm92ZWwgKyDwnZu9MzUgU2FucmlvICsg8J2bvTM2IFNodWVpc2hhICsg8J2bvTM3IFRvaG8gQW5pbWF0aW9uICsg8J2bvTM4IFRCUyArIPCdm70zOSBQb255LkNhbnlvbiArIPCdm700MCBTaG9nYWt1a2FuICArICrwnZyADQoNCg0KTm93LCBJJ2xsIGdvIG92ZXIgdGhlIGNvZWZmaWNpZW50cy4gSXQgbWFrZXMgc2Vuc2UgdG8gc3RhcnQgd2l0aCB0aGUgb3V0Y29tZSB3ZSB3YW50IHRvIHVuZGVyc3RhbmQ6IHRoZSBtZW1iZXJzIHZhcmlhYmxlLg0KDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KDQpwbG90X2x5KHggPSB+bnVldm8zJG1lbWJlcnMxLCB0eXBlID0gImhpc3RvZ3JhbSIpJT4lIA0KICBsYXlvdXQodGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIE1lbWJlcnMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIm1lbWJlcnMiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJjb3VudCIpKQ0KDQpgYGANCg0KVGhlIGRhdGEgaXMgcmlnaHQtc2tld2VkOyB0aGVyZSBhcmUgbW9yZSDigJxub3QgdGhhdCBwb3B1bGFy4oCdIHNob3dzIHRoYW4gdmVyeSBwb3B1bGFyIG9uZXMuIFRoZSBtZWRpYW4gd2FzIDg5NDE4IGFuZCB0aGUgbW9zdCBwb3B1bGFyIHNob3cgaGFkIDIxMTYxMjMgbWVtYmVycy4gV2hlbiBtb2RlbGluZyB0aGlzIG91dGNvbWUsIGEgc3Ryb25nIGFyZ3VtZW50IGNhbiBiZSBtYWRlIHRoYXQgaXQgc2hvdWxkIGJlIGxvZy10cmFuc2Zvcm1lZC4gDQoNCkhlcmUncyB0aGUgdHJhbnNmb3JtZWQgZGF0YToNClwNCg0KYGBge3IsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KDQoNCnBsb3RfbHkoeCA9IH5sb2cobnVldm8zJG1lbWJlcnMxKSwgdHlwZSA9ICJoaXN0b2dyYW0iKSU+JSANCiAgbGF5b3V0KHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBsb2coTWVtYmVycyknLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gImxvZyhtZW1iZXJzKSIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImNvdW50IikpDQoNCmBgYA0KDQpXaGlsZSBub3QgcGVyZmVjdCAobm93IGl0IGxvb2tzIGEgYml0IGxlZnQtc2tld2VkKSwgb3VyIG1vZGVsIHJlc3VsdHMgd2lsbCBwcm9iYWJseSBiZSBiZXR0ZXIuDQoNClNjb3JlIGlzIGEgdXNlci1nZW5lcmF0ZWQgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV2YWx1YXRpb24gb2YgTUFMIHVzZXJzIHRvd2FyZHMgYSBwYXJ0aWN1bGFyIGFuaW1lIGZyb20gMSB0byAxMC4gVGhlIG1lYW4gYW5kIG1lZGlhbiBhcmUgNy4yLiANClwNCg0KYGBge3IsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KcGxvdF9seShvcGFjaXR5PTAuNSkgJT4lIA0KICBhZGRfbGluZXMoeD1+ZGVuc2l0eTEkeCx5PX5kZW5zaXR5MSR5ICklPiUgDQogIGxheW91dCh0aXRsZSA9ICdEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiBNQUwgU2NvcmUnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gInNjb3JlIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiZGVuc2l0eSIpKQ0KYGBgDQoNCkVwaSBpcyBhIGR1bW15IHZhcmlhYmxlIHdoaWNoIHRha2VzIHRoZSB2YWx1ZSAxIGZvciBzaG93cyB3aXRoIG1vcmUgdGhhbiAyNiBlcGlzb2RlcyBhbmQgMCBmb3Igc2hvd3Mgd2l0aCAyNiBvciBmZXdlciBlcGlzb2Rlcy4gUHJvZHVjZXJzIGlzIHRoZSBudW1iZXIgb2YgcHJvZHVjZXJzIG9uIHRoZSBjb21taXR0ZWUgYm9hcmQgb2YgYSBnaXZlbiBhbmltZS4gQWdlIGlzIGhvdyBvbGQgYW4gYW5pbWUgaXMgKGluIHllYXJzKS4gRm9yIGV4YW1wbGUsIDAgbWVhbnMgMjAyMCBhbmQgMTUgbWVhbnMgMjAwNS4gSGVyZSdzIHRoZSBudW1iZXIgb2Ygc2hvd3MgYW5pbWF0ZWQgYnkgeWVhci4NClwNCg0KYGBge3IsZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQoNCm51ZXZvMyAlPiUgY291bnQoeWVhcjEpICU+JSANCnBsb3RfbHkoIHggPSB+IHllYXIxLCB5ID0gfm4sIG5hbWUgPSAndHJhY2UgMCcsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICdBbmltZSBUViBTaG93cyBmcm9tIDIwMDUgdG8gU3ByaW5nIDIwMjAnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOdW1iZXIgb2Ygc2hvd3MiKSkNCg0KYGBgDQoNCkNoaWxkcmVuLCBBbGwgQWdlcywgUiAxNysgeSBNaWxkIE51ZGl0eSBhcmUgcGFydCBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgcmF0aW5nLiBUaGUgcmVmZXJlbmNlIGxldmVsIGlzIHRoZSBQRy0xMyBjYXRlZ29yeS4gQS0xIFBpY3R1cmVzLCBCb25lcywgS3lvdG8gQW5pbWF0aW9uIGFuZCBTaGluIEVpIEFuaW1hdGlvbiBhcmUgZHVtbXkgdmFyaWFibGVzIGZvciB0aG9zZSBzdHVkaW9zLiBBbHNvLCBJIG1hZGUgZHVtbXkgdmFyaWFibGVzIGZvciB0aGUgc3R1ZGlvczogCQ0KDQpUb2VpIEFuaW1hdGlvbiwgU3VucmlzZSwgSi5DIFN0YWZmLCBNYWRob3VzZSwgVE1TIEVudGVydGFpbm1lbnQsIFByb2R1Y3Rpb24uSS5HLCBTdHVkaW8uRGVlbiwgU3R1ZGlvLlBpZXJyb3QsIE9MTSwgTmlwcG9uLkFuaW1hdGlvbiwgRExFLCBUYXRzdW5va28uUHJvZHVjdGlvbiwgR29uem8sIFhlYmVjLCBBSUMsIFNoYWZ0LCBCcmFpbi5CYXNlLCB1Zm90YWJsZSwgR2FpbmF4IGFuZCBmZWVsLiANCg0KVGhleSB3ZXJlIG5vdCBjb25zaWRlcmVkIGluIHRoZSBmaW5hbCBtb2RlbCwgYmVjYXVzZSB0aGUgYW5vdmEgdGVzdHMgdGhhdCBJIGNhcnJpZWQgb3V0IHJlcG9ydGVkIHRoYXQgdGhlc2Ugc3R1ZGlvcyBkaWQgbm90IGNvbnRyaWJ1dGUgc3RhdGlzdGljYWxseSB0byB0aGUgbW9kZWwuDQoNClRoZSBjb2VmZmljaWVudHMgZnJvbSDwnZu9MTcgdG8g8J2bvTMzIGFyZSBkdW1teSB2YXJpYWJsZXMgZm9yIGFuaW1lIGdlbnJlcy4gSXQgaXMgbmVjZXNzYXJ5IHRvIG1lbnRpb24gdGhhdCBhcyB3aXRoIGFuaW1lIHN0dWRpb3MsIEkgY3JlYXRlZCB2YXJpYWJsZXMgZm9yIG1hbnkgZ2VucmVzIHRoYXQgd2VyZSBub3QgY29uc2lkZXJlZCBpbiB0aGUgZmluYWwgbW9kZWwgYmVjYXVzZSB0aGV5IGRpZCBub3QgY29udHJpYnV0ZSBzdGF0aXN0aWNhbGx5IHRvIG91ciBtb2RlbDogQW1vbmcgdGhlIGdlbnJlcyBkcm9wcGVkIGFyZToNCg0KQ29tZWR5LCBBZHZlbnR1cmUsIFNsaWNlIG9mIExpZmUsIERyYW1hLCBTY2kgRmksIE15c3RlcnksIFNlaW5lbiwgTWFydGlhbCBBcnRzLCBTYW11cmFpLCBTaG91am8sIFNob3VqbyBBaSwgU2hvdW5lbiBBaSwgSm9zZWksIFZhbXBpcmUsIE1pbGl0YXJ5LCBEZW1vbnMsIE1hZ2ljIGFuZCBUaHJpbGxlcg0KDQpMaWdodCBOb3ZlbCBpcyBhIHZhcmlhYmxlIHdoaWNoIHRha2VzIHRoZSB2YWx1ZSAxLCB3aGVuIHRoZSBzb3VyY2UgbWF0ZXJpYWwgb2YgYSBzaG93IGlzIGEgbGlnaHQgbm92ZWwgYW5kIDAgZm9yIGFuaW1lIHdpdGggYSBkaWZmZXJlbnQgc291cmNlLiBGaW5hbGx5LCBmcm9tIPCdm70zNSB0byDwnZu9NDAgY29ycmVzcG9uZCB0byBkdW1teSB2YXJpYWJsZXMgZm9yIGRpZmZlcmVudCBhbmltZSBwcm9kdWN0aW9uIGNvbXBhbmllcy4gQXMgd2l0aCBnZW5yZXMgYW5kIHN0dWRpb3MsIHRoZXJlIHdlcmUgbWFueSBwcm9kdWNlcnMgd2hvIHdlcmUgaW5pdGlhbGx5IGNvbnNpZGVyZWQgYnV0IHdlcmUgZHJvcHBlZCBmb3IgdGhlIHNhbWUgcmVhc29ucy4gQW1vbmcgdGhlbSB3ZXJlOg0KDQpLb2RhbnNoYSwgQmFuZGFpLCBTcXVhcmUgRW5peCwgS2Fkb2thd2EsIEFuaXBsZXgsIE5ISywgVFYgVG9reW8sIFRWIEFzYWhpLCBGdWppIFRWLCBHYWtrZW4sIERlbnRzdSwgTWVkaWEgRmFjdG9yeSwgTGFudGlzLCBLbG9ja1dvcngsIEZyb250aWVyIFdvcmtzLCBmbHlpbmcgRE9HLCBOaXBwb24gVGVsZXZpc2lvbiBOZXR3b3JrLCBTaG93Z2F0ZSwgU3RhcmNoaWxkIFJlY29yZHMsIFNvbnkgTXVzaWMgeSBWQVAuDQoNClRoZXJlIHdlcmUgc29tZSBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMgc28gSSBkZWNpZGVkIHRvIGVsaW1pbmF0ZSB0aGVtIG9uZSBieSBvbmUgdW50aWwgdGhlcmUgd2VyZSBubyBtb3JlIHNob3dzIHdpdGggaGlnaCBsZXZlcmFnZS4gVGhlIGFuaW1lIGludm9sdmVkIGluIHRoZSBwcm9jZXNzIHdlcmU6IOKAnE5haWtha3UgS2Vucnlva3UgSGFuemFpIEt5b3VzZWkgVG9yaXNoaW1hcmlrYW4gWmFpemVuIEpvdXRhcm914oCdLCDigJxEZWF0aCBOb3Rl4oCdLCDigJ1LYWl0b3UgSm9rZXIgNHRoIFNlYXNvbuKAnSwg4oCcQWN0aXZlIFJhaWQ6IEtpZG91IEt5b3VzaHV1c2hpdHN1IERhaSBIYWNoaSBHYWthcmnigJ0gYW5kIOKAnFRzdXJ1bmU6IEthemVtYWkgS291a291IEt5dXVkb3VideKAnS4NCg0KQWZ0ZXIgZG9pbmcgdGhpcyBpdCBpcyBwb3NzaWJsZSB0byBwb2ludCBvdXQgdGhhdCB0aGUgbW9zdCBpbXBvcnRhbnQgY2hhbmdlIGlzIHRoYXQgdGhlIFNoaW4gRWkgYW5pbWF0aW9uIGNvZWZmaWNpZW50IGlzIG5vIGxvbmdlciBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHNpZ25pZmljYW50IGluY3JlYXNlcyBpbiB0aGUgaW1wYWN0IG9mIGNlcnRhaW4gdmFyaWFibGVzIHN1Y2ggYXMgIlBvbGljZSIgYW5kICJLeW90byBBbmltYXRpb24iDQoNCkkgcmFuIGEgU2hhcGlybyB0ZXN0IHRvIGFzc2VzcyBub3JtYWxpdHkuIEFuZCB0aGVyZSB3YXNu4oCZdCBub3JtYWxpdHkuIFNvIEkgZGVjaWRlZCB0byB3aW5zb3JpemUgdGhlIGRhdGEuIFRoZXJlIHdlcmUgMjQgYW5pbWUgaW52b2x2ZWQgaW4gdGhlIHByb2Nlc3MsIGFsbCBvZiB0aGVtIGhhZCBsZXNzIHRoYW4gMTcwMCBtZW1iZXJzLiBMYXN0bHksIEkgZGVjaWRlZCB0byBydW4gdGhlIG1vZGVsIHdpdGggcm9idXN0IHN0YW5kYXJkIGVycm9ycyBiZWNhdXNlIEkgZGV0ZWN0ZWQgaGV0ZXJvc2NlZGFzdGljaXR5LiANCg0KYGBge3IgdGFibGUsIHJlc3VsdHMgPSAiYXNpcyIsIGVjaG89RkFMU0UsY29sbGFwc2U9RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0Kc3RhcmdhemVyKG1vZGVsbzgsbW9kZWxvMTkscm9idXN0byx0eXBlPSJodG1sIiwNCiAgICAgICAgICB0aXRsZT0iVW5kZXJzdGFuZGluZyBBbmltZSBQb3B1bGFyaXR5IiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscy5pbmNsdWRlID0gRkFMU0UsDQogICAgICAgICAgZGVwLnZhci5jYXB0aW9uICA9ICJEZXBlbmRlbnQgVmFyaWFibGU6IExvZyAoTWVtYmVycykiLA0KICAgICAgICAgIG1vZGVsLm51bWJlcnMgPSBGQUxTRSwNCiAgICAgICAgICBtb2RlbC5uYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIGNvbHVtbi5sYWJlbHMgPSBjKCJNb2RlbCAxIiwiTW9kZWwgMiIsIk1vZGVsIDMiKSwNCiAgICAgICAgICBjb3ZhcmlhdGUubGFiZWxzPWMoIlNjb3JlIiwiU2NvcmVcXF4yIiwiU2NvcmVcXF4zIiwiRXBpc29kZSIsICJQcm9kdWNlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZHVjZXJzXFxeMiIsIkFuaW1lIEFnZSIsIkFuaW1lIEFnZVxcXjIiLCJDaGlsZHJlbiIsIkFsbCBBZ2VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlIgMTcrIiwiTWlsZCBOdWRpdHkiLCJLeW90byBBbmltYXRpb24iLCAiQTEgUGljdHVyZXMiLCJCb25lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGluIEVpIEFuaW1hdGlvbiIsIkhpc3RvcmljYWwiLCJIYXJlbSIsIk11c2ljIiwiQWN0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvbWFuY2UiLCJTY2hvb2wiLCJTcGFjZSIsIlBzeWNob2xvZ2ljYWwiLCJTdXBlcm5hdHVyYWwiLCJIb3Jyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFudGFzeSIsIk1lY2hhIiwiU3BvcnRzIiwiR2FtZSIsIkRlbW9ucyIsIlBvbGljZSIsIlNob3VuZW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGlnaHQgTm92ZWwiLCJTYW5yaW8iLCJTaHVlaXNoYSIsIlRvaG8gQW5pbWF0aW9uIiwiVEJTIiwiUG9ueSBDYW55b24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hvZ2FrdWthbiIpLA0KICAgICAgICAgIG91dD0idGFibGUxLmh0bWwiLCANCiAgICAgICAgICBhbGlnbj1UUlVFLA0KICAgICAgICAgIG5vLnNwYWNlPVRSVUUpDQpgYGANClwNCg0KTW9kZWwgMSBpcyB0aGUgZmlyc3QgbW9kZWwgSSBjYW1lIHVwIHdpdGguIE1vZGVsIDIgc2hvd3MgdGhlIHJlc3VsdHMgYWZ0ZXIgSSBkcm9wcGVkIHRoZSBoaWdoIGxldmVyYWdlIG9ic2VydmF0aW9ucyBhbmQgZml4ZWQgdGhlIG5vcm1hbGl0eSBpc3N1ZXMuIE1vZGVsIDMgaXMgTW9kZWwgMiB3aXRoIHJvYnVzdCBzdGFuZGFyZCBlcnJvcnMuIEFsbCAzIG1vZGVscyBhcmUgcHJlc2VudCBpbiB0aGUgdGFibGUgc28geW91IGNhbiBzZWUgaG93IHRoZSByZXN1bHRzIGNoYW5nZS4gIFRoZSBtb3N0IGltcG9ydGFudCAgbW9kZWwgaXMgbnVtYmVyIDMgYW5kIHRoZXJlZm9yZSwgd2hlbiBJIHJlZmVyIHRvIHRoZSByZXN1bHRzIGZyb20gbm93IG9uLCBJIHdpbGwgYmUgdGFsa2luZyBhYm91dCB0aGUgY29lZmZpY2llbnRzIG9mIHRoaXMgbW9kZWwuIEZpbmFsbHksIGl0IGlzIG5lY2Vzc2FyeSB0byBwb2ludCBvdXQgdGhhdCB3aGVuIEkgaW50ZXJwcmV0IGEgY29lZmZpY2llbnQgaW4gdGhlIHdheTogIOKAnHRoaXMgb3IgdGhhdCB2YXJpYWJsZSBoYXMgYW4gZWZmZWN0IG9mIFglIG9uIHBvcHVsYXJpdHnigJ0uIFRoZXNlIGVmZmVjdHMgYXJlIGFsd2F5cyBvbiBhdmVyYWdlIGFuZCBrZWVwaW5nIHRoZSByZXN0IG9mIHRoZSB2YXJpYWJsZXMgY29uc3RhbnQuIEkgZmluZCBpdCBhIGJpdCByZXBldGl0aXZlIHRvIGhhdmUgdG8gd3JpdGUgaXQgZXZlcnkgdGltZSBJIGludGVycHJldCBhIGNvZWZmaWNpZW50LCBzbyBJIHByZWZlciB0byBtYWtlIGl0IGNsZWFyIGhlcmUuDQoNCiMjIyBGaW5kaW5ncw0KDQojIyMjIFNjb3JlDQoNCkl0IGlzIHBvc3NpYmxlIHRvIHNheSB0aGF0LCBpbiBnZW5lcmFsIHRlcm1zLCBzaG93cyB3aXRoIGEgaGlnaCBzY29yZSB0ZW5kIHRvIGJlIG1vcmUgcG9wdWxhci4gVGhhdCBiZWluZyBzYWlkLCB0aGUgZGF0YSBzaG93IHVzIHRoYXQgdGhlcmUgaXMgYSBjdWJpYyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdmFyaWFibGVzIG1lbWJlcnMgYW5kIHNjb3JlLiBBcyB5b3UgY2FuIHNlZSBvbiB0aGUgZ3JhcGguIFRoZSBjdXJ2ZSAoaW4gb3JhbmdlKSBnb2VzIGRvd24sIGJhY2sgdXAsIHRoZW4gYmFjayBkb3duIGFnYWluLiBXaGljaCBtZWFucyB0aGF0IGZvciBzaG93cyB3aXRoIHZlcnkgbG93IHNjb3JlcyBvbmUgbW9yZSBwb2ludCBpbiB0aGUgc2NvcmUgaGFzIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHBvcHVsYXJpdHkuIFRoZW4sIGZvciBzaG93cyBvdmVyIDUuNSBhbiBpbmNyZWFzZSBpbiB0aGUgc2NvcmUgaGFzIGEgcG9zaXRpdmUgZWZmZWN0IG9uIHBvcHVsYXJpdHkuIEZpbmFsbHksIGZvciBzaG93cyB3aXRoIGEgaGlnaCBzY29yZSAob3ZlciA4LjQgb3IgOC41KSB0aGUgbWFyZ2luYWwgZWZmZWN0IG9mIGEgcG9pbnQgc2VlbXMgdG8gZmxhdHRlbiBvdXQuIA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCmZpZyA8LXBsb3RfbHkoZGF0YSA9IG51ZXZvMywgeCA9IH5zY29yZSwgeSA9IH5sb2cobWVtYmVyczEpLGhvdmVyaW5mbyA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiTmFtZToiLG5hbWUsIjxicj4iLCJTY29yZToiLCBzY29yZSwgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyczoiLHJvdW5kKGxvZyhtZW1iZXJzMSksZGlnaXRzID0gMikpKQ0KDQpmaWcgJT4lIGxheW91dCh0aXRsZSA9ICdNQUwgTWVtYmVycyB2cy4gTUFMIFNjb3JlJywNCiAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJsb2cobWVtYmVycykiKSwNCiAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJzY29yZSIpKSAlPiUNCiAgYWRkX21hcmtlcnMoc2hvd2xlZ2VuZCA9IEZBTFNFKSU+JQ0KICBhZGRfbGluZXMoeSA9IH5maXR0ZWQobTEpLCBuYW1lID0iUG9seW5vbWlhbCIpDQoNCmBgYA0KDQojIyMjIEFnZQ0KDQpUaGVyZSBpcyBhIHF1YWRyYXRpYyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgYWdlIG9mIGFuIGFuaW1lIGFuZCBpdHMgcG9wdWxhcml0eS4gU3BlY2lmaWNhbGx5LCBhbiBhZGRpdGlvbmFsIHllYXIgaGFzIGEgcG9zaXRpdmUgZWZmZWN0IHVudGlsIDIwMTQgKDYgeWVhcnMpLCB3aGljaCBtYWtlcyBzZW5zZSwgc2luY2Ugc2hvd3MgbmVlZCB0aW1lIHRvIGdhaW4gbWVtYmVycy4gQWZ0ZXIgNiB5ZWFycyB0aGUgZWZmZWN0IG9mIGFuIGFkZGl0aW9uYWwgeWVhciBiZWNvbWVzIG5lZ2F0aXZlLCB3aGljaCBhbHNvIG1ha2VzIHNlbnNlLCBzaW5jZSBpbnR1aXRpb24gd291bGQgdGVsbCB1cyB0aGF0IG9sZCBzaG93cyBhcmUgbGVzcyBwb3B1bGFyLg0KDQpgYGB7ciAsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KbTIgPC0gbG0obG9nKG1lbWJlcnMxKSB+IHBvbHkoZWRhZCwgMiksIGRhdGEgPSBudWV2bzMpDQoNCmZpZyA8LXBsb3RfbHkoZGF0YSA9IG51ZXZvMywgeCA9IH5lZGFkLCB5ID0gfmxvZyhtZW1iZXJzMSksaG92ZXJpbmZvID0gInRleHQiLA0KICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJOYW1lOiIsbmFtZSwiPGJyPiIsIkFnZToiLCBlZGFkLCAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZW1iZXJzOiIscm91bmQobG9nKG1lbWJlcnMxKSxkaWdpdHMgPSAyKSkpDQoNCmZpZyAlPiUgbGF5b3V0KHRpdGxlID0gJ01BTCBNZW1iZXJzIHZzLiBBbmltZSBBZ2UnLA0KICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImxvZyAobWVtYmVycykiKSwNCiAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBZ2UiKSkgJT4lDQogIGFkZF9tYXJrZXJzKHNob3dsZWdlbmQgPSBGQUxTRSklPiUNCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKG0yKSwgbmFtZSA9IlBvbHlub21pYWwiKQ0KYGBgDQoNCg0KIyMjIyBQcm9kdWNlcnMNCg0KV2hlbiBpdCBjb21lcyB0byB0aGUgbnVtYmVyIG9mIHByb2R1Y2VycywgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSB2YXJpYWJsZSBtZW1iZXJzIGlzIGFsc28gcXVhZHJhdGljLiBCZWNhdXNlIHRoZSBjb2VmZmljaWVudCBvbiBwcm9kdWNlcnMgaXMgcG9zaXRpdmUgYW5kIHRoZSBjb2VmZmljaWVudCBvbiBwcm9kdWNlcnMgXjIgaXMgbmVnYXRpdmUsIHRoaXMgZXF1YXRpb24gbGl0ZXJhbGx5IGltcGxpZXMgdGhhdCwgYXQgbG93IG51bWJlcnMgb2Yg4oCccHJvZHVjZXJz4oCdLCBhbiBhZGRpdGlvbmFsIHByb2R1Y2VyIGhhcyBhIHBvc2l0aXZlIGVmZmVjdCBvbiBsb2cobWVtYmVycykuIEF0IDggcHJvZHVjZXJzLCB0aGUgZWZmZWN0IGJlY29tZXMgbmVnYXRpdmUuIFRoZSBxdWFkcmF0aWMgc2hhcGUgbWVhbnMgdGhhdCB0aGUgc2VtaS1lbGFzdGljaXR5IG9mIHByb2R1Y2VycyB3aXRoIHJlc3BlY3QgdG8gbWVtYmVycyBpcyBkZWNyZWFzaW5nIGFzIHRoZSBudW1iZXIgb2YgcHJvZHVjZXJzIGluY3JlYXNlcy4gDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KZmlnIDwtcGxvdF9seShkYXRhID0gbnVldm8zLCB4ID0gfnByb2R1Y2VycywgeSA9IH5sb2cobWVtYmVyczEpLGhvdmVyaW5mbyA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiTmFtZToiLG5hbWUsIjxicj4iLCJQcm9kdWNlcnM6IiwgcHJvZHVjZXJzLCAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZW1iZXJzOiIscm91bmQobG9nKG1lbWJlcnMxKSxkaWdpdHMgPSAyKSkpDQoNCmZpZyAlPiUgbGF5b3V0KHRpdGxlID0gJ01BTCBNZW1iZXJzIHZzLiBOdW1iZXIgb2YgcHJvZHVjZXJzIHBlciBBbmltZScsDQogICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAibG9nKG1lbWJlcnMpIiksDQogICAgICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAicHJvZHVjZXJzIikpICU+JQ0KICBhZGRfbWFya2VycyhzaG93bGVnZW5kID0gRkFMU0UpJT4lDQogIGFkZF9saW5lcyh5ID0gfmZpdHRlZChtMyksbmFtZSA9IlBvbHlub21pYWwiKQ0KDQpgYGANCg0KIyMjIyBOdW1iZXIgb2YgRXBpc29kZXMNCg0KV2hpbGUgSSB3YXMgZXhwbG9yaW5nIHRoZSBkYXRhYmFzZSBsb29raW5nIGZvciBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZXBpc29kZXMgYW5kIHRoZSBtZW1iZXIgdmFyaWFibGUuIEkgbm90aWNlZCB0aGF0IHNob3dzIHdpdGggbW9yZSB0aGFuIDI2IGVwaXNvZGVzIHNlZW1lZCB0byBiZSBsZXNzIHBvcHVsYXIuIFRoZXJlZm9yZSwgSSBkZWNpZGVkIHRvIGNyZWF0ZSBhIGR1bW15IHZhcmlhYmxlLCB3aGljaCB0YWtlcyB0aGUgdmFsdWUgMSwgZm9yIHNob3dzIHdpdGggbW9yZSB0aGFuIDI2IGVwaXNvZGVzIGFuZCAwIGZvciBzaG93cyB3aXRoIDI2IG9yIGZld2VyIGVwaXNvZGVzLiBUaGUgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IHNob3dzIHdpdGggbW9yZSB0aGFuIDI2IGVwaXNvZGVzIGFyZSBvbiBhdmVyYWdlIDMzJSBsZXNzIHBvcHVsYXIgdGhhbiBzaG93cyB3aXRoIGZld2VyIGVwaXNvZGVzLg0KDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KDQpwbG90X2x5KG9wYWNpdHk9MC41KSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MSR4LHk9fmRlbnNpdHkxJHksbmFtZT0iU2hvd3Mgd2l0aCBtb3JlIHRoYW4gMjYgZXBpc29kZXMiKSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MiR4LHk9fmRlbnNpdHkyJHksbmFtZT0iU2hvd3Mgd2l0aCBsZXNzIHRoYW4gMjYgZXBpc29kZXMiKSAlPiUgDQpsYXlvdXQodGl0bGUgPSAnRGVuc2l0eSBEaXN0cmlidXRpb24nLA0KICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAibG9nKG1lbWJlcnMpIiksDQogICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJkZW5zaXR5IikpDQoNCg0KYGBgDQoNCiMjIyMgUmF0aW5nDQoNCkFuaW1lIHVuZGVyIHRoZSBjYXRlZ29yaWVzICJDaGlsZHJlbiIgYW5kICJBbGwgQWdlcyIgYXJlIG9uIGF2ZXJhZ2UgODUlIGFuZCA5MiUgbGVzcyBwb3B1bGFyIHRoYW4gc2hvd3MgbGlzdGVkIGFzIFBHLTEzLiBUaGlzIHBlcmhhcHMgaGFzIHRvIGRvIHdpdGggdGhlIHZhcmlhYmxlICJtZW1iZXJzIiBiZWluZyBnZW5lcmF0ZWQgYnkgdXNlcnMuIENoaWxkcmVuLCB3aG8gYXJlIHRoZSB0YXJnZXQgYXVkaWVuY2UgZm9yIHRoZXNlIHNob3dzLCBwcm9iYWJseSBkb24ndCBoYXZlIE1BTCBhY2NvdW50cywgaGVuY2Ugd2h5IHRoZXkgYXJlIGxlc3MgcG9wdWxhci4gSW4gcmVsYXRpb24gdG8gdGhlIGFib3ZlLCBhbmltZSB1bmRlciB0aGUgY2F0ZWdvcmllcyAiTWlsZCBOdWRpdHkiIGFuZCAiUiArMTciIGFyZSA0MCUgYW5kIDM2JSBtb3JlIHBvcHVsYXIgdGhhbiB0aG9zZSBpbiB0aGUgUEctMTMgY2F0ZWdvcnkuDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KDQpwbG90X2x5KCkgJT4lIA0KICBhZGRfdHJhY2UoZGF0YSA9IG51ZXZvMywNCiAgICAgICAgICAgIHkgPSB+bG9nKG1lbWJlcnMxKSwNCiAgICAgICAgICAgIGNvbG9yID0gflgyLjQsDQogICAgICAgICAgICB0eXBlID0gImJveCIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gIk1BTCBNZW1iZXJzIHBlciBSYXRpbmciLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gInJhdGluZyIpKSANCg0KDQoNCmBgYA0KDQojIyMjIEFuaW1lIFN0dWRpb3MNCg0KVGhlcmUgYXJlIDMgc3R1ZGlvcyB0aGF0IGhhdmUgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gdGhlIHBvcHVsYXJpdHkgb2YgYSBzaG93LiBUaGUgZmlyc3Qgb25lIGlzIEt5b3RvIEFuaW1hdGlvbiwgb24gYXZlcmFnZSwgdGhlIHNob3dzIGFuaW1hdGVkIGJ5IHRoaXMgc3R1ZGlvIGFyZSA4NiUgbW9yZSBwb3B1bGFyIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIGFuaW1lICh3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBhbmltZSBwcm9kdWNlZCBieSBCb25lcywgQTEgUGljdHVyZXMgYW5kIFNoaW4gRWkgQW5pbWF0aW9uLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2xhcmlmeSB0aGlzLCBzaW5jZSB0aGUgYW5pbWUgc3R1ZGlvcyBpbiB0aGlzIG1vZGVsIGFyZSBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGFuZCBub3QgYSBtZXJlIGR1bW15IHZhcmlhYmxlKS4gT24gdGhlIG90aGVyIGhhbmQsIEJvbmVzIGhhcyBhIHBvc2l0aXZlIGVmZmVjdCBvZiAyOCUgd2hpbGUgQS4xIFBpY3R1cmVzIGhhcyBvbmUgb2YgNDQlLiBTaGluIEVpIEFuaW1hdGlvbiBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0Lg0KDQpUaGVzZSByZXN1bHRzIG1ha2Ugc2Vuc2UgdG8gbWUuIEt5b3RvIEFuaW1hdGlvbiBpcyBwcm9iYWJseSBvbmUgb2YgdGhlIGJlc3Qgc3R1ZGlvcyBpbiB0ZXJtcyBvZiBhbmltYXRpb24gcXVhbGl0eS4gRGVzcGl0ZSBub3QgYW5pbWF0aW5nIG1hbnkgc2hvd3MsIGl0IG11c3QgYmUgY29uc2lkZXJlZCB0aGF0IGR1cmluZyB0aGUgcGFzdCBkZWNhZGUgZWFjaCBhbmltZSB0aGV5IG1hZGUgd2FzIGEgY29tbWVyY2lhbCBzdWNjZXNzLCAoQWlyLCBLYW5vbiwgQ2xhbm5hZCwgTHVja3kgU3RhciwgU3V6dW1peWEgSGFydWhpLCBLLU9uISkuDQoNCmBgYHtyIHRhYmxlcywgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KDQprYWJsZShLeW90by5BbmltYXRpb25bMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiVG9wIDEwIE1vc3QgUG9wdWxhciBBbmltZSBNYWRlIGJ5IEt5b3RvIEFuaW1hdGlvbiAuIikNCg0KYGBgDQoNCg0KT24gdGhlIG90aGVyIGhhbmQsIEJvbmVzIGlzIHBlcmhhcHMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBhbmltZSBzdHVkaW9zIGV2ZXIuIE1hbnkgb2YgdGhlaXIgIm9sZCIgc2hvd3MgbGlrZSBFdXJla2EgU2V2ZW4sIERhcmtlciB0aGFuIEJsYWNrLCBPdXJhbiBLb3Vrb3UgSG9zdCBDbHViIG9yIFNvdWwgRWF0ZXIsIGhhdmUgbWFueSBtZW1iZXJzLiBBbHNvLCBhcyB5b3UgY2FuIHNlZSBpbiB0aGUgdGFibGUsIHRoZXkgYXJlIGFuaW1hdGluZyBCb2t1IE5vIEhlcm8gQWNhZGVtaWEsIHdoaWNoIGlzIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGFuaW1lIHNob3dzIGF0IHRoZSBtb21lbnQuDQoNCmBgYHtyIHRhYmxlczEsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0Ka2FibGUoQm9uZXNbMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiVG9wIDEwIE1vc3QgUG9wdWxhciBBbmltZSBNYWRlIGJ5IEJvbmVzLiIpDQoNCmBgYA0KDQoNCkZpbmFsbHksIEEtMSBQaWN0dXJlcyBpcyB0aGUgb25lIHRoYXQgc3VycHJpc2VzIG1lIHRoZSBsZWFzdC4gSW4gdGhlIHBhc3QgZGVjYWRlIHRoZXkgYmVjYW1lIHRoZSBwb3dlcmhvdXNlIG9mIGFuaW1lIHByb2R1Y3Rpb24gKFN3b3JkIEFydCBPbmxpbmUsIEFvIG5vIEV4b3JjaXN0LCBTaGlnYXRzdSB3YSBLaW1pIG5vIFVzbywgRmFpcnkgVGFpbCwgTmFuYXRzdSBubyBUYWl6YWkpLiBCZXR3ZWVuIDIwMTQgYW5kIDIwMTYgdGhleSBwcm9kdWNlZCAxMCBvciBtb3JlIHRlbGV2aXNpb24gc2hvd3MgcGVyIHllYXIuIFdoaWNoIGlzIGEgdmVyeSBoaWdoIGZpZ3VyZSBjb21wYXJhdGl2ZWx5LiBUaGUgb25seSBzdHVkaW8gdGhhdCBoYXMgZG9uZSBzb21ldGhpbmcgc2ltaWxhciBpcyBKQyBTdGFmZiBpbiAyMDEyIGFuZCAyMDE3Lg0KDQpgYGB7ciB0YWJsZXMyLCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQprYWJsZShBLjFbMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiVG9wIDEwIE1vc3QgUG9wdWxhciBBbmltZSBNYWRlIGJ5IEEtMSBQaWN0dXJlcyIpDQpgYGANCkFzIHlvdSBjYW4gc2VlIG9uIHRoZSBib3hwbG90IGJlaGluZCwgSXQgaXMgY2xlYXIgdGhhdCB0aGVzZSAzIHN0dWRpb3MgYW5pbWF0ZSBzaG93cyB0aGF0IGFyZSBtb3JlIHBvcHVsYXIgdGhhbiB0aGUgc2hvd3MgYW5pbWF0ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGFuaW1lIHN0dWRpb3MuDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KcGxvdF9seSgpICU+JSANCiAgYWRkX3RyYWNlKGRhdGEgPSBudWV2bzMsDQogICAgICAgICAgICB5ID0gfmxvZyhtZW1iZXJzMSksDQogICAgICAgICAgICBjb2xvciA9IH5TdHVkaW9zLA0KICAgICAgICAgICAgdHlwZSA9ICJib3giKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICJNQUwgTWVtYmVycyBwZXIgQW5pbWUgU3R1ZGlvIiwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBbmltZSBTdHVkaW9zIikpIA0KDQpgYGANCg0KDQojIyMjIEdlbnJlcw0KDQpUaGUgZ2VucmUgb2YgYW4gYW5pbWUgaXMgcGVyaGFwcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGVsZW1lbnRzIGluIGRldGVybWluaW5nIHRoZSBwb3B1bGFyaXR5IG9mIGEgc2hvdy4gU3VycHJpc2luZ2x5LCB0aGUgZ2VucmUgdGhhdCBoYXMgdGhlIGhpZ2hlc3QgcG9zaXRpdmUgZWZmZWN0IG9uIHRoZSBtZW1iZXIgdmFyaWFibGUgaXMgSGFyZW0sIG9uIGF2ZXJhZ2UgYSBzaG93IG9mIHRoaXMgdHlwZSBpcyA0NSUgbW9yZSBwb3B1bGFyIHRoYW4gYSBzaG93IHRoYXQgaXMgbm90IGxpc3RlZCBhcyBIYXJlbS4gT3RoZXIgZ2VucmVzIHRoYXQgaGF2ZSBhIHBvc2l0aXZlIGVmZmVjdCBvbiBwb3B1bGFyaXR5IGFyZTogQWN0aW9uLCBSb21hbmNlLCBTY2hvb2wsIFBzeWNob2xvZ2ljYWwsIFN1cGVybmF0dXJhbCwgSG9ycm9yLCBTaG91bmVuIGFuZCBGYW50YXN5Lg0KDQpUaGUgZ2VucmVzIHdpdGggdGhlIGJpZ2dlc3QgbmVnYXRpdmUgZWZmZWN0IGFyZSAiTXVzaWMiIGFuZCAiSGlzdG9yaWNhbCIuIEEgc2hvdyB3aXRoIHRoZXNlIGdlbnJlcyBpcywgb24gYXZlcmFnZSwgNTklIGxlc3MgcG9wdWxhciB0aGFuIGEgc2hvdyB0aGF0J3Mgbm90IGxpc3RlZCBhcyAiTXVzaWMiIG9yICJIaXN0b3JpY2FsIi4gVGhlIG90aGVyIGdlbnJlcyB0aGF0IGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3QgYXJlIFNwYWNlLCBNZWNoYSwgU3BvcnRzLCBEZW1vbnMgYW5kIFBvbGljZS4gSW4gdGhlIGdyYXBoIGJlaGluZCB5b3UgY2FuIGxvb2sgYXQgdGhlIHBvcHVsYXJpdHkgZGVuc2l0eSBkaXN0cmlidXRpb24gb2Ygc29tZSBvZiB0aGUgbW9zdCBpbmZsdWVudGlhbCBnZW5yZXMuIEkgcGlja2VkIHRoZSB0d28gZ2VucmVzIHdpdGggdGhlIGhpZ2hlc3QgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIGVmZmVjdCBvbiBwb3B1bGFyaXR5Lg0KDQpgYGB7ciwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQoNCnBsb3RfbHkob3BhY2l0eT0wLjUpICU+JSANCiAgYWRkX2xpbmVzKHg9fmRlbnNpdHkxNCR4LHk9fmRlbnNpdHkxNCR5LG5hbWU9IkhhcmVtIikgJT4lIA0KICBhZGRfbGluZXMoeD1+ZGVuc2l0eTIkeCx5PX5kZW5zaXR5MiR5LG5hbWU9Ikhpc3RvcmljYWwiKSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MTAkeCx5PX5kZW5zaXR5MTAkeSxuYW1lPSJNdXNpYyIpICU+JSANCiAgYWRkX2xpbmVzKHg9fmRlbnNpdHk5JHgseT1+ZGVuc2l0eTkkeSxuYW1lPSJBbGwgQW5pbWUiKSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MTIkeCx5PX5kZW5zaXR5MTIkeSxuYW1lPSJQc3ljaG9sb2dpY2FsIikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSAnUG9wdWxhcml0eSBEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiB0aGUgTW9zdCBJbmZsdWVuY2lhbCBBbmltZSBHZW5yZXMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gImxvZyhtZW1iZXJzKSIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImRlbnNpdHkiKSkNCg0KDQpgYGANCg0KDQojIyMjIFNvdXJjZSBNYXRlcmlhbA0KDQpPZiBhbGwgdGhlIHNvdXJjZXMsIHRoZSBvbmx5IG9uZSB0aGF0IGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBpcyBsaWdodCBub3ZlbC4gSWYgeW91IGRvbid0IGtub3cgd2hhdCBhIGxpZ2h0IG5vdmVsIGlzIHJlYWQgW3RoaXNdKGh0dHBzOi8vcmFuZG9tYy5uZXQvMjAwOS8wNS8xOC9saWdodC1ub3ZlbHMtaW50cm9kdWN0aW9uLykuIExpZ2h0IG5vdmVscyBhZGFwdGF0aW9ucyBhcmUgb24gYXZlcmFnZSA0MiUgbW9yZSBwb3B1bGFyIHRoYW4gYW5pbWUgd2hvc2Ugc291cmNlIG1hdGVyaWFsIGNvbWVzIGZyb20gYW5vdGhlciBtZWRpdW0uIEkgdGhpbmsgdGhpcyBpcyBwYXJ0bHkgZHVlIHRvIHRoZSByaXNlIGluIHBvcHVsYXJpdHkgb2YgSXNla2FpIGluIHRoZSBsYXN0IGRlY2FkZSwgYXMgSXNla2FpIGFuaW1lIGFyZSBwcmVkb21pbmFudGx5IGFkYXB0YXRpb25zIG9mIGxpZ2h0IG5vdmVscy4gSWYgeW91IGRvbid0IGtub3cgd2hhdCBhbiBpc2VrYWkgYW5pbWUgaXMgcmVhZCBbdGhpc10oaHR0cHM6Ly9tYW5nYXBsYW5ldC5jb20vd2hhdC1pcy1pc2VrYWkvKQ0KDQpgYGB7ciwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQpudWV2bzMgJT4lIGZpbHRlcihzb3VyY2U9PSIgIExpZ2h0IG5vdmVsICAgICJ8c291cmNlPT0iICBNYW5nYSAgICAifA0KICAgICAgICAgICAgICAgICAgc291cmNlPT0iICBPcmlnaW5hbCAgICAifHNvdXJjZT09IiAgVmlzdWFsIG5vdmVsICAgICIpICU+JSANCnBsb3RfbHkoKSAlPiUgDQogIGFkZF90cmFjZSggeSA9IH5sb2cobWVtYmVyczEpLA0KICAgICAgICAgICAgY29sb3IgPSB+c291cmNlLA0KICAgICAgICAgICAgdHlwZSA9ICJib3giKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICJBbmltZSBQb3B1bGFyaXR5IGJ5IFNvdXJjZSBNYXRlcmlhbCIsDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU291cmNlIE1hdGVyaWFsIikpIA0KDQpgYGANCg0KDQpgYGB7ciB0YWJsZTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0Ka2FibGUoTGlnaHQuTm92ZWxbMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiTW9zdCBQb3B1bGFyIExpZ2h0IE5vdmVsIEFkYXB0YXRpb25zIikNCg0KDQpgYGANCg0KIyMjIyBQcm9kdWNlcnMNCg0KVGhlcmUgYXJlIHR3byBwcm9kdWNlcnMgdGhhdCBoYXZlIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHBvcHVsYXJpdHkuIFRoZSBmaXJzdCBvbmUgaXMgU2FucmlvLiBTaG93cyBTYW5yaW8gaXMgcGFydCBvZiB0aGUgcHJvZHVjdGlvbiBjb21taXR0ZWUgYXJlIG9uIGF2ZXJhZ2UgODIlIGxlc3MgcG9wdWxhciB0aGFuIHNob3dzIFNhbnJpbyBpcyBub3QgcGFydCBvZiB0aGUgY29tbWl0dGVlLiBGcm9tIHdpa2lwZWRpYTogKiJTYW5yaW8gaXMgYSBKYXBhbmVzZSBjb21wYW55IHRoYXQgZGVzaWducywgbGljZW5zZXMgYW5kIHByb2R1Y2VzIHByb2R1Y3RzIGZvY3VzaW5nIG9uIHRoZSBrYXdhaWkgKCdjdXRlJykgc2VnbWVudCBvZiBKYXBhbmVzZSBwb3B1bGFyIGN1bHR1cmUiKi4gVGhlIG90aGVyIHByb2R1Y2VyIHRoYXQgaGFzIGEgbmVnYXRpdmUgZWZmZWN0IGlzIHRoZSBwdWJsaXNoZXIgU2hvZ2FrdWthbiwgdGhlIHNob3dzIGluIHdoaWNoIFNob2dha3VrYW4gaXMgaW52b2x2ZWQgYXJlIG9uIGF2ZXJhZ2UgMzUlIGxlc3MgcG9wdWxhciB0aGFuIHRoZSBzaG93cyBpbiB3aGljaCB0aGlzIHB1Ymxpc2hlciBpcyBub3Qgb24gdGhlIHByb2R1Y3Rpb24gY29tbWl0dGVlLg0KDQpUaGUgcHJvZHVjZXJzIFNodWVpc2hhLCBUb2hvIEFuaW1hdGlvbiwgYW5kIFBvbnkgQ2FueW9uIGhhdmUgYSBwb3NpdGl2ZSBlZmZlY3Qgb24gcG9wdWxhcml0eS4gU2hvd3MgaW4gd2hpY2ggU2jFq2Vpc2hhIGlzIGludm9sdmVkIGFyZSBvbiBhdmVyYWdlIDIxJSBtb3JlIHBvcHVsYXIgdGhhbiB0aGUgYW5pbWUgaW4gd2hpY2ggdGhpcyBwdWJsaXNoZXIgaXMgbm90IGludm9sdmVkLiBUaGlzIG1ha2VzIHNlbnNlIHNpbmNlIHRoaXMgcHVibGlzaGVyIHB1Ymxpc2hlcyB0aGUgV2Vla2x5IFNoxY1uZW4gSnVtcCBtYWdhemluZS4NCg0KYGBge3IgdGFibGU1LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQoNCmthYmxlKFNodWVpc2hhWzE6MTAsXSwgY29sLm5hbWVzPWMoIkFuaW1lIiwiTWVtYmVycyIsIlllYXIiKSxhbGlnbj0ibGNjIixjYXB0aW9uID0gIlRvcCAxMCBNb3N0IFBvcHVsYXIgQW5pbWUgUHJvZHVjZWQgYnkgU2h1ZWlzaGEiKQ0KDQpgYGANCkhlcmUncyBhIGJveHBsb3Qgd2l0aCB0aGUgbW9zdCBpbXBvcnRhbnQgbWFuZ2EvbGlnaHQgbm92ZWwgcHVibGlzaGVycyAoS2Fkb2thd2EsS29kYW5zaGEsU2hvZ2FrdWthbiBhbmQgU2h1ZWlzaGEpLiBBcyBjYW4gYmUgc2VlbiwgU2h1ZWlzaGEgaGFzIHRoZSBoaWdoZXN0IGxvZyhtZW1iZXJzKSBtZWRpYW4uIE9uIHRoZSBvdGhlciBoYW5kIFNob2dha3VrYW4gaGFzIHRoZSBsb3dlc3Qgb25lLg0KDQpgYGB7ciwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQpudWV2bzMgJT4lIGZpbHRlcihpcy5uYShlZGl0b3JpYWwpPT1GQUxTRSkgJT4lIA0KcGxvdF9seSgpICU+JSANCiAgYWRkX3RyYWNlKCB5ID0gfmxvZyhtZW1iZXJzMSksDQogICAgICAgICAgICAgY29sb3IgPSB+ZWRpdG9yaWFsLA0KICAgICAgICAgICAgIHR5cGUgPSAiYm94IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSAiQW5pbWUgUG9wdWxhcml0eSBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlB1Ymxpc2hlciIpKSANCmBgYA0KDQpUaGUgb3RoZXIgdHdvIHByb2R1Y2VycyB0aGF0IGhhdmUgYSBwb3NpdGl2ZSBlZmZlY3QgYXJlIDEpIFRvaG8gQW5pbWF0aW9uLCB3aGljaCBpcyBhbiBhbmltYXRpb24gc3R1ZGlvIGFuZCBmaWxtIGRpc3RyaWJ1dG9yLiAyKSBQb255IENhbnlvbiwgd2hpY2ggYWNjb3JkaW5nIHRvIHdpa2lwZWRpYSBpczogKiJhIEphcGFuZXNlIGNvbXBhbnksIHdoaWNoIHB1Ymxpc2hlcyBtdXNpYywgRFZEIGFuZCBWSFMgdmlkZW9zLCBtb3ZpZXMsIGFuZCB2aWRlbyBnYW1lcyIqLiBUb2hvIEFuaW1hdGlvbiBoYXMgYSBwb3NpdGl2ZSBlZmZlY3Qgb2YgMjclIHdoaWxlIFBvbnkgQ2FueW9uIGhhcyBhbiBlZmZlY3Qgb2YgMTYlLiBGaW5hbGx5LCB0aGUgdGVsZXZpc2lvbiBjb21wYW55IFRCUyBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGVmZmVjdCBvbiB0aGUgcG9wdWxhcml0eSBvZiBhbiBhbmltZS4NCg0KDQojIyMgRmluYWwgVGhvdWdodHMNCg0KT3VyIGFkanVzdGVkIHIgc3F1YXJlZCB0ZWxscyB1cyB0aGF0IHRoZSB2YXJpYWJsZXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFyZSBleHBsYWluaW5nIGFib3V0IDcwJSBvZiB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIG1lbWJlcnMgdmFyaWFibGUuIEhvd2V2ZXIgdGhlcmUgYXJlIGNlcnRhaW4gdGhpbmdzIHRvIGtlZXAgaW4gbWluZCB3aGVuIGFuYWx5emluZyB0aGVzZSByZXN1bHRzLiBGaXJzdCwgSSBkb24ndCBrbm93IHRoZSBnZW9ncmFwaGljIGRpc3RyaWJ1dGlvbiBvZiBNQUwgdXNlcnMuIEkgc3VzcGVjdCB0aGF0IHRoZXkgYXJlIG1vc3RseSBmcm9tIEVuZ2xpc2gtc3BlYWtpbmcgY291bnRyaWVzLiBUaGVyZWZvcmUsIG9uZSBtdXN0IGJlIGNhcmVmdWwgd2hlbiBtYWtpbmcgZ2VuZXJhbGl6YXRpb25zIHJlZ2FyZGluZyB0aGVzZSByZXN1bHRzLg0KDQpTZWNvbmQsIEkgY291bGRuJ3QgZmluZCBhIHdheSB0byBjb250cm9sIHRoZSBlZmZlY3QgcHJlcXVlbHMgaGF2ZSBvbiBzZXF1ZWxzLiBJZiB0aGUgZmlyc3Qgc2Vhc29uIG9mIGEgc2hvdyBpcyBwb3B1bGFyLCB0aGlzIHdpbGwgbWFrZSB0aGUgc2VxdWVscyB0byB0aGF0IHNob3cgdmVyeSBwb3B1bGFyIGFzIHdlbGwuIFdpdGggdGhlIGRhdGEgSSBoYXZlIHRoZXJlIGlzIG5vIHdheSB0byBjb250cm9sIHRoaXMgZWZmZWN0LiBUaGlyZCwgSSBjYW5ub3QgY29udHJvbCB0aGUgZWZmZWN0IHRoYXQgY2VydGFpbiBzdHJlYW1pbmcgcGxhdGZvcm1zIHN1Y2ggYXMgTmV0ZmxpeCwgQW1hem9uIG9yIENydW5jaHlyb2xsIG1heSBoYXZlLiBGb3VydGgsIHRoZSBkYXRhIG1heSBzaG93IG51bWJlcnMgdGhhdCBhcmUgbm90IHZlcnkgZmF2b3JhYmxlIHRvd2FyZHMgc2hvd3Mgd2hvc2UgdGFyZ2V0IGF1ZGllbmNlIGlzIGNoaWxkcmVuIHNpbmNlIGNoaWxkcmVuIHByb2JhYmx5IGRvIG5vdCBoYXZlIE1BTCBhY2NvdW50cy4NCg0KRGVzcGl0ZSBhbGwgb2YgdGhlIGFib3ZlLCBJIHRoaW5rIHRoaXMgZmlyc3QgYXBwcm9hY2ggc2hlZHMgc29tZSBsaWdodCBvbiB3aGF0IGVsZW1lbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIHBvcHVsYXJpdHkgb2YgYW5pbWUuIEluIHRoZSBmdXR1cmUgSSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSBtYWNoaW5lIGxlYXJuaW5nIG1vZGVscyB0aGF0IHByZWRpY3QgdGhlIHBvcHVsYXJpdHkgb2YgYW5pbWUuDQoNCg0K