Green Space Comparison Between Manhattan and the Bronx
December 12th, 2023
Socheata Chey
Purpose
This research aims to study the inequality of public space among
affluent neighborhoods in Manhattan and the low income neighborhoods in
the Bronx. By using NYC Open Data analyzing the correlation between
green space availability, race and income.
Introduction & Background
Public parks are a critical space for people in the community. They
serve as places to relax with friends, unwind after a long day, picnic
with family, or participate in urban life through outdoor activities and
community services. New York City has been incredibly successful in
creating public parks for residents. For example, Manhattan boasts
numerous large parks with extensive facilities, catering to diverse
needs, from cycling and jogging to dog parks, outdoor gyms, and
children’s playgrounds.
Central Park, a flagship park in the heart of Manhattan, serves as a
prime example. Additionally, Hudson River Park has received significant
investment from both the government and private institutions for various
projects. Residents in Manhattan are fortunate to have access to such
diverse and well-maintained public amenities compared to those in other
boroughs. As a resident of the Bronx, I have witnessed the stark
contrast in park facilities compared to those in Manhattan. The
disparity in amenities has sparked my interest in comparing the amount
of public space available in each borough and exploring the potential
causes of this inequality.
Methodology
I got data from NYC Open Data for the Parks properties  https://data.cityofnewyork.us/Recreation/Parks-Properties/enfh-gkve
and Aces data for races & income.
## Reading layer `Parks Properties_20231201' from data source
## `C:\Users\Chey Socheata\Downloads\Parks Properties_20231201.geojson'
## using driver `GeoJSON'
## Simple feature collection with 2045 features and 34 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -74.25609 ymin: 40.49449 xmax: -73.70905 ymax: 40.91133
## Geodetic CRS: WGS 84
| Grand Central Parkway Extension |
Parkway |
EXWY |
249.389 |
Q |
MULTIPOLYGON (((-73.85875 4… |
| Sunset Cove Park |
Undeveloped |
NA |
9.375 |
Q |
MULTIPOLYGON (((-73.82218 4… |
| Challenge Playground |
Jointly Operated Playground |
JOP |
2.035 |
Q |
MULTIPOLYGON (((-73.72738 4… |
| McLaughlin Playground |
Playground |
Neighborhood Plgd |
0.356 |
Q |
MULTIPOLYGON (((-73.76599 4… |
| Glen Oaks Oval |
Community Park |
Neighborhood Plgd |
2.948 |
Q |
MULTIPOLYGON (((-73.71535 4… |
Given the presence of unnecessary park categories in the downloaded
data, I filtered the information to focus solely on relevant categories
for my analysis: flagship parks, community parks, and neighborhood
parks.
| Heritage Park |
R |
Neighborhood Park |
9.934 |
MULTIPOLYGON (((-74.12088 4… |
| Washington Square Park |
M |
Neighborhood Park |
9.749 |
MULTIPOLYGON (((-73.99661 4… |
| Bryant Park |
M |
Neighborhood Park |
9.603 |
MULTIPOLYGON (((-73.98341 4… |
| Bicentennial Veterans Memorial Park |
X |
Neighborhood Park |
9.395 |
MULTIPOLYGON (((-73.81338 4… |
| Haffen Park |
X |
Neighborhood Park |
9.238 |
MULTIPOLYGON (((-73.83763 4… |
I import borough shapefiles from NYC Open Data and NYC neighborhood
tabulation areas in order to create map by using ggplot.
Results

I group data by borough and calculate the acres of public park space
available in those five boroughs.
Total Park Size in Each Borough
| B |
113 |
2484.287 |
21.98484 |
| M |
89 |
2446.159 |
27.48493 |
| Q |
99 |
4196.589 |
42.38979 |
| R |
32 |
1990.410 |
62.20031 |
| X |
68 |
5796.989 |
85.24984 |

I filtered out Manhattan and the Bronx since my research is only
focus on those two boroughs.
Despite the large surface area of green space in the Bronx, the map
reveals significant accessibility issues for the community. Three major
parks are present: the Bronx Zoo & Botanical Garden, which requires
an entry fee, and Van Cortlandt Park and Pelham Bay Park, both located
far north, leaving the rest of the borough underserved. In contrast,
Manhattan enjoys the unfair advantage of Central Park, situated
centrally and easily accessible to its residents.

In order to understand the correlation between race and public space
in New York City, I import data census tract to create maps illustrating
the percentage and distribution of different racial groups, including
White, Asian, Hispanic, and Black, across the two boroughs. This
analysis reveals a clear link between racial demographics and the
distribution of public space. Areas with a larger white population
generally display greater affluence and development compared to those
with higher proportions of people of color
I create map by using ggplot
To investigate the income disparities between the two boroughs, I
imported median household income data from the American Community
Survey. The analysis revealed a significant income gap, with residents
in Manhattan earning nearly double the income of those in the Bronx,
predominantly populated by people of color. This data further suggests a
correlation between wealth and investment in public spaces. Areas with
higher-income populations receive greater investment and maintenance in
public parks compared to lower-income communities.
Further research would aim to explore the impact of tax allocation on
community development within each neighborhood. The unequal distribution
of funding from the city government to different boroughs is evident and
contributes to disparities in park quality and overall lifestyle. For
example, residents of Manhattan enjoy well-equipped parks like those
along the Hudson River and Central Park, offering facilities for
everything from outdoor sports and running tracks to scenic sitting
areas for relaxation and socializing. In contrast, Bronx residents lack
access to similar large, safe, and healthy parks within their own
neighborhoods, despite residing in the same city.

Discussion
What are the impact of unequal public space in lower income
neighborhood?
The unequal distribution of public spaces in lower-income
neighborhoods can have detrimental impacts on both the physical and
mental well-being of residents.
Firstly, Individuals lacking access to public park are prone to
engaging in less physical activity, increasing their susceptibility to
diseases like asthma. This limited activity further contributes to
higher obesity rates, chronic diseases, and mental health issues.
Lower-income neighborhoods, like those in the Bronx, often face greater
exposure to environmental hazards such as highways, industrial
facilities, and pollution, compared to their counterparts in Manhattan.
Consequently, the lack of access to safe and healthy outdoor spaces
further exacerbates existing health disparities in these
communities.
Secondly, public spaces can serve as vital community hubs, fostering
social interaction and building relationships among residents. The
absence of such spaces hinders community development and can lead to
social isolation. In contrast, Hudson River Park offers public programs
and events throughout the year, providing opportunities for residents to
connect and engage with their community. Additionally, well-maintained
public spaces can attract businesses and investment. For example, the
area surrounding Central Park in Manhattan boasts a thriving business
community and attracts significant private investment, contributing to
the overall economic well-being of residents. Conversely, the absence of
well-maintained public spaces can negatively impact property values and
discourage investment in the neighborhood.
Thirdly, the lack of access to nature and green spaces can contribute
to increased stress and anxiety levels, particularly among vulnerable
populations like children and the elderly. Consider residents of
Manhattan, who can easily commute to Central Park and enjoy its natural
beauty due to its central location. In stark contrast, residents of the
Bronx must travel further north to access parks like Van Cortlandt or
Pelham Bay Park, where public transportation options are also limited.
This necessity of traveling long distances to access parks reduces the
quality of life for both adults and children, limiting their ability to
enjoy outdoor activities and participate in community events.
The unequal distribution and limited accessibility of public spaces
pose significant challenges to the health, lifestyle, and social life of
residents in lower-income neighborhoods, particularly in the Bronx.
Addressing this issue is crucial for the New York City government in
order to create a healthier, more vibrant, and inclusive city for all
New Yorkers.
LS0tDQp0aXRsZTogIlVyYmFuIEVjb2xvZ2llcyBNZXRob2QgRmluYWwgUHJvamVjdCINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpHcmVlbiBTcGFjZSBDb21wYXJpc29uIEJldHdlZW4gTWFuaGF0dGFuIGFuZCB0aGUgQnJvbngNCg0KRGVjZW1iZXIgMTJ0aCwgMjAyMw0KDQpTb2NoZWF0YSBDaGV5DQoNCiMjIFB1cnBvc2UNCg0KVGhpcyByZXNlYXJjaCBhaW1zIHRvIHN0dWR5IHRoZSBpbmVxdWFsaXR5IG9mIHB1YmxpYyBzcGFjZSBhbW9uZyBhZmZsdWVudCBuZWlnaGJvcmhvb2RzIGluIE1hbmhhdHRhbiBhbmQgdGhlIGxvdyBpbmNvbWUgbmVpZ2hib3Job29kcyBpbiB0aGUgQnJvbnguIEJ5IHVzaW5nIE5ZQyBPcGVuIERhdGEgYW5hbHl6aW5nIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGdyZWVuIHNwYWNlIGF2YWlsYWJpbGl0eSwgcmFjZSBhbmQgaW5jb21lLg0KDQojIyBJbnRyb2R1Y3Rpb24gJiBCYWNrZ3JvdW5kDQoNClB1YmxpYyBwYXJrcyBhcmUgYSBjcml0aWNhbCBzcGFjZSBmb3IgcGVvcGxlIGluIHRoZSBjb21tdW5pdHkuIFRoZXkgc2VydmUgYXMgcGxhY2VzIHRvIHJlbGF4IHdpdGggZnJpZW5kcywgdW53aW5kIGFmdGVyIGEgbG9uZyBkYXksIHBpY25pYyB3aXRoIGZhbWlseSwgb3IgcGFydGljaXBhdGUgaW4gdXJiYW4gbGlmZSB0aHJvdWdoIG91dGRvb3IgYWN0aXZpdGllcyBhbmQgY29tbXVuaXR5IHNlcnZpY2VzLiBOZXcgWW9yayBDaXR5IGhhcyBiZWVuIGluY3JlZGlibHkgc3VjY2Vzc2Z1bCBpbiBjcmVhdGluZyBwdWJsaWMgcGFya3MgZm9yIHJlc2lkZW50cy4gRm9yIGV4YW1wbGUsIE1hbmhhdHRhbiBib2FzdHMgbnVtZXJvdXMgbGFyZ2UgcGFya3Mgd2l0aCBleHRlbnNpdmUgZmFjaWxpdGllcywgY2F0ZXJpbmcgdG8gZGl2ZXJzZSBuZWVkcywgZnJvbSBjeWNsaW5nIGFuZCBqb2dnaW5nIHRvIGRvZyBwYXJrcywgb3V0ZG9vciBneW1zLCBhbmQgY2hpbGRyZW4ncyBwbGF5Z3JvdW5kcy4NCg0KQ2VudHJhbCBQYXJrLCBhIGZsYWdzaGlwIHBhcmsgaW4gdGhlIGhlYXJ0IG9mIE1hbmhhdHRhbiwgc2VydmVzIGFzIGEgcHJpbWUgZXhhbXBsZS4gQWRkaXRpb25hbGx5LCBIdWRzb24gUml2ZXIgUGFyayBoYXMgcmVjZWl2ZWQgc2lnbmlmaWNhbnQgaW52ZXN0bWVudCBmcm9tIGJvdGggdGhlIGdvdmVybm1lbnQgYW5kIHByaXZhdGUgaW5zdGl0dXRpb25zIGZvciB2YXJpb3VzIHByb2plY3RzLiBSZXNpZGVudHMgaW4gTWFuaGF0dGFuIGFyZSBmb3J0dW5hdGUgdG8gaGF2ZSBhY2Nlc3MgdG8gc3VjaCBkaXZlcnNlIGFuZCB3ZWxsLW1haW50YWluZWQgcHVibGljIGFtZW5pdGllcyBjb21wYXJlZCB0byB0aG9zZSBpbiBvdGhlciBib3JvdWdocy4gQXMgYSByZXNpZGVudCBvZiB0aGUgQnJvbngsIEkgaGF2ZSB3aXRuZXNzZWQgdGhlIHN0YXJrIGNvbnRyYXN0IGluIHBhcmsgZmFjaWxpdGllcyBjb21wYXJlZCB0byB0aG9zZSBpbiBNYW5oYXR0YW4uIFRoZSBkaXNwYXJpdHkgaW4gYW1lbml0aWVzIGhhcyBzcGFya2VkIG15IGludGVyZXN0IGluIGNvbXBhcmluZyB0aGUgYW1vdW50IG9mIHB1YmxpYyBzcGFjZSBhdmFpbGFibGUgaW4gZWFjaCBib3JvdWdoIGFuZCBleHBsb3JpbmcgdGhlIHBvdGVudGlhbCBjYXVzZXMgb2YgdGhpcyBpbmVxdWFsaXR5Lg0KDQojIyBNZXRob2RvbG9neQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUYsIGVjaG89RkFMU0UsIHF1aWV0bHk9VCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShSU29jcmF0YSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodGlkeWNlbnN1cykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0Kb3B0aW9ucyhzY2llcGVuID0gOTk5KQ0KDQpgYGANCg0KSSBnb3QgZGF0YSBmcm9tIE5ZQyBPcGVuIERhdGEgZm9yIHRoZSBQYXJrcyBwcm9wZXJ0aWVzIMKgPGh0dHBzOi8vZGF0YS5jaXR5b2ZuZXd5b3JrLnVzL1JlY3JlYXRpb24vUGFya3MtUHJvcGVydGllcy9lbmZoLWdrdmU+IGFuZCBBY2VzIGRhdGEgZm9yIHJhY2VzICYgaW5jb21lLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFIH0NCiMgIyBpbXBvcnQgdGhlIGRhdGEgZGlyZWN0bHkgaW50byBSU3R1ZGlvIHVzaW5nIHVybCBwYXRoDQojIGRhdGEgPC0gcmVhZC5zb2NyYXRhKCJodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9yZXNvdXJjZS9lbmZoLWdrdmUuY3N2IikNCg0KDQpkYXRhX3NmIDwtIHN0X3JlYWQoIkM6L1VzZXJzL0NoZXkgU29jaGVhdGEvRG93bmxvYWRzL1BhcmtzIFByb3BlcnRpZXNfMjAyMzEyMDEuZ2VvanNvbiIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSB9DQojIHNlbGVjdGVkIHZhcmlhYmxlcyAoY29sdW1ucykNCmNvbHVtbnMgPC1jKCJuYW1lMzExIiwgInR5cGVjYXRlZ29yeSIsICJzdWJjYXRlZ29yeSIsICJhY3JlcyIsImJvcm91Z2giLCAiYWRkcmVzcyIsICJjbGFzcyIsICJsb2NhdGlvbiIsImVhcHBseSIsICJjb3VuY2lsZGlzdHJpY3QiLCAiY29tbXVuaXR5Ym9hcmQiLCAidXJsIiwgInppcGNvZGUiLCAiYWNxdWlzaXRpb25kYXRlIikgICMjIyBJIHJlbW92ZWQgdGhlIG11bHRpcG9seWdvbiBmb3JtIHRoZSBsaXN0IG9mIGNvbHVtbnMgdG8ga2VlcCBzaW5jZSBpdCBpcyBub3QgaW4gdGhlIGRhdGFfc2YNCm15ZGF0YSA8LSBkYXRhX3NmIHw+IA0KICBzZWxlY3QoYWxsX29mKGNvbHVtbnMpKXw+DQpyZW5hbWUoTmFtZSA9IG5hbWUzMTEpDQogbXlkYXRhIHw+DQpzZWxlY3QoMTo1KSB8Pg0Kc2xpY2UoMTo1KSB8PiBrYWJsZSgpDQpgYGANCg0KR2l2ZW4gdGhlIHByZXNlbmNlIG9mIHVubmVjZXNzYXJ5IHBhcmsgY2F0ZWdvcmllcyBpbiB0aGUgZG93bmxvYWRlZCBkYXRhLCBJIGZpbHRlcmVkIHRoZSBpbmZvcm1hdGlvbiB0byBmb2N1cyBzb2xlbHkgb24gcmVsZXZhbnQgY2F0ZWdvcmllcyBmb3IgbXkgYW5hbHlzaXM6IGZsYWdzaGlwIHBhcmtzLCBjb21tdW5pdHkgcGFya3MsIGFuZCBuZWlnaGJvcmhvb2QgcGFya3MuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpQYXJrcyA8LSBteWRhdGEgfD4gDQogIGZpbHRlcih0eXBlY2F0ZWdvcnkgPT0gIkZsYWdzaGlwIFBhcmsifHR5cGVjYXRlZ29yeSA9PSAiQ29tbXVuaXR5IFBhcmsiIHwgdHlwZWNhdGVnb3J5ID09Ik5laWdoYm9yaG9vZCBQYXJrIiApIHw+DQogIHNlbGVjdChjKE5hbWUsYm9yb3VnaCx0eXBlY2F0ZWdvcnksYWNyZXMpKSB8PiANCiAgYXJyYW5nZShkZXNjKGFjcmVzKSkNCiBQYXJrcyB8Pg0Kc2VsZWN0KDE6NSkgfD4NCnNsaWNlKDE6NSkgfD4ga2FibGUoKQ0KDQpgYGANCg0KSSBpbXBvcnQgYm9yb3VnaCBzaGFwZWZpbGVzIGZyb20gTllDIE9wZW4gRGF0YSBhbmQgTllDIG5laWdoYm9yaG9vZCB0YWJ1bGF0aW9uIGFyZWFzIGluIG9yZGVyIHRvIGNyZWF0ZSBtYXAgYnkgdXNpbmcgZ2dwbG90Lg0KDQojIyBSZXN1bHRzDQoNCmBgYHtyIGVjaG89RiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIHJlc3VsdHM9J2hpZGUnfQ0KIyMgaW1wb3J0IGJvcm91Z2ggc2hhcGVmaWxlcyBmcm9tIE5ZQyBPcGVuIERhdGENCmJvcm9zIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Byb2Nlc3NlZC9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKSANCg0KIyMgaW1wb3J0IE5laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWFzIGZvciBOWUMNCm5hYmVzIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Jhdy9nZW8vbnludGEyMDIwXzIzYy9ueW50YTIwMjAuc2hwIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmdncGxvdChkYXRhID0gUGFya3MpICArIA0KICBnZW9tX3NmKGZpbGwgPSAiIzFkODUzOSIsIA0KICAgICAgICAgIGx3ZCA9IDApICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgI3NjYWxlX2ZpbGxfZGlzdGlsbGVyKGJyZWFrcz1jKDAsIC4yLCAuNCwgLjYsIC44LCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgI2RpcmVjdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICNuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICNuYW1lPSJOWUMgUHVibGljIFBhcmtzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgI2xhYmVscyA9IGFjcmVzICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk5ZQyBQdWJsaWMgUGFya3MiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBOWUMgT3BlbiBEYXRhIg0KICApICsgDQogIGdlb21fc2YoZGF0YSA9IG5hYmVzLCBjb2xvciA9ICJncmF5IiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArDQogIGdlb21fc2YoZGF0YSA9IGJvcm9zLCAgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IC41KQ0KYGBgDQoNCkkgZ3JvdXAgZGF0YSBieSBib3JvdWdoIGFuZCBjYWxjdWxhdGUgdGhlIGFjcmVzIG9mIHB1YmxpYyBwYXJrIHNwYWNlIGF2YWlsYWJsZSBpbiB0aG9zZSBmaXZlIGJvcm91Z2hzLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KUGFya3NkZiA8LSBzdF9kcm9wX2dlb21ldHJ5KFBhcmtzKXw+DQogIG11dGF0ZShhY3Jlcz0gYXMubnVtZXJpYyhhY3JlcykpDQoNCnBhcmtzc3VtbWFyeSA8LSBQYXJrc2RmIHw+DQogIGdyb3VwX2J5KGJvcm91Z2gpfD4NCiAgc3VtbWFyaXNlKGNvdW50PW4oKSwgDQogICAgICAgICAgICBzdW1hY3Jlcz1zdW0oYWNyZXMpLA0KICAgICAgICAgICAgbWVhbmFjcmVzPW1lYW4oYWNyZXMpKQ0KYGBgDQoNCmBgYHtyIG1ha2UgYSB0YWJsZSwgcmVzdWx0cz0nYXNpcyd9DQoNCg0KdGFibGUgPSBtYXRyaXgoTkEsIG5yb3cgPSA2LCBuY29sID0gNCkgDQpjb2xuYW1lcyhwYXJrc3N1bW1hcnkpID0gYygiQm9yb3VnaCIsICJUb3RhbE51bWJlcm9mUGFyayIsICJTdW1BY3JlcyIsICJNZWFuQWNyZXMiKQ0KI3RhYmxlWzEsIF0gPSBjKCJCcm9va2x5biIpDQoNCmthYmxlKHBhcmtzc3VtbWFyeSwgY2FwdGlvbiA9ICJUb3RhbCBQYXJrIFNpemUgaW4gRWFjaCBCb3JvdWdoIikNCmBgYA0KDQpgYGB7cn0NCnBlcmYgPC1nZ3Bsb3QoZGF0YT1wYXJrc3N1bW1hcnksIGFlcyh4PUJvcm91Z2gsIHk9VG90YWxOdW1iZXJvZlBhcmssIHNpemUgPSBCb3JvdWdoLCBmaWxsPVRvdGFsTnVtYmVyb2ZQYXJrKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iZGFya3JlZCIpIA0KcGVyZiANCg0KDQoNCmBgYA0KDQpJIGZpbHRlcmVkIG91dCBNYW5oYXR0YW4gYW5kIHRoZSBCcm9ueCBzaW5jZSBteSByZXNlYXJjaCBpcyBvbmx5IGZvY3VzIG9uIHRob3NlIHR3byBib3JvdWdocy4NCg0KRGVzcGl0ZSB0aGUgbGFyZ2Ugc3VyZmFjZSBhcmVhIG9mIGdyZWVuIHNwYWNlIGluIHRoZSBCcm9ueCwgdGhlIG1hcCByZXZlYWxzIHNpZ25pZmljYW50IGFjY2Vzc2liaWxpdHkgaXNzdWVzIGZvciB0aGUgY29tbXVuaXR5LiBUaHJlZSBtYWpvciBwYXJrcyBhcmUgcHJlc2VudDogdGhlIEJyb254IFpvbyAmIEJvdGFuaWNhbCBHYXJkZW4sIHdoaWNoIHJlcXVpcmVzIGFuIGVudHJ5IGZlZSwgYW5kIFZhbiBDb3J0bGFuZHQgUGFyayBhbmQgUGVsaGFtIEJheSBQYXJrLCBib3RoIGxvY2F0ZWQgZmFyIG5vcnRoLCBsZWF2aW5nIHRoZSByZXN0IG9mIHRoZSBib3JvdWdoIHVuZGVyc2VydmVkLiBJbiBjb250cmFzdCwgTWFuaGF0dGFuIGVuam95cyB0aGUgdW5mYWlyIGFkdmFudGFnZSBvZiBDZW50cmFsIFBhcmssIHNpdHVhdGVkIGNlbnRyYWxseSBhbmQgZWFzaWx5IGFjY2Vzc2libGUgdG8gaXRzIHJlc2lkZW50cy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpQYXJrc01YIDwtIG15ZGF0YSB8Pg0KICBmaWx0ZXIoYm9yb3VnaCA9PSAiTSJ8Ym9yb3VnaCA9PSAiWCIgKSB8Pg0KICBmaWx0ZXIodHlwZWNhdGVnb3J5ID09ICJGbGFnc2hpcCBQYXJrInx0eXBlY2F0ZWdvcnkgPT0gIkNvbW11bml0eSBQYXJrIiB8IHR5cGVjYXRlZ29yeSA9PSJOZWlnaGJvcmhvb2QgUGFyayIgKSB8Pg0KICBzZWxlY3QoYyhOYW1lLGJvcm91Z2gsdHlwZWNhdGVnb3J5LGFjcmVzKSkgfD4gDQogIGFycmFuZ2UoZGVzYyhhY3JlcykpICANCkJvcm91Z2hNWCA8LWJvcm9zIHw+DQogIGZpbHRlcihib3JvX25hbWUgPT0gIk1hbmhhdHRhbiJ8Ym9yb19uYW1lID09ICJCcm9ueCIgKQ0KbmFiZXNNWCA8LW5hYmVzIHw+DQogIGZpbHRlcihCb3JvTmFtZSA9PSAiTWFuaGF0dGFuInxCb3JvTmFtZSA9PSAiQnJvbngiICkNCiAgDQpQYXJrc01YIHw+DQpzZWxlY3QoMTo1KSB8Pg0Kc2xpY2UoMTo1KSB8PiBrYWJsZSgpDQoNCmdncGxvdChkYXRhID0gUGFya3NNWCkgICsgDQogIGdlb21fc2YoZmlsbCA9ICIjMWQ4NTM5IiwgDQogICAgICAgICAgbHdkID0gMCkgKw0KICB0aGVtZV92b2lkKCkgKw0KICAjc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAjZGlyZWN0aW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgI25hLnZhbHVlID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgI25hbWU9Ik5ZQyBQdWJsaWMgUGFya3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAjbGFiZWxzID0gYWNyZXMgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTllDIFB1YmxpYyBQYXJrcyIsDQogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE5ZQyBPcGVuIERhdGEiDQogICkgKyANCiAgZ2VvbV9zZihkYXRhID0gbmFiZXNNWCwgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSBOQSwgbHdkID0gMC4yNSkgKw0KICBnZW9tX3NmKGRhdGEgPSBCb3JvdWdoTVgsICBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgbHdkID0gLjUpDQoNCmBgYA0KDQpJbiBvcmRlciB0byB1bmRlcnN0YW5kIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHJhY2UgYW5kIHB1YmxpYyBzcGFjZSBpbiBOZXcgWW9yayBDaXR5LCBJIGltcG9ydCBkYXRhIGNlbnN1cyB0cmFjdCB0byBjcmVhdGUgbWFwcyBpbGx1c3RyYXRpbmcgdGhlIHBlcmNlbnRhZ2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiBkaWZmZXJlbnQgcmFjaWFsIGdyb3VwcywgaW5jbHVkaW5nIFdoaXRlLCBBc2lhbiwgSGlzcGFuaWMsIGFuZCBCbGFjaywgYWNyb3NzIHRoZSB0d28gYm9yb3VnaHMuIFRoaXMgYW5hbHlzaXMgcmV2ZWFscyBhIGNsZWFyIGxpbmsgYmV0d2VlbiByYWNpYWwgZGVtb2dyYXBoaWNzIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHB1YmxpYyBzcGFjZS4gQXJlYXMgd2l0aCBhIGxhcmdlciB3aGl0ZSBwb3B1bGF0aW9uIGdlbmVyYWxseSBkaXNwbGF5IGdyZWF0ZXIgYWZmbHVlbmNlIGFuZCBkZXZlbG9wbWVudCBjb21wYXJlZCB0byB0aG9zZSB3aXRoIGhpZ2hlciBwcm9wb3J0aW9ucyBvZiBwZW9wbGUgb2YgY29sb3INCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIyMjIGltcG9ydCBib3JvdWdoIHNoYXBlZmlsZXMgZnJvbSBOWUMgT3BlbiBEYXRhDQpib3JvcyA8LSBzdF9yZWFkKCJEOi9QYXJzb24gU2Nob29vbCBPZiBEZXNpZ24vRGVzaWduIE1ldGhvZC9MZXNzb24vV2VlazEvUGFydDIvZGF0YS9wcm9jZXNzZWQvZ2VvL0Jvcm91Z2ggQm91bmRhcmllcy5nZW9qc29uIikNCg0KcmF3X2FuY2VzdHJ5IDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKGFuY2VzdHJ5X3BvcCA9ICJCMDQwMDZfMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNpYW4gPSAiQjAyMDAxXzAwNSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPSdOWScsDQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHkgPSBjKCdCcm9ueCcsJ05ldyBZb3JrJyksDQogICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMjAsDQogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAid2lkZSIpIA0KDQphc2lhbiA8LSByYXdfYW5jZXN0cnkgfD4gDQogIG11dGF0ZShwY3RfYXNpYW4gPSBhc2lhbkUvYW5jZXN0cnlfcG9wRSkgfD4gDQogIGZpbHRlcihhbmNlc3RyeV9wb3BFID4gMCkNCg0KYGBgDQoNCkkgY3JlYXRlIG1hcCBieSB1c2luZyBnZ3Bsb3QNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFzaWFuX21hcCA8LSBzdXBwcmVzc1dhcm5pbmdzKCBnZ3Bsb3QoKSAgKyANCiAgZ2VvbV9zZihkYXRhID0gYXNpYW4sIA0KICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHBjdF9hc2lhbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoTkFNRSwgIjoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnQgQXNpYW4gYW5jZXN0cnk6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2FzaWFuLCBhY2N1cmFjeT0xKSkpLA0KICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihicmVha3M9YygwLCAuMiwgLjQsIC42LCAuOCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gIiNmYWZhZmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAjIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGVyY2VudCBBc2lhbiBBbmNlc3RyeSAoJSkiLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBc2lhbiBBbmNlc3RyeSBieSBDZW5zdXMgVHJhY3QiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LCAyMDE2LTIwIg0KICApKQ0KZ2dwbG90bHkoYXNpYW5fbWFwLCB0b29sdGlwID0gInRleHQiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbmFiZXMgPC0gc3RfcmVhZCgiRDovUGFyc29uIFNjaG9vb2wgT2YgRGVzaWduL0Rlc2lnbiBNZXRob2QvTGVzc29uL1dlZWsxL1BhcnQyL2RhdGEvcmF3L2dlby9ueW50YTIwMjBfMjNjL255bnRhMjAyMC5zaHAiKQ0Kc3RfY3JzKG5hYmVzKQ0KDQphc2lhbl8yMjYzIDwtIHN0X3RyYW5zZm9ybShhc2lhbiwgMjI2MykNCnN0X2Nycyhhc2lhbl8yMjYzKQ0KDQojcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBpbiB0aGUgbmVpZ2hib3Job29kIHNoYXBlZmlsZQ0KbmFiZXNfc2VsZWN0ZWQgPC0gbmFiZXMgfD4NCiAgc2VsZWN0KEJvcm9Db2RlLCBCb3JvTmFtZSwgTlRBMjAyMCwgTlRBTmFtZSkNCg0KYXNpYW5fbmFiZXMgPC0gYXNpYW5fMjI2MyB8Pg0KICBzdF9qb2luKG5hYmVzX3NlbGVjdGVkLCANCiAgICAgICAgICBsZWZ0ID0gVFJVRSwNCiAgICAgICAgICBqb2luID0gc3RfaW50ZXJzZWN0cywNCiAgICAgICAgICBsYXJnZXN0ID0gVCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmFzaWFuX25hYmVfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeShhc2lhbl9uYWJlcykgfD4gDQogIGdyb3VwX2J5KE5UQU5hbWUpIHw+IA0KICBzdW1tYXJpc2UoQm9yb3VnaCA9IGZpcnN0KEJvcm9OYW1lKSwNCiAgICAgICAgICAgIGBFc3QuIFRvdGFsIFBvcHVsYXRpb25gID0gc3VtKGFuY2VzdHJ5X3BvcEUpLA0KICAgICAgICAgICAgYEVzdC4gVG90YWwgQXNpYW4gUG9wdWxhdGlvbmAgPSBzdW0oYXNpYW5NKSkgfD4gDQogIG11dGF0ZShgRXN0LiBQZXJjZW50IEFzaWFuIEFuY2VzdHJ5YCA9IHBlcmNlbnQoYEVzdC4gVG90YWwgQXNpYW4gUG9wdWxhdGlvbmAvYEVzdC4gVG90YWwgUG9wdWxhdGlvbmAsIGFjY3VyYWN5ID0gMSkpIA0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyMjIyBpbXBvcnQgYm9yb3VnaCBzaGFwZWZpbGVzIGZyb20gTllDIE9wZW4gRGF0YQ0KYm9yb3MgPC0gc3RfcmVhZCgiRDovUGFyc29uIFNjaG9vb2wgT2YgRGVzaWduL0Rlc2lnbiBNZXRob2QvTGVzc29uL1dlZWsxL1BhcnQyL2RhdGEvcHJvY2Vzc2VkL2dlby9Cb3JvdWdoIEJvdW5kYXJpZXMuZ2VvanNvbiIpDQoNCnJhd19hbmNlc3RyeSA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJ0cmFjdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gYyhhbmNlc3RyeV9wb3AgPSAiQjA0MDA2XzAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3BhbmljID0gIkIwMzAwMV8wMDMiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nTlknLA0KICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gYygnQnJvbngnLCdOZXcgWW9yaycpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBULCANCiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gIndpZGUiKSANCg0KaGlzcGFuaWMgPC0gcmF3X2FuY2VzdHJ5IHw+IA0KICBtdXRhdGUocGN0X2hpc3BhbmljID0gaGlzcGFuaWNFL2FuY2VzdHJ5X3BvcEUpIHw+IA0KICBmaWx0ZXIoYW5jZXN0cnlfcG9wRSA+IDApDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmhpc3BhbmljX21hcCA8LSBnZ3Bsb3QoKSAgKyANCiAgZ2VvbV9zZihkYXRhID0gaGlzcGFuaWMsIA0KICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHBjdF9oaXNwYW5pYywNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoTkFNRSwgIjoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnQgSGlzcGFuaWMgYW5jZXN0cnk6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2hpc3BhbmljLCBhY2N1cmFjeT0xKSkpLA0KICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihicmVha3M9YygwLCAuMiwgLjQsIC42LCAuOCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiT3JhbmdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gIiNHcmVlbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAjIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGVyY2VudCBIaXNwYW5pYyBBbmNlc3RyeSAoJSkiLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIaXNwYW5pYyBBbmNlc3RyeSBieSBDZW5zdXMgVHJhY3QiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LCAyMDE2LTIwIg0KICApDQpnZ3Bsb3RseShoaXNwYW5pY19tYXAsIHRvb2x0aXAgPSAidGV4dCIpDQoNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCm5hYmVzIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Jhdy9nZW8vbnludGEyMDIwXzIzYy9ueW50YTIwMjAuc2hwIikNCnN0X2NycyhuYWJlcykNCg0KaGlzcGFuaWNfMjI2MyA8LSBzdF90cmFuc2Zvcm0oaGlzcGFuaWMsIDIyNjMpDQpzdF9jcnMoaGlzcGFuaWNfMjI2MykNCg0KI3JlbW92ZSB1bm5lY2Vzc2FyeSBmaWVsZHMgaW4gdGhlIG5laWdoYm9yaG9vZCBzaGFwZWZpbGUNCm5hYmVzX3NlbGVjdGVkIDwtIG5hYmVzIHw+DQogIHNlbGVjdChCb3JvQ29kZSwgQm9yb05hbWUsIE5UQTIwMjAsIE5UQU5hbWUpDQoNCmhpc3BhbmljX25hYmVzIDwtIGhpc3BhbmljXzIyNjMgfD4NCiAgc3Rfam9pbihuYWJlc19zZWxlY3RlZCwgDQogICAgICAgICAgbGVmdCA9IFRSVUUsDQogICAgICAgICAgam9pbiA9IHN0X2ludGVyc2VjdHMsDQogICAgICAgICAgbGFyZ2VzdCA9IFQpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpoaXNwYW5pY19uYWJlX3N0YXRzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkoaGlzcGFuaWNfbmFiZXMpIHw+IA0KICBncm91cF9ieShOVEFOYW1lKSB8PiANCiAgc3VtbWFyaXNlKEJvcm91Z2ggPSBmaXJzdChCb3JvTmFtZSksDQogICAgICAgICAgICBgRXN0LiBUb3RhbCBQb3B1bGF0aW9uYCA9IHN1bShhbmNlc3RyeV9wb3BFKSwNCiAgICAgICAgICAgIGBFc3QuIFRvdGFsIEhpc3BhbmljIFBvcHVsYXRpb25gID0gc3VtKGhpc3BhbmljTSkpIHw+IA0KICBtdXRhdGUoYEVzdC4gUGVyY2VudCBIaXNwYW5pYyBBbmNlc3RyeWAgPSBwZXJjZW50KGBFc3QuIFRvdGFsIEhpc3BhbmljIFBvcHVsYXRpb25gL2BFc3QuIFRvdGFsIFBvcHVsYXRpb25gLCBhY2N1cmFjeSA9IDEpKSANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmJvcm9zIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Byb2Nlc3NlZC9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKQ0KDQpyYXdfYW5jZXN0cnkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMoYW5jZXN0cnlfcG9wID0gIkIwNDAwNl8wMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjayA9ICJCMDIwMDFfMDAzIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9IGMoJ0Jyb254JywnTmV3IFlvcmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikgDQoNCmJsYWNrIDwtIHJhd19hbmNlc3RyeSB8PiANCiAgbXV0YXRlKHBjdF9ibGFjayA9IGJsYWNrRS9hbmNlc3RyeV9wb3BFKSB8PiANCiAgZmlsdGVyKGFuY2VzdHJ5X3BvcEUgPiAwKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpibGFja19tYXAgPC0gZ2dwbG90KCkgICsgDQogIGdlb21fc2YoZGF0YSA9IGJsYWNrLCANCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3RfYmxhY2ssDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKE5BTUUsICI6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IEJsYWNrIGFuY2VzdHJ5OiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9ibGFjaywgYWNjdXJhY3k9MSkpKSwNCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlB1UmQiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICIjWWxPclJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIyBuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlBlcmNlbnQgQmxhY2sgQW5jZXN0cnkgKCUpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmxhY2sgQW5jZXN0cnkgYnkgQ2Vuc3VzIFRyYWN0IiwNCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSwgMjAxNi0yMCINCiAgKQ0KZ2dwbG90bHkoYmxhY2tfbWFwLCB0b29sdGlwID0gInRleHQiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbmFiZXMgPC0gc3RfcmVhZCgiRDovUGFyc29uIFNjaG9vb2wgT2YgRGVzaWduL0Rlc2lnbiBNZXRob2QvTGVzc29uL1dlZWsxL1BhcnQyL2RhdGEvcmF3L2dlby9ueW50YTIwMjBfMjNjL255bnRhMjAyMC5zaHAiKQ0Kc3RfY3JzKG5hYmVzKQ0KDQpibGFja18yMjYzIDwtIHN0X3RyYW5zZm9ybShibGFjaywgMjI2MykNCnN0X2NycyhibGFja18yMjYzKQ0KDQojcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBpbiB0aGUgbmVpZ2hib3Job29kIHNoYXBlZmlsZQ0KbmFiZXNfc2VsZWN0ZWQgPC0gbmFiZXMgfD4NCiAgc2VsZWN0KEJvcm9Db2RlLCBCb3JvTmFtZSwgTlRBMjAyMCwgTlRBTmFtZSkNCg0KYmxhY2tfbmFiZXMgPC0gYmxhY2tfMjI2MyB8Pg0KICBzdF9qb2luKG5hYmVzX3NlbGVjdGVkLCANCiAgICAgICAgICBsZWZ0ID0gVFJVRSwNCiAgICAgICAgICBqb2luID0gc3RfaW50ZXJzZWN0cywNCiAgICAgICAgICBsYXJnZXN0ID0gVCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmJsYWNrX25hYmVfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeShibGFja19uYWJlcykgfD4gDQogIGdyb3VwX2J5KE5UQU5hbWUpIHw+IA0KICBzdW1tYXJpc2UoQm9yb3VnaCA9IGZpcnN0KEJvcm9OYW1lKSwNCiAgICAgICAgICAgIGBFc3QuIFRvdGFsIFBvcHVsYXRpb25gID0gc3VtKGFuY2VzdHJ5X3BvcEUpLA0KICAgICAgICAgICAgYEVzdC4gVG90YWwgYmxhY2sgUG9wdWxhdGlvbmAgPSBzdW0oYmxhY2tNKSkgfD4gDQogIG11dGF0ZShgRXN0LiBQZXJjZW50IGJsYWNrIEFuY2VzdHJ5YCA9IHBlcmNlbnQoYEVzdC4gVG90YWwgYmxhY2sgUG9wdWxhdGlvbmAvYEVzdC4gVG90YWwgUG9wdWxhdGlvbmAsIGFjY3VyYWN5ID0gMSkpIA0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnIH0NCiMjIyMgaW1wb3J0IGJvcm91Z2ggc2hhcGVmaWxlcyBmcm9tIE5ZQyBPcGVuIERhdGENCmJvcm9zIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Byb2Nlc3NlZC9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKQ0KDQpyYXdfYW5jZXN0cnkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMoYW5jZXN0cnlfcG9wID0gIkIwNDAwNl8wMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZSA9ICJCMDIwMDFfMDAyIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9IGMoJ0Jyb254JywnTmV3IFlvcmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikNCndoaXRlIDwtIHJhd19hbmNlc3RyeSB8PiANCiAgbXV0YXRlKHBjdF93aGl0ZSA9IHdoaXRlRS9hbmNlc3RyeV9wb3BFKSB8PiANCiAgZmlsdGVyKGFuY2VzdHJ5X3BvcEUgPiAwKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp3aGl0ZV9tYXAgPC0gZ2dwbG90KCkgICsgDQogIGdlb21fc2YoZGF0YSA9IHdoaXRlLCANCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3Rfd2hpdGUsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKE5BTUUsICI6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IFdoaXRlIGFuY2VzdHJ5OiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF93aGl0ZSwgYWNjdXJhY3k9MSkpKSwNCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIkJ1UHUiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICIjU2V0MyIsDQogICAgICAgICAgICAgICAgICAgICAgICMgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJQZXJjZW50IFdoaXRlIEFuY2VzdHJ5ICglKSIsDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1wZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIldoaXRlIEFuY2VzdHJ5IGJ5IENlbnN1cyBUcmFjdCIsDQogICAgY2FwdGlvbiA9ICJTb3VyY2U6IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXksIDIwMTYtMjAiDQogICkgDQpnZ3Bsb3RseSh3aGl0ZV9tYXAsIHRvb2x0aXAgPSAidGV4dCIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpuYWJlcyA8LSBzdF9yZWFkKCJEOi9QYXJzb24gU2Nob29vbCBPZiBEZXNpZ24vRGVzaWduIE1ldGhvZC9MZXNzb24vV2VlazEvUGFydDIvZGF0YS9yYXcvZ2VvL255bnRhMjAyMF8yM2MvbnludGEyMDIwLnNocCIpDQpzdF9jcnMobmFiZXMpDQoNCndoaXRlXzIyNjMgPC0gc3RfdHJhbnNmb3JtKHdoaXRlLCAyMjYzKQ0Kc3RfY3JzKHdoaXRlXzIyNjMpDQoNCiNyZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzIGluIHRoZSBuZWlnaGJvcmhvb2Qgc2hhcGVmaWxlDQpuYWJlc19zZWxlY3RlZCA8LSBuYWJlcyB8Pg0KICBzZWxlY3QoQm9yb0NvZGUsIEJvcm9OYW1lLCBOVEEyMDIwLCBOVEFOYW1lKQ0KDQp3aGl0ZV9uYWJlcyA8LSB3aGl0ZV8yMjYzIHw+DQogIHN0X2pvaW4obmFiZXNfc2VsZWN0ZWQsIA0KICAgICAgICAgIGxlZnQgPSBUUlVFLA0KICAgICAgICAgIGpvaW4gPSBzdF9pbnRlcnNlY3RzLA0KICAgICAgICAgIGxhcmdlc3QgPSBUKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0Kd2hpdGVfbmFiZV9zdGF0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KHdoaXRlX25hYmVzKSB8PiANCiAgZ3JvdXBfYnkoTlRBTmFtZSkgfD4gDQogIHN1bW1hcmlzZShCb3JvdWdoID0gZmlyc3QoQm9yb05hbWUpLA0KICAgICAgICAgICAgYEVzdC4gVG90YWwgUG9wdWxhdGlvbmAgPSBzdW0oYW5jZXN0cnlfcG9wRSksDQogICAgICAgICAgICBgRXN0LiBUb3RhbCB3aGl0ZSBQb3B1bGF0aW9uYCA9IHN1bSh3aGl0ZU0pKSB8PiANCiAgbXV0YXRlKGBFc3QuIFBlcmNlbnQgd2hpdGUgQW5jZXN0cnlgID0gcGVyY2VudChgRXN0LiBUb3RhbCB3aGl0ZSBQb3B1bGF0aW9uYC9gRXN0LiBUb3RhbCBQb3B1bGF0aW9uYCwgYWNjdXJhY3kgPSAxKSkgDQpgYGANCg0KVG8gaW52ZXN0aWdhdGUgdGhlIGluY29tZSBkaXNwYXJpdGllcyBiZXR3ZWVuIHRoZSB0d28gYm9yb3VnaHMsIEkgaW1wb3J0ZWQgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgZGF0YSBmcm9tIHRoZSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LiBUaGUgYW5hbHlzaXMgcmV2ZWFsZWQgYSBzaWduaWZpY2FudCBpbmNvbWUgZ2FwLCB3aXRoIHJlc2lkZW50cyBpbiBNYW5oYXR0YW4gZWFybmluZyBuZWFybHkgZG91YmxlIHRoZSBpbmNvbWUgb2YgdGhvc2UgaW4gdGhlIEJyb254LCBwcmVkb21pbmFudGx5IHBvcHVsYXRlZCBieSBwZW9wbGUgb2YgY29sb3IuIFRoaXMgZGF0YSBmdXJ0aGVyIHN1Z2dlc3RzIGEgY29ycmVsYXRpb24gYmV0d2VlbiB3ZWFsdGggYW5kIGludmVzdG1lbnQgaW4gcHVibGljIHNwYWNlcy4gQXJlYXMgd2l0aCBoaWdoZXItaW5jb21lIHBvcHVsYXRpb25zIHJlY2VpdmUgZ3JlYXRlciBpbnZlc3RtZW50IGFuZCBtYWludGVuYW5jZSBpbiBwdWJsaWMgcGFya3MgY29tcGFyZWQgdG8gbG93ZXItaW5jb21lIGNvbW11bml0aWVzLg0KDQpGdXJ0aGVyIHJlc2VhcmNoIHdvdWxkIGFpbSB0byBleHBsb3JlIHRoZSBpbXBhY3Qgb2YgdGF4IGFsbG9jYXRpb24gb24gY29tbXVuaXR5IGRldmVsb3BtZW50IHdpdGhpbiBlYWNoIG5laWdoYm9yaG9vZC4gVGhlIHVuZXF1YWwgZGlzdHJpYnV0aW9uIG9mIGZ1bmRpbmcgZnJvbSB0aGUgY2l0eSBnb3Zlcm5tZW50IHRvIGRpZmZlcmVudCBib3JvdWdocyBpcyBldmlkZW50IGFuZCBjb250cmlidXRlcyB0byBkaXNwYXJpdGllcyBpbiBwYXJrIHF1YWxpdHkgYW5kIG92ZXJhbGwgbGlmZXN0eWxlLiBGb3IgZXhhbXBsZSwgcmVzaWRlbnRzIG9mIE1hbmhhdHRhbiBlbmpveSB3ZWxsLWVxdWlwcGVkIHBhcmtzIGxpa2UgdGhvc2UgYWxvbmcgdGhlIEh1ZHNvbiBSaXZlciBhbmQgQ2VudHJhbCBQYXJrLCBvZmZlcmluZyBmYWNpbGl0aWVzIGZvciBldmVyeXRoaW5nIGZyb20gb3V0ZG9vciBzcG9ydHMgYW5kIHJ1bm5pbmcgdHJhY2tzIHRvIHNjZW5pYyBzaXR0aW5nIGFyZWFzIGZvciByZWxheGF0aW9uIGFuZCBzb2NpYWxpemluZy4gSW4gY29udHJhc3QsIEJyb254IHJlc2lkZW50cyBsYWNrIGFjY2VzcyB0byBzaW1pbGFyIGxhcmdlLCBzYWZlLCBhbmQgaGVhbHRoeSBwYXJrcyB3aXRoaW4gdGhlaXIgb3duIG5laWdoYm9yaG9vZHMsIGRlc3BpdGUgcmVzaWRpbmcgaW4gdGhlIHNhbWUgY2l0eS4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIyMjIGltcG9ydCBib3JvdWdoIHNoYXBlZmlsZXMgZnJvbSBOWUMgT3BlbiBEYXRhDQpib3JvcyA8LSBzdF9yZWFkKCJEOi9QYXJzb24gU2Nob29vbCBPZiBEZXNpZ24vRGVzaWduIE1ldGhvZC9MZXNzb24vV2VlazEvUGFydDIvZGF0YS9wcm9jZXNzZWQvZ2VvL0Jvcm91Z2ggQm91bmRhcmllcy5nZW9qc29uIikNCg0KTUhJIDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKE1ISSA9ICJCMTkwMTlfMDAxIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9IGMoJ0Jyb254JywnTmV3IFlvcmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikgDQoNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIG1oaV9tYXAgPC0gZ2dwbG90KCkgICsgDQogICAgc3VwcHJlc3NXYXJuaW5ncyhnZW9tX3NmKGx3ZCA9IDAsDQogICAgICAgICAgZGF0YSA9IE1ISSwNCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBNSElFLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChNSElFLCI6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNSEk6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2xsYXIoTUhJRSkpKSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9mZXJtZW50ZXIoYnJlYWtzPWMoMCwgMjUwMDAsIDUwMDAwLCA3NTAwMCwgMTAwMDAwLCAxMjUwMDAsIDE1MDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJNZWRpYW4gSG91c2Vob2xkIEluY29tZSIsDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1kb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gTlVMTCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJNYW5oYXR0YW4gJiBCcm9ueCwgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgYnkgQ2Vuc3VzIFRyYWN0IiwNCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gRGVjZW5uaWFsIENlbnN1cywgMjAyMCINCiAgKSArDQogIGdlb21fc2YoZGF0YSA9IGJvcm9zIHw+IGZpbHRlcihib3JvX25hbWUgPT0gIk1hbmhhdHRhbiIpLCAgDQogICAgICAgICAgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSBOQSwgbHdkID0gLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gYm9yb3MgfD4gZmlsdGVyKGJvcm9fbmFtZSA9PSAiQnJvbngiKSwgIA0KICAgICAgICAgIGNvbG9yID0gImdyYXkiLCBmaWxsID0gTkEsIGx3ZCA9IC4xKQ0KICANCg0KZ2dwbG90bHkobWhpX21hcCx0b29sdGlwID0gInRleHQiKQ0KYGBgDQoNCiFbXShpbWFnZXMvU2NyZWVuc2hvdCUyMDIwMjMtMTItMTElMjAwOTU0MzEucG5nKQ0KDQojIyBEaXNjdXNzaW9uDQoNCioqV2hhdCBhcmUgdGhlIGltcGFjdCBvZiB1bmVxdWFsIHB1YmxpYyBzcGFjZSBpbiBsb3dlciBpbmNvbWUgbmVpZ2hib3Job29kPyoqDQoNClRoZSB1bmVxdWFsIGRpc3RyaWJ1dGlvbiBvZiBwdWJsaWMgc3BhY2VzIGluIGxvd2VyLWluY29tZSBuZWlnaGJvcmhvb2RzIGNhbiBoYXZlIGRldHJpbWVudGFsIGltcGFjdHMgb24gYm90aCB0aGUgcGh5c2ljYWwgYW5kIG1lbnRhbCB3ZWxsLWJlaW5nIG9mIHJlc2lkZW50cy4NCg0KRmlyc3RseSwgSW5kaXZpZHVhbHMgbGFja2luZyBhY2Nlc3MgdG8gcHVibGljIHBhcmsgYXJlIHByb25lIHRvIGVuZ2FnaW5nIGluIGxlc3MgcGh5c2ljYWwgYWN0aXZpdHksIGluY3JlYXNpbmcgdGhlaXIgc3VzY2VwdGliaWxpdHkgdG8gZGlzZWFzZXMgbGlrZSBhc3RobWEuIFRoaXMgbGltaXRlZCBhY3Rpdml0eSBmdXJ0aGVyIGNvbnRyaWJ1dGVzIHRvIGhpZ2hlciBvYmVzaXR5IHJhdGVzLCBjaHJvbmljIGRpc2Vhc2VzLCBhbmQgbWVudGFsIGhlYWx0aCBpc3N1ZXMuIExvd2VyLWluY29tZSBuZWlnaGJvcmhvb2RzLCBsaWtlIHRob3NlIGluIHRoZSBCcm9ueCwgb2Z0ZW4gZmFjZSBncmVhdGVyIGV4cG9zdXJlIHRvIGVudmlyb25tZW50YWwgaGF6YXJkcyBzdWNoIGFzIGhpZ2h3YXlzLCBpbmR1c3RyaWFsIGZhY2lsaXRpZXMsIGFuZCBwb2xsdXRpb24sIGNvbXBhcmVkIHRvIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNYW5oYXR0YW4uIENvbnNlcXVlbnRseSwgdGhlIGxhY2sgb2YgYWNjZXNzIHRvIHNhZmUgYW5kIGhlYWx0aHkgb3V0ZG9vciBzcGFjZXMgZnVydGhlciBleGFjZXJiYXRlcyBleGlzdGluZyBoZWFsdGggZGlzcGFyaXRpZXMgaW4gdGhlc2UgY29tbXVuaXRpZXMuDQoNClNlY29uZGx5LCBwdWJsaWMgc3BhY2VzIGNhbiBzZXJ2ZSBhcyB2aXRhbCBjb21tdW5pdHkgaHVicywgZm9zdGVyaW5nIHNvY2lhbCBpbnRlcmFjdGlvbiBhbmQgYnVpbGRpbmcgcmVsYXRpb25zaGlwcyBhbW9uZyByZXNpZGVudHMuIFRoZSBhYnNlbmNlIG9mIHN1Y2ggc3BhY2VzIGhpbmRlcnMgY29tbXVuaXR5IGRldmVsb3BtZW50IGFuZCBjYW4gbGVhZCB0byBzb2NpYWwgaXNvbGF0aW9uLiBJbiBjb250cmFzdCwgSHVkc29uIFJpdmVyIFBhcmsgb2ZmZXJzIHB1YmxpYyBwcm9ncmFtcyBhbmQgZXZlbnRzIHRocm91Z2hvdXQgdGhlIHllYXIsIHByb3ZpZGluZyBvcHBvcnR1bml0aWVzIGZvciByZXNpZGVudHMgdG8gY29ubmVjdCBhbmQgZW5nYWdlIHdpdGggdGhlaXIgY29tbXVuaXR5LiBBZGRpdGlvbmFsbHksIHdlbGwtbWFpbnRhaW5lZCBwdWJsaWMgc3BhY2VzIGNhbiBhdHRyYWN0IGJ1c2luZXNzZXMgYW5kIGludmVzdG1lbnQuIEZvciBleGFtcGxlLCB0aGUgYXJlYSBzdXJyb3VuZGluZyBDZW50cmFsIFBhcmsgaW4gTWFuaGF0dGFuIGJvYXN0cyBhIHRocml2aW5nIGJ1c2luZXNzIGNvbW11bml0eSBhbmQgYXR0cmFjdHMgc2lnbmlmaWNhbnQgcHJpdmF0ZSBpbnZlc3RtZW50LCBjb250cmlidXRpbmcgdG8gdGhlIG92ZXJhbGwgZWNvbm9taWMgd2VsbC1iZWluZyBvZiByZXNpZGVudHMuIENvbnZlcnNlbHksIHRoZSBhYnNlbmNlIG9mIHdlbGwtbWFpbnRhaW5lZCBwdWJsaWMgc3BhY2VzIGNhbiBuZWdhdGl2ZWx5IGltcGFjdCBwcm9wZXJ0eSB2YWx1ZXMgYW5kIGRpc2NvdXJhZ2UgaW52ZXN0bWVudCBpbiB0aGUgbmVpZ2hib3Job29kLg0KDQpUaGlyZGx5LCB0aGUgbGFjayBvZiBhY2Nlc3MgdG8gbmF0dXJlIGFuZCBncmVlbiBzcGFjZXMgY2FuIGNvbnRyaWJ1dGUgdG8gaW5jcmVhc2VkIHN0cmVzcyBhbmQgYW54aWV0eSBsZXZlbHMsIHBhcnRpY3VsYXJseSBhbW9uZyB2dWxuZXJhYmxlIHBvcHVsYXRpb25zIGxpa2UgY2hpbGRyZW4gYW5kIHRoZSBlbGRlcmx5LiBDb25zaWRlciByZXNpZGVudHMgb2YgTWFuaGF0dGFuLCB3aG8gY2FuIGVhc2lseSBjb21tdXRlIHRvIENlbnRyYWwgUGFyayBhbmQgZW5qb3kgaXRzIG5hdHVyYWwgYmVhdXR5IGR1ZSB0byBpdHMgY2VudHJhbCBsb2NhdGlvbi4gSW4gc3RhcmsgY29udHJhc3QsIHJlc2lkZW50cyBvZiB0aGUgQnJvbnggbXVzdCB0cmF2ZWwgZnVydGhlciBub3J0aCB0byBhY2Nlc3MgcGFya3MgbGlrZSBWYW4gQ29ydGxhbmR0IG9yIFBlbGhhbSBCYXkgUGFyaywgd2hlcmUgcHVibGljIHRyYW5zcG9ydGF0aW9uIG9wdGlvbnMgYXJlIGFsc28gbGltaXRlZC4gVGhpcyBuZWNlc3NpdHkgb2YgdHJhdmVsaW5nIGxvbmcgZGlzdGFuY2VzIHRvIGFjY2VzcyBwYXJrcyByZWR1Y2VzIHRoZSBxdWFsaXR5IG9mIGxpZmUgZm9yIGJvdGggYWR1bHRzIGFuZCBjaGlsZHJlbiwgbGltaXRpbmcgdGhlaXIgYWJpbGl0eSB0byBlbmpveSBvdXRkb29yIGFjdGl2aXRpZXMgYW5kIHBhcnRpY2lwYXRlIGluIGNvbW11bml0eSBldmVudHMuDQoNClRoZSB1bmVxdWFsIGRpc3RyaWJ1dGlvbiBhbmQgbGltaXRlZCBhY2Nlc3NpYmlsaXR5IG9mIHB1YmxpYyBzcGFjZXMgcG9zZSBzaWduaWZpY2FudCBjaGFsbGVuZ2VzIHRvIHRoZSBoZWFsdGgsIGxpZmVzdHlsZSwgYW5kIHNvY2lhbCBsaWZlIG9mIHJlc2lkZW50cyBpbiBsb3dlci1pbmNvbWUgbmVpZ2hib3Job29kcywgcGFydGljdWxhcmx5IGluIHRoZSBCcm9ueC4gQWRkcmVzc2luZyB0aGlzIGlzc3VlIGlzIGNydWNpYWwgZm9yIHRoZSBOZXcgWW9yayBDaXR5IGdvdmVybm1lbnQgaW4gb3JkZXIgdG8gY3JlYXRlIGEgaGVhbHRoaWVyLCBtb3JlIHZpYnJhbnQsIGFuZCBpbmNsdXNpdmUgY2l0eSBmb3IgYWxsIE5ldyBZb3JrZXJzLg0KDQojIyBSZWZlcmVuY2UNCg0KQXJjaGl2ZWQgUGFya3MgWm9uZSBmcm9tIE5ldyBZb3JrIENpdHkgT3BlbiBEYXRhIDxodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9DaXR5LUdvdmVybm1lbnQvQVJDSElWRUQtUGFya3MtWm9uZXMvcmphai16Z3E3Pg0KDQpEaXNwYXJpdGllcyBhbW9uZyBDaGlsZHJlbiB3aXRoIEFzdGhtYSBpbiBOZXcgWW9yayA8aHR0cHM6Ly93d3cubnljLmdvdi9hc3NldHMvZG9oL2Rvd25sb2Fkcy9wZGYvZXBpL2RhdGFicmllZjEyNi5wZGY+DQo=