1 Introduction

The increasing popularity of cycling in New York City has made it an important focus of transportation and public-health planning. The city’s Department of Transportation monitors daily cyclist traffic across the East River bridges to evaluate patterns in commuting, recreation, and infrastructure usage. Understanding how environmental factors such as temperature and precipitation affect cycling behavior can help policymakers improve safety, allocate resources, and encourage sustainable transportation.

In this study, we analyze daily cyclist counts collected by the Traffic Information Management System (TIMS) across four major East River bridges—the Brooklyn, Manhattan, Williamsburg, and Queensboro Bridges. Each observation represents the total number of cyclists recorded within a 24-hour period, along with daily weather conditions including high temperature, low temperature, and precipitation. The dataset spans multiple months and provides a detailed view of day-to-day variation in cycling activity.

The primary research question is:

How do temperature and precipitation influence the number of cyclists crossing the Manhattan Bridge each day?

To address this question, we apply a Poisson regression model, which is suitable for modeling count data. The response variable in our analysis is the daily cyclist count on the Manhattan Bridge (ManhattanBridge), while the explanatory variables include daily high temperature (HighTemp), low temperature (LowTemp), and precipitation (Precipitation). By modeling both the raw counts and adjusted rates of Manhattan Bridge crossings, we aim to quantify how weather conditions influence daily bicycle traffic on this key New York City route.

2 Description of Dataset

The dataset originates from the Traffic Information Management System (TIMS), which collects automated bicycle counts across New York City’s East River bridges. The data are summarized on a daily basis, where each observation represents the total number of cyclists crossing the bridges in a 24-hour period, along with corresponding weather conditions for that day. These data provide a snapshot of how cycling activity fluctuates with environmental factors such as temperature and rainfall.

There are 5 exploratory variables in the data set:

  • Date (categorical) - date of the bike count. This is our observation ID

  • LowTemp (numerical) - lowest temperature

  • Precipitation (numerical) - amount of precipitation

  • HighTemp (numerical) - highest temperature

  • Total (numerical) - total number of cyclists per 24 hours on the Brooklyn Bridge, Manhattan Bridge, Williamsburg Bridge, and Queensboro Bridge Our response variable is:

  • ManhattanBridge (numerical) - total number of cyclists per 24 hours crossing the Manhattan Bridge

Assumptions and Conditions for Poisson Regression:

Count response variable: The dependent variable must represent counts (non-negative integers), such as the number of cyclists crossing a bridge per day.

Independence of observations: Each observation (daily count) is assumed to be independent of the others.

Equidispersion: The mean and variance of the response variable are approximately equal. Overdispersion (variance greater than mean) can indicate model misfit and may require a quasi-Poisson or negative binomial adjustment.

Log-linearity: The logarithm of the expected count is a linear function of the predictor variables.

No excessive zeros: Poisson regression assumes the count data are not dominated by zeros (zero-inflated models would be used otherwise).

Explanatory variables measured without error: Predictor variables (e.g., temperature, precipitation) are assumed to be observed accurately.

3 Poisson Regression on New York Bike Crossing Counts

We first build a Poisson frequency regression model to evaluate how daily weather conditions—specifically temperature and precipitation—affect the number of cyclists crossing the Manhattan Bridge. The model treats the Manhattan Bridge cyclist count as the random response variable and uses low temperature, high temperature, and precipitation as explanatory variables.

3.1

The fitted model is given by:

log(E[ManhattanBridge])=β0​+β1​(LowTemp)+β2​(Precipitation)+β3​(HighTemp)

model.freq <- glm(ManhattanBridge ~ LowTemp + Precipitation + HighTemp, family = poisson(link = "log"), data = data)
##
pois.count.coef = summary(model.freq)$coef
kable(pois.count.coef, caption = "Poisson regression of daily total cyclists on temperature and precipitation")
Poisson regression of daily total cyclists on temperature and precipitation
Estimate Std. Error z value Pr(>|z|)
(Intercept) 7.1518810 0.0208735 342.629009 0
LowTemp 0.0057293 0.0007305 7.843104 0
Precipitation -0.9562159 0.0171745 -55.676552 0
HighTemp 0.0156493 0.0005453 28.699846 0

The Poisson regression results show how weather conditions shape daily cycling activity across the Manhattan Bridge. Both temperature variables have positive relationships with cyclist counts, meaning warmer days—both in the morning and afternoon—encourage more people to bike across the bridge. For every one-degree increase in daily high temperature, the expected number of cyclists rises by about 1.4 percent, while a one-degree increase in the low temperature adds roughly 0.7 percent. These effects, though small individually, accumulate to a substantial increase in cycling volume during warm weather. In contrast, precipitation has a strong and highly significant negative impact on cyclist activity. A day with measurable rainfall sees nearly a 60 percent drop in cyclists compared to a dry day, highlighting how sensitive commuting and recreational biking are to poor weather. Overall, the model captures intuitive behavioral patterns: people are more likely to cycle when temperatures are comfortable and far less likely when it rains. These findings reinforce how weather directly drives daily changes in cycling traffic across the Manhattan Bridge.

Variable Selection:

To simplify the model, I examined the p-values of each predictor to determine which variables had statistically significant effects on Manhattan Bridge cyclist counts. Both temperature variables and precipitation were highly significant (p < 0.05), so all three predictors were retained in the final Poisson count model. Because every variable contributed meaningfully, no further model reduction was necessary.

3.2 Poisson Regression on Manhattan Bridge Cycling Rates

Next, we build a Poisson rate model to assess the relationship between cycling rates on the Manhattan Bridge and weather conditions while adjusting for the overall daily cycling volume across all four bridges. This adjustment accounts for the fact that daily cycling totals citywide may vary due to unobserved factors such as holidays, events, or other conditions affecting all bridges.

The fitted model is:

log(E[ManhattanBridge])=β0​+β1​(LowTemp)+β2​(Precipitation)+β3​(HighTemp)+log(Total)

where log(Total) is included as an offset, allowing us to model the rate of cyclists on the Manhattan Bridge relative to the total number of cyclists across all bridges.

model.rates <- glm(ManhattanBridge ~ LowTemp + Precipitation + HighTemp, offset = log(Total), 
                   family = poisson(link = "log"), data = data)
kable(summary(model.rates)$coef, caption = "Poisson regression of daily cyclist rates by temperature and precipitation")
Poisson regression of daily cyclist rates by temperature and precipitation
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.2821389 0.0219865 -58.314794 0.0000000
LowTemp -0.0009331 0.0007449 -1.252776 0.2102872
Precipitation -0.0429674 0.0164222 -2.616430 0.0088855
HighTemp 0.0014200 0.0005597 2.537243 0.0111729

The Poisson rate model evaluates how temperature and precipitation affect the rate of cyclists crossing the Manhattan Bridge, after accounting for overall citywide cycling activity. Among the predictors, precipitation has a significant negative impact (p = 0.009). Its coefficient (−0.043) implies that for each additional inch of rainfall, the expected rate of Manhattan Bridge crossings decreases by about 4%, since exp(−0.043) ≈ 0.96. In other words, rainfall substantially lowers the share of cyclists using the Manhattan Bridge relative to total cyclists across all bridges.

High temperature has a small but statistically significant positive relationship (p = 0.011). Each one-degree increase in daily high temperature corresponds to roughly a 0.14% increase in the expected cycling rate on the Manhattan Bridge (exp(0.0014) ≈ 1.0014). This indicates that warmer daytime conditions slightly raise the bridge’s cycling rate, even when controlling for total activity citywide.

Low temperature, however, shows no significant effect (p = 0.21), suggesting that overnight or early-morning lows have minimal influence once other factors are considered.

Overall, the results demonstrate that precipitation sharply reduces Manhattan Bridge cycling rates, while warmer daily highs modestly increase them. This pattern reinforces that adverse weather conditions, particularly rain, discourage bridge cycling even after accounting for broader citywide trends.

Variable Selection:

For the rate model, I used p-value–based selection to identify the most important weather predictors after adjusting for total cycling volume. High temperature (p = 0.011) and precipitation (p = 0.009) were statistically significant, while low temperature (p = 0.21) was not. Therefore, the final Poisson rate model retains only HighTemp and Precipitation as predictors of Manhattan Bridge cycling rates.

4 Conclusion

This study examined how weather conditions influence daily cycling activity across the Manhattan Bridge in New York City using Poisson regression models. The analysis revealed consistent and intuitive patterns: warmer temperatures encourage higher cyclist volumes, while precipitation sharply reduces them.

In the Poisson count model, both high and low temperatures had significant positive effects, indicating that warm days—morning and afternoon alike—lead to greater numbers of cyclists. Precipitation showed a large and highly significant negative impact, confirming that rain strongly deters cycling across the bridge.

In the Poisson rate model, which adjusted for the total number of cyclists across all East River bridges, high temperature remained a small but significant positive predictor, while precipitation continued to have a strong negative effect. Low temperature was no longer significant once overall cycling trends were accounted for.

Together, these results demonstrate that daily variations in weather, particularly precipitation and temperature, play a key role in shaping cycling behavior. The findings highlight the importance of favorable weather conditions for promoting urban cycling and provide useful insights for city planners and transportation officials seeking to design policies and infrastructure that support year-round bicycle commuting in New York City.

LS0tDQp0aXRsZTogIk1vZGVsaW5nIE1hbmhhdHRhbiBCcmlkZ2UgQ3ljbGlzdCBDb3VudHMgVXNpbmcgUG9pc3NvbiBSZWdyZXNzaW9uIg0KYXV0aG9yOiAiTHVrZSBWb2xtIg0KZGF0ZTogIjIwMjUtMTAtMTAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAjIG91dHB1dCBkb2N1bWVudCBmb3JtYXQNCiAgICB0b2M6IHllcyAgICAgICAgICAgICAgICMgYWRkIHRhYmxlIGNvbnRlbnRzDQogICAgdG9jX2Zsb2F0OiB5ZXMgICAgICAgICAjIHRvY19wcm9wZXJ0eTogZmxvYXRpbmcNCiAgICB0b2NfZGVwdGg6IDQgICAgICAgICAgICMgZGVwdGggb2YgVE9DIGhlYWRpbmdzDQogICAgZmlnX3dpZHRoOiA2ICAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgd2lkdGgNCiAgICBmaWdfaGVpZ2h0OiA0ICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSBoZWlnaHQNCiAgICBmaWdfY2FwdGlvbjogeWVzICAgICAgICMgYWRkIGZpZ3VyZSBjYXB0aW9uDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubyAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICMgVE9DIHN1YmhlYWRpbmcgY29sbGFwc2luZw0KICAgIGNvZGVfZm9sZGluZzogaGlkZSAgICAgIyBmb2xkaW5nL3Nob3dpbmcgY29kZSANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyBsd2V7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShib290KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShwYW5kZXIpDQoNCiMgU2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQojIFJlYWQgaW4gZGF0YSAoZHJvcCBmaXJzdCBjb2x1bW4gaWYgaXQncyBqdXN0IGFuIGluZGV4L0lEKQ0Kc2V0d2QoIkM6L1VzZXJzL3ZvbG0xL09uZURyaXZlL0Rlc2t0b3AvU1RBMzIxIG5ldyIpDQpkYXRhIDwtIHJlYWRfZXhjZWwoIncwOS1Bc3NpZ25EYXRhc2V0Lnhsc3giKQ0KIyBHbG9iYWwgY2h1bmsgb3B0aW9ucw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvID0gVFJVRSwgICAgICAjIHNob3cgY29kZQ0KICB3YXJuaW5nID0gRkFMU0UsICAjIHN1cHByZXNzIHdhcm5pbmdzDQogIG1lc3NhZ2UgPSBGQUxTRSwgICMgc3VwcHJlc3MgbWVzc2FnZXMNCiAgcmVzdWx0cyA9IFRSVUUsICAgIyBzaG93IHJlc3VsdHMNCiAgY29tbWVudCA9IE5BICAgICAgIyBjbGVhbmVyIG91dHB1dCAobm8gIiMjIiBwcmVmaXgpDQopDQpgYGANCg0KIyAxIEludHJvZHVjdGlvbg0KDQpUaGUgaW5jcmVhc2luZyBwb3B1bGFyaXR5IG9mIGN5Y2xpbmcgaW4gTmV3IFlvcmsgQ2l0eSBoYXMgbWFkZSBpdCBhbiBpbXBvcnRhbnQgZm9jdXMgb2YgdHJhbnNwb3J0YXRpb24gYW5kIHB1YmxpYy1oZWFsdGggcGxhbm5pbmcuIFRoZSBjaXR54oCZcyBEZXBhcnRtZW50IG9mIFRyYW5zcG9ydGF0aW9uIG1vbml0b3JzIGRhaWx5IGN5Y2xpc3QgdHJhZmZpYyBhY3Jvc3MgdGhlIEVhc3QgUml2ZXIgYnJpZGdlcyB0byBldmFsdWF0ZSBwYXR0ZXJucyBpbiBjb21tdXRpbmcsIHJlY3JlYXRpb24sIGFuZCBpbmZyYXN0cnVjdHVyZSB1c2FnZS4gVW5kZXJzdGFuZGluZyBob3cgZW52aXJvbm1lbnRhbCBmYWN0b3JzIHN1Y2ggYXMgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24gYWZmZWN0IGN5Y2xpbmcgYmVoYXZpb3IgY2FuIGhlbHAgcG9saWN5bWFrZXJzIGltcHJvdmUgc2FmZXR5LCBhbGxvY2F0ZSByZXNvdXJjZXMsIGFuZCBlbmNvdXJhZ2Ugc3VzdGFpbmFibGUgdHJhbnNwb3J0YXRpb24uDQoNCkluIHRoaXMgc3R1ZHksIHdlIGFuYWx5emUgZGFpbHkgY3ljbGlzdCBjb3VudHMgY29sbGVjdGVkIGJ5IHRoZSBUcmFmZmljIEluZm9ybWF0aW9uIE1hbmFnZW1lbnQgU3lzdGVtIChUSU1TKSBhY3Jvc3MgZm91ciBtYWpvciBFYXN0IFJpdmVyIGJyaWRnZXPigJR0aGUgQnJvb2tseW4sIE1hbmhhdHRhbiwgV2lsbGlhbXNidXJnLCBhbmQgUXVlZW5zYm9ybyBCcmlkZ2VzLiBFYWNoIG9ic2VydmF0aW9uIHJlcHJlc2VudHMgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyByZWNvcmRlZCB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgYWxvbmcgd2l0aCBkYWlseSB3ZWF0aGVyIGNvbmRpdGlvbnMgaW5jbHVkaW5nIGhpZ2ggdGVtcGVyYXR1cmUsIGxvdyB0ZW1wZXJhdHVyZSwgYW5kIHByZWNpcGl0YXRpb24uIFRoZSBkYXRhc2V0IHNwYW5zIG11bHRpcGxlIG1vbnRocyBhbmQgcHJvdmlkZXMgYSBkZXRhaWxlZCB2aWV3IG9mIGRheS10by1kYXkgdmFyaWF0aW9uIGluIGN5Y2xpbmcgYWN0aXZpdHkuDQoNClRoZSBwcmltYXJ5IHJlc2VhcmNoIHF1ZXN0aW9uIGlzOg0KDQpIb3cgZG8gdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24gaW5mbHVlbmNlIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgY3Jvc3NpbmcgdGhlIE1hbmhhdHRhbiBCcmlkZ2UgZWFjaCBkYXk/DQoNClRvIGFkZHJlc3MgdGhpcyBxdWVzdGlvbiwgd2UgYXBwbHkgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBtb2RlbGluZyBjb3VudCBkYXRhLiBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaW4gb3VyIGFuYWx5c2lzIGlzIHRoZSBkYWlseSBjeWNsaXN0IGNvdW50IG9uIHRoZSBNYW5oYXR0YW4gQnJpZGdlIChNYW5oYXR0YW5CcmlkZ2UpLCB3aGlsZSB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGluY2x1ZGUgZGFpbHkgaGlnaCB0ZW1wZXJhdHVyZSAoSGlnaFRlbXApLCBsb3cgdGVtcGVyYXR1cmUgKExvd1RlbXApLCBhbmQgcHJlY2lwaXRhdGlvbiAoUHJlY2lwaXRhdGlvbikuIEJ5IG1vZGVsaW5nIGJvdGggdGhlIHJhdyBjb3VudHMgYW5kIGFkanVzdGVkIHJhdGVzIG9mIE1hbmhhdHRhbiBCcmlkZ2UgY3Jvc3NpbmdzLCB3ZSBhaW0gdG8gcXVhbnRpZnkgaG93IHdlYXRoZXIgY29uZGl0aW9ucyBpbmZsdWVuY2UgZGFpbHkgYmljeWNsZSB0cmFmZmljIG9uIHRoaXMga2V5IE5ldyBZb3JrIENpdHkgcm91dGUuDQoNCiMgMiBEZXNjcmlwdGlvbiBvZiBEYXRhc2V0DQoNClRoZSBkYXRhc2V0IG9yaWdpbmF0ZXMgZnJvbSB0aGUgVHJhZmZpYyBJbmZvcm1hdGlvbiBNYW5hZ2VtZW50IFN5c3RlbSAoVElNUyksIHdoaWNoIGNvbGxlY3RzIGF1dG9tYXRlZCBiaWN5Y2xlIGNvdW50cyBhY3Jvc3MgTmV3IFlvcmsgQ2l0eeKAmXMgRWFzdCBSaXZlciBicmlkZ2VzLiBUaGUgZGF0YSBhcmUgc3VtbWFyaXplZCBvbiBhIGRhaWx5IGJhc2lzLCB3aGVyZSBlYWNoIG9ic2VydmF0aW9uIHJlcHJlc2VudHMgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBjcm9zc2luZyB0aGUgYnJpZGdlcyBpbiBhIDI0LWhvdXIgcGVyaW9kLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgd2VhdGhlciBjb25kaXRpb25zIGZvciB0aGF0IGRheS4gVGhlc2UgZGF0YSBwcm92aWRlIGEgc25hcHNob3Qgb2YgaG93IGN5Y2xpbmcgYWN0aXZpdHkgZmx1Y3R1YXRlcyB3aXRoIGVudmlyb25tZW50YWwgZmFjdG9ycyBzdWNoIGFzIHRlbXBlcmF0dXJlIGFuZCByYWluZmFsbC4NCg0KVGhlcmUgYXJlIDUgZXhwbG9yYXRvcnkgdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldDoNCg0KKiBEYXRlIChjYXRlZ29yaWNhbCkgLSBkYXRlIG9mIHRoZSBiaWtlIGNvdW50LiBUaGlzIGlzIG91ciBvYnNlcnZhdGlvbiBJRA0KKiBMb3dUZW1wIChudW1lcmljYWwpIC0gbG93ZXN0IHRlbXBlcmF0dXJlDQoqIFByZWNpcGl0YXRpb24gKG51bWVyaWNhbCkgLSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbg0KKiBIaWdoVGVtcCAobnVtZXJpY2FsKSAtIGhpZ2hlc3QgdGVtcGVyYXR1cmUgDQoqIFRvdGFsIChudW1lcmljYWwpIC0gdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIHBlciAyNCBob3VycyBvbiB0aGUgQnJvb2tseW4gQnJpZGdlLCBNYW5oYXR0YW4gQnJpZGdlLCBXaWxsaWFtc2J1cmcgQnJpZGdlLCBhbmQgUXVlZW5zYm9ybyBCcmlkZ2UNCk91ciByZXNwb25zZSB2YXJpYWJsZSBpczoNCg0KKiBNYW5oYXR0YW5CcmlkZ2UgKG51bWVyaWNhbCkgLSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgcGVyIDI0IGhvdXJzIGNyb3NzaW5nIHRoZSBNYW5oYXR0YW4gQnJpZGdlDQoNCioqQXNzdW1wdGlvbnMgYW5kIENvbmRpdGlvbnMgZm9yIFBvaXNzb24gUmVncmVzc2lvbjoqKg0KDQpDb3VudCByZXNwb25zZSB2YXJpYWJsZTogVGhlIGRlcGVuZGVudCB2YXJpYWJsZSBtdXN0IHJlcHJlc2VudCBjb3VudHMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyksIHN1Y2ggYXMgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBjcm9zc2luZyBhIGJyaWRnZSBwZXIgZGF5Lg0KDQpJbmRlcGVuZGVuY2Ugb2Ygb2JzZXJ2YXRpb25zOiBFYWNoIG9ic2VydmF0aW9uIChkYWlseSBjb3VudCkgaXMgYXNzdW1lZCB0byBiZSBpbmRlcGVuZGVudCBvZiB0aGUgb3RoZXJzLg0KDQpFcXVpZGlzcGVyc2lvbjogVGhlIG1lYW4gYW5kIHZhcmlhbmNlIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhcmUgYXBwcm94aW1hdGVseSBlcXVhbC4gT3ZlcmRpc3BlcnNpb24gKHZhcmlhbmNlIGdyZWF0ZXIgdGhhbiBtZWFuKSBjYW4gaW5kaWNhdGUgbW9kZWwgbWlzZml0IGFuZCBtYXkgcmVxdWlyZSBhIHF1YXNpLVBvaXNzb24gb3IgbmVnYXRpdmUgYmlub21pYWwgYWRqdXN0bWVudC4NCg0KTG9nLWxpbmVhcml0eTogVGhlIGxvZ2FyaXRobSBvZiB0aGUgZXhwZWN0ZWQgY291bnQgaXMgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMuDQoNCk5vIGV4Y2Vzc2l2ZSB6ZXJvczogUG9pc3NvbiByZWdyZXNzaW9uIGFzc3VtZXMgdGhlIGNvdW50IGRhdGEgYXJlIG5vdCBkb21pbmF0ZWQgYnkgemVyb3MgKHplcm8taW5mbGF0ZWQgbW9kZWxzIHdvdWxkIGJlIHVzZWQgb3RoZXJ3aXNlKS4NCg0KRXhwbGFuYXRvcnkgdmFyaWFibGVzIG1lYXN1cmVkIHdpdGhvdXQgZXJyb3I6IFByZWRpY3RvciB2YXJpYWJsZXMgKGUuZy4sIHRlbXBlcmF0dXJlLCBwcmVjaXBpdGF0aW9uKSBhcmUgYXNzdW1lZCB0byBiZSBvYnNlcnZlZCBhY2N1cmF0ZWx5Lg0KDQojIDMgUG9pc3NvbiBSZWdyZXNzaW9uIG9uIE5ldyBZb3JrIEJpa2UgQ3Jvc3NpbmcgQ291bnRzDQoNCldlIGZpcnN0IGJ1aWxkIGEgUG9pc3NvbiBmcmVxdWVuY3kgcmVncmVzc2lvbiBtb2RlbCB0byBldmFsdWF0ZSBob3cgZGFpbHkgd2VhdGhlciBjb25kaXRpb25z4oCUc3BlY2lmaWNhbGx5IHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9u4oCUYWZmZWN0IHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgY3Jvc3NpbmcgdGhlIE1hbmhhdHRhbiBCcmlkZ2UuIFRoZSBtb2RlbCB0cmVhdHMgdGhlIE1hbmhhdHRhbiBCcmlkZ2UgY3ljbGlzdCBjb3VudCBhcyB0aGUgcmFuZG9tIHJlc3BvbnNlIHZhcmlhYmxlIGFuZCB1c2VzIGxvdyB0ZW1wZXJhdHVyZSwgaGlnaCB0ZW1wZXJhdHVyZSwgYW5kIHByZWNpcGl0YXRpb24gYXMgZXhwbGFuYXRvcnkgdmFyaWFibGVzLg0KDQojIyAzLjEgDQoNClRoZSBmaXR0ZWQgbW9kZWwgaXMgZ2l2ZW4gYnk6DQoNCmxvZyhFW01hbmhhdHRhbkJyaWRnZV0pPc6yMOKAiyvOsjHigIsoTG93VGVtcCkrzrIy4oCLKFByZWNpcGl0YXRpb24pK86yM+KAiyhIaWdoVGVtcCkNCg0KYGBge3J9DQoNCm1vZGVsLmZyZXEgPC0gZ2xtKE1hbmhhdHRhbkJyaWRnZSB+IExvd1RlbXAgKyBQcmVjaXBpdGF0aW9uICsgSGlnaFRlbXAsIGZhbWlseSA9IHBvaXNzb24obGluayA9ICJsb2ciKSwgZGF0YSA9IGRhdGEpDQojIw0KcG9pcy5jb3VudC5jb2VmID0gc3VtbWFyeShtb2RlbC5mcmVxKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiByZWdyZXNzaW9uIG9mIGRhaWx5IHRvdGFsIGN5Y2xpc3RzIG9uIHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9uIikNCmBgYA0KDQpUaGUgUG9pc3NvbiByZWdyZXNzaW9uIHJlc3VsdHMgc2hvdyBob3cgd2VhdGhlciBjb25kaXRpb25zIHNoYXBlIGRhaWx5IGN5Y2xpbmcgYWN0aXZpdHkgYWNyb3NzIHRoZSBNYW5oYXR0YW4gQnJpZGdlLiBCb3RoIHRlbXBlcmF0dXJlIHZhcmlhYmxlcyBoYXZlIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMgd2l0aCBjeWNsaXN0IGNvdW50cywgbWVhbmluZyB3YXJtZXIgZGF5c+KAlGJvdGggaW4gdGhlIG1vcm5pbmcgYW5kIGFmdGVybm9vbuKAlGVuY291cmFnZSBtb3JlIHBlb3BsZSB0byBiaWtlIGFjcm9zcyB0aGUgYnJpZGdlLiBGb3IgZXZlcnkgb25lLWRlZ3JlZSBpbmNyZWFzZSBpbiBkYWlseSBoaWdoIHRlbXBlcmF0dXJlLCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGN5Y2xpc3RzIHJpc2VzIGJ5IGFib3V0IDEuNCBwZXJjZW50LCB3aGlsZSBhIG9uZS1kZWdyZWUgaW5jcmVhc2UgaW4gdGhlIGxvdyB0ZW1wZXJhdHVyZSBhZGRzIHJvdWdobHkgMC43IHBlcmNlbnQuIFRoZXNlIGVmZmVjdHMsIHRob3VnaCBzbWFsbCBpbmRpdmlkdWFsbHksIGFjY3VtdWxhdGUgdG8gYSBzdWJzdGFudGlhbCBpbmNyZWFzZSBpbiBjeWNsaW5nIHZvbHVtZSBkdXJpbmcgd2FybSB3ZWF0aGVyLiBJbiBjb250cmFzdCwgcHJlY2lwaXRhdGlvbiBoYXMgYSBzdHJvbmcgYW5kIGhpZ2hseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBpbXBhY3Qgb24gY3ljbGlzdCBhY3Rpdml0eS4gQSBkYXkgd2l0aCBtZWFzdXJhYmxlIHJhaW5mYWxsIHNlZXMgbmVhcmx5IGEgNjAgcGVyY2VudCBkcm9wIGluIGN5Y2xpc3RzIGNvbXBhcmVkIHRvIGEgZHJ5IGRheSwgaGlnaGxpZ2h0aW5nIGhvdyBzZW5zaXRpdmUgY29tbXV0aW5nIGFuZCByZWNyZWF0aW9uYWwgYmlraW5nIGFyZSB0byBwb29yIHdlYXRoZXIuIE92ZXJhbGwsIHRoZSBtb2RlbCBjYXB0dXJlcyBpbnR1aXRpdmUgYmVoYXZpb3JhbCBwYXR0ZXJuczogcGVvcGxlIGFyZSBtb3JlIGxpa2VseSB0byBjeWNsZSB3aGVuIHRlbXBlcmF0dXJlcyBhcmUgY29tZm9ydGFibGUgYW5kIGZhciBsZXNzIGxpa2VseSB3aGVuIGl0IHJhaW5zLiBUaGVzZSBmaW5kaW5ncyByZWluZm9yY2UgaG93IHdlYXRoZXIgZGlyZWN0bHkgZHJpdmVzIGRhaWx5IGNoYW5nZXMgaW4gY3ljbGluZyB0cmFmZmljIGFjcm9zcyB0aGUgTWFuaGF0dGFuIEJyaWRnZS4NCg0KKipWYXJpYWJsZSBTZWxlY3Rpb246KioNCg0KVG8gc2ltcGxpZnkgdGhlIG1vZGVsLCBJIGV4YW1pbmVkIHRoZSBwLXZhbHVlcyBvZiBlYWNoIHByZWRpY3RvciB0byBkZXRlcm1pbmUgd2hpY2ggdmFyaWFibGVzIGhhZCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGVmZmVjdHMgb24gTWFuaGF0dGFuIEJyaWRnZSBjeWNsaXN0IGNvdW50cy4gQm90aCB0ZW1wZXJhdHVyZSB2YXJpYWJsZXMgYW5kIHByZWNpcGl0YXRpb24gd2VyZSBoaWdobHkgc2lnbmlmaWNhbnQgKHAgPCAwLjA1KSwgc28gYWxsIHRocmVlIHByZWRpY3RvcnMgd2VyZSByZXRhaW5lZCBpbiB0aGUgZmluYWwgUG9pc3NvbiBjb3VudCBtb2RlbC4gQmVjYXVzZSBldmVyeSB2YXJpYWJsZSBjb250cmlidXRlZCBtZWFuaW5nZnVsbHksIG5vIGZ1cnRoZXIgbW9kZWwgcmVkdWN0aW9uIHdhcyBuZWNlc3NhcnkuDQoNCiMjIDMuMiBQb2lzc29uIFJlZ3Jlc3Npb24gb24gTWFuaGF0dGFuIEJyaWRnZSBDeWNsaW5nIFJhdGVzDQoNCk5leHQsIHdlIGJ1aWxkIGEgUG9pc3NvbiByYXRlIG1vZGVsIHRvIGFzc2VzcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY3ljbGluZyByYXRlcyBvbiB0aGUgTWFuaGF0dGFuIEJyaWRnZSBhbmQgd2VhdGhlciBjb25kaXRpb25zIHdoaWxlIGFkanVzdGluZyBmb3IgdGhlIG92ZXJhbGwgZGFpbHkgY3ljbGluZyB2b2x1bWUgYWNyb3NzIGFsbCBmb3VyIGJyaWRnZXMuIFRoaXMgYWRqdXN0bWVudCBhY2NvdW50cyBmb3IgdGhlIGZhY3QgdGhhdCBkYWlseSBjeWNsaW5nIHRvdGFscyBjaXR5d2lkZSBtYXkgdmFyeSBkdWUgdG8gdW5vYnNlcnZlZCBmYWN0b3JzIHN1Y2ggYXMgaG9saWRheXMsIGV2ZW50cywgb3Igb3RoZXIgY29uZGl0aW9ucyBhZmZlY3RpbmcgYWxsIGJyaWRnZXMuDQoNClRoZSBmaXR0ZWQgbW9kZWwgaXM6DQoNCmxvZyhFW01hbmhhdHRhbkJyaWRnZV0pPc6yMOKAiyvOsjHigIsoTG93VGVtcCkrzrIy4oCLKFByZWNpcGl0YXRpb24pK86yM+KAiyhIaWdoVGVtcCkrbG9nKFRvdGFsKQ0KDQp3aGVyZSBsb2coVG90YWwpIGlzIGluY2x1ZGVkIGFzIGFuIG9mZnNldCwgYWxsb3dpbmcgdXMgdG8gbW9kZWwgdGhlIHJhdGUgb2YgY3ljbGlzdHMgb24gdGhlIE1hbmhhdHRhbiBCcmlkZ2UgcmVsYXRpdmUgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBhY3Jvc3MgYWxsIGJyaWRnZXMuDQoNCmBgYHtyfQ0KDQptb2RlbC5yYXRlcyA8LSBnbG0oTWFuaGF0dGFuQnJpZGdlIH4gTG93VGVtcCArIFByZWNpcGl0YXRpb24gKyBIaWdoVGVtcCwgb2Zmc2V0ID0gbG9nKFRvdGFsKSwgDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gZGF0YSkNCmthYmxlKHN1bW1hcnkobW9kZWwucmF0ZXMpJGNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiByZWdyZXNzaW9uIG9mIGRhaWx5IGN5Y2xpc3QgcmF0ZXMgYnkgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24iKQ0KYGBgDQoNClRoZSBQb2lzc29uIHJhdGUgbW9kZWwgZXZhbHVhdGVzIGhvdyB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiBhZmZlY3QgdGhlIHJhdGUgb2YgY3ljbGlzdHMgY3Jvc3NpbmcgdGhlIE1hbmhhdHRhbiBCcmlkZ2UsIGFmdGVyIGFjY291bnRpbmcgZm9yIG92ZXJhbGwgY2l0eXdpZGUgY3ljbGluZyBhY3Rpdml0eS4gQW1vbmcgdGhlIHByZWRpY3RvcnMsIHByZWNpcGl0YXRpb24gaGFzIGEgc2lnbmlmaWNhbnQgbmVnYXRpdmUgaW1wYWN0IChwID0gMC4wMDkpLiBJdHMgY29lZmZpY2llbnQgKOKIkjAuMDQzKSBpbXBsaWVzIHRoYXQgZm9yIGVhY2ggYWRkaXRpb25hbCBpbmNoIG9mIHJhaW5mYWxsLCB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiBNYW5oYXR0YW4gQnJpZGdlIGNyb3NzaW5ncyBkZWNyZWFzZXMgYnkgYWJvdXQgNCUsIHNpbmNlIGV4cCjiiJIwLjA0Mykg4omIIDAuOTYuIEluIG90aGVyIHdvcmRzLCByYWluZmFsbCBzdWJzdGFudGlhbGx5IGxvd2VycyB0aGUgc2hhcmUgb2YgY3ljbGlzdHMgdXNpbmcgdGhlIE1hbmhhdHRhbiBCcmlkZ2UgcmVsYXRpdmUgdG8gdG90YWwgY3ljbGlzdHMgYWNyb3NzIGFsbCBicmlkZ2VzLg0KDQpIaWdoIHRlbXBlcmF0dXJlIGhhcyBhIHNtYWxsIGJ1dCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCAocCA9IDAuMDExKS4gRWFjaCBvbmUtZGVncmVlIGluY3JlYXNlIGluIGRhaWx5IGhpZ2ggdGVtcGVyYXR1cmUgY29ycmVzcG9uZHMgdG8gcm91Z2hseSBhIDAuMTQlIGluY3JlYXNlIGluIHRoZSBleHBlY3RlZCBjeWNsaW5nIHJhdGUgb24gdGhlIE1hbmhhdHRhbiBCcmlkZ2UgKGV4cCgwLjAwMTQpIOKJiCAxLjAwMTQpLiBUaGlzIGluZGljYXRlcyB0aGF0IHdhcm1lciBkYXl0aW1lIGNvbmRpdGlvbnMgc2xpZ2h0bHkgcmFpc2UgdGhlIGJyaWRnZeKAmXMgY3ljbGluZyByYXRlLCBldmVuIHdoZW4gY29udHJvbGxpbmcgZm9yIHRvdGFsIGFjdGl2aXR5IGNpdHl3aWRlLg0KDQpMb3cgdGVtcGVyYXR1cmUsIGhvd2V2ZXIsIHNob3dzIG5vIHNpZ25pZmljYW50IGVmZmVjdCAocCA9IDAuMjEpLCBzdWdnZXN0aW5nIHRoYXQgb3Zlcm5pZ2h0IG9yIGVhcmx5LW1vcm5pbmcgbG93cyBoYXZlIG1pbmltYWwgaW5mbHVlbmNlIG9uY2Ugb3RoZXIgZmFjdG9ycyBhcmUgY29uc2lkZXJlZC4NCg0KT3ZlcmFsbCwgdGhlIHJlc3VsdHMgZGVtb25zdHJhdGUgdGhhdCBwcmVjaXBpdGF0aW9uIHNoYXJwbHkgcmVkdWNlcyBNYW5oYXR0YW4gQnJpZGdlIGN5Y2xpbmcgcmF0ZXMsIHdoaWxlIHdhcm1lciBkYWlseSBoaWdocyBtb2Rlc3RseSBpbmNyZWFzZSB0aGVtLiBUaGlzIHBhdHRlcm4gcmVpbmZvcmNlcyB0aGF0IGFkdmVyc2Ugd2VhdGhlciBjb25kaXRpb25zLCBwYXJ0aWN1bGFybHkgcmFpbiwgZGlzY291cmFnZSBicmlkZ2UgY3ljbGluZyBldmVuIGFmdGVyIGFjY291bnRpbmcgZm9yIGJyb2FkZXIgY2l0eXdpZGUgdHJlbmRzLg0KDQoqKlZhcmlhYmxlIFNlbGVjdGlvbjoqKg0KDQpGb3IgdGhlIHJhdGUgbW9kZWwsIEkgdXNlZCBwLXZhbHVl4oCTYmFzZWQgc2VsZWN0aW9uIHRvIGlkZW50aWZ5IHRoZSBtb3N0IGltcG9ydGFudCB3ZWF0aGVyIHByZWRpY3RvcnMgYWZ0ZXIgYWRqdXN0aW5nIGZvciB0b3RhbCBjeWNsaW5nIHZvbHVtZS4gSGlnaCB0ZW1wZXJhdHVyZSAocCA9IDAuMDExKSBhbmQgcHJlY2lwaXRhdGlvbiAocCA9IDAuMDA5KSB3ZXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIHdoaWxlIGxvdyB0ZW1wZXJhdHVyZSAocCA9IDAuMjEpIHdhcyBub3QuIFRoZXJlZm9yZSwgdGhlIGZpbmFsIFBvaXNzb24gcmF0ZSBtb2RlbCByZXRhaW5zIG9ubHkgSGlnaFRlbXAgYW5kIFByZWNpcGl0YXRpb24gYXMgcHJlZGljdG9ycyBvZiBNYW5oYXR0YW4gQnJpZGdlIGN5Y2xpbmcgcmF0ZXMuDQoNCiMgNCBDb25jbHVzaW9uDQoNClRoaXMgc3R1ZHkgZXhhbWluZWQgaG93IHdlYXRoZXIgY29uZGl0aW9ucyBpbmZsdWVuY2UgZGFpbHkgY3ljbGluZyBhY3Rpdml0eSBhY3Jvc3MgdGhlIE1hbmhhdHRhbiBCcmlkZ2UgaW4gTmV3IFlvcmsgQ2l0eSB1c2luZyBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLiBUaGUgYW5hbHlzaXMgcmV2ZWFsZWQgY29uc2lzdGVudCBhbmQgaW50dWl0aXZlIHBhdHRlcm5zOiB3YXJtZXIgdGVtcGVyYXR1cmVzIGVuY291cmFnZSBoaWdoZXIgY3ljbGlzdCB2b2x1bWVzLCB3aGlsZSBwcmVjaXBpdGF0aW9uIHNoYXJwbHkgcmVkdWNlcyB0aGVtLg0KDQpJbiB0aGUgUG9pc3NvbiBjb3VudCBtb2RlbCwgYm90aCBoaWdoIGFuZCBsb3cgdGVtcGVyYXR1cmVzIGhhZCBzaWduaWZpY2FudCBwb3NpdGl2ZSBlZmZlY3RzLCBpbmRpY2F0aW5nIHRoYXQgd2FybSBkYXlz4oCUbW9ybmluZyBhbmQgYWZ0ZXJub29uIGFsaWtl4oCUbGVhZCB0byBncmVhdGVyIG51bWJlcnMgb2YgY3ljbGlzdHMuIFByZWNpcGl0YXRpb24gc2hvd2VkIGEgbGFyZ2UgYW5kIGhpZ2hseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBpbXBhY3QsIGNvbmZpcm1pbmcgdGhhdCByYWluIHN0cm9uZ2x5IGRldGVycyBjeWNsaW5nIGFjcm9zcyB0aGUgYnJpZGdlLg0KDQpJbiB0aGUgUG9pc3NvbiByYXRlIG1vZGVsLCB3aGljaCBhZGp1c3RlZCBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBhY3Jvc3MgYWxsIEVhc3QgUml2ZXIgYnJpZGdlcywgaGlnaCB0ZW1wZXJhdHVyZSByZW1haW5lZCBhIHNtYWxsIGJ1dCBzaWduaWZpY2FudCBwb3NpdGl2ZSBwcmVkaWN0b3IsIHdoaWxlIHByZWNpcGl0YXRpb24gY29udGludWVkIHRvIGhhdmUgYSBzdHJvbmcgbmVnYXRpdmUgZWZmZWN0LiBMb3cgdGVtcGVyYXR1cmUgd2FzIG5vIGxvbmdlciBzaWduaWZpY2FudCBvbmNlIG92ZXJhbGwgY3ljbGluZyB0cmVuZHMgd2VyZSBhY2NvdW50ZWQgZm9yLg0KDQpUb2dldGhlciwgdGhlc2UgcmVzdWx0cyBkZW1vbnN0cmF0ZSB0aGF0IGRhaWx5IHZhcmlhdGlvbnMgaW4gd2VhdGhlciwgcGFydGljdWxhcmx5IHByZWNpcGl0YXRpb24gYW5kIHRlbXBlcmF0dXJlLCBwbGF5IGEga2V5IHJvbGUgaW4gc2hhcGluZyBjeWNsaW5nIGJlaGF2aW9yLiBUaGUgZmluZGluZ3MgaGlnaGxpZ2h0IHRoZSBpbXBvcnRhbmNlIG9mIGZhdm9yYWJsZSB3ZWF0aGVyIGNvbmRpdGlvbnMgZm9yIHByb21vdGluZyB1cmJhbiBjeWNsaW5nIGFuZCBwcm92aWRlIHVzZWZ1bCBpbnNpZ2h0cyBmb3IgY2l0eSBwbGFubmVycyBhbmQgdHJhbnNwb3J0YXRpb24gb2ZmaWNpYWxzIHNlZWtpbmcgdG8gZGVzaWduIHBvbGljaWVzIGFuZCBpbmZyYXN0cnVjdHVyZSB0aGF0IHN1cHBvcnQgeWVhci1yb3VuZCBiaWN5Y2xlIGNvbW11dGluZyBpbiBOZXcgWW9yayBDaXR5Lg==