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
Name typecategory subcategory acres borough geometry
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.

Name borough typecategory acres geometry
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
Borough TotalNumberofPark SumAcres MeanAcres
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.

Reference

Archived Parks Zone from New York City Open Data https://data.cityofnewyork.us/City-Government/ARCHIVED-Parks-Zones/rjaj-zgq7

Disparities among Children with Asthma in New York https://www.nyc.gov/assets/doh/downloads/pdf/epi/databrief126.pdf

LS0tDQp0aXRsZTogIlVyYmFuIEVjb2xvZ2llcyBNZXRob2QgRmluYWwgUHJvamVjdCINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpHcmVlbiBTcGFjZSBDb21wYXJpc29uIEJldHdlZW4gTWFuaGF0dGFuIGFuZCB0aGUgQnJvbngNCg0KRGVjZW1iZXIgMTJ0aCwgMjAyMw0KDQpTb2NoZWF0YSBDaGV5DQoNCiMjIFB1cnBvc2UNCg0KVGhpcyByZXNlYXJjaCBhaW1zIHRvIHN0dWR5IHRoZSBpbmVxdWFsaXR5IG9mIHB1YmxpYyBzcGFjZSBhbW9uZyBhZmZsdWVudCBuZWlnaGJvcmhvb2RzIGluIE1hbmhhdHRhbiBhbmQgdGhlIGxvdyBpbmNvbWUgbmVpZ2hib3Job29kcyBpbiB0aGUgQnJvbnguIEJ5IHVzaW5nIE5ZQyBPcGVuIERhdGEgYW5hbHl6aW5nIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGdyZWVuIHNwYWNlIGF2YWlsYWJpbGl0eSwgcmFjZSBhbmQgaW5jb21lLg0KDQojIyBJbnRyb2R1Y3Rpb24gJiBCYWNrZ3JvdW5kDQoNClB1YmxpYyBwYXJrcyBhcmUgYSBjcml0aWNhbCBzcGFjZSBmb3IgcGVvcGxlIGluIHRoZSBjb21tdW5pdHkuIFRoZXkgc2VydmUgYXMgcGxhY2VzIHRvIHJlbGF4IHdpdGggZnJpZW5kcywgdW53aW5kIGFmdGVyIGEgbG9uZyBkYXksIHBpY25pYyB3aXRoIGZhbWlseSwgb3IgcGFydGljaXBhdGUgaW4gdXJiYW4gbGlmZSB0aHJvdWdoIG91dGRvb3IgYWN0aXZpdGllcyBhbmQgY29tbXVuaXR5IHNlcnZpY2VzLiBOZXcgWW9yayBDaXR5IGhhcyBiZWVuIGluY3JlZGlibHkgc3VjY2Vzc2Z1bCBpbiBjcmVhdGluZyBwdWJsaWMgcGFya3MgZm9yIHJlc2lkZW50cy4gRm9yIGV4YW1wbGUsIE1hbmhhdHRhbiBib2FzdHMgbnVtZXJvdXMgbGFyZ2UgcGFya3Mgd2l0aCBleHRlbnNpdmUgZmFjaWxpdGllcywgY2F0ZXJpbmcgdG8gZGl2ZXJzZSBuZWVkcywgZnJvbSBjeWNsaW5nIGFuZCBqb2dnaW5nIHRvIGRvZyBwYXJrcywgb3V0ZG9vciBneW1zLCBhbmQgY2hpbGRyZW4ncyBwbGF5Z3JvdW5kcy4NCg0KQ2VudHJhbCBQYXJrLCBhIGZsYWdzaGlwIHBhcmsgaW4gdGhlIGhlYXJ0IG9mIE1hbmhhdHRhbiwgc2VydmVzIGFzIGEgcHJpbWUgZXhhbXBsZS4gQWRkaXRpb25hbGx5LCBIdWRzb24gUml2ZXIgUGFyayBoYXMgcmVjZWl2ZWQgc2lnbmlmaWNhbnQgaW52ZXN0bWVudCBmcm9tIGJvdGggdGhlIGdvdmVybm1lbnQgYW5kIHByaXZhdGUgaW5zdGl0dXRpb25zIGZvciB2YXJpb3VzIHByb2plY3RzLiBSZXNpZGVudHMgaW4gTWFuaGF0dGFuIGFyZSBmb3J0dW5hdGUgdG8gaGF2ZSBhY2Nlc3MgdG8gc3VjaCBkaXZlcnNlIGFuZCB3ZWxsLW1haW50YWluZWQgcHVibGljIGFtZW5pdGllcyBjb21wYXJlZCB0byB0aG9zZSBpbiBvdGhlciBib3JvdWdocy4gQXMgYSByZXNpZGVudCBvZiB0aGUgQnJvbngsIEkgaGF2ZSB3aXRuZXNzZWQgdGhlIHN0YXJrIGNvbnRyYXN0IGluIHBhcmsgZmFjaWxpdGllcyBjb21wYXJlZCB0byB0aG9zZSBpbiBNYW5oYXR0YW4uIFRoZSBkaXNwYXJpdHkgaW4gYW1lbml0aWVzIGhhcyBzcGFya2VkIG15IGludGVyZXN0IGluIGNvbXBhcmluZyB0aGUgYW1vdW50IG9mIHB1YmxpYyBzcGFjZSBhdmFpbGFibGUgaW4gZWFjaCBib3JvdWdoIGFuZCBleHBsb3JpbmcgdGhlIHBvdGVudGlhbCBjYXVzZXMgb2YgdGhpcyBpbmVxdWFsaXR5Lg0KDQojIyBNZXRob2RvbG9neQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUYsIGVjaG89RkFMU0UsIHF1aWV0bHk9VCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShSU29jcmF0YSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodGlkeWNlbnN1cykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0Kb3B0aW9ucyhzY2llcGVuID0gOTk5KQ0KDQpgYGANCg0KSSBnb3QgZGF0YSBmcm9tIE5ZQyBPcGVuIERhdGEgZm9yIHRoZSBQYXJrcyBwcm9wZXJ0aWVzIMKgPGh0dHBzOi8vZGF0YS5jaXR5b2ZuZXd5b3JrLnVzL1JlY3JlYXRpb24vUGFya3MtUHJvcGVydGllcy9lbmZoLWdrdmU+IGFuZCBBY2VzIGRhdGEgZm9yIHJhY2VzICYgaW5jb21lLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFIH0NCiMgIyBpbXBvcnQgdGhlIGRhdGEgZGlyZWN0bHkgaW50byBSU3R1ZGlvIHVzaW5nIHVybCBwYXRoDQojIGRhdGEgPC0gcmVhZC5zb2NyYXRhKCJodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9yZXNvdXJjZS9lbmZoLWdrdmUuY3N2IikNCg0KDQpkYXRhX3NmIDwtIHN0X3JlYWQoIkM6L1VzZXJzL0NoZXkgU29jaGVhdGEvRG93bmxvYWRzL1BhcmtzIFByb3BlcnRpZXNfMjAyMzEyMDEuZ2VvanNvbiIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSB9DQojIHNlbGVjdGVkIHZhcmlhYmxlcyAoY29sdW1ucykNCmNvbHVtbnMgPC1jKCJuYW1lMzExIiwgInR5cGVjYXRlZ29yeSIsICJzdWJjYXRlZ29yeSIsICJhY3JlcyIsImJvcm91Z2giLCAiYWRkcmVzcyIsICJjbGFzcyIsICJsb2NhdGlvbiIsImVhcHBseSIsICJjb3VuY2lsZGlzdHJpY3QiLCAiY29tbXVuaXR5Ym9hcmQiLCAidXJsIiwgInppcGNvZGUiLCAiYWNxdWlzaXRpb25kYXRlIikgICMjIyBJIHJlbW92ZWQgdGhlIG11bHRpcG9seWdvbiBmb3JtIHRoZSBsaXN0IG9mIGNvbHVtbnMgdG8ga2VlcCBzaW5jZSBpdCBpcyBub3QgaW4gdGhlIGRhdGFfc2YNCm15ZGF0YSA8LSBkYXRhX3NmIHw+IA0KICBzZWxlY3QoYWxsX29mKGNvbHVtbnMpKXw+DQpyZW5hbWUoTmFtZSA9IG5hbWUzMTEpDQogbXlkYXRhIHw+DQpzZWxlY3QoMTo1KSB8Pg0Kc2xpY2UoMTo1KSB8PiBrYWJsZSgpDQpgYGANCg0KR2l2ZW4gdGhlIHByZXNlbmNlIG9mIHVubmVjZXNzYXJ5IHBhcmsgY2F0ZWdvcmllcyBpbiB0aGUgZG93bmxvYWRlZCBkYXRhLCBJIGZpbHRlcmVkIHRoZSBpbmZvcm1hdGlvbiB0byBmb2N1cyBzb2xlbHkgb24gcmVsZXZhbnQgY2F0ZWdvcmllcyBmb3IgbXkgYW5hbHlzaXM6IGZsYWdzaGlwIHBhcmtzLCBjb21tdW5pdHkgcGFya3MsIGFuZCBuZWlnaGJvcmhvb2QgcGFya3MuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpQYXJrcyA8LSBteWRhdGEgfD4gDQogIGZpbHRlcih0eXBlY2F0ZWdvcnkgPT0gIkZsYWdzaGlwIFBhcmsifHR5cGVjYXRlZ29yeSA9PSAiQ29tbXVuaXR5IFBhcmsiIHwgdHlwZWNhdGVnb3J5ID09Ik5laWdoYm9yaG9vZCBQYXJrIiApIHw+DQogIHNlbGVjdChjKE5hbWUsYm9yb3VnaCx0eXBlY2F0ZWdvcnksYWNyZXMpKSB8PiANCiAgYXJyYW5nZShkZXNjKGFjcmVzKSkNCiBQYXJrcyB8Pg0Kc2VsZWN0KDE6NSkgfD4NCnNsaWNlKDE6NSkgfD4ga2FibGUoKQ0KDQpgYGANCg0KSSBpbXBvcnQgYm9yb3VnaCBzaGFwZWZpbGVzIGZyb20gTllDIE9wZW4gRGF0YSBhbmQgTllDIG5laWdoYm9yaG9vZCB0YWJ1bGF0aW9uIGFyZWFzIGluIG9yZGVyIHRvIGNyZWF0ZSBtYXAgYnkgdXNpbmcgZ2dwbG90Lg0KDQojIyBSZXN1bHRzDQoNCmBgYHtyIGVjaG89RiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIHJlc3VsdHM9J2hpZGUnfQ0KIyMgaW1wb3J0IGJvcm91Z2ggc2hhcGVmaWxlcyBmcm9tIE5ZQyBPcGVuIERhdGENCmJvcm9zIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Byb2Nlc3NlZC9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKSANCg0KIyMgaW1wb3J0IE5laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWFzIGZvciBOWUMNCm5hYmVzIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Jhdy9nZW8vbnludGEyMDIwXzIzYy9ueW50YTIwMjAuc2hwIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmdncGxvdChkYXRhID0gUGFya3MpICArIA0KICBnZW9tX3NmKGZpbGwgPSAiIzFkODUzOSIsIA0KICAgICAgICAgIGx3ZCA9IDApICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgI3NjYWxlX2ZpbGxfZGlzdGlsbGVyKGJyZWFrcz1jKDAsIC4yLCAuNCwgLjYsIC44LCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgI2RpcmVjdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICNuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICNuYW1lPSJOWUMgUHVibGljIFBhcmtzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgI2xhYmVscyA9IGFjcmVzICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk5ZQyBQdWJsaWMgUGFya3MiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBOWUMgT3BlbiBEYXRhIg0KICApICsgDQogIGdlb21fc2YoZGF0YSA9IG5hYmVzLCBjb2xvciA9ICJncmF5IiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArDQogIGdlb21fc2YoZGF0YSA9IGJvcm9zLCAgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IC41KQ0KYGBgDQoNCkkgZ3JvdXAgZGF0YSBieSBib3JvdWdoIGFuZCBjYWxjdWxhdGUgdGhlIGFjcmVzIG9mIHB1YmxpYyBwYXJrIHNwYWNlIGF2YWlsYWJsZSBpbiB0aG9zZSBmaXZlIGJvcm91Z2hzLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KUGFya3NkZiA8LSBzdF9kcm9wX2dlb21ldHJ5KFBhcmtzKXw+DQogIG11dGF0ZShhY3Jlcz0gYXMubnVtZXJpYyhhY3JlcykpDQoNCnBhcmtzc3VtbWFyeSA8LSBQYXJrc2RmIHw+DQogIGdyb3VwX2J5KGJvcm91Z2gpfD4NCiAgc3VtbWFyaXNlKGNvdW50PW4oKSwgDQogICAgICAgICAgICBzdW1hY3Jlcz1zdW0oYWNyZXMpLA0KICAgICAgICAgICAgbWVhbmFjcmVzPW1lYW4oYWNyZXMpKQ0KYGBgDQoNCmBgYHtyIG1ha2UgYSB0YWJsZSwgcmVzdWx0cz0nYXNpcyd9DQoNCg0KdGFibGUgPSBtYXRyaXgoTkEsIG5yb3cgPSA2LCBuY29sID0gNCkgDQpjb2xuYW1lcyhwYXJrc3N1bW1hcnkpID0gYygiQm9yb3VnaCIsICJUb3RhbE51bWJlcm9mUGFyayIsICJTdW1BY3JlcyIsICJNZWFuQWNyZXMiKQ0KI3RhYmxlWzEsIF0gPSBjKCJCcm9va2x5biIpDQoNCmthYmxlKHBhcmtzc3VtbWFyeSwgY2FwdGlvbiA9ICJUb3RhbCBQYXJrIFNpemUgaW4gRWFjaCBCb3JvdWdoIikNCmBgYA0KDQpgYGB7cn0NCnBlcmYgPC1nZ3Bsb3QoZGF0YT1wYXJrc3N1bW1hcnksIGFlcyh4PUJvcm91Z2gsIHk9VG90YWxOdW1iZXJvZlBhcmssIHNpemUgPSBCb3JvdWdoLCBmaWxsPVRvdGFsTnVtYmVyb2ZQYXJrKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iZGFya3JlZCIpIA0KcGVyZiANCg0KDQoNCmBgYA0KDQpJIGZpbHRlcmVkIG91dCBNYW5oYXR0YW4gYW5kIHRoZSBCcm9ueCBzaW5jZSBteSByZXNlYXJjaCBpcyBvbmx5IGZvY3VzIG9uIHRob3NlIHR3byBib3JvdWdocy4NCg0KRGVzcGl0ZSB0aGUgbGFyZ2Ugc3VyZmFjZSBhcmVhIG9mIGdyZWVuIHNwYWNlIGluIHRoZSBCcm9ueCwgdGhlIG1hcCByZXZlYWxzIHNpZ25pZmljYW50IGFjY2Vzc2liaWxpdHkgaXNzdWVzIGZvciB0aGUgY29tbXVuaXR5LiBUaHJlZSBtYWpvciBwYXJrcyBhcmUgcHJlc2VudDogdGhlIEJyb254IFpvbyAmIEJvdGFuaWNhbCBHYXJkZW4sIHdoaWNoIHJlcXVpcmVzIGFuIGVudHJ5IGZlZSwgYW5kIFZhbiBDb3J0bGFuZHQgUGFyayBhbmQgUGVsaGFtIEJheSBQYXJrLCBib3RoIGxvY2F0ZWQgZmFyIG5vcnRoLCBsZWF2aW5nIHRoZSByZXN0IG9mIHRoZSBib3JvdWdoIHVuZGVyc2VydmVkLiBJbiBjb250cmFzdCwgTWFuaGF0dGFuIGVuam95cyB0aGUgdW5mYWlyIGFkdmFudGFnZSBvZiBDZW50cmFsIFBhcmssIHNpdHVhdGVkIGNlbnRyYWxseSBhbmQgZWFzaWx5IGFjY2Vzc2libGUgdG8gaXRzIHJlc2lkZW50cy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpQYXJrc01YIDwtIG15ZGF0YSB8Pg0KICBmaWx0ZXIoYm9yb3VnaCA9PSAiTSJ8Ym9yb3VnaCA9PSAiWCIgKSB8Pg0KICBmaWx0ZXIodHlwZWNhdGVnb3J5ID09ICJGbGFnc2hpcCBQYXJrInx0eXBlY2F0ZWdvcnkgPT0gIkNvbW11bml0eSBQYXJrIiB8IHR5cGVjYXRlZ29yeSA9PSJOZWlnaGJvcmhvb2QgUGFyayIgKSB8Pg0KICBzZWxlY3QoYyhOYW1lLGJvcm91Z2gsdHlwZWNhdGVnb3J5LGFjcmVzKSkgfD4gDQogIGFycmFuZ2UoZGVzYyhhY3JlcykpICANCkJvcm91Z2hNWCA8LWJvcm9zIHw+DQogIGZpbHRlcihib3JvX25hbWUgPT0gIk1hbmhhdHRhbiJ8Ym9yb19uYW1lID09ICJCcm9ueCIgKQ0KbmFiZXNNWCA8LW5hYmVzIHw+DQogIGZpbHRlcihCb3JvTmFtZSA9PSAiTWFuaGF0dGFuInxCb3JvTmFtZSA9PSAiQnJvbngiICkNCiAgDQpQYXJrc01YIHw+DQpzZWxlY3QoMTo1KSB8Pg0Kc2xpY2UoMTo1KSB8PiBrYWJsZSgpDQoNCmdncGxvdChkYXRhID0gUGFya3NNWCkgICsgDQogIGdlb21fc2YoZmlsbCA9ICIjMWQ4NTM5IiwgDQogICAgICAgICAgbHdkID0gMCkgKw0KICB0aGVtZV92b2lkKCkgKw0KICAjc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAjZGlyZWN0aW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgI25hLnZhbHVlID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgI25hbWU9Ik5ZQyBQdWJsaWMgUGFya3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAjbGFiZWxzID0gYWNyZXMgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTllDIFB1YmxpYyBQYXJrcyIsDQogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE5ZQyBPcGVuIERhdGEiDQogICkgKyANCiAgZ2VvbV9zZihkYXRhID0gbmFiZXNNWCwgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSBOQSwgbHdkID0gMC4yNSkgKw0KICBnZW9tX3NmKGRhdGEgPSBCb3JvdWdoTVgsICBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgbHdkID0gLjUpDQoNCmBgYA0KDQpJbiBvcmRlciB0byB1bmRlcnN0YW5kIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHJhY2UgYW5kIHB1YmxpYyBzcGFjZSBpbiBOZXcgWW9yayBDaXR5LCBJIGltcG9ydCBkYXRhIGNlbnN1cyB0cmFjdCB0byBjcmVhdGUgbWFwcyBpbGx1c3RyYXRpbmcgdGhlIHBlcmNlbnRhZ2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiBkaWZmZXJlbnQgcmFjaWFsIGdyb3VwcywgaW5jbHVkaW5nIFdoaXRlLCBBc2lhbiwgSGlzcGFuaWMsIGFuZCBCbGFjaywgYWNyb3NzIHRoZSB0d28gYm9yb3VnaHMuIFRoaXMgYW5hbHlzaXMgcmV2ZWFscyBhIGNsZWFyIGxpbmsgYmV0d2VlbiByYWNpYWwgZGVtb2dyYXBoaWNzIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHB1YmxpYyBzcGFjZS4gQXJlYXMgd2l0aCBhIGxhcmdlciB3aGl0ZSBwb3B1bGF0aW9uIGdlbmVyYWxseSBkaXNwbGF5IGdyZWF0ZXIgYWZmbHVlbmNlIGFuZCBkZXZlbG9wbWVudCBjb21wYXJlZCB0byB0aG9zZSB3aXRoIGhpZ2hlciBwcm9wb3J0aW9ucyBvZiBwZW9wbGUgb2YgY29sb3INCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIyMjIGltcG9ydCBib3JvdWdoIHNoYXBlZmlsZXMgZnJvbSBOWUMgT3BlbiBEYXRhDQpib3JvcyA8LSBzdF9yZWFkKCJEOi9QYXJzb24gU2Nob29vbCBPZiBEZXNpZ24vRGVzaWduIE1ldGhvZC9MZXNzb24vV2VlazEvUGFydDIvZGF0YS9wcm9jZXNzZWQvZ2VvL0Jvcm91Z2ggQm91bmRhcmllcy5nZW9qc29uIikNCg0KcmF3X2FuY2VzdHJ5IDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKGFuY2VzdHJ5X3BvcCA9ICJCMDQwMDZfMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNpYW4gPSAiQjAyMDAxXzAwNSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPSdOWScsDQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHkgPSBjKCdCcm9ueCcsJ05ldyBZb3JrJyksDQogICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMjAsDQogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAid2lkZSIpIA0KDQphc2lhbiA8LSByYXdfYW5jZXN0cnkgfD4gDQogIG11dGF0ZShwY3RfYXNpYW4gPSBhc2lhbkUvYW5jZXN0cnlfcG9wRSkgfD4gDQogIGZpbHRlcihhbmNlc3RyeV9wb3BFID4gMCkNCg0KYGBgDQoNCkkgY3JlYXRlIG1hcCBieSB1c2luZyBnZ3Bsb3QNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFzaWFuX21hcCA8LSBzdXBwcmVzc1dhcm5pbmdzKCBnZ3Bsb3QoKSAgKyANCiAgZ2VvbV9zZihkYXRhID0gYXNpYW4sIA0KICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHBjdF9hc2lhbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoTkFNRSwgIjoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnQgQXNpYW4gYW5jZXN0cnk6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2FzaWFuLCBhY2N1cmFjeT0xKSkpLA0KICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihicmVha3M9YygwLCAuMiwgLjQsIC42LCAuOCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gIiNmYWZhZmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAjIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGVyY2VudCBBc2lhbiBBbmNlc3RyeSAoJSkiLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBc2lhbiBBbmNlc3RyeSBieSBDZW5zdXMgVHJhY3QiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LCAyMDE2LTIwIg0KICApKQ0KZ2dwbG90bHkoYXNpYW5fbWFwLCB0b29sdGlwID0gInRleHQiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbmFiZXMgPC0gc3RfcmVhZCgiRDovUGFyc29uIFNjaG9vb2wgT2YgRGVzaWduL0Rlc2lnbiBNZXRob2QvTGVzc29uL1dlZWsxL1BhcnQyL2RhdGEvcmF3L2dlby9ueW50YTIwMjBfMjNjL255bnRhMjAyMC5zaHAiKQ0Kc3RfY3JzKG5hYmVzKQ0KDQphc2lhbl8yMjYzIDwtIHN0X3RyYW5zZm9ybShhc2lhbiwgMjI2MykNCnN0X2Nycyhhc2lhbl8yMjYzKQ0KDQojcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBpbiB0aGUgbmVpZ2hib3Job29kIHNoYXBlZmlsZQ0KbmFiZXNfc2VsZWN0ZWQgPC0gbmFiZXMgfD4NCiAgc2VsZWN0KEJvcm9Db2RlLCBCb3JvTmFtZSwgTlRBMjAyMCwgTlRBTmFtZSkNCg0KYXNpYW5fbmFiZXMgPC0gYXNpYW5fMjI2MyB8Pg0KICBzdF9qb2luKG5hYmVzX3NlbGVjdGVkLCANCiAgICAgICAgICBsZWZ0ID0gVFJVRSwNCiAgICAgICAgICBqb2luID0gc3RfaW50ZXJzZWN0cywNCiAgICAgICAgICBsYXJnZXN0ID0gVCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmFzaWFuX25hYmVfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeShhc2lhbl9uYWJlcykgfD4gDQogIGdyb3VwX2J5KE5UQU5hbWUpIHw+IA0KICBzdW1tYXJpc2UoQm9yb3VnaCA9IGZpcnN0KEJvcm9OYW1lKSwNCiAgICAgICAgICAgIGBFc3QuIFRvdGFsIFBvcHVsYXRpb25gID0gc3VtKGFuY2VzdHJ5X3BvcEUpLA0KICAgICAgICAgICAgYEVzdC4gVG90YWwgQXNpYW4gUG9wdWxhdGlvbmAgPSBzdW0oYXNpYW5NKSkgfD4gDQogIG11dGF0ZShgRXN0LiBQZXJjZW50IEFzaWFuIEFuY2VzdHJ5YCA9IHBlcmNlbnQoYEVzdC4gVG90YWwgQXNpYW4gUG9wdWxhdGlvbmAvYEVzdC4gVG90YWwgUG9wdWxhdGlvbmAsIGFjY3VyYWN5ID0gMSkpIA0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyMjIyBpbXBvcnQgYm9yb3VnaCBzaGFwZWZpbGVzIGZyb20gTllDIE9wZW4gRGF0YQ0KYm9yb3MgPC0gc3RfcmVhZCgiRDovUGFyc29uIFNjaG9vb2wgT2YgRGVzaWduL0Rlc2lnbiBNZXRob2QvTGVzc29uL1dlZWsxL1BhcnQyL2RhdGEvcHJvY2Vzc2VkL2dlby9Cb3JvdWdoIEJvdW5kYXJpZXMuZ2VvanNvbiIpDQoNCnJhd19hbmNlc3RyeSA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJ0cmFjdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gYyhhbmNlc3RyeV9wb3AgPSAiQjA0MDA2XzAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3BhbmljID0gIkIwMzAwMV8wMDMiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nTlknLA0KICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gYygnQnJvbngnLCdOZXcgWW9yaycpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBULCANCiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gIndpZGUiKSANCg0KaGlzcGFuaWMgPC0gcmF3X2FuY2VzdHJ5IHw+IA0KICBtdXRhdGUocGN0X2hpc3BhbmljID0gaGlzcGFuaWNFL2FuY2VzdHJ5X3BvcEUpIHw+IA0KICBmaWx0ZXIoYW5jZXN0cnlfcG9wRSA+IDApDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmhpc3BhbmljX21hcCA8LSBnZ3Bsb3QoKSAgKyANCiAgZ2VvbV9zZihkYXRhID0gaGlzcGFuaWMsIA0KICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHBjdF9oaXNwYW5pYywNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoTkFNRSwgIjoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnQgSGlzcGFuaWMgYW5jZXN0cnk6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2hpc3BhbmljLCBhY2N1cmFjeT0xKSkpLA0KICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihicmVha3M9YygwLCAuMiwgLjQsIC42LCAuOCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiT3JhbmdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gIiNHcmVlbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAjIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGVyY2VudCBIaXNwYW5pYyBBbmNlc3RyeSAoJSkiLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIaXNwYW5pYyBBbmNlc3RyeSBieSBDZW5zdXMgVHJhY3QiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LCAyMDE2LTIwIg0KICApDQpnZ3Bsb3RseShoaXNwYW5pY19tYXAsIHRvb2x0aXAgPSAidGV4dCIpDQoNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCm5hYmVzIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Jhdy9nZW8vbnludGEyMDIwXzIzYy9ueW50YTIwMjAuc2hwIikNCnN0X2NycyhuYWJlcykNCg0KaGlzcGFuaWNfMjI2MyA8LSBzdF90cmFuc2Zvcm0oaGlzcGFuaWMsIDIyNjMpDQpzdF9jcnMoaGlzcGFuaWNfMjI2MykNCg0KI3JlbW92ZSB1bm5lY2Vzc2FyeSBmaWVsZHMgaW4gdGhlIG5laWdoYm9yaG9vZCBzaGFwZWZpbGUNCm5hYmVzX3NlbGVjdGVkIDwtIG5hYmVzIHw+DQogIHNlbGVjdChCb3JvQ29kZSwgQm9yb05hbWUsIE5UQTIwMjAsIE5UQU5hbWUpDQoNCmhpc3BhbmljX25hYmVzIDwtIGhpc3BhbmljXzIyNjMgfD4NCiAgc3Rfam9pbihuYWJlc19zZWxlY3RlZCwgDQogICAgICAgICAgbGVmdCA9IFRSVUUsDQogICAgICAgICAgam9pbiA9IHN0X2ludGVyc2VjdHMsDQogICAgICAgICAgbGFyZ2VzdCA9IFQpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpoaXNwYW5pY19uYWJlX3N0YXRzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkoaGlzcGFuaWNfbmFiZXMpIHw+IA0KICBncm91cF9ieShOVEFOYW1lKSB8PiANCiAgc3VtbWFyaXNlKEJvcm91Z2ggPSBmaXJzdChCb3JvTmFtZSksDQogICAgICAgICAgICBgRXN0LiBUb3RhbCBQb3B1bGF0aW9uYCA9IHN1bShhbmNlc3RyeV9wb3BFKSwNCiAgICAgICAgICAgIGBFc3QuIFRvdGFsIEhpc3BhbmljIFBvcHVsYXRpb25gID0gc3VtKGhpc3BhbmljTSkpIHw+IA0KICBtdXRhdGUoYEVzdC4gUGVyY2VudCBIaXNwYW5pYyBBbmNlc3RyeWAgPSBwZXJjZW50KGBFc3QuIFRvdGFsIEhpc3BhbmljIFBvcHVsYXRpb25gL2BFc3QuIFRvdGFsIFBvcHVsYXRpb25gLCBhY2N1cmFjeSA9IDEpKSANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmJvcm9zIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Byb2Nlc3NlZC9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKQ0KDQpyYXdfYW5jZXN0cnkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMoYW5jZXN0cnlfcG9wID0gIkIwNDAwNl8wMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjayA9ICJCMDIwMDFfMDAzIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9IGMoJ0Jyb254JywnTmV3IFlvcmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikgDQoNCmJsYWNrIDwtIHJhd19hbmNlc3RyeSB8PiANCiAgbXV0YXRlKHBjdF9ibGFjayA9IGJsYWNrRS9hbmNlc3RyeV9wb3BFKSB8PiANCiAgZmlsdGVyKGFuY2VzdHJ5X3BvcEUgPiAwKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpibGFja19tYXAgPC0gZ2dwbG90KCkgICsgDQogIGdlb21fc2YoZGF0YSA9IGJsYWNrLCANCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3RfYmxhY2ssDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKE5BTUUsICI6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IEJsYWNrIGFuY2VzdHJ5OiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9ibGFjaywgYWNjdXJhY3k9MSkpKSwNCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlB1UmQiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICIjWWxPclJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIyBuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlBlcmNlbnQgQmxhY2sgQW5jZXN0cnkgKCUpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmxhY2sgQW5jZXN0cnkgYnkgQ2Vuc3VzIFRyYWN0IiwNCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSwgMjAxNi0yMCINCiAgKQ0KZ2dwbG90bHkoYmxhY2tfbWFwLCB0b29sdGlwID0gInRleHQiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbmFiZXMgPC0gc3RfcmVhZCgiRDovUGFyc29uIFNjaG9vb2wgT2YgRGVzaWduL0Rlc2lnbiBNZXRob2QvTGVzc29uL1dlZWsxL1BhcnQyL2RhdGEvcmF3L2dlby9ueW50YTIwMjBfMjNjL255bnRhMjAyMC5zaHAiKQ0Kc3RfY3JzKG5hYmVzKQ0KDQpibGFja18yMjYzIDwtIHN0X3RyYW5zZm9ybShibGFjaywgMjI2MykNCnN0X2NycyhibGFja18yMjYzKQ0KDQojcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBpbiB0aGUgbmVpZ2hib3Job29kIHNoYXBlZmlsZQ0KbmFiZXNfc2VsZWN0ZWQgPC0gbmFiZXMgfD4NCiAgc2VsZWN0KEJvcm9Db2RlLCBCb3JvTmFtZSwgTlRBMjAyMCwgTlRBTmFtZSkNCg0KYmxhY2tfbmFiZXMgPC0gYmxhY2tfMjI2MyB8Pg0KICBzdF9qb2luKG5hYmVzX3NlbGVjdGVkLCANCiAgICAgICAgICBsZWZ0ID0gVFJVRSwNCiAgICAgICAgICBqb2luID0gc3RfaW50ZXJzZWN0cywNCiAgICAgICAgICBsYXJnZXN0ID0gVCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmJsYWNrX25hYmVfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeShibGFja19uYWJlcykgfD4gDQogIGdyb3VwX2J5KE5UQU5hbWUpIHw+IA0KICBzdW1tYXJpc2UoQm9yb3VnaCA9IGZpcnN0KEJvcm9OYW1lKSwNCiAgICAgICAgICAgIGBFc3QuIFRvdGFsIFBvcHVsYXRpb25gID0gc3VtKGFuY2VzdHJ5X3BvcEUpLA0KICAgICAgICAgICAgYEVzdC4gVG90YWwgYmxhY2sgUG9wdWxhdGlvbmAgPSBzdW0oYmxhY2tNKSkgfD4gDQogIG11dGF0ZShgRXN0LiBQZXJjZW50IGJsYWNrIEFuY2VzdHJ5YCA9IHBlcmNlbnQoYEVzdC4gVG90YWwgYmxhY2sgUG9wdWxhdGlvbmAvYEVzdC4gVG90YWwgUG9wdWxhdGlvbmAsIGFjY3VyYWN5ID0gMSkpIA0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnIH0NCiMjIyMgaW1wb3J0IGJvcm91Z2ggc2hhcGVmaWxlcyBmcm9tIE5ZQyBPcGVuIERhdGENCmJvcm9zIDwtIHN0X3JlYWQoIkQ6L1BhcnNvbiBTY2hvb29sIE9mIERlc2lnbi9EZXNpZ24gTWV0aG9kL0xlc3Nvbi9XZWVrMS9QYXJ0Mi9kYXRhL3Byb2Nlc3NlZC9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKQ0KDQpyYXdfYW5jZXN0cnkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMoYW5jZXN0cnlfcG9wID0gIkIwNDAwNl8wMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZSA9ICJCMDIwMDFfMDAyIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9IGMoJ0Jyb254JywnTmV3IFlvcmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikNCndoaXRlIDwtIHJhd19hbmNlc3RyeSB8PiANCiAgbXV0YXRlKHBjdF93aGl0ZSA9IHdoaXRlRS9hbmNlc3RyeV9wb3BFKSB8PiANCiAgZmlsdGVyKGFuY2VzdHJ5X3BvcEUgPiAwKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp3aGl0ZV9tYXAgPC0gZ2dwbG90KCkgICsgDQogIGdlb21fc2YoZGF0YSA9IHdoaXRlLCANCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3Rfd2hpdGUsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKE5BTUUsICI6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IFdoaXRlIGFuY2VzdHJ5OiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF93aGl0ZSwgYWNjdXJhY3k9MSkpKSwNCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIkJ1UHUiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICIjU2V0MyIsDQogICAgICAgICAgICAgICAgICAgICAgICMgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJQZXJjZW50IFdoaXRlIEFuY2VzdHJ5ICglKSIsDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1wZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIldoaXRlIEFuY2VzdHJ5IGJ5IENlbnN1cyBUcmFjdCIsDQogICAgY2FwdGlvbiA9ICJTb3VyY2U6IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXksIDIwMTYtMjAiDQogICkgDQpnZ3Bsb3RseSh3aGl0ZV9tYXAsIHRvb2x0aXAgPSAidGV4dCIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpuYWJlcyA8LSBzdF9yZWFkKCJEOi9QYXJzb24gU2Nob29vbCBPZiBEZXNpZ24vRGVzaWduIE1ldGhvZC9MZXNzb24vV2VlazEvUGFydDIvZGF0YS9yYXcvZ2VvL255bnRhMjAyMF8yM2MvbnludGEyMDIwLnNocCIpDQpzdF9jcnMobmFiZXMpDQoNCndoaXRlXzIyNjMgPC0gc3RfdHJhbnNmb3JtKHdoaXRlLCAyMjYzKQ0Kc3RfY3JzKHdoaXRlXzIyNjMpDQoNCiNyZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzIGluIHRoZSBuZWlnaGJvcmhvb2Qgc2hhcGVmaWxlDQpuYWJlc19zZWxlY3RlZCA8LSBuYWJlcyB8Pg0KICBzZWxlY3QoQm9yb0NvZGUsIEJvcm9OYW1lLCBOVEEyMDIwLCBOVEFOYW1lKQ0KDQp3aGl0ZV9uYWJlcyA8LSB3aGl0ZV8yMjYzIHw+DQogIHN0X2pvaW4obmFiZXNfc2VsZWN0ZWQsIA0KICAgICAgICAgIGxlZnQgPSBUUlVFLA0KICAgICAgICAgIGpvaW4gPSBzdF9pbnRlcnNlY3RzLA0KICAgICAgICAgIGxhcmdlc3QgPSBUKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0Kd2hpdGVfbmFiZV9zdGF0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KHdoaXRlX25hYmVzKSB8PiANCiAgZ3JvdXBfYnkoTlRBTmFtZSkgfD4gDQogIHN1bW1hcmlzZShCb3JvdWdoID0gZmlyc3QoQm9yb05hbWUpLA0KICAgICAgICAgICAgYEVzdC4gVG90YWwgUG9wdWxhdGlvbmAgPSBzdW0oYW5jZXN0cnlfcG9wRSksDQogICAgICAgICAgICBgRXN0LiBUb3RhbCB3aGl0ZSBQb3B1bGF0aW9uYCA9IHN1bSh3aGl0ZU0pKSB8PiANCiAgbXV0YXRlKGBFc3QuIFBlcmNlbnQgd2hpdGUgQW5jZXN0cnlgID0gcGVyY2VudChgRXN0LiBUb3RhbCB3aGl0ZSBQb3B1bGF0aW9uYC9gRXN0LiBUb3RhbCBQb3B1bGF0aW9uYCwgYWNjdXJhY3kgPSAxKSkgDQpgYGANCg0KVG8gaW52ZXN0aWdhdGUgdGhlIGluY29tZSBkaXNwYXJpdGllcyBiZXR3ZWVuIHRoZSB0d28gYm9yb3VnaHMsIEkgaW1wb3J0ZWQgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgZGF0YSBmcm9tIHRoZSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LiBUaGUgYW5hbHlzaXMgcmV2ZWFsZWQgYSBzaWduaWZpY2FudCBpbmNvbWUgZ2FwLCB3aXRoIHJlc2lkZW50cyBpbiBNYW5oYXR0YW4gZWFybmluZyBuZWFybHkgZG91YmxlIHRoZSBpbmNvbWUgb2YgdGhvc2UgaW4gdGhlIEJyb254LCBwcmVkb21pbmFudGx5IHBvcHVsYXRlZCBieSBwZW9wbGUgb2YgY29sb3IuIFRoaXMgZGF0YSBmdXJ0aGVyIHN1Z2dlc3RzIGEgY29ycmVsYXRpb24gYmV0d2VlbiB3ZWFsdGggYW5kIGludmVzdG1lbnQgaW4gcHVibGljIHNwYWNlcy4gQXJlYXMgd2l0aCBoaWdoZXItaW5jb21lIHBvcHVsYXRpb25zIHJlY2VpdmUgZ3JlYXRlciBpbnZlc3RtZW50IGFuZCBtYWludGVuYW5jZSBpbiBwdWJsaWMgcGFya3MgY29tcGFyZWQgdG8gbG93ZXItaW5jb21lIGNvbW11bml0aWVzLg0KDQpGdXJ0aGVyIHJlc2VhcmNoIHdvdWxkIGFpbSB0byBleHBsb3JlIHRoZSBpbXBhY3Qgb2YgdGF4IGFsbG9jYXRpb24gb24gY29tbXVuaXR5IGRldmVsb3BtZW50IHdpdGhpbiBlYWNoIG5laWdoYm9yaG9vZC4gVGhlIHVuZXF1YWwgZGlzdHJpYnV0aW9uIG9mIGZ1bmRpbmcgZnJvbSB0aGUgY2l0eSBnb3Zlcm5tZW50IHRvIGRpZmZlcmVudCBib3JvdWdocyBpcyBldmlkZW50IGFuZCBjb250cmlidXRlcyB0byBkaXNwYXJpdGllcyBpbiBwYXJrIHF1YWxpdHkgYW5kIG92ZXJhbGwgbGlmZXN0eWxlLiBGb3IgZXhhbXBsZSwgcmVzaWRlbnRzIG9mIE1hbmhhdHRhbiBlbmpveSB3ZWxsLWVxdWlwcGVkIHBhcmtzIGxpa2UgdGhvc2UgYWxvbmcgdGhlIEh1ZHNvbiBSaXZlciBhbmQgQ2VudHJhbCBQYXJrLCBvZmZlcmluZyBmYWNpbGl0aWVzIGZvciBldmVyeXRoaW5nIGZyb20gb3V0ZG9vciBzcG9ydHMgYW5kIHJ1bm5pbmcgdHJhY2tzIHRvIHNjZW5pYyBzaXR0aW5nIGFyZWFzIGZvciByZWxheGF0aW9uIGFuZCBzb2NpYWxpemluZy4gSW4gY29udHJhc3QsIEJyb254IHJlc2lkZW50cyBsYWNrIGFjY2VzcyB0byBzaW1pbGFyIGxhcmdlLCBzYWZlLCBhbmQgaGVhbHRoeSBwYXJrcyB3aXRoaW4gdGhlaXIgb3duIG5laWdoYm9yaG9vZHMsIGRlc3BpdGUgcmVzaWRpbmcgaW4gdGhlIHNhbWUgY2l0eS4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIyMjIGltcG9ydCBib3JvdWdoIHNoYXBlZmlsZXMgZnJvbSBOWUMgT3BlbiBEYXRhDQpib3JvcyA8LSBzdF9yZWFkKCJEOi9QYXJzb24gU2Nob29vbCBPZiBEZXNpZ24vRGVzaWduIE1ldGhvZC9MZXNzb24vV2VlazEvUGFydDIvZGF0YS9wcm9jZXNzZWQvZ2VvL0Jvcm91Z2ggQm91bmRhcmllcy5nZW9qc29uIikNCg0KTUhJIDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKE1ISSA9ICJCMTkwMTlfMDAxIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9IGMoJ0Jyb254JywnTmV3IFlvcmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikgDQoNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIG1oaV9tYXAgPC0gZ2dwbG90KCkgICsgDQogICAgc3VwcHJlc3NXYXJuaW5ncyhnZW9tX3NmKGx3ZCA9IDAsDQogICAgICAgICAgZGF0YSA9IE1ISSwNCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBNSElFLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChNSElFLCI6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNSEk6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2xsYXIoTUhJRSkpKSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgc2NhbGVfZmlsbF9mZXJtZW50ZXIoYnJlYWtzPWMoMCwgMjUwMDAsIDUwMDAwLCA3NTAwMCwgMTAwMDAwLCAxMjUwMDAsIDE1MDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJNZWRpYW4gSG91c2Vob2xkIEluY29tZSIsDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1kb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gTlVMTCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJNYW5oYXR0YW4gJiBCcm9ueCwgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgYnkgQ2Vuc3VzIFRyYWN0IiwNCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gRGVjZW5uaWFsIENlbnN1cywgMjAyMCINCiAgKSArDQogIGdlb21fc2YoZGF0YSA9IGJvcm9zIHw+IGZpbHRlcihib3JvX25hbWUgPT0gIk1hbmhhdHRhbiIpLCAgDQogICAgICAgICAgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSBOQSwgbHdkID0gLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gYm9yb3MgfD4gZmlsdGVyKGJvcm9fbmFtZSA9PSAiQnJvbngiKSwgIA0KICAgICAgICAgIGNvbG9yID0gImdyYXkiLCBmaWxsID0gTkEsIGx3ZCA9IC4xKQ0KICANCg0KZ2dwbG90bHkobWhpX21hcCx0b29sdGlwID0gInRleHQiKQ0KYGBgDQoNCiFbXShpbWFnZXMvU2NyZWVuc2hvdCUyMDIwMjMtMTItMTElMjAwOTU0MzEucG5nKQ0KDQojIyBEaXNjdXNzaW9uDQoNCioqV2hhdCBhcmUgdGhlIGltcGFjdCBvZiB1bmVxdWFsIHB1YmxpYyBzcGFjZSBpbiBsb3dlciBpbmNvbWUgbmVpZ2hib3Job29kPyoqDQoNClRoZSB1bmVxdWFsIGRpc3RyaWJ1dGlvbiBvZiBwdWJsaWMgc3BhY2VzIGluIGxvd2VyLWluY29tZSBuZWlnaGJvcmhvb2RzIGNhbiBoYXZlIGRldHJpbWVudGFsIGltcGFjdHMgb24gYm90aCB0aGUgcGh5c2ljYWwgYW5kIG1lbnRhbCB3ZWxsLWJlaW5nIG9mIHJlc2lkZW50cy4NCg0KRmlyc3RseSwgSW5kaXZpZHVhbHMgbGFja2luZyBhY2Nlc3MgdG8gcHVibGljIHBhcmsgYXJlIHByb25lIHRvIGVuZ2FnaW5nIGluIGxlc3MgcGh5c2ljYWwgYWN0aXZpdHksIGluY3JlYXNpbmcgdGhlaXIgc3VzY2VwdGliaWxpdHkgdG8gZGlzZWFzZXMgbGlrZSBhc3RobWEuIFRoaXMgbGltaXRlZCBhY3Rpdml0eSBmdXJ0aGVyIGNvbnRyaWJ1dGVzIHRvIGhpZ2hlciBvYmVzaXR5IHJhdGVzLCBjaHJvbmljIGRpc2Vhc2VzLCBhbmQgbWVudGFsIGhlYWx0aCBpc3N1ZXMuIExvd2VyLWluY29tZSBuZWlnaGJvcmhvb2RzLCBsaWtlIHRob3NlIGluIHRoZSBCcm9ueCwgb2Z0ZW4gZmFjZSBncmVhdGVyIGV4cG9zdXJlIHRvIGVudmlyb25tZW50YWwgaGF6YXJkcyBzdWNoIGFzIGhpZ2h3YXlzLCBpbmR1c3RyaWFsIGZhY2lsaXRpZXMsIGFuZCBwb2xsdXRpb24sIGNvbXBhcmVkIHRvIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNYW5oYXR0YW4uIENvbnNlcXVlbnRseSwgdGhlIGxhY2sgb2YgYWNjZXNzIHRvIHNhZmUgYW5kIGhlYWx0aHkgb3V0ZG9vciBzcGFjZXMgZnVydGhlciBleGFjZXJiYXRlcyBleGlzdGluZyBoZWFsdGggZGlzcGFyaXRpZXMgaW4gdGhlc2UgY29tbXVuaXRpZXMuDQoNClNlY29uZGx5LCBwdWJsaWMgc3BhY2VzIGNhbiBzZXJ2ZSBhcyB2aXRhbCBjb21tdW5pdHkgaHVicywgZm9zdGVyaW5nIHNvY2lhbCBpbnRlcmFjdGlvbiBhbmQgYnVpbGRpbmcgcmVsYXRpb25zaGlwcyBhbW9uZyByZXNpZGVudHMuIFRoZSBhYnNlbmNlIG9mIHN1Y2ggc3BhY2VzIGhpbmRlcnMgY29tbXVuaXR5IGRldmVsb3BtZW50IGFuZCBjYW4gbGVhZCB0byBzb2NpYWwgaXNvbGF0aW9uLiBJbiBjb250cmFzdCwgSHVkc29uIFJpdmVyIFBhcmsgb2ZmZXJzIHB1YmxpYyBwcm9ncmFtcyBhbmQgZXZlbnRzIHRocm91Z2hvdXQgdGhlIHllYXIsIHByb3ZpZGluZyBvcHBvcnR1bml0aWVzIGZvciByZXNpZGVudHMgdG8gY29ubmVjdCBhbmQgZW5nYWdlIHdpdGggdGhlaXIgY29tbXVuaXR5LiBBZGRpdGlvbmFsbHksIHdlbGwtbWFpbnRhaW5lZCBwdWJsaWMgc3BhY2VzIGNhbiBhdHRyYWN0IGJ1c2luZXNzZXMgYW5kIGludmVzdG1lbnQuIEZvciBleGFtcGxlLCB0aGUgYXJlYSBzdXJyb3VuZGluZyBDZW50cmFsIFBhcmsgaW4gTWFuaGF0dGFuIGJvYXN0cyBhIHRocml2aW5nIGJ1c2luZXNzIGNvbW11bml0eSBhbmQgYXR0cmFjdHMgc2lnbmlmaWNhbnQgcHJpdmF0ZSBpbnZlc3RtZW50LCBjb250cmlidXRpbmcgdG8gdGhlIG92ZXJhbGwgZWNvbm9taWMgd2VsbC1iZWluZyBvZiByZXNpZGVudHMuIENvbnZlcnNlbHksIHRoZSBhYnNlbmNlIG9mIHdlbGwtbWFpbnRhaW5lZCBwdWJsaWMgc3BhY2VzIGNhbiBuZWdhdGl2ZWx5IGltcGFjdCBwcm9wZXJ0eSB2YWx1ZXMgYW5kIGRpc2NvdXJhZ2UgaW52ZXN0bWVudCBpbiB0aGUgbmVpZ2hib3Job29kLg0KDQpUaGlyZGx5LCB0aGUgbGFjayBvZiBhY2Nlc3MgdG8gbmF0dXJlIGFuZCBncmVlbiBzcGFjZXMgY2FuIGNvbnRyaWJ1dGUgdG8gaW5jcmVhc2VkIHN0cmVzcyBhbmQgYW54aWV0eSBsZXZlbHMsIHBhcnRpY3VsYXJseSBhbW9uZyB2dWxuZXJhYmxlIHBvcHVsYXRpb25zIGxpa2UgY2hpbGRyZW4gYW5kIHRoZSBlbGRlcmx5LiBDb25zaWRlciByZXNpZGVudHMgb2YgTWFuaGF0dGFuLCB3aG8gY2FuIGVhc2lseSBjb21tdXRlIHRvIENlbnRyYWwgUGFyayBhbmQgZW5qb3kgaXRzIG5hdHVyYWwgYmVhdXR5IGR1ZSB0byBpdHMgY2VudHJhbCBsb2NhdGlvbi4gSW4gc3RhcmsgY29udHJhc3QsIHJlc2lkZW50cyBvZiB0aGUgQnJvbnggbXVzdCB0cmF2ZWwgZnVydGhlciBub3J0aCB0byBhY2Nlc3MgcGFya3MgbGlrZSBWYW4gQ29ydGxhbmR0IG9yIFBlbGhhbSBCYXkgUGFyaywgd2hlcmUgcHVibGljIHRyYW5zcG9ydGF0aW9uIG9wdGlvbnMgYXJlIGFsc28gbGltaXRlZC4gVGhpcyBuZWNlc3NpdHkgb2YgdHJhdmVsaW5nIGxvbmcgZGlzdGFuY2VzIHRvIGFjY2VzcyBwYXJrcyByZWR1Y2VzIHRoZSBxdWFsaXR5IG9mIGxpZmUgZm9yIGJvdGggYWR1bHRzIGFuZCBjaGlsZHJlbiwgbGltaXRpbmcgdGhlaXIgYWJpbGl0eSB0byBlbmpveSBvdXRkb29yIGFjdGl2aXRpZXMgYW5kIHBhcnRpY2lwYXRlIGluIGNvbW11bml0eSBldmVudHMuDQoNClRoZSB1bmVxdWFsIGRpc3RyaWJ1dGlvbiBhbmQgbGltaXRlZCBhY2Nlc3NpYmlsaXR5IG9mIHB1YmxpYyBzcGFjZXMgcG9zZSBzaWduaWZpY2FudCBjaGFsbGVuZ2VzIHRvIHRoZSBoZWFsdGgsIGxpZmVzdHlsZSwgYW5kIHNvY2lhbCBsaWZlIG9mIHJlc2lkZW50cyBpbiBsb3dlci1pbmNvbWUgbmVpZ2hib3Job29kcywgcGFydGljdWxhcmx5IGluIHRoZSBCcm9ueC4gQWRkcmVzc2luZyB0aGlzIGlzc3VlIGlzIGNydWNpYWwgZm9yIHRoZSBOZXcgWW9yayBDaXR5IGdvdmVybm1lbnQgaW4gb3JkZXIgdG8gY3JlYXRlIGEgaGVhbHRoaWVyLCBtb3JlIHZpYnJhbnQsIGFuZCBpbmNsdXNpdmUgY2l0eSBmb3IgYWxsIE5ldyBZb3JrZXJzLg0KDQojIyBSZWZlcmVuY2UNCg0KQXJjaGl2ZWQgUGFya3MgWm9uZSBmcm9tIE5ldyBZb3JrIENpdHkgT3BlbiBEYXRhIDxodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9DaXR5LUdvdmVybm1lbnQvQVJDSElWRUQtUGFya3MtWm9uZXMvcmphai16Z3E3Pg0KDQpEaXNwYXJpdGllcyBhbW9uZyBDaGlsZHJlbiB3aXRoIEFzdGhtYSBpbiBOZXcgWW9yayA8aHR0cHM6Ly93d3cubnljLmdvdi9hc3NldHMvZG9oL2Rvd25sb2Fkcy9wZGYvZXBpL2RhdGFicmllZjEyNi5wZGY+DQo=