Food Security Cluster Myanmar homepage


Acronyms
ACLED Armed Conflict Location and Event Data Project
CCCM Camp Management and Camp Coordination
CSO Civil Society Organization
FAO Food and Agriculture Organization
FSC Food Security Cluster
HARP Humanitarian Assistance and Resilience Programme (DfID)
HNO Humanitarian Needs Overview
HRP Humanitarian Response Plan
IDP Internally Displaced Person
IERP Interim Emergency Response Plan
IFPRI International Food Policy Research Institute
MIMU Myanmar Information Management Unit
NNGO National Non-governmental Organization
OCHA UN Office for the Coordination of Humanitarian Affairs
UXO Unexploded Ordnance
WFP World Food Programme


Introduction

In 2021, Myanmar experienced more conflict events than any other country.

Despite existing in a state of civil war for the past 70 years, conflict in Myanmar had remained at a relatively low level when compared with the other high conflict countries, such as Syria, Yemen and Afghanistan.

However, following the military takeover on 1 February 2021, conflict in Myanmar quickly increased, and by the end of the year it had overtaken Syria as the most conflict-affected country.

While the Russia-Ukraine war in 2022 might shift Myanmar from being the most conflict-affected country, it is likely to remain a conflict hotspot. As such, a deeper exploration of conflict in Myanmar is warranted, especially as it relates to food security and food security programming.

The following report uses data from the Armed Conflict Location and Event Data Project, or ACLED, to analyse and provide an overview of the conflict situation in Myanmar and what that means for food security into the future.




About the data

The Armed Conflict Location and Event Data Project, or ACLED, captures real-time data on the locations, dates, actors, fatalities, and types of all reported political violence and protest events around the world. As of early 2022, ACLED has recorded a total of more than 1.3 million individual events globally.

ACLED has been collecting data in Myanmar since 2010. Data is updated monthly, and is collected through a review of English and Myanmar sources to code political violence and demonstration events. The majority of the information, about 85 percent, comes from subnational, national and international media sources. The remainder comes from ACLED’s partner, the Myanmar Peace Monitor, and reports from UN agencies, international monitoring groups, and local human rights organizations.

With some exceptions, this report uses 2021 data. The data is presented using terms consistent with the ACLED codebook, the foremost resource on their methodology and a useful reference for those seeking to understand more.

The excellent scholarship of the Armed Conflict Location and Event Data Project, and their dedication to making a wealth of conflict data available for free to the public must be commended. Their calls for increased protections for journalists and independent reporting should also be supported.


References for this report

1. Progression of conflict events in Myanmar in 2021, by interaction type

Myanmar experienced 16,263 separate conflict events in 2021, which led to 11,506 fatalities. Conflict fatalities in 2021 were more than for the previous 10 years combined.

Most conflicts in Myanmar are interactions between two groups of actors, and most of these interactions involve the Myanmar Military as one of those actors.

The map below shows the progress in of six most common conflict interaction types by month. Of these, four involve the Military.

The most fatal interactions in Myanmar in 2021 were those between the Military and political militia groups. Such interactions accounted for 57% of the 11,506 conflict fatalities. In comparison, interactions between the military and rebel groups accounted for 19 percent of fatalities, military versus civilian interactions for 9 percent, and political militia versus civilians for 8 percent.

The map below plots where conflict events took place across the country, by interaction type, with the size of the points indicating the number of fatalities per event.





2. Food security partners and road network in relation to conflict events

In general, food security partners are not operating in the parts of Myanmar most affected by the post-coup. This is evident from the map below which plots Food Security Partners working across Myanmar against 2021-2022 conflict events.

This lack of partners in conflict areas is especially true around Sagaing and Magway. Sagaing region experienced the most conflict in this period, followed by Magway and Chin.



Humanitarian partners have traditionally focused on Rakhine, Kachin and northern Shan – the areas which had experienced more conflict in the past. However, a shift in the conflict dynamics in Myanmar has not yet led to a reallocation of resources to target new populations most affected by conflict. The allocation of funds away from Sagaing and Magway may also be a result of OCHA’s decision to focus on peri-urban areas under the Interim Emergency Response Plan for Myanmar which was released in June of 2021.

The distribution of Food Security Cluster partners in correlation to conflict areas is discussed in more detail in Section 6.

Many of the literal choke points in this conflict are related to the road network. The map below shows conflict events as points in red and major roads in blue. The yellow square is Nay Pyi Taw and the light blue squares are Tamu in Sagaing and Muse and Tachileik in Shan.

The main front (where Sagaing, Mandalay, Magway and Chin border each other) seems to be preventing the Tatamdaw from accessing the border crossing at Tamu and penetrating deeper into Sagaing. The border crossing at Muse is still very much contested. However, what is clear is that much of the armed resistance is aimed at preventing the Tatmadaw (projecting forward out of Nay Pyi Taw), from accessing the north of the country.

It remains to be seen whether non-state armed groups will be able to close off Kachin and Shan to the Tatmadaw and pushing the front closer to Nay Pyi Taw.

In the southeast, armed resistance seems to be aimed at preventing the Tatmadaw from reaching beyond major roads into NSAG territory which runs along the border with Thailand. However, the Tatmadaw is still able to move troops all the way down through Tanintharyi.





3. Progression and distribution of conflict events and fatalities

3.1 Conflict in Myanmar over time

Myanmar experienced a massive spike in conflict events in 2021. This sudden increase came despite the fact that Myanmar has been embroiled in a 70-year-long civil war.

In 2021, there were 16,263 conflict events in Myanmar, while in 2020 there were just 1,480. In the preceding decade, 2019 had accounted for the most conflict events, however there were only 1,811 in that year. In just two years, conflict in Myanmar increased almost tenfold.



The breakdown of conflict events in 2021 was:

2021-2022 event types by percentage of total
Event type Count Percentage
Protests 6,046 35.70
Strategic developments 3,406 20.11
Explosions/Remote violence 2,948 17.41
Battles 2,462 14.54
Violence against civilians 1,966 11.61
Riots 107 0.63
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



3.3 Progression of conflict events in 2021

The Military takeover on 1 February led to a steady rise in battles, explosions and remote violence, and strategic developments, through to May 2021.

The incidence of these events declined briefly between June and August, before rising again in September 2021.

Protests and riots peaked in March 2021, immediately after the takeover. Events involving violence against civilians grew in frequency throughout the year, though a slight decline in intensity was noted at the end of the 2021.



The table below provides a more detailed snapshot of conflicts, broken down by sub-events. Most violence against civilians was through the sub-event type labelled Attack.




3.4 Contributors to conflict fatalities

Battles and explosions and remote violence were the largest contributors to conflict fatalities in 2021.



Of concern, violence against civilians accounted for 15% of all conflict fatalities.

2021-2022 conflict fatalities by event type
Event type Fatalities Percentage
Battles 12,410 60.85
Explosions/Remote violence 4,606 22.58
Violence against civilians 2,713 13.30
Protests 376 1.84
Riots 252 1.24
Strategic developments 38 0.19
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


However, the event type Violence against civilians does not encompass all fatal incidents involving non-combatants. If the data is examined through the lens of interaction type, which records the types of actors involved in each conflict event, it shows that 17.22 percent of fatalities stem from interactions involving non-combatants, that is civilians and protesters. The next chapter deals with a more detailed assessment of the number of fatalities related to non-combatants.



The largest number of fatalities are related to events involving the military, political militias, including the People’s Defense Force, as well as those involving rebel groups.

2021-2022 conflict fatalities by interaction type
Interaction type Fatalities Percentage
Military versus Political Militia 7,133 57.92
Military versus Rebels 2,255 18.31
Military versus Civilians 1,120 9.09
Political Militia versus Civilians 906 7.36
Other 864 7.02
Sole Political Militia Action 30 0.24
Sole Military Action 8 0.06
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



3.5 Geographic distribution of conflict events in 2021



Sagaing experienced the highest number of conflict events and fatalities in 2021. Indeed, Sagaing region experienced more than three times the number of conflict-related fatalities than Magway, the next most-affected area. This represents a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.




3.6 Progression of the conflict in 2021-2022 by event type

The map below shows 2021-2022 conflict events by month. The color of each point indicates the type of conflict event. The number of fatalities associated with each event is indicated by the size of each point. It is interesting to note that after the protests in February and March 2021, the conflict moves on to a new stage in April and May, visibly increasing in intensity.





4. Conflict and non-combatants

4.1 Conflict events involving non-combatants


Non-combatants were involved in almost one third of conflict-related fatalities in Myanmar in 2021. In total, there were 20,395 fatalities, of which 4,906 were related to non-combatants.

The map below shows conflict events labelled by ACLED as Violence against civilians and where the event was described as involving a civilian, protester, or villager.

However, protest events have been filtered out as these are generally one-sided, where the only actors involved are protesters and they do not result in property damage or death.

Events involving non-combatants are plotted on the map below, with those events that resulted in fatalities shown in red.



A breakdown of sub conflict events involving non-combatants is listed below.

Top 10 sub-event types involving non-combatants in 2021-2022
Sub-event type Events Fatalities
Abduction/forced disappearance 220 0
Air/drone strike 58 92
Armed clash 357 1,282
Arrests 2,312 0
Attack 2,453 2,707
Excessive force against protesters 223 376
Looting/property destruction 1,324 0
Other 352 45
Protest with intervention 458 0
Remote explosive/landmine/IED 498 223
Shelling/artillery/missile attack 290 181
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.2 Events and fatalities involving non-combatants, by state

Most of the fatal conflict events in Myanmar in 2021 occurred in Sagaing region. In total, the region recorded 1,178 conflict-related fatalities, significantly more than in Mandalay and Yangon, the next most fatal regions. In Mandalay, there were 411 conflict-related deaths and in Yangon there were 300.


The chart above shows events and fatalities involving non-combatants, broken down by state and region.

The large number of fatalities in Sagaing, Mandalay and Yangon are due to a high rate of arrests and attacks on civilians, as shown below. However, the ratio of attacks to arrests is significantly higher in Sagaing than compared to Mandalay and Yangon.

Main sub-event types and fatalities involving non-combatants by state/region
State Arrests Attack Looting/property destruction Protest with intervention Remote explosive/landmine/IED Other Fatalities
Sagaing 387 663 589 29 70 359 1,939
Mandalay 338 388 91 70 55 95 529
Magway 254 252 219 21 31 112 399
Yangon 344 335 80 125 70 81 359
Kayin 39 48 18 15 22 129 207
Shan (North) 59 106 32 44 73 204 199
Shan (South) 106 74 27 18 29 86 199
Kayah 25 52 39 7 9 92 189
Kachin 99 95 33 37 23 110 187
Tanintharyi 123 116 31 16 8 46 168
Mon 79 87 23 16 26 49 157
Chin 43 44 74 10 17 50 125
Bago (East) 48 47 11 7 6 24 82
Ayeyarwady 195 72 35 18 22 18 63
Bago (West) 79 41 13 2 11 7 47
Rakhine 52 17 5 12 22 26 40
Naypyitaw 29 12 1 11 2 9 13
Shan (East) 13 4 3 0 2 3 2
Data sources: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


Kale Township in Sagaing experienced the highest rate of fatalities involving non-combatants in 2021. In total, 7 per cent of non-combatant-related fatalities occured in Kale, which represents 304 deaths. Overall, 250 townships reported fatalities involving non-combatants in 2021 and 2022. Of the 20 townships with the most non-combatant fatalities, 11 were in the Sagaing Region.





5. Conflict actors

5.1 Conflict events by type of actor

The next two sections summarize conflict events and fatalities by event type and actor type.

In the plot below, faceted by type of conflict actor, shows the types of conflict events each type of actor has been involved in during 2021. For instance, political militias are most heavily involved in conflict events related to explosions and remote violence, whereas rebel groups are most involved in battles.

Because most event types, with the exception of peaceful protests, involve more than one actor, individual events appear in more than one table. For example, the same battle involving state forces and rebel groups would appear in the event count tables for each type of conflict actor. This means actual number of events is less than the total shown across all tables.



2021-2022 number of conflict events by actor type
Actor type State_forces Protesters Civilians Political_militias Rebel_groups Rioters Identity_militias External_other_force
events 12,724 7,063 7,473 7,637 2,114 116 5 5
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.2 Fatalities by actor type

The tables below show the number of fatalities associated with each type of actor.

Similar to the plot above, the plot below has been faceted by actor type and shows the number of fatalities associated with a specific actor type by type of event. As these actor types are exhaustive, a specific event type can be tracked across different actors. For instance, there were 1,729 fatalities related to Violence against civilians (in green), using the plot below, one can see how many of these 1,729 fatalities the various actor types were associated with. Civilians were, of course, one of the parties involved in the Violence against civilians event type, but the other largest actors were state forces and political militias.

It should be noted that the ACLED dataset does not have a column to assign blame. For instance, under fatalities related to protests, 382 fatalities were associated with protesters, with the main other party involved almost entirely being state forces, with very small numbers being associated with rioters.




5.3 Actors associated with the most fatalities

Conflict events between the Myanmar Military and the People’s Defense Force accounted for the greatest number of fatalities in 2021. This is significant given that the People’s Defense Force (PDF) was only created in May of last year. In total, 3,143 fatalities resulted from conflict events involving the Military and the PDF.

Conflict between civilians and the Military was the second most-likely type of conflict event to cause fatalities. In total, 966 people died from this this type of conflict.

The list below shows the number of fatalities associated with interactions between a given pair of actors. Only the top 20 pairs, in terms of fatalities, are shown. Of concern is that civilians as actors appear in the list, both in interactions with the Military and with Unidentified Armed Groups fighting military forces.

Conflict actor pairs with the highest fatalities in 2021
Actor1 Actor2 Fatalities
Military Forces of Myanmar People’s Defense Force 5,548
Military Forces of Myanmar Civilians (Myanmar) 1,860
Military Forces of Myanmar Unidentified Armed Group (Myanmar) 1,445
Military Forces of Myanmar KNU/KNLA: Karen National Union/Karen National Liberation Army 1,180
Military Forces of Myanmar KIO/KIA: Kachin Independence Organization/Kachin Independence Army 1,022
Civilians (Myanmar) Unidentified Armed Group (Myanmar) 888
Military Forces of Myanmar KNDF: Karenni Nationalities Defense Force 526
Military Forces of Myanmar Protesters (Myanmar) 359
Military Forces of Myanmar MNTJP/MNDAA: Myanmar National Truth and Justice Party/Myanmar National Democratic Alliance Army 334
Military Forces of Myanmar KNPP/KA: Karenni National Progressive Party/Karenni Army 332
Military Forces of Myanmar Chinland Defense Force - Mindat 321
Military Forces of Myanmar YDF: Yaw Defense Force 309
Military Forces of Myanmar Chinland Defense Force - Matupi 286
Military Forces of Myanmar CNF/CNA: Chin National Front/Chin National Army 239
Military Forces of Myanmar Rioters (Myanmar) 231
Military Forces of Myanmar PRA: People’s Revolution Army 212
People’s Defense Force Police Forces of Myanmar 195
Military Forces of Myanmar PPDF: Pale People’s Defence Force 195
Military Forces of Myanmar CNO/CNDF: Chin National Organization/Chin National Defense Force 184
Police Forces of Myanmar Unidentified Armed Group (Myanmar) 155
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


ACLED does not collect data on the actor responsible for a fatality. This makes it impossible to distinguish whether a fatality was caused by the other actor in a conflict, or as a result of the actions of the person that dies. Despite this, it is interesting to see which actors are associated with the most fatalities, and may be considered the ‘bloodiest’.

The plot below shows the actors associated with the most fatalities, per event. Only actors who participated in more than 50 conflict events during 2021 are included.

Each point shows the average number of fatalities associated with the actor for each conflict event it participated in. The whiskers show the range of fatalities across events, with at least 95 percent of all conflict events covered within the range.

Political militias and rebel groups are associated with the highest fatality events, which is not surprising given that incidents between the People’s Defense Force and the Military resulted in the highest number of fatalities, as shown above.




5.4 Summary table of main conflict actors by actor type

Top conflict actors in 2021-2022 by actor type
Actor type Actor name Events %_of_group
Civilians
Civilians Civilians (Myanmar) 7,366 99.73
Civilians Other 20 0.27
Identity_militias
Identity_militias Rohingya Muslim Militia (Myanmar) 31 44.29
Identity_militias Rakhine Ethnic Militia (Myanmar) 24 34.29
Identity_militias Unidentified Communal Militia (Myanmar) 7 10.00
Identity_militias Other 5 7.14
Identity_militias Buddhist Militia (Myanmar) 3 4.29
Political_militias
Political_militias Unidentified Armed Group (Myanmar) 3,549 62.96
Political_militias Other 1,011 17.94
Political_militias People’s Defense Force 935 16.59
Political_militias Pyu Saw Htee 142 2.52
Protesters
Protesters Protesters (Myanmar) 8,712 99.99
Protesters Protesters (International) 1 0.01
Rebel_groups
Rebel_groups KIO/KIA: Kachin Independence Organization/Kachin Independence Army 2,776 39.21
Rebel_groups ULA/AA: United League of Arakan/Arakan Army 1,075 15.18
Rebel_groups PSLF/TNLA: Palaung State Liberation Front/Ta’ang National Liberation Army 1,054 14.89
Rebel_groups RCSS/SSA-S: Restoration Council of Shan State/Shan State Army-South 615 8.69
Rebel_groups Other 509 7.19
Rebel_groups KNU/KNLA: Karen National Union/Karen National Liberation Army 392 5.54
Rebel_groups SSPP/SSA-N: Shan State Progress Party/Shan State Army-North 359 5.07
Rebel_groups MNTJP/MNDAA: Myanmar National Truth and Justice Party/Myanmar National Democratic Alliance Army 300 4.24
Rioters
Rioters Rioters (Myanmar) 336 99.41
Rioters Other 2 0.59
State_forces
State_forces Military Forces of Myanmar 13,381 89.75
State_forces Police Forces of Myanmar 1,230 8.25
State_forces Other 298 2.00
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.5 Geographic distribution of conflict actors

Sagaing is home to a huge concentration of conflict actors, with many more than in the traditional conflict areas of Kachin, northern Shan and Rakhine.





6. Correlations between conflict and food security cluster footprint

6.1 Correlation plot

Food security partners are not operating in the parts of Myanmar most affected by conflict in 2021, as shown previously in Section 2. Sagaing region experienced the most conflict in 2021, followed by Kachin and northern Shan, however humanitarian partners continue to work in Rakhine, Kachin and southern Shan, with some shift towards working in peri-urban Yangon and Mandalay.

The plot below correlates conflict indicators with the number of FSC partners and beneficiaries at township level.

The darker the color of the circle and the larger the size, is an indication of a greater the degree of correlation, with +1 being a perfect positive correlation and -1 being a perfect negative correlation.

As may be expected, conflict indicators are highly correlated with each other. What is of concern is the very weak correlation between the presence of Food Security Cluster partners and beneficiaries in relation to the incidence of conflict.



The plot below uses the same variables as above, but provides additional detail and information.

The plot is split into an upper and lower triangle, divided diagonally by the blue histograms.

The numbers in the upper triangle are the specific numeric values of the blue and yellow circles in the plot above, indicating the correlation coefficient of between +1 and –1. The asterisks denote the level of statistical significance of the correlations. The histograms show the distribution of each variable. For the conflict variables the bars are skewed to the left, indicating that most townships experienced relatively low levels of conflict.

This is borne out in an examination of the lower triangle, where each point is a township and the red line shows the linear fit between each pair of variables. Most townships tend to be concentrated around the bottom-left quadrant of the chart, with many outliers. The steeper the gradient of red line, the stronger the correlation.

For instance, the two variables most highly-correlated with each other are violence against civilians and strategic developments: they share a correlation coefficient of 0.79, meaning that in 79% of the townships in which violence against civilians occurred, strategic developments also took place (the most common strategic developments were arrests and property damage). This relationship is statistically significant, that is to say, it was not by chance that these two types of conflict events tended to occur in the same places.


The numbers of partners and beneficiaries per township were, unsurprisingly, correlated with each other. However, the number of partners per township was only slightly correlated with the number of battles and the number of explosions and remote violence – this pattern likely only holds for certain states. The number of beneficiaries reached is not correlated with any conflict indicators



6.2 Conflict score and beneficiaries reached

A conflict score, at its most basic, is an average of the normalized values of key conflict indicators. Its main use it to aid decisions about geographic prioritization. Using ACLED data, a conflict score was calculated at township level, and this is shown plotted against food security beneficiary reach in 2021. The conflict score here is an update of the conflict index in the MIMU-HARP Vulnerability Analysis, using 2021 data. The specific conflict variables that included in the score were battles, explosions and remote violence, non-peaceful protests and riots, conflict-related fatalities and strategic developments.

The spread of beneficiaries shows no discernible relationship between the incidence of conflict and the beneficiaries being reached. Please download the code here to see in detail how the conflict score was calculated.




6.3 Township-level distribution of conflict events and fatalities

Townships that experience the most conflict events and conflict-related fatalities, combined, can be considered those most affected.

The plot below shows the distribution of conflict events and fatalities by township. The townships in the upper right quadrant are the most conflict-affected, of which there are 57. While prioritization of support is necessary, it seems clear these townships should be targeted.

Further detail is provided about these townships in section 9.1.





7. Agriculture and conflict

7.1 Summary of agricultural statistics


Detailed township-level agricultural statistics for Myanmar were last made available in 2016. These statistics were included in the MIMU-HARP report Vulnerability in Myanmar.

However, the statistics are somewhat limited in value because they were collected after major floods in 2015 and were used to document losses and guide development of a national recovery plan. Many of the values related to areas harvested are anomalous. However, agricultural areas sown are unlikely to have shifted greatly in the past 6 years, indeed the sown area of paddy fields only varied by 0.1% between 2015/2016 and 2018/2019 when compared at the national level.

The plot below shows the state/regional breakdown of the total sown area in acres in 2015/2016, by major crop type.

Ayeyarwady, Sagaing, Bago and Magway contain the main agricultural production areas of Myanmar. Though Mandalay, Magway and Sagaing show a much higher diversity of crop types compared to other states/regions which are dominated by paddy rice.



The 2015/2016 agricultural data is also useful for determining the net margins per acre of crop type, and therefore the potential cost of crop losses due to conflict.

Paddy rice crops provided the lowest net margins. Areas with diverse crops enjoyed higher margins in 2015/2016.

Assuming these margins are still accurate, areas of Myanmar with greater levels of crop diversification, such as Mandalay, Magway and Sagaing, have likely suffered greater economic impacts from conflict events.


Net margin per acre of major crops (2015)
Crop type Net margin (USD) Harvested area (acres) Harvested area % Margin per acre (USD)
Maize 351,623,671 1,144,769 3.48 307
Green Gram 686,210,129 2,915,748 8.87 235
Pigeon Pea 375,384,475 1,596,547 4.85 235
Groundnut 302,247,466 2,305,150 7.01 131
Urad Pea 293,636,574 2,717,568 8.26 108
Sesame 319,141,771 3,904,036 11.87 82
Paddy 1,176,706,195 17,367,234 52.81 68
Data source: Ministry of Agriculture, Livestock and Irrigation (2015/2016)



7.2 Conflict score and agriculture

Conflict has a real effect on food prices, as demonstrated by the International Food Policy Research Institute (IFPRI) in their working paper Agricultural value chains in a fragile state: the case of rice in Myanmar.

IFPRI noted that whilst neither paddy nor milled rice (100 kg of harvested paddy yields about 68 kg milled rice, which is then sold on to retailers) had seen any major price changes after the military takeover, the retail price of rice has been noticeably higher. Surveyed food vendors also reported experiencing a steep increase in “local farmer supply difficulties” and “outside village supply difficulties”.

This indicates that the conflict is impacting agricultural supply chains and prices. In total, retail rice prices have increased 11 per cent since the military takeover. IFPRI noted that 10 additional violent events in the month-of and month before a price measurement was associated with a 1 and 2 percent increase in price dispersion, respectively, at the mill and vendor levels. As IFPRI reported, “the impact of 10 violent events is approximately equivalent to 167-333 km of distance between mills and vendors”.

The treemap below shows the intersection of acres of land sown and the conflict score calculated from ACLED data. Townships are represented by the smaller rectangles and are grouped by state/region. The amount of agricultural area sown in a state or region is reflected by the size of the larger rectangles. The severity of conflict in a township is indicated by its color.

Sagaing and Magway are two of the top areas in Myanmar for agricultural production, and their townships were most affected by conflict in 2021. Agricultural areas in Ayeyarwady, Bago, Yangon, Rakhine and Shan (East) have been less affected by conflict events and fatalities, indicating that access to fields and markets not been disrupted and existing livelihoods programme designs may be sufficient in these areas.

Ensuring food security in Sagaing, Magway, Mandalay, Mon, Kayin, Kachin and Kayah, livelihood programming should be predicated on safe access to agricultural land and markets. While a more thorough analysis of market access in these areas is warranted, facilitating access between producers, millers and vendors would contribute to the stabilization of prices. There is also a need for mine-risk education as many areas might be contaminated by UXOs. For reference, the map in section 3.4 to see where explosions and remote violence have occurred.



The next treemap uses the same area scale as above, but the colours of each township have been changed to reflect the net margins earned from agricultural production in 2015/2016.

While Ayeyarwady had the largest cultivated area of all the states and regions, its share of the net margins per acre tended to be lower than in many other parts of the country. This is largely due to the much higher levels of crop diversification in Magway and Sagaing or rather, the predominance of paddy cultivation in Ayeyarwady. Despite the anomalous post-flood data from 2015/2016, this shows the areas of Sagaing and Magway have the most to lose in relation to conflict and crop losses or damage.




7.3 Maps of conflict events, fatalities and agricultural area sown

Click here to see interactive versions of these maps. Please note the maps are large and will take a long time to load. Static versions are below.




8. Text mining conflict event descriptions

8.1 Network graph of conflict descriptions

ACLED data catalogued 16,263 conflict events in Myanmar in 2021. For each event, a series of notes is logged, which contain a description of the event. The descriptions include information on the location of the conflict, the actors involved, and the immediate impact. A sample of conflict event descriptions from the ACLED dataset are shown below. To better understand the data, each descriptive paragraph was broken down by individual words to better identify key words and the relationships between them.

Examples of conflict descriptions from the ACLED dataset
data_id notes
8655424 On 17 November 2021, in Yesagyo town (Yesagyo township, Pakokku district, Magway region), a parcel bomb exploded at the home of a NLD activist when opened the parcel thrown by two motorcyclists in front of the home in No (1) Htin Tan ward. The activist, his wife, his daughter and one neighbor were killed. Locals speculated that the leader of the Pyu Saw Htee group (also a military informant) and military forces jointly assassinated them.
7761223 Displacement: Around 16 March 2021 (as reported), in Hpapun township (Hpapun District, Kayin State), about 800 villagers from two villages fled their villages after the Myanmar military fired artillery shells into the villages and burned rice fields.
7695728 On 9 February 2021, in Khaing Sein village, Mongtong village tract, Hsipaw township, Kyaukme district, Shan state, the military and RCSS/SSA-S clashed. Myanmar military 22, 243 LIB and 567 LID were involved. Another clash was reported in Pang Hkar village.
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


When the conflict description key words are mapped onto a network graph, as below, clusters of words become apparent. Only those words that appeared in at least 70 conflict descriptions, and had a correlation of above 0.2 with at least one other word were mapped. There are fours clusters of words of note. The first centers around the word protests, the second around protest-related words, the third around remote, controlled and explosives, and the fourth around Kachin township names.


conflict network graph Click here to see the full-sized graph.


The first cluster centers on the word protests. The word is closely linked to other words including coup and disobedience. Linked to this cluster is a second which contains the words live, rubber, bullets, disperse and crowd. It is easily surmised these words relate to conflict events surrounding the February 2021 military takeover and the mass demonstrations in response. Indeed, the word February is also closely linked with both clusters.

Another cluster of note centers around the words remote, controlled and explosives. The cluster is closely linked to a second series of words, including convoy, trucks and landmines. These word are likely linked to events where military convoys were bombed and ambushed by the People’s Defence Forces.

There is also a Kachin cluster of words, centered around the township names of Myitkyina, Waingmaw, Monhyin, Hpakant, Bhamo, as well as KIA, the acronym for the Kachin Independence Army.

The plots below show the top 20 words associated with each type of conflict event. These plots provide an alternative way of reading or interpreting the word data. Of interest, the word clashed is most likely to appear in descriptions of battles, while the word coup is more likely to appear in descriptions of protest events.




8.2 Pairwise correlations

To further interrogate the ACLED conflict descriptions, correlations between individual words were also assessed. When a particular word is of interest, it may be useful to see its most likely word pair.

The table below shows the 20 most common word pairings, where each word has appeared in an ACLED conflict description at least 50 times. A correlation of 1 means that the word always appears with its match in the dataset; a correlation of 0.5 means that the word appears in the same event as its match 50 percent of the time.

You can use the filter above the column word to see different word pairings. We suggest starting with artillery, protest, landmine or a location of interest to see how the pairings change. The search bar will search in both columns and so may prove less useful than the filter function.




8.3 Fatalities and word correlations

Another way to interpret the ACLED description data through word associations, is to look at the words used to describe conflict events that resulted in fatalities.

The plots below show the top 30 words associated with conflict events that either resulted in fatalities (shown in red), or did not (shown in blue).

In each plot, the most common words are ranked in terms of how often they are used to describe a conflict event that did or did not result in fatalities.

Of interest, when a fatal conflict is described, the description most often uses the words shot, soldiers, injured, PDF and military. In contrast, the words displacement, change, formed, arrested and offices were most likely to be used to describe events that did not result in fatalities.

An interesting next step in understanding the descriptive data might be to try and develop a predictive model based on the conflict descriptions to better understand which types of events are more likely to result in fatalities.




8.4 Sources used by the ACLED dataset

In most cases, the ACLED dataset’s descriptions of each conflict event comes from news sources.

A total of 67 news sources were used in the ACLED Myanmar dataset. About one third of the conflict events included in the ACLED dataset for 2021 were originally reported in the Democratic Voice of Burma. The most common news sources are listed in the table below. They are ranked by order of the share of 2021 conflict events attributed to them.



As a point of comparison, ACLED’s methodology and dataset was discussed with the Nexus Response Mechanism’s (NRM) Conflict Analysis and Research Facility, which also maintains its own dataset of conflict events. It was noted that the two datasets are very similar, both relying largely on media sources, with the only exception being the inclusion of social media posts in the NRM dataset. The FSC will continue to use ACLED data for analysis going forward as it is free and publicly available.




9. Next steps

The ACLED data is an important source of data for better understanding the scope nature of conflict in Myanmar. However, more can be done to interrogate how conflict impacts food security in the country. Furthermore, the incidence of conflict, to-date, has not been taken into account when allocating resources in food security programming and it is important to ensure that the data presented in this report are used to inform programmatic and operational decision making.

To better understand impact of conflict on food security, the following steps are recommended.

  1. Review all findings with other humanitarian stakeholders and develop area-specific products, as necessary. The conflict score that has been calculated is an important tool for geographic prioritization and food security partners should be oriented on its use. The data used to generate the conflict score is both easily accessible and regularly updated, though it remains to be seen to what extent this is true for data on displacement.

  2. Re-calculate the conflict score once updated IDP data is obtained and compare these results to previous results recorded by MIMU-HARP in their vulnerability analysis. To note, displacement is likely to be highly correlated with the other conflict indicators (this was the case with the MIMU-HARP conflict index). Nevertheless, it was a key component of the MIMU-HARP model and its inclusion will aid in improving comparability.

  3. Compare conflict scores and conflict indicators to the results of the WFP-FAO food insecurity survey. It will be important to understand if there are any significant correlations between the scores and results. Further, the two datasets could be filtered to only include time periods relevant to the WFP-FAO study. Additionally, conflict scores could be cross-referenced with market prices to see if a predictive model can be established. Conflict data should also be mapped against data on malnutrition. While there will likely be many challenges in obtaining accurate mortality rates, the impact of conflict on malnutrition should be better understood.

  4. Compare conflict indicators to market prices to whether conflict events have had an impact on food prices and price stability. Again, a predictive model could be developed from this comparison.

  5. Compare ACLED data against MIMU’s hard-to-reach areas dataset.

  6. Cross-reference conflict data with partner presence and achievements of other clusters.




10. Reference maps and tables

10.1 Conflict events in 2021 aggregated at township level



10.2 Conflict actors in 2021



10.3 Reference maps

LS0tDQp0aXRsZTogIlVuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmUiDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIxMS8wMi8yMDIyLCBVcGRhdGVkIDAxLzA2LzIwMjIiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUgIA0KZ29vZ2xlX2FuYWx5dGljczogRy03Q1pQUUpWUVZMDQotLS0NCg0KPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4NCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctN0NaUFFKVlFWTCI+PC9zY3JpcHQ+DQo8c2NyaXB0Pg0KICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsNCiAgZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7fQ0KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOw0KDQogIGd0YWcoJ2NvbmZpZycsICdHLTdDWlBRSlZRVkwnKTsNCjwvc2NyaXB0Pg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KDQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiIjsNCiAgZGlzcGxheTogYmxvY2s7DQogIGhlaWdodDogNzBweDsNCiAgbWFyZ2luOiAyZW0gMjBweCA0MHB4IDIwcHg7DQogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiTXlhbm1hcl9jbHVzdGVyX2JsdWUucG5nIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShib29rZG93bikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeSh3aWR5cikNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShtZGVwcml2KQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeSh0cmVlbWFwaWZ5KQ0KbGlicmFyeSh0aWR5bG8pDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzLCAyIGdyb3VwZWQgdmFyaWFibGVzDQpzdW1fYmVuMiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3ZhcjEsIGNvbHVtbl92YXIyKXsNCiAgDQogIGNvbHVtbl92YXIxIDwtIGVucXVvKGNvbHVtbl92YXIxKQ0KICBjb2x1bW5fdmFyMiA8LSBlbnF1byhjb2x1bW5fdmFyMikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcjEsICEhY29sdW1uX3ZhcjIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGN1bXVhbHRpdmUgY291bnQNCmN1bWNvdW50IDwtIGZ1bmN0aW9uKHgpew0KICBjdW1jb3VudCA8LSBudW1lcmljKGxlbmd0aCh4KSkNCiAgbmFtZXMoY3VtY291bnQpIDwtIHgNCg0KICBmb3IoaSBpbiAxOmxlbmd0aCh4KSl7DQogICAgY3VtY291bnRbaV0gPC0gc3VtKHhbMTppXT09eFtpXSkNCiAgfQ0KDQogIHJldHVybihjdW1jb3VudCkNCn0NCg0KYGBgDQoNCltGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciBob21lcGFnZV0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vKQ0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWFjcm9ueW1zLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0cmliYmxlKA0KICB+YWNyb255bSwgfm5hbWUsIA0KICAiQUNMRUQiLCAiQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gYW5kIEV2ZW50IERhdGEgUHJvamVjdCIsDQogICJDQ0NNIiwgIkNhbXAgTWFuYWdlbWVudCBhbmQgQ2FtcCBDb29yZGluYXRpb24iLA0KICAiQ1NPIiwgIkNpdmlsIFNvY2lldHkgT3JnYW5pemF0aW9uIiwNCiAgIkZBTyIsICJGb29kIGFuZCBBZ3JpY3VsdHVyZSBPcmdhbml6YXRpb24iLA0KICAiRlNDIiwgIkZvb2QgU2VjdXJpdHkgQ2x1c3RlciIsDQogICJIQVJQIiwgIkh1bWFuaXRhcmlhbiBBc3Npc3RhbmNlIGFuZCBSZXNpbGllbmNlIFByb2dyYW1tZSAoRGZJRCkiLA0KICAiSE5PIiwgIkh1bWFuaXRhcmlhbiBOZWVkcyBPdmVydmlldyIsDQogICJIUlAiLCAiSHVtYW5pdGFyaWFuIFJlc3BvbnNlIFBsYW4iLA0KICAiSURQIiwgIkludGVybmFsbHkgRGlzcGxhY2VkIFBlcnNvbiIsIA0KICAiSUVSUCIsICJJbnRlcmltIEVtZXJnZW5jeSBSZXNwb25zZSBQbGFuIiwNCiAgIklGUFJJIiwgIkludGVybmF0aW9uYWwgRm9vZCBQb2xpY3kgUmVzZWFyY2ggSW5zdGl0dXRlIiwNCiAgIk1JTVUiLCAiTXlhbm1hciBJbmZvcm1hdGlvbiBNYW5hZ2VtZW50IFVuaXQiLA0KICAiTk5HTyIsICJOYXRpb25hbCBOb24tZ292ZXJubWVudGFsIE9yZ2FuaXphdGlvbiIsIA0KICAiT0NIQSIsICJVTiBPZmZpY2UgZm9yIHRoZSBDb29yZGluYXRpb24gb2YgSHVtYW5pdGFyaWFuIEFmZmFpcnMiLA0KICAiVVhPIiwgIlVuZXhwbG9kZWQgT3JkbmFuY2UiLA0KICAiV0ZQIiwgIldvcmxkIEZvb2QgUHJvZ3JhbW1lIg0KKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiKipBY3JvbnltcyoqIiwgY29sLm5hbWVzID0gTlVMTCkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIocG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQo8YnI+DQoNCiMjIEludHJvZHVjdGlvbg0KDQpJbiAyMDIxLCBNeWFubWFyIGV4cGVyaWVuY2VkIG1vcmUgY29uZmxpY3QgZXZlbnRzIHRoYW4gYW55IG90aGVyIGNvdW50cnkuDQoNCkRlc3BpdGUgZXhpc3RpbmcgaW4gYSBzdGF0ZSBvZiBjaXZpbCB3YXIgZm9yIHRoZSBwYXN0IDcwIHllYXJzLCBjb25mbGljdCBpbiBNeWFubWFyIGhhZCByZW1haW5lZCBhdCBhIHJlbGF0aXZlbHkgbG93IGxldmVsIHdoZW4gY29tcGFyZWQgd2l0aCB0aGUgb3RoZXIgaGlnaCBjb25mbGljdCBjb3VudHJpZXMsIHN1Y2ggYXMgU3lyaWEsIFllbWVuIGFuZCBBZmdoYW5pc3Rhbi4NCg0KSG93ZXZlciwgZm9sbG93aW5nIHRoZSBtaWxpdGFyeSB0YWtlb3ZlciBvbiAxIEZlYnJ1YXJ5IDIwMjEsIGNvbmZsaWN0IGluIE15YW5tYXIgcXVpY2tseSBpbmNyZWFzZWQsIGFuZCBieSB0aGUgZW5kIG9mIHRoZSB5ZWFyIGl0IGhhZCBvdmVydGFrZW4gU3lyaWEgYXMgdGhlIG1vc3QgY29uZmxpY3QtYWZmZWN0ZWQgY291bnRyeS4NCg0KV2hpbGUgdGhlIFJ1c3NpYS1Va3JhaW5lIHdhciBpbiAyMDIyIG1pZ2h0IHNoaWZ0IE15YW5tYXIgZnJvbSBiZWluZyB0aGUgbW9zdCBjb25mbGljdC1hZmZlY3RlZCBjb3VudHJ5LCBpdCBpcyBsaWtlbHkgdG8gcmVtYWluIGEgY29uZmxpY3QgaG90c3BvdC4gQXMgc3VjaCwgYSBkZWVwZXIgZXhwbG9yYXRpb24gb2YgY29uZmxpY3QgaW4gTXlhbm1hciBpcyB3YXJyYW50ZWQsIGVzcGVjaWFsbHkgYXMgaXQgcmVsYXRlcyB0byBmb29kIHNlY3VyaXR5IGFuZCBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nLg0KDQpUaGUgZm9sbG93aW5nIHJlcG9ydCB1c2VzIGRhdGEgZnJvbSB0aGUgQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gYW5kIEV2ZW50IERhdGEgUHJvamVjdCwgb3IgQUNMRUQsIHRvIGFuYWx5c2UgYW5kIHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YgdGhlIGNvbmZsaWN0IHNpdHVhdGlvbiBpbiBNeWFubWFyIGFuZCB3aGF0IHRoYXQgbWVhbnMgZm9yIGZvb2Qgc2VjdXJpdHkgaW50byB0aGUgZnV0dXJlLg0KDQo8YnI+DQoNCiFbXSguL21pc2MvYWxsX2FjbGVkXzIwMTBfMjAyMS5wbmcpDQoNCjxicj48YnI+DQoNCiMjIyBBYm91dCB0aGUgZGF0YQ0KDQpgYGB7ciBkYXRhc2V0c30NCiMgZGF0YXNldHMgDQoNCnRvd25zaGlwcyA8LSByZWFkX2NzdigiLi9kYXRhL3Rvd25zaGlwcy5jc3YiKQ0KYWNsZWQgPC0gcmVhZF9jc3YoIi4vZGF0YS9hY2xlZF8yMDIyMDEyNS5jc3YiKQ0KYWN0b3JzX25ldyA8LSByZWFkX2NzdigiLi9kYXRhL2FjdG9yc19uZXcuY3N2IikgDQphY2xlZF93b3JkcyA8LSByZWFkX2NzdigiLi9kYXRhL2FjbGVkX3dvcmRzLmNzdiIpDQp2dWxtbXIgPC0gcmVhZF9jc3YoIi4vZGF0YS92dWxtbXIuY3N2IikNCmZzYyA8LSByZWFkX2NzdigiLi9kYXRhL2ZzYzV3XzIwMjEuY3N2IikNCmZzY18yMDIyIDwtIHJlYWRfY3N2KCIuL2RhdGEvZnNjX3ExXzIwMjIuY3N2IikNCmFjbGVkX25ldyA8LSByZWFkX2NzdigiLi9kYXRhL2FjbGVkXzIwMjIwNjA2LmNzdiIpDQpjb25mbGljdF9zY29yZSA8LSByZWFkX2NzdigiLi9kYXRhL2NvbmZsaWN0X3Njb3JlMi5jc3YiKSAlPiUgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbWluMSwgYWRtaW4zLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmc2NfMjAyMiAlPiUgIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzXzIwMjEgPSBzdW0oYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpDQoNCiMgc2hhcGVmaWxlcw0KcGNvZGUzX3NoYXBlIDwtIA0KICBzdF9yZWFkKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lDQogIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSAlPiUgDQogbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvd25zaGlwLCAiSGxhaW5ndGhhcnlhIiksICJNTVIwMTMwMDgiLCBhZG1pbjNfcGNvZGUpKQ0KDQpwY29kZTFfc2hhcGUgPC0gDQogIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JQ0KICByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKSAlPiUgc3RfYXNfc2YoKQ0KDQpgYGANCg0KVGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhIFByb2plY3QsIG9yIEFDTEVELCBjYXB0dXJlcyByZWFsLXRpbWUgZGF0YSBvbiB0aGUgbG9jYXRpb25zLCBkYXRlcywgYWN0b3JzLCBmYXRhbGl0aWVzLCBhbmQgdHlwZXMgb2YgYWxsIHJlcG9ydGVkIHBvbGl0aWNhbCB2aW9sZW5jZSBhbmQgcHJvdGVzdCBldmVudHMgYXJvdW5kIHRoZSB3b3JsZC4gQXMgb2YgZWFybHkgMjAyMiwgQUNMRUQgaGFzIHJlY29yZGVkIGEgdG90YWwgb2YgbW9yZSB0aGFuIDEuMyBtaWxsaW9uIGluZGl2aWR1YWwgZXZlbnRzIGdsb2JhbGx5Lg0KDQpBQ0xFRCBoYXMgYmVlbiBjb2xsZWN0aW5nIGRhdGEgaW4gTXlhbm1hciBzaW5jZSAyMDEwLiBEYXRhIGlzIHVwZGF0ZWQgbW9udGhseSwgYW5kIGlzIGNvbGxlY3RlZCB0aHJvdWdoIGEgcmV2aWV3IG9mIEVuZ2xpc2ggYW5kIE15YW5tYXIgc291cmNlcyB0byBjb2RlIHBvbGl0aWNhbCB2aW9sZW5jZSBhbmQgZGVtb25zdHJhdGlvbiBldmVudHMuIFRoZSBtYWpvcml0eSBvZiB0aGUgaW5mb3JtYXRpb24sIGFib3V0IDg1IHBlcmNlbnQsIGNvbWVzIGZyb20gc3VibmF0aW9uYWwsIG5hdGlvbmFsIGFuZCBpbnRlcm5hdGlvbmFsIG1lZGlhIHNvdXJjZXMuIFRoZSByZW1haW5kZXIgY29tZXMgZnJvbSBBQ0xFROKAmXMgcGFydG5lciwgdGhlIE15YW5tYXIgUGVhY2UgTW9uaXRvciwgYW5kIHJlcG9ydHMgZnJvbSBVTiBhZ2VuY2llcywgaW50ZXJuYXRpb25hbCBtb25pdG9yaW5nIGdyb3VwcywgYW5kIGxvY2FsIGh1bWFuIHJpZ2h0cyBvcmdhbml6YXRpb25zLiANCg0KV2l0aCBzb21lIGV4Y2VwdGlvbnMsIHRoaXMgcmVwb3J0IHVzZXMgMjAyMSBkYXRhLiBUaGUgZGF0YSBpcyBwcmVzZW50ZWQgdXNpbmcgdGVybXMgY29uc2lzdGVudCB3aXRoIHRoZSBBQ0xFRCBjb2RlYm9vaywgdGhlIGZvcmVtb3N0IHJlc291cmNlIG9uIHRoZWlyIG1ldGhvZG9sb2d5IGFuZCBhIHVzZWZ1bCByZWZlcmVuY2UgZm9yIHRob3NlIHNlZWtpbmcgdG8gdW5kZXJzdGFuZCBtb3JlLiANCiANClRoZSBleGNlbGxlbnQgc2Nob2xhcnNoaXAgb2YgdGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhIFByb2plY3QsIGFuZCB0aGVpciBkZWRpY2F0aW9uIHRvIG1ha2luZyBhIHdlYWx0aCBvZiBjb25mbGljdCBkYXRhIGF2YWlsYWJsZSBmb3IgZnJlZSB0byB0aGUgcHVibGljIG11c3QgYmUgY29tbWVuZGVkLiBUaGVpciBjYWxscyBmb3IgaW5jcmVhc2VkIHByb3RlY3Rpb25zIGZvciBqb3VybmFsaXN0cyBhbmQgaW5kZXBlbmRlbnQgcmVwb3J0aW5nIHNob3VsZCBhbHNvIGJlIHN1cHBvcnRlZC4NCg0KDQo8YnI+DQoNCiMjIyBSZWZlcmVuY2VzIGZvciB0aGlzIHJlcG9ydA0KKiBBQ0xFRCwgKDIwMTkpLiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpIENvZGVib29rLiBodHRwczovL3d3dy5hY2xlZGRhdGEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy9kbG1fdXBsb2Fkcy8yMDE3LzEwL0FDTEVEX0NvZGVib29rXzIwMTlGSU5BTF9wYmwucGRmLg0KKiBBQ0xFRCwgKDIwMjIpLiBBQ0xFRCBkYXRhIGZvciBNeWFubWFyICgyMDEwLTIwMjIpLiBodHRwczovL2FjbGVkZGF0YS5jb20uDQoqIEFDTEVELCAoMjAyMCkuIEFDTEVEIE1ldGhvZG9sb2d5IGFuZCBDb2RpbmcgRGVjaXNpb25zIGFyb3VuZCBQb2xpdGljYWwgVmlvbGVuY2UgaW4gTXlhbm1hci4gaHR0cHM6Ly9hY2xlZGRhdGEuY29tL2FjbGVkZGF0YW5ldy93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8xMS9BQ0xFRF9Qb2xpdGljYWwtVmlvbGVuY2UtaW4tTXlhbm1hcl9GZWJydWFyeS0yMDIwLnBkZi4NCiogQXRpbGxpbyBCZW5pbmksIEFsZG8gQmVuaW5pICgyMDIxKS4gbWRlcHJpdjogU3ludGhldGljIHNjb3JlcyBvZiBtdWx0aXBsZSBkZXByaXZhdGlvbi4gUiBwYWNrYWdlIHZlcnNpb24gMC4wLjMuICBodHRwczovL2dpdGh1Yi5jb20vYS1iZW5pbmkvbWRlcHJpdi8uDQoqIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgTXlhbm1hciAoMjAyMSkuIDVXcyByZXBvcnRpbmcgdG9vbC4NCiogSEFSUC1GIGFuZCBNSU1VICgyMDE4KS4gVnVsbmVyYWJpbGl0eSBpbiBNeWFubWFyOiBBIFNlY29uZGFyeSBEYXRhIFJldmlldyBvZiBOZWVkcywgQ292ZXJhZ2UgYW5kIEdhcHMuIGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyLg0KKiBJRlBSSSAoMjAyMikuIEFncmljdWx0dXJhbCB2YWx1ZSBjaGFpbnMgaW4gYSBmcmFnaWxlIHN0YXRlOiB0aGUgY2FzZSBvZiByaWNlIGluIE15YW5tYXIuIGh0dHBzOi8vd3d3LmlmcHJpLm9yZy9wdWJsaWNhdGlvbi9hZ3JpY3VsdHVyYWwtdmFsdWUtY2hhaW5zLWZyYWdpbGUtc3RhdGUtY2FzZS1yaWNlLW15YW5tYXIuDQoqIFNpbGdlIEosIFJvYmluc29uIEQgKDIwMTYpLiB0aWR5dGV4dDogVGV4dCBNaW5pbmcgYW5kIEFuYWx5c2lzIFVzaW5nIFRpZHkgRGF0YSBQcmluY2lwbGVzIGluIFIuIEpPU1MsIDEoMykuIGRvaTogMTAuMjExMDUvam9zcy4wMDAzNywgaHR0cDovL2R4LmRvaS5vcmcvMTAuMjExMDUvam9zcy4wMDAzNy4NCjxicj48YnI+PGJyPg0KDQoNCiMjIDEuIFByb2dyZXNzaW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBpbiBNeWFubWFyIGluIDIwMjEsIGJ5IGludGVyYWN0aW9uIHR5cGUNCg0KTXlhbm1hciBleHBlcmllbmNlZCAxNiwyNjMgc2VwYXJhdGUgY29uZmxpY3QgZXZlbnRzIGluIDIwMjEsIHdoaWNoIGxlZCB0byAxMSw1MDYgZmF0YWxpdGllcy4gQ29uZmxpY3QgZmF0YWxpdGllcyBpbiAyMDIxIHdlcmUgbW9yZSB0aGFuIGZvciB0aGUgcHJldmlvdXMgMTAgeWVhcnMgY29tYmluZWQuDQoNCk1vc3QgY29uZmxpY3RzIGluIE15YW5tYXIgYXJlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHR3byBncm91cHMgb2YgYWN0b3JzLCBhbmQgbW9zdCBvZiB0aGVzZSBpbnRlcmFjdGlvbnMgaW52b2x2ZSB0aGUgTXlhbm1hciBNaWxpdGFyeSBhcyBvbmUgb2YgdGhvc2UgYWN0b3JzLg0KDQpUaGUgbWFwIGJlbG93IHNob3dzIHRoZSBwcm9ncmVzcyBpbiBvZiBzaXggbW9zdCBjb21tb24gY29uZmxpY3QgaW50ZXJhY3Rpb24gdHlwZXMgYnkgKiptb250aCoqLiBPZiB0aGVzZSwgZm91ciBpbnZvbHZlIHRoZSBNaWxpdGFyeS4NCg0KVGhlIG1vc3QgZmF0YWwgaW50ZXJhY3Rpb25zIGluIE15YW5tYXIgaW4gMjAyMSB3ZXJlIHRob3NlIGJldHdlZW4gdGhlIE1pbGl0YXJ5IGFuZCBwb2xpdGljYWwgbWlsaXRpYSBncm91cHMuIFN1Y2ggaW50ZXJhY3Rpb25zIGFjY291bnRlZCBmb3IgNTclIG9mIHRoZSAxMSw1MDYgY29uZmxpY3QgZmF0YWxpdGllcy4gSW4gY29tcGFyaXNvbiwgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIG1pbGl0YXJ5IGFuZCByZWJlbCBncm91cHMgYWNjb3VudGVkIGZvciAxOSBwZXJjZW50IG9mIGZhdGFsaXRpZXMsIG1pbGl0YXJ5IHZlcnN1cyBjaXZpbGlhbiBpbnRlcmFjdGlvbnMgZm9yIDkgcGVyY2VudCwgYW5kIHBvbGl0aWNhbCBtaWxpdGlhIHZlcnN1cyBjaXZpbGlhbnMgZm9yIDggcGVyY2VudC4NCg0KVGhlIG1hcCBiZWxvdyBwbG90cyB3aGVyZSBjb25mbGljdCBldmVudHMgdG9vayBwbGFjZSBhY3Jvc3MgdGhlIGNvdW50cnksIGJ5IGludGVyYWN0aW9uIHR5cGUsIHdpdGggdGhlIHNpemUgb2YgdGhlIHBvaW50cyBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgZXZlbnQuDQoNCg0KPGJyPg0KIVtdKC4vZ2lmL2FjbGVkX2ludGVyXzIwMjIuZ2lmKQ0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDIuIEZvb2Qgc2VjdXJpdHkgcGFydG5lcnMgYW5kIHJvYWQgbmV0d29yayBpbiByZWxhdGlvbiB0byBjb25mbGljdCBldmVudHMgDQoNCkluIGdlbmVyYWwsIGZvb2Qgc2VjdXJpdHkgcGFydG5lcnMgYXJlIG5vdCBvcGVyYXRpbmcgaW4gdGhlIHBhcnRzIG9mIE15YW5tYXIgbW9zdCBhZmZlY3RlZCBieSB0aGUgcG9zdC1jb3VwLiBUaGlzIGlzIGV2aWRlbnQgZnJvbSB0aGUgbWFwIGJlbG93IHdoaWNoIHBsb3RzIEZvb2QgU2VjdXJpdHkgUGFydG5lcnMgd29ya2luZyBhY3Jvc3MgTXlhbm1hciBhZ2FpbnN0IDIwMjEtMjAyMiBjb25mbGljdCBldmVudHMuDQoNClRoaXMgbGFjayBvZiBwYXJ0bmVycyBpbiBjb25mbGljdCBhcmVhcyBpcyBlc3BlY2lhbGx5IHRydWUgYXJvdW5kIFNhZ2FpbmcgYW5kIE1hZ3dheS4gU2FnYWluZyByZWdpb24gZXhwZXJpZW5jZWQgdGhlIG1vc3QgY29uZmxpY3QgaW4gdGhpcyBwZXJpb2QsIGZvbGxvd2VkIGJ5IE1hZ3dheSBhbmQgQ2hpbi4NCg0KPGJyPg0KDQpgYGB7ciBtYXAtZXZlbnRzLWZzYy1wYXJudGVycywgZmlnLmhlaWdodD0xMn0NCmFjbGVkX25ldyAlPiUgDQogIGZpbHRlcih5ZWFyID49IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgZnVsbF9qb2luKGZzY18yMDIyICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGJiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gcGFydG5lcnMpLCBzaXplID0gLjEpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSksIHNpemUgPSAuNSwgYWxwaGEgPSAuMjUsIGNvbG91ciA9ICJyZWQiKSArIA0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IC41KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgZm9vZCBzZWN1cml0eSBwYXJ0bmVycyBhbmQgY29uZmxpY3QgZXZlbnRzIGluIDIwMjEtMjAyMiIsDQogICAgICAgc3VidGl0bGUgPSAgIlJlZCBkb3RzIGFyZSBjb25mbGljdCBldmVudHM7IHBlYWNlZnVsIHByb3Rlc3RzIGhhdmUgYmVlbiBleGNsdWRlZCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZXM6IEFDTEVEOyBhY2xlZGRhdGEuY29tIGFuZCBGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciIsDQogICAgICAgZmlsbCA9ICJudW1iZXIgb2ZcbnBhcnRuZXJzIikgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoNCg0KIDxicj4NCiANCkh1bWFuaXRhcmlhbiBwYXJ0bmVycyBoYXZlIHRyYWRpdGlvbmFsbHkgZm9jdXNlZCBvbiBSYWtoaW5lLCBLYWNoaW4gYW5kIG5vcnRoZXJuIFNoYW4g4oCTIHRoZSBhcmVhcyB3aGljaCBoYWQgZXhwZXJpZW5jZWQgbW9yZSBjb25mbGljdCBpbiB0aGUgcGFzdC4gSG93ZXZlciwgYSBzaGlmdCBpbiB0aGUgY29uZmxpY3QgZHluYW1pY3MgaW4gTXlhbm1hciBoYXMgbm90IHlldCBsZWQgdG8gYSByZWFsbG9jYXRpb24gb2YgcmVzb3VyY2VzIHRvIHRhcmdldCBuZXcgcG9wdWxhdGlvbnMgbW9zdCBhZmZlY3RlZCBieSBjb25mbGljdC4gVGhlIGFsbG9jYXRpb24gb2YgZnVuZHMgYXdheSBmcm9tIFNhZ2FpbmcgYW5kIE1hZ3dheSBtYXkgYWxzbyBiZSBhIHJlc3VsdCBvZiBPQ0hB4oCZcyBkZWNpc2lvbiB0byBmb2N1cyBvbiBwZXJpLXVyYmFuIGFyZWFzIHVuZGVyIHRoZSBJbnRlcmltIEVtZXJnZW5jeSBSZXNwb25zZSBQbGFuIGZvciBNeWFubWFyIHdoaWNoIHdhcyByZWxlYXNlZCBpbiBKdW5lIG9mIDIwMjEuDQoNClRoZSBkaXN0cmlidXRpb24gb2YgRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGluIGNvcnJlbGF0aW9uIHRvIGNvbmZsaWN0IGFyZWFzIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbCBpbiBTZWN0aW9uIDYuDQoNCg0KTWFueSBvZiB0aGUgbGl0ZXJhbCBjaG9rZSBwb2ludHMgaW4gdGhpcyBjb25mbGljdCBhcmUgcmVsYXRlZCB0byB0aGUgcm9hZCBuZXR3b3JrLiBUaGUgbWFwIGJlbG93IHNob3dzIGNvbmZsaWN0IGV2ZW50cyBhcyBwb2ludHMgaW4gcmVkIGFuZCBtYWpvciByb2FkcyBpbiBibHVlLiBUaGUgeWVsbG93IHNxdWFyZSBpcyBOYXkgUHlpIFRhdyBhbmQgdGhlIGxpZ2h0IGJsdWUgc3F1YXJlcyBhcmUgVGFtdSBpbiBTYWdhaW5nIGFuZCBNdXNlIGFuZCBUYWNoaWxlaWsgaW4gU2hhbi4gDQoNClRoZSBtYWluIGZyb250ICh3aGVyZSBTYWdhaW5nLCBNYW5kYWxheSwgTWFnd2F5IGFuZCBDaGluIGJvcmRlciBlYWNoIG90aGVyKSBzZWVtcyB0byBiZSBwcmV2ZW50aW5nIHRoZSBUYXRhbWRhdyBmcm9tIGFjY2Vzc2luZyB0aGUgYm9yZGVyIGNyb3NzaW5nIGF0IFRhbXUgYW5kIHBlbmV0cmF0aW5nIGRlZXBlciBpbnRvIFNhZ2FpbmcuIFRoZSBib3JkZXIgY3Jvc3NpbmcgYXQgTXVzZSBpcyBzdGlsbCB2ZXJ5IG11Y2ggY29udGVzdGVkLiBIb3dldmVyLCB3aGF0IGlzIGNsZWFyIGlzIHRoYXQgbXVjaCBvZiB0aGUgYXJtZWQgcmVzaXN0YW5jZSBpcyBhaW1lZCBhdCBwcmV2ZW50aW5nIHRoZSBUYXRtYWRhdyAocHJvamVjdGluZyBmb3J3YXJkIG91dCBvZiBOYXkgUHlpIFRhdyksIGZyb20gYWNjZXNzaW5nIHRoZSBub3J0aCBvZiB0aGUgY291bnRyeS4gDQoNCkl0IHJlbWFpbnMgdG8gYmUgc2VlbiB3aGV0aGVyIG5vbi1zdGF0ZSBhcm1lZCBncm91cHMgd2lsbCBiZSBhYmxlIHRvIGNsb3NlIG9mZiBLYWNoaW4gYW5kIFNoYW4gdG8gdGhlIFRhdG1hZGF3IGFuZCBwdXNoaW5nIHRoZSBmcm9udCBjbG9zZXIgdG8gTmF5IFB5aSBUYXcuICANCg0KSW4gdGhlIHNvdXRoZWFzdCwgYXJtZWQgcmVzaXN0YW5jZSBzZWVtcyB0byBiZSBhaW1lZCBhdCBwcmV2ZW50aW5nIHRoZSBUYXRtYWRhdyBmcm9tIHJlYWNoaW5nIGJleW9uZCBtYWpvciByb2FkcyBpbnRvIE5TQUcgdGVycml0b3J5IHdoaWNoIHJ1bnMgYWxvbmcgdGhlIGJvcmRlciB3aXRoIFRoYWlsYW5kLiBIb3dldmVyLCB0aGUgVGF0bWFkYXcgaXMgc3RpbGwgYWJsZSB0byBtb3ZlIHRyb29wcyBhbGwgdGhlIHdheSBkb3duIHRocm91Z2ggVGFuaW50aGFyeWkuIA0KDQo8YnI+DQogDQogIVtdKC4vbWlzYy9yb2FkX2NvbmZsaWN0X3RpdGxlLnBuZykNCiANCiA8YnI+PGJyPjxicj4NCg0KDQojIyAzLiBQcm9ncmVzc2lvbiBhbmQgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcw0KDQojIyMgMy4xIENvbmZsaWN0IGluIE15YW5tYXIgb3ZlciB0aW1lDQoNCk15YW5tYXIgZXhwZXJpZW5jZWQgYSBtYXNzaXZlIHNwaWtlIGluIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxLiAgVGhpcyBzdWRkZW4gaW5jcmVhc2UgY2FtZSBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgTXlhbm1hciBoYXMgYmVlbiBlbWJyb2lsZWQgaW4gYSA3MC15ZWFyLWxvbmcgY2l2aWwgd2FyLiANCg0KSW4gMjAyMSwgdGhlcmUgd2VyZSAxNiwyNjMgY29uZmxpY3QgZXZlbnRzIGluIE15YW5tYXIsIHdoaWxlIGluIDIwMjAgdGhlcmUgd2VyZSBqdXN0IDEsNDgwLiBJbiB0aGUgcHJlY2VkaW5nIGRlY2FkZSwgMjAxOSBoYWQgYWNjb3VudGVkIGZvciB0aGUgbW9zdCBjb25mbGljdCBldmVudHMsIGhvd2V2ZXIgdGhlcmUgd2VyZSBvbmx5IDEsODExIGluIHRoYXQgeWVhci4gSW4ganVzdCB0d28geWVhcnMsIGNvbmZsaWN0IGluIE15YW5tYXIgaW5jcmVhc2VkIGFsbW9zdCB0ZW5mb2xkLg0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QteWVhci1ldmVudHN9DQphY2xlZF9uZXcgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGV2ZW50X3R5cGUpICYgeWVhciA8PSAyMDIyKSAlPiUNCiAgbXV0YXRlKHllYXIgPSByb3VuZCh5ZWFyKSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBldmVudF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBjb3VudCwgZmlsbCA9IGV2ZW50X3R5cGUsIGdyb3VwID0gZXZlbnRfdHlwZSkpICsgDQogICMgZ2VvbV9saW5lKHNpemUgPSAxKSArIA0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHN0YXQoeSksIGFjY3VyYWN5ID0gMSksIA0KICAgICAgICAgICAgICAgIGdyb3VwID0geWVhciksIA0KICAgICAgICAgICAgc3RhdCA9ICJzdW1tYXJ5IiwgDQogICAgICAgICAgICBmdW4gPSBzdW0sIA0KICAgICAgICAgICAgdmp1c3QgPSAtMC43LCANCiAgICAgICAgICAgIHNpemUgPSAzKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAxMCwgMjAyMiwgYnkgPSAxKSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBsaW1pdHMgPSBjKDAsIDE3MDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGJ5IGV2ZW50IHR5cGUsIDIwMTAtMjAyMSIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQpgYGANCg0KPGJyPg0KDQoNClRoZSBicmVha2Rvd24gb2YgY29uZmxpY3QgZXZlbnRzIGluIDIwMjEgd2FzOg0KDQpgYGB7ciBjb25mbGljdC1ldmVudHMtc3VtbWFyeS0yMDIxfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShDb3VudCA9IG4oKSkgJT4lIA0KICBtdXRhdGUoUGVyY2VudGFnZSA9IHJvdW5kKENvdW50IC8gc3VtKENvdW50KSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVuYW1lKGBFdmVudCB0eXBlYCA9IGV2ZW50X3R5cGUpICU+JSANCiAgYXJyYW5nZShkZXNjKFBlcmNlbnRhZ2UpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMS0yMDIyIGV2ZW50IHR5cGVzIGJ5IHBlcmNlbnRhZ2Ugb2YgdG90YWwiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgQ29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIA0KDQpNeWFubWFyIGV4cGVyaWVuY2VkICBtb3JlIGNvbmZsaWN0IGZhdGFsaXRpZXMgaW4gMjAyMSB0aGFuIGluIHRoZSBwcmVjZWRpbmcgZGVjYWRlLiBJbiAyMDIxIHRoZXJlIHdlcmUgMTEsNTA2IGNvbmZsaWN0LXJlbGF0ZWQgZGVhdGhzLiBCZXR3ZWVuIDIwMTAgYW5kIDIwMjAgdGhlIGNvbWJpbmVkIG51bWJlciBvZiBkZWF0aHMgd2FzIDksNDA0LiBUaGUgdmlvbGVuY2UgYXBwZWFycyB0byBiZSBpbnRlbnNpZnlpbmcsIHdpdGggOSwzODMgZmF0YWxpdGllcyBhcyBvZiAzMSBNYXkgMjAyMi4gDQoNClZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGFjY291bnRlZCBmb3IgMSw4OTEgZGVhdGhzLiBUaGlzIHdhcyBtb3JlIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBmYXRhbGl0aWVzIGFjcm9zcyBhbGwgY29uZmxpY3QgZXZlbnRzIGluIDIwMTkuIEJlZm9yZSAyMDIxLCAyMDE5IGhhZCBiZWVuIHRoZSBkZWFkbGllc3QgY29uZmxpY3QgeWVhciBpbiBNeWFubWFyIGluIHRoZSBwYXN0IGRlY2FkZS4NCg0KSG93ZXZlciwgYW55IHJlYWN0aW9uIHRvIHRoaXMgc2lnbmlmaWNhbnQgaW5jcmVhc2UgYXBwZWFycyBsaW1pdGVkLiBZZXQsIGlmIGEgc2luZ2xlIGV2ZW50IHN1Y2ggYXMgYSBjeWNsb25lIGhhZCBpbmNyZWFzZWQgYW5udWFsIGZhdGFsaXRpZXMgYnkgbW9yZSB0aGFuIDEwMDAlLCBvbmUgbWlnaHQgZXhwZWN0IGFuIHVyZ2VudCByZXNwb25zZSBhbmQgYSBkcmFzdGljIHJlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMuDQoNCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LXllYXItZmF0YWx0aWVzfQ0KYWNsZWRfbmV3ICU+JSANCiAgZmlsdGVyKCFpcy5uYShldmVudF90eXBlKSAmIHllYXIgPD0gMjAyMikgJT4lDQogIG11dGF0ZSh5ZWFyID0gcm91bmQoeWVhcikpICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBmYXRhbGl0aWVzLCBmaWxsID0gZXZlbnRfdHlwZSwgZ3JvdXAgPSBldmVudF90eXBlKSkgKyANCiAgIyBnZW9tX2xpbmUoc2l6ZSA9IDEpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSB5ZWFyKSwgDQogICAgICAgICAgICBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNywgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDEwLCAyMDIyLCBieSA9IDEpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGxpbWl0cyA9IGMoMCwgMTI1MDApKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJGYXRhbGl0aWVzIGJ5IGNvbmZsaWN0IGV2ZW50IHR5cGUsIDIwMTAtMjAyMiIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAzLjMgUHJvZ3Jlc3Npb24gb2YgY29uZmxpY3QgZXZlbnRzIGluIDIwMjENCg0KVGhlIE1pbGl0YXJ5IHRha2VvdmVyIG9uIDEgRmVicnVhcnkgbGVkIHRvIGEgc3RlYWR5IHJpc2UgaW4gYmF0dGxlcywgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlLCBhbmQgc3RyYXRlZ2ljIGRldmVsb3BtZW50cywgdGhyb3VnaCB0byBNYXkgMjAyMS4gDQoNClRoZSBpbmNpZGVuY2Ugb2YgdGhlc2UgZXZlbnRzIGRlY2xpbmVkIGJyaWVmbHkgYmV0d2VlbiBKdW5lIGFuZCBBdWd1c3QsIGJlZm9yZSByaXNpbmcgYWdhaW4gaW4gU2VwdGVtYmVyIDIwMjEuDQoNClByb3Rlc3RzIGFuZCByaW90cyBwZWFrZWQgaW4gTWFyY2ggMjAyMSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRha2VvdmVyLiBFdmVudHMgaW52b2x2aW5nIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGdyZXcgaW4gZnJlcXVlbmN5IHRocm91Z2hvdXQgdGhlIHllYXIsIHRob3VnaCBhIHNsaWdodCBkZWNsaW5lIGluIGludGVuc2l0eSB3YXMgbm90ZWQgYXQgdGhlIGVuZCBvZiB0aGUgMjAyMS4NCiANCg0KPGJyPg0KDQpgYGB7ciBmYWNldC1saW5lLXBsb3QtbW9udGhseSxmaWcuaGVpZ2h0PTl9DQoNCmFjbGVkX25ldyAlPiUgDQogIGZpbHRlcih5ZWFyID49IDIwMjEpICU+JSANCiAgZmlsdGVyKGV2ZW50X2RhdGUgPCAiMjAyMi0wNi0wMSIpICU+JSANCiAgZ3JvdXBfYnkoZXZlbnRfZGF0ZSwgZXZlbnRfdHlwZSkgJT4lICANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGV2ZW50X2RhdGUsIHkgPSBjb3VudCwgY29sb3VyID0gZXZlbnRfdHlwZSwgZ3JvdXAgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSwgYWxwaGEgPSAuNSwgc2l6ZSA9IC41KSArDQogIGdlb21fbGluZSgpICsNCiAgZmFjZXRfd3JhcCh+IGV2ZW50X3R5cGUsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMSkgKyANCiAgIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGV2ZW50cyBwZXIgZGF5IiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBwZXIgZGF5LCBieSB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgbGFiZWxzID0gZGF0ZV9mb3JtYXQoZm9ybWF0ID0gIiVZLSViIikpDQoNCiNnZ3NhdmUoIi4vbWlzYy9ldmVudF9kYXlzLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTEsIHdpZHRoID0gMTQsIHVuaXRzID0gImluIikNCg0KYGBgDQoNCjxicj4NCg0KVGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIGEgbW9yZSBkZXRhaWxlZCBzbmFwc2hvdCBvZiBjb25mbGljdHMsIGJyb2tlbiBkb3duIGJ5IHN1Yi1ldmVudHMuIE1vc3QgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgd2FzIHRocm91Z2ggdGhlIHN1Yi1ldmVudCB0eXBlIGxhYmVsbGVkICpBdHRhY2sqLiANCiANCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3Qtc3ViLWV2ZW50LXR5cGUtMjAyMSwgZmlnLmhlaWdodD02fQ0KDQphY2xlZF9uZXcgJT4lDQogIGZpbHRlcih5ZWFyID49IDIwMjEpICU+JSANCiAgbXV0YXRlKHN1Yl9ldmVudF90eXBlID0gZmN0X2x1bXAoc3ViX2V2ZW50X3R5cGUsIDkpKSAlPiUNCiAgbXV0YXRlKG1vbnRoID0gZmxvb3JfZGF0ZShldmVudF9kYXRlLCAibW9udGgiKSkgJT4lIA0KICBtdXRhdGUobW9udGggPSANCiAgICAgICAgICAgbWFwKG1vbnRoLCANCiAgICAgICAgICAgICAgIH4gc2VxLkRhdGUoYXMuRGF0ZSguKSwgYXMuRGF0ZSgiMjAyMi8wNS8wMSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibW9udGgiKSkpICU+JSANCiAgdW5uZXN0KG1vbnRoKSAlPiUgDQogIGdyb3VwX2J5KG1vbnRoLCBzdWJfZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIHkgPSBldmVudHMsIGZpbGwgPSBzdWJfZXZlbnRfdHlwZSwgZ3JvdXAgPSBzdWJfZXZlbnRfdHlwZSkpICsgDQogIGdlb21fYXJlYSgpICArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgbGFiZWxzID0gZGF0ZV9mb3JtYXQoZm9ybWF0ID0gIiVZLSViIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgMjIwMDAsIGJ5ID0gMjAwMCkpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBjb25mbGljdCBldmVudHMiLCANCiAgICAgICB0aXRsZSA9ICJDdW11bGF0aXZlIDIwMjEtMjAyMiBjb25mbGljdCBldmVudHMgcGVyIG1vbnRoLCBieSBldmVudCB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgIGZpbGwgPSAiIikNCiAgDQoNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAzLjQgQ29udHJpYnV0b3JzIHRvIGNvbmZsaWN0IGZhdGFsaXRpZXMNCg0KQmF0dGxlcyBhbmQgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIHdlcmUgdGhlIGxhcmdlc3QgY29udHJpYnV0b3JzIHRvIGNvbmZsaWN0IGZhdGFsaXRpZXMgaW4gMjAyMS4gDQoNCjxicj4NCg0KYGBge3IgbGluZS1wbG90LWZhdGFsaXRpZXMsIGZpZy5oZWlnaHQ9Nn0NCiANCmFjbGVkX25ldyAlPiUNCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBtdXRhdGUobW9udGggPSBmbG9vcl9kYXRlKGV2ZW50X2RhdGUsICJtb250aCIpKSAlPiUgDQogIG11dGF0ZShtb250aCA9IG1hcChtb250aCwgfiBzZXEuRGF0ZShhcy5EYXRlKC4pLCBhcy5EYXRlKCIyMDIyLzA1LzAxIiksIGJ5ID0gIm1vbnRoIikpKSAlPiUgDQogIHVubmVzdChtb250aCkgJT4lIA0KICBncm91cF9ieShtb250aCwgZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gZmF0YWxpdGllcywgZ3JvdXAgPSBldmVudF90eXBlLCBmaWxsID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fYXJlYSgpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBsYWJlbHMgPSBkYXRlX2Zvcm1hdChmb3JtYXQgPSAiJVktJWIiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyMDAwLCBieSA9IDIwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgZmF0YWxpdGllcyIsIA0KICAgICAgIHRpdGxlID0gIkN1bXVsYXRpdmUgMjAyMS0yMDIyIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBwZXIgbW9udGgsIGJ5IGV2ZW50IHR5cGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgDQogICAgICAgZmlsbCA9ICIiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCk9mIGNvbmNlcm4sIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGFjY291bnRlZCBmb3IgMTUlIG9mIGFsbCBjb25mbGljdCBmYXRhbGl0aWVzLg0KDQpgYGB7ciBmYXRhbGl0aWVzLXN1bW1hcnktMjAyMX0NCmFjbGVkX25ldyAlPiUNCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50YWdlID0gcm91bmQoZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVuYW1lKGBFdmVudCB0eXBlYCA9IGV2ZW50X3R5cGUsDQogICAgICAgICBGYXRhbGl0aWVzID0gZmF0YWxpdGllcywgDQogICAgICAgICBQZXJjZW50YWdlID0gcGVyY2VudGFnZSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoUGVyY2VudGFnZSkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIxLTIwMjIgY29uZmxpY3QgZmF0YWxpdGllcyBieSBldmVudCB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj4NCg0KSG93ZXZlciwgdGhlIGV2ZW50IHR5cGUgKlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zKiBkb2VzIG5vdCBlbmNvbXBhc3MgYWxsIGZhdGFsIGluY2lkZW50cyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMuIElmIHRoZSBkYXRhIGlzIGV4YW1pbmVkIHRocm91Z2ggdGhlIGxlbnMgb2YgaW50ZXJhY3Rpb24gdHlwZSwgd2hpY2ggcmVjb3JkcyB0aGUgdHlwZXMgb2YgYWN0b3JzIGludm9sdmVkIGluIGVhY2ggY29uZmxpY3QgZXZlbnQsIGl0IHNob3dzIHRoYXQgYHIgcm91bmQoKGZpbHRlcihhY2xlZF9uZXcsIHllYXIgPj0gMjAyMSAmIHN0cl9kZXRlY3QoaW50ZXJfdHlwZSwgImNpdmlsaWFufHByb3Rlc3RlciIpKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfSkgLyAoZmlsdGVyKGFjbGVkX25ldywgeWVhciA+PSAyMDIxKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCBwZXJjZW50IG9mIGZhdGFsaXRpZXMgc3RlbSBmcm9tIGludGVyYWN0aW9ucyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMsIHRoYXQgaXMgY2l2aWxpYW5zIGFuZCBwcm90ZXN0ZXJzLiBUaGUgbmV4dCBjaGFwdGVyIGRlYWxzIHdpdGggYSBtb3JlIGRldGFpbGVkIGFzc2Vzc21lbnQgb2YgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHJlbGF0ZWQgdG8gbm9uLWNvbWJhdGFudHMuDQoNCjxicj4NCg0KYGBge3IgbGluZS1wbG90LWludGVyLXR5cGUtMjAyMSwgZmlnLmhlaWdodD02fQ0KDQoNCmFjbGVkX25ldyAlPiUNCiAgZmlsdGVyKGludGVyX3R5cGUgIT0gInNvbGUgcHJvdGVzdGVyIGFjdGlvbiIpICU+JSANCiAgbXV0YXRlKGludGVyX3R5cGUgPSBmY3RfbHVtcChpbnRlcl90eXBlLCA2KSkgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUgDQogIG11dGF0ZShtb250aCA9IGZsb29yX2RhdGUoZXZlbnRfZGF0ZSwgIm1vbnRoIikpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbWFwKG1vbnRoLCB+IHNlcS5EYXRlKGFzLkRhdGUoLiksIGFzLkRhdGUoIjIwMjIvMDUvMDEiKSwgYnkgPSAibW9udGgiKSkpICU+JSANCiAgdW5uZXN0KG1vbnRoKSAlPiUgDQogIGdyb3VwX2J5KG1vbnRoLCBpbnRlcl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gZmF0YWxpdGllcywgZ3JvdXAgPSBpbnRlcl90eXBlLCBmaWxsID0gaW50ZXJfdHlwZSkpICsgDQogIGdlb21fYXJlYSgpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBsYWJlbHMgPSBkYXRlX2Zvcm1hdChmb3JtYXQgPSAiJVktJWIiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyMDAwLCBieSA9IDIwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRDk1RjAyIiwgIiM3NTcwQjMiLCAiIzFCOUU3NyIsICIjRTcyOThBIiwgIiM2NkE2MUUiLCAiI0U2QUIwMiIsICIjNjY2NjY2IiwgIiNBNjc2MUQiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKw0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgZmF0YWxpdGllcyIsIA0KICAgICAgIHRpdGxlID0gIkN1bXVsYXRpdmUgZmF0YWxpdGllcyBpbiAyMDIxLTIwMjIgYnkgaW50ZXJhY3Rpb24gdHlwZSwgZXhjbHVkaW5nIHNvbGUgcHJvdGVzdGVyIGFjdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICBmaWxsID0gIiIpICAgDQoNCmBgYA0KDQo8YnI+DQoNClRoZSBsYXJnZXN0IG51bWJlciBvZiBmYXRhbGl0aWVzIGFyZSByZWxhdGVkIHRvIGV2ZW50cyBpbnZvbHZpbmcgdGhlIG1pbGl0YXJ5LCBwb2xpdGljYWwgbWlsaXRpYXMsIGluY2x1ZGluZyB0aGUgUGVvcGxl4oCZcyBEZWZlbnNlIEZvcmNlLCBhcyB3ZWxsIGFzIHRob3NlIGludm9sdmluZyByZWJlbCBncm91cHMuIA0KDQpgYGB7ciBmYXRhbGl0aWVzLXN1bW1hcnktMjAyMS1pbnRlci10eXBlfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lDQogIGZpbHRlcihpbnRlcl90eXBlICE9ICJzb2xlIHByb3Rlc3RlciBhY3Rpb24iKSAlPiUgDQogIG11dGF0ZShpbnRlcl90eXBlID0gZmN0X2x1bXAoaW50ZXJfdHlwZSwgNiksIA0KICAgICAgICAgaW50ZXJfdHlwZSA9IHN0cl90b190aXRsZShpbnRlcl90eXBlKSwgDQogICAgICAgICBpbnRlcl90eXBlID0gc3RyX3JlcGxhY2VfYWxsKGludGVyX3R5cGUsICJWZXJzdXMiLCAidmVyc3VzIikpICU+JSANCiAgZ3JvdXBfYnkoaW50ZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGZhdGFsaXRpZXMgLyBzdW0oZmF0YWxpdGllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHJlbmFtZShGYXRhbGl0aWVzID0gZmF0YWxpdGllcywgDQogICAgICAgICBQZXJjZW50YWdlID0gcGVyY2VudGFnZSwNCiAgICAgICAgIGBJbnRlcmFjdGlvbiB0eXBlYCA9IGludGVyX3R5cGUpICU+JSANCiAgYXJyYW5nZShkZXNjKFBlcmNlbnRhZ2UpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMS0yMDIyIGNvbmZsaWN0IGZhdGFsaXRpZXMgYnkgaW50ZXJhY3Rpb24gdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lICANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIGdlbmVyYWxfdGl0bGUgPSAiIikNCg0KDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyMgMy41IEdlb2dyYXBoaWMgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxDQoNCjxicj4gDQoNCmBgYHtyIHN0YXRlLWV2ZW50cy1wbG90fQ0KDQphY2xlZF9uZXcgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgbXV0YXRlKHN1bSA9IHN1bShjb3VudCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGFkbWluMSA9IGZjdF9yZW9yZGVyKGFkbWluMSwgc3VtLCAuZGVzYyA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFkbWluMSwgeSA9IGNvdW50LCBmaWxsID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSBhZG1pbjEpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgNjAwMCwgYnkgPSAxMDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgaGp1c3QgPSAxLCBhbmdsZSA9IDYwKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIiwNCiAgICAgICB0aXRsZSA9ICIyMDIxLTIwMjIgY29uZmxpY3QgZXZlbnRzIGJ5IHN0YXRlL3JlZ2lvbiIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQogIA0KYGBgDQoNCjxicj4NCg0KU2FnYWluZyBleHBlcmllbmNlZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGluIDIwMjEuIEluZGVlZCwgU2FnYWluZyByZWdpb24gZXhwZXJpZW5jZWQgbW9yZSB0aGFuIHRocmVlIHRpbWVzIHRoZSBudW1iZXIgb2YgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIHRoYW4gTWFnd2F5LCB0aGUgbmV4dCBtb3N0LWFmZmVjdGVkIGFyZWEuIFRoaXMgcmVwcmVzZW50cyBhIHNpZ25pZmljYW50IHNoaWZ0IGluIHRoZSBwYXR0ZXJuIG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHdoaWNoIGhhcyB0cmFkaXRpb25hbGx5IHJldm9sdmVkIGFyb3VuZCBLYWNoaW4sIFJha2hpbmUgYW5kIFNoYW4uDQoNCjxicj4NCg0KYGBge3Igc3RhdGUtZmF0YWxpdGllcy1wbG90fQ0KDQphY2xlZF9uZXcgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUoc3VtID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShhZG1pbjEgPSBmY3RfcmVvcmRlcihhZG1pbjEsIHN1bSwgLmRlc2MgPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhZG1pbjEsIHkgPSBmYXRhbGl0aWVzLCBmaWxsID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSBhZG1pbjEpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgOTAwMCwgYnkgPSAxMDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgaGp1c3QgPSAxLCBhbmdsZSA9IDYwKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgYnkgc3RhdGUvcmVnaW9uIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQogDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuNiBQcm9ncmVzc2lvbiBvZiB0aGUgY29uZmxpY3QgaW4gMjAyMS0yMDIyIGJ5IGV2ZW50IHR5cGUNCg0KVGhlIG1hcCBiZWxvdyBzaG93cyAyMDIxLTIwMjIgY29uZmxpY3QgZXZlbnRzIGJ5ICoqbW9udGgqKi4gVGhlIGNvbG9yIG9mIGVhY2ggcG9pbnQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbmZsaWN0IGV2ZW50LiBUaGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZXZlbnQgaXMgaW5kaWNhdGVkIGJ5IHRoZSBzaXplIG9mIGVhY2ggcG9pbnQuIEl0IGlzIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBhZnRlciB0aGUgcHJvdGVzdHMgaW4gRmVicnVhcnkgYW5kIE1hcmNoIDIwMjEsIHRoZSBjb25mbGljdCBtb3ZlcyBvbiB0byBhIG5ldyBzdGFnZSBpbiBBcHJpbCBhbmQgTWF5LCB2aXNpYmx5IGluY3JlYXNpbmcgaW4gaW50ZW5zaXR5Lg0KDQo8YnI+DQohW10oLi9naWYvZXZlbnRfdHlwZV8yMDIyLmdpZikNCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIENvbmZsaWN0IGFuZCBub24tY29tYmF0YW50cyANCg0KIyMjIDQuMSBDb25mbGljdCBldmVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzDQoNCjxicj4NCg0KTm9uLWNvbWJhdGFudHMgd2VyZSBpbnZvbHZlZCBpbiBhbG1vc3Qgb25lIHRoaXJkIG9mIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBpbiBNeWFubWFyIGluIDIwMjEuIEluIHRvdGFsLCB0aGVyZSB3ZXJlIGByIGZpbHRlcihhY2xlZF9uZXcsIHllYXIgPj0gMjAyMSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGZhdGFsaXRpZXMsIG9mIHdoaWNoIGByIHJvdW5kKGZpbHRlcihhY2xlZF9uZXcsIHllYXIgPj0gMjAyMSAmIG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX0pICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHJlbGF0ZWQgdG8gbm9uLWNvbWJhdGFudHMuIA0KDQpUaGUgbWFwIGJlbG93IHNob3dzIGNvbmZsaWN0IGV2ZW50cyBsYWJlbGxlZCBieSBBQ0xFRCBhcyAqVmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMqIGFuZCB3aGVyZSB0aGUgZXZlbnQgd2FzIGRlc2NyaWJlZCBhcyBpbnZvbHZpbmcgYSBjaXZpbGlhbiwgcHJvdGVzdGVyLCBvciB2aWxsYWdlci4NCg0KSG93ZXZlciwgcHJvdGVzdCBldmVudHMgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCBhcyB0aGVzZSBhcmUgZ2VuZXJhbGx5IG9uZS1zaWRlZCwgd2hlcmUgdGhlIG9ubHkgYWN0b3JzIGludm9sdmVkIGFyZSBwcm90ZXN0ZXJzIGFuZCB0aGV5IGRvIG5vdCByZXN1bHQgaW4gcHJvcGVydHkgZGFtYWdlIG9yIGRlYXRoLiANCg0KRXZlbnRzIGludm9sdmluZyBub24tY29tYmF0YW50cyBhcmUgcGxvdHRlZCBvbiB0aGUgbWFwIGJlbG93LCB3aXRoIHRob3NlIGV2ZW50cyB0aGF0IHJlc3VsdGVkIGluIGZhdGFsaXRpZXMgc2hvd24gaW4gcmVkLg0KIA0KPGJyPg0KDQpgYGB7ciBtYXAtbm9uLWNvbWJhdGFudHMsIGZpZy5oZWlnaHQ9MTB9DQphY2xlZF9uZXcgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShoYXNfZmF0YWxpdGllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihzaXplID0gMC4xLCBhbHBoYSA9IDAsIGRhdGEgPSBwY29kZTNfc2hhcGUpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgc2l6ZSA9IGZhdGFsaXRpZXMsIGNvbG91ciA9IGhhc19mYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBhbHBoYSA9IDAsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCA0KSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMiLA0KICAgICAgIHN1YnRpdGxlID0gICJDaXZpbGlhbnMgYW5kIHByb3Rlc3RlcnMgYXJlIGNvbnNpZGVyZWQgbm9uLWNvbWJhdGFudHMiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2VzOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIGFuZCBGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciIsDQogICAgICAgZmlsbCA9ICJudW1iZXIgb2ZcbnBhcnRuZXJzIikgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhPTEpKSkNCmBgYA0KDQo8YnI+DQoNCkEgYnJlYWtkb3duIG9mIHN1YiBjb25mbGljdCBldmVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGlzIGxpc3RlZCBiZWxvdy4gDQoNCg0KYGBge3IgdGFibGUtc3ViLWV2ZW50LW5vbi1jb21iYXRhbnRzfQ0KYWNsZWRfbmV3ICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSAmIHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lIA0KICBmaWx0ZXIobm9uX2NvbWJhdGFudCA9PSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KHN1Yl9ldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksIA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUoc29ydCA9IGV2ZW50cyAvIHN1bShldmVudHMpICsgZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUoc3ViX2V2ZW50X3R5cGUgPSBpZmVsc2Uoc29ydCA8IDAuMDE3LCAiT3RoZXIiLCBzdWJfZXZlbnRfdHlwZSkpICU+JSANCiAgZ3JvdXBfYnkoc3ViX2V2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IHN1bShldmVudHMpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgcmVuYW1lKGBTdWItZXZlbnQgdHlwZWAgPSBzdWJfZXZlbnRfdHlwZSwgDQogICAgICAgICBFdmVudHMgPSBldmVudHMsIA0KICAgICAgICAgRmF0YWxpdGllcyA9IGZhdGFsaXRpZXMpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgMTAgc3ViLWV2ZW50IHR5cGVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBpbiAyMDIxLTIwMjIiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRkFMU0UpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBFdmVudHMgYW5kIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzLCBieSBzdGF0ZQ0KDQpNb3N0IG9mIHRoZSBmYXRhbCBjb25mbGljdCBldmVudHMgaW4gTXlhbm1hciBpbiAyMDIxIG9jY3VycmVkIGluIFNhZ2FpbmcgcmVnaW9uLiBJbiB0b3RhbCwgdGhlIHJlZ2lvbiByZWNvcmRlZCAxLDE3OCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMsIHNpZ25pZmljYW50bHkgbW9yZSB0aGFuIGluIE1hbmRhbGF5IGFuZCBZYW5nb24sIHRoZSBuZXh0IG1vc3QgZmF0YWwgcmVnaW9ucy4gSW4gTWFuZGFsYXksIHRoZXJlIHdlcmUgNDExIGNvbmZsaWN0LXJlbGF0ZWQgZGVhdGhzIGFuZCBpbiBZYW5nb24gdGhlcmUgd2VyZSAzMDAuDQoNCmBgYHtyIGJhcnBsb3QtZXZlbnRzLWZhdGFsaXRpZXMtc3J9DQphY2xlZF9uZXcgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JQ0KICBncm91cF9ieShhZG1pbjEpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwgDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUNCiAgbXV0YXRlKGFkbWluMSA9IGZjdF9yZW9yZGVyKGFkbWluMSwgLWZhdGFsaXRpZXMpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhmYXRhbGl0aWVzLCBldmVudHMpLCBuYW1lc190byA9ICJ0eXBlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IGZjdF9yZWxldmVsKHR5cGUsIGMoImZhdGFsaXRpZXMiLCAiZXZlbnRzIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFkbWluMSwgeSA9IHZhbHVlLCBmaWxsID0gdHlwZSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gdmFsdWUpLCBzaXplID0gMi41LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgdmp1c3QgPSAtMC4zKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDAsIHZqdXN0ID0gMC42KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyAvIGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGJ5IHN0YXRlIChleGNsLiBwZWFjZWZ1bCBwcm90ZXN0cykiLA0KICAgICAgIHN1YnRpdGxlID0gIkRhdGEgc291cmNlczogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgIGZpbGwgPSAiIikNCg0KYGBgDQo8YnI+DQoNClRoZSBjaGFydCBhYm92ZSBzaG93cyBldmVudHMgYW5kIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzLCBicm9rZW4gZG93biBieSBzdGF0ZSBhbmQgcmVnaW9uLiANCg0KVGhlIGxhcmdlIG51bWJlciBvZiBmYXRhbGl0aWVzIGluIFNhZ2FpbmcsIE1hbmRhbGF5IGFuZCBZYW5nb24gYXJlIGR1ZSB0byBhIGhpZ2ggcmF0ZSBvZiBhcnJlc3RzIGFuZCBhdHRhY2tzIG9uIGNpdmlsaWFucywgYXMgc2hvd24gYmVsb3cuIEhvd2V2ZXIsIHRoZSByYXRpbyBvZiBhdHRhY2tzIHRvIGFycmVzdHMgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgaW4gU2FnYWluZyB0aGFuIGNvbXBhcmVkIHRvIE1hbmRhbGF5IGFuZCBZYW5nb24uDQoNCg0KYGBge3IgdGFibGUtc3ViLWV2ZW50cy1zcn0NCmFjbGVkX25ldyAlPiUgDQogIGZpbHRlcih5ZWFyID49IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgZmlsdGVyKG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lDQogIG11dGF0ZShzdWJfZXZlbnRfdHlwZSA9IGZjdF9sdW1wKHN1Yl9ldmVudF90eXBlLCA1KSkgJT4lIA0KICBncm91cF9ieShhZG1pbjEsIHN1Yl9ldmVudF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwNCiAgICAgICAgICAgIEZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHN1Yl9ldmVudF90eXBlLCB2YWx1ZXNfZnJvbSA9IGV2ZW50cykgJT4lIA0KICBncm91cF9ieShhZG1pbjEpICU+JSANCiAgc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBzdW0oLngsIG5hLnJtID0gVFJVRSkpKSAlPiUNCiAgbXV0YXRlKGFkbWluMSA9IHJlY29kZShhZG1pbjEsICJOYXkgUHlpIFRhdyIgPSAiTmF5cHlpdGF3IikpICU+JQ0KICByZW5hbWUoc3RhdGUgPSBhZG1pbjEpICU+JSANCiAgYXJyYW5nZShkZXNjKEZhdGFsaXRpZXMpKSAlPiUgDQogIHJlbG9jYXRlKEZhdGFsaXRpZXMsIC5hZnRlciA9IE90aGVyKSAlPiUNCiAgcmVuYW1lKFN0YXRlID0gc3RhdGUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJNYWluIHN1Yi1ldmVudCB0eXBlcyBhbmQgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgYnkgc3RhdGUvcmVnaW9uIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlczogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQogIA0KICANCmBgYA0KDQoNCjxicj4NCg0KS2FsZSBUb3duc2hpcCBpbiBTYWdhaW5nIGV4cGVyaWVuY2VkIHRoZSBoaWdoZXN0IHJhdGUgb2YgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgaW4gMjAyMS4gSW4gdG90YWwsIDcgcGVyIGNlbnQgb2Ygbm9uLWNvbWJhdGFudC1yZWxhdGVkIGZhdGFsaXRpZXMgb2NjdXJlZCBpbiBLYWxlLCB3aGljaCByZXByZXNlbnRzIGByIGZpbHRlcihhY2xlZF9uZXcsIHllYXIgPj0gMjAyMSAmIGFkbWluM19wY29kZSA9PSAiTU1SMDA1MDI3IiAmIG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX1gIGRlYXRocy4gT3ZlcmFsbCwgYHIgZmlsdGVyKGFjbGVkX25ldywgeWVhciA+PSAyMDIxICYgZmF0YWxpdGllcyA+IDAgJiBub25fY29tYmF0YW50ID09IFRSVUUpICU+JSBkaXN0aW5jdChhZG1pbjNfcGNvZGUpICU+JSBucm93KClgICB0b3duc2hpcHMgcmVwb3J0ZWQgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgaW4gMjAyMSBhbmQgMjAyMi4gT2YgdGhlIDIwIHRvd25zaGlwcyB3aXRoIHRoZSBtb3N0IG5vbi1jb21iYXRhbnQgZmF0YWxpdGllcywgMTEgd2VyZSBpbiB0aGUgU2FnYWluZyBSZWdpb24uIA0KDQo8YnI+DQoNCmBgYHtyIG1hcC10b3duc2hpcHMtZmF0YWxpdGllcy1ub25jb21iYXRhbnQsIGZpZy5oZWlnaHQ9MTB9DQphY2xlZF9uZXcgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBhZG1pbjMsIGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHBjX2V2ZW50cyA9IGV2ZW50cyAvIHN1bShldmVudHMpLCANCiAgICAgICAgIHBjX2ZhdGFsaXRpZXMgPSBmYXRhbGl0aWVzIC8gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwY19mYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUocGNfZmF0YWxpdGllcyA9IG5hX2lmKHBjX2ZhdGFsaXRpZXMsIDApLCANCiAgICAgICAgIGZhdGFsaXRpZXMgPSBuYV9pZihmYXRhbGl0aWVzLCAwKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gZmF0YWxpdGllcyksIHNpemUgPSAwLjEpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJGYXRhbGl0aWVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICBmaWxsID0gImZhdGFsaXRpZXMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKQ0KDQoNCiAgDQpgYGANCg0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA1LiBDb25mbGljdCBhY3RvcnMNCg0KIyMjIDUuMSBDb25mbGljdCBldmVudHMgYnkgdHlwZSBvZiBhY3RvciANCg0KVGhlIG5leHQgdHdvIHNlY3Rpb25zIHN1bW1hcml6ZSBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgZXZlbnQgdHlwZSBhbmQgYWN0b3IgdHlwZS4gDQoNCkluIHRoZSBwbG90IGJlbG93LCBmYWNldGVkIGJ5IHR5cGUgb2YgY29uZmxpY3QgYWN0b3IsIHNob3dzIHRoZSB0eXBlcyBvZiBjb25mbGljdCBldmVudHMgZWFjaCB0eXBlIG9mIGFjdG9yIGhhcyBiZWVuIGludm9sdmVkIGluIGR1cmluZyAyMDIxLiBGb3IgaW5zdGFuY2UsIHBvbGl0aWNhbCBtaWxpdGlhcyBhcmUgbW9zdCBoZWF2aWx5IGludm9sdmVkIGluIGNvbmZsaWN0IGV2ZW50cyByZWxhdGVkIHRvIGV4cGxvc2lvbnMgYW5kIHJlbW90ZSB2aW9sZW5jZSwgd2hlcmVhcyByZWJlbCBncm91cHMgYXJlIG1vc3QgaW52b2x2ZWQgaW4gYmF0dGxlcy4gDQoNCkJlY2F1c2UgbW9zdCBldmVudCB0eXBlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHBlYWNlZnVsIHByb3Rlc3RzLCBpbnZvbHZlIG1vcmUgdGhhbiBvbmUgYWN0b3IsIGluZGl2aWR1YWwgZXZlbnRzIGFwcGVhciBpbiBtb3JlIHRoYW4gb25lIHRhYmxlLiBGb3IgZXhhbXBsZSwgdGhlIHNhbWUgYmF0dGxlIGludm9sdmluZyBzdGF0ZSBmb3JjZXMgYW5kIHJlYmVsIGdyb3VwcyB3b3VsZCBhcHBlYXIgaW4gdGhlIGV2ZW50IGNvdW50IHRhYmxlcyBmb3IgZWFjaCB0eXBlIG9mIGNvbmZsaWN0IGFjdG9yLiBUaGlzIG1lYW5zIGFjdHVhbCBudW1iZXIgb2YgZXZlbnRzIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc2hvd24gYWNyb3NzIGFsbCB0YWJsZXMuDQogDQoNCjxicj4NCg0KYGBge3IgYWN0b3ItZmFjZXQtZXZlbnQtY291bnQsIGZpZy5oZWlnaHQgPSA3fQ0KDQphY3RvcnNfbmV3ICU+JQ0KICBtdXRhdGUoZXZlbnRfdHlwZSA9IGZjdF9yZWxldmVsKGV2ZW50X3R5cGUsIGMoIkJhdHRsZXMiLCAiRXhwbG9zaW9ucy9SZW1vdGUgdmlvbGVuY2UiLCAiVmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3Rlc3RzIiwgIlJpb3RzIiwgIlN0cmF0ZWdpYyBkZXZlbG9wbWVudHMiKSkpICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygic3RhdGVfZm9yY2VzIiwgInByb3Rlc3RlcnMiLCAiY2l2aWxpYW5zIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIGZpbHRlcih5ZWFyID49IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWN0b3Jfc2ltcGxlLCBldmVudF90eXBlLCBpbnRlcjEpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogICMgZmlsdGVyKGludGVyMSAhPSAiaWRlbnRpdHlfbWlsaXRpYXMiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGNvdW50LCB5ID0gZXZlbnRfdHlwZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgZmFjZXRfd3JhcCh+IGludGVyMSwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwgDQogICAgICAgeSA9ICJUeXBlIG9mIGNvbmZsaWN0IGV2ZW50IiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IHR5cGUgb2YgY29uZmxpY3QgYWN0b3IiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIHN1bW1hcnktdGFibGUtZXZlbnRfdHlwZX0NCmFjdG9yc19uZXcgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBncm91cF9ieShgQWN0b3IgdHlwZWAgPSBpbnRlcjEpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSkgJT4lICANCiAgbXV0YXRlKGBBY3RvciB0eXBlYCA9IHN0cl90b190aXRsZShgQWN0b3IgdHlwZWApKSAlPiUgDQogIHRyYW5zcG9zZV9kZigpICU+JSANCiAgcm93X3RvX25hbWVzKHJvd19udW1iZXIgPSAxKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKCJQcm90ZXN0ZXJzIiwgIkNpdmlsaWFucyIsICJTdGF0ZV9mb3JjZXMiLCAiUG9saXRpY2FsX21pbGl0aWFzIiwgIlJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJpb3RlcnMiLCAiSWRlbnRpdHlfbWlsaXRpYXMiLCAiRXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSwNCiAgICAgICAgICAgIH4gYXMubnVtZXJpYygueCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIxLTIwMjIgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBieSBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSwgZGlnaXRzID0gMCkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBGYXRhbGl0aWVzIGJ5IGFjdG9yIHR5cGUNCg0KVGhlIHRhYmxlcyBiZWxvdyBzaG93IHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCB0eXBlIG9mIGFjdG9yLiANCg0KU2ltaWxhciB0byB0aGUgcGxvdCBhYm92ZSwgdGhlIHBsb3QgYmVsb3cgaGFzIGJlZW4gZmFjZXRlZCBieSBhY3RvciB0eXBlIGFuZCBzaG93cyB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgYWN0b3IgdHlwZSBieSB0eXBlIG9mIGV2ZW50LiBBcyB0aGVzZSBhY3RvciB0eXBlcyBhcmUgZXhoYXVzdGl2ZSwgYSBzcGVjaWZpYyBldmVudCB0eXBlIGNhbiBiZSB0cmFja2VkIGFjcm9zcyBkaWZmZXJlbnQgYWN0b3JzLiBGb3IgaW5zdGFuY2UsIHRoZXJlIHdlcmUgMSw3MjkgZmF0YWxpdGllcyByZWxhdGVkIHRvICpWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyogKGluIGdyZWVuKSwgdXNpbmcgdGhlIHBsb3QgYmVsb3csIG9uZSBjYW4gc2VlIGhvdyBtYW55IG9mIHRoZXNlIDEsNzI5IGZhdGFsaXRpZXMgdGhlIHZhcmlvdXMgYWN0b3IgdHlwZXMgd2VyZSBhc3NvY2lhdGVkIHdpdGguIENpdmlsaWFucyB3ZXJlLCBvZiBjb3Vyc2UsIG9uZSBvZiB0aGUgcGFydGllcyBpbnZvbHZlZCBpbiB0aGUgKlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zKiBldmVudCB0eXBlLCBidXQgdGhlIG90aGVyIGxhcmdlc3QgYWN0b3JzIHdlcmUgc3RhdGUgZm9yY2VzIGFuZCBwb2xpdGljYWwgbWlsaXRpYXMuICANCg0KSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIEFDTEVEIGRhdGFzZXQgZG9lcyBub3QgaGF2ZSBhIGNvbHVtbiB0byBhc3NpZ24gYmxhbWUuIEZvciBpbnN0YW5jZSwgdW5kZXIgZmF0YWxpdGllcyByZWxhdGVkIHRvIHByb3Rlc3RzLCBgciBmaWx0ZXIoYWN0b3JzX25ldywgaW50ZXIxID09ICJwcm90ZXN0ZXJzIikgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX1gIGZhdGFsaXRpZXMgd2VyZSBhc3NvY2lhdGVkIHdpdGggcHJvdGVzdGVycywgd2l0aCB0aGUgbWFpbiBvdGhlciBwYXJ0eSBpbnZvbHZlZCBhbG1vc3QgZW50aXJlbHkgYmVpbmcgc3RhdGUgZm9yY2VzLCB3aXRoIHZlcnkgc21hbGwgbnVtYmVycyBiZWluZyBhc3NvY2lhdGVkIHdpdGggcmlvdGVycy4NCg0KPGJyPg0KDQpgYGB7ciBhY3Rvci1mYWNldC1ldmVudC1mYXRhbGl0aWVzLCBmaWcuaGVpZ2h0PTd9DQoNCmFjdG9yc19uZXcgJT4lDQogIG11dGF0ZShldmVudF90eXBlID0gZmN0X3JlbGV2ZWwoZXZlbnRfdHlwZSwgYygiQmF0dGxlcyIsICJFeHBsb3Npb25zL1JlbW90ZSB2aW9sZW5jZSIsICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdGVzdHMiLCAiUmlvdHMiLCAiU3RyYXRlZ2ljIGRldmVsb3BtZW50cyIpKSkgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUsIGV2ZW50X3R5cGUsIGludGVyMSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCksDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGV2ZW50X3R5cGUpICU+JSANCiAgZmlsdGVyKGludGVyMSAlb3V0JSBjKCJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSAlPiUgDQogIG11dGF0ZShwY190b3RhbCA9IGNvdW50IC8gc3VtKGNvdW50KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmYXRhbGl0aWVzLCB5ID0gZXZlbnRfdHlwZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgZmFjZXRfd3JhcCh+IGludGVyMSwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsIA0KICAgICAgIHkgPSAiVHlwZSBvZiBjb25mbGljdCBldmVudCIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGFjdG9yIHR5cGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgdHlwZSBvZiBjb25mbGljdCBhY3RvciIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQoNCiMjIyA1LjMgQWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzDQoNCkNvbmZsaWN0IGV2ZW50cyBiZXR3ZWVuIHRoZSBNeWFubWFyIE1pbGl0YXJ5IGFuZCB0aGUgUGVvcGxl4oCZcyBEZWZlbnNlIEZvcmNlIGFjY291bnRlZCBmb3IgdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBmYXRhbGl0aWVzIGluIDIwMjEuIFRoaXMgaXMgc2lnbmlmaWNhbnQgZ2l2ZW4gdGhhdCB0aGUgUGVvcGxl4oCZcyBEZWZlbnNlIEZvcmNlIChQREYpIHdhcyBvbmx5IGNyZWF0ZWQgaW4gTWF5IG9mIGxhc3QgeWVhci4gSW4gdG90YWwsIDMsMTQzIGZhdGFsaXRpZXMgcmVzdWx0ZWQgZnJvbSBjb25mbGljdCBldmVudHMgaW52b2x2aW5nIHRoZSBNaWxpdGFyeSBhbmQgdGhlIFBERi4NCg0KQ29uZmxpY3QgYmV0d2VlbiBjaXZpbGlhbnMgYW5kIHRoZSBNaWxpdGFyeSB3YXMgdGhlIHNlY29uZCBtb3N0LWxpa2VseSB0eXBlIG9mIGNvbmZsaWN0IGV2ZW50IHRvIGNhdXNlIGZhdGFsaXRpZXMuIEluIHRvdGFsLCA5NjYgcGVvcGxlIGRpZWQgZnJvbSB0aGlzIHRoaXMgdHlwZSBvZiBjb25mbGljdC4NCg0KVGhlIGxpc3QgYmVsb3cgc2hvd3MgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpbnRlcmFjdGlvbnMgYmV0d2VlbiBhIGdpdmVuIHBhaXIgb2YgYWN0b3JzLiBPbmx5IHRoZSB0b3AgMjAgcGFpcnMsIGluIHRlcm1zIG9mIGZhdGFsaXRpZXMsIGFyZSBzaG93bi4gT2YgY29uY2VybiBpcyB0aGF0IGNpdmlsaWFucyBhcyBhY3RvcnMgYXBwZWFyIGluIHRoZSBsaXN0LCBib3RoIGluIGludGVyYWN0aW9ucyB3aXRoIHRoZSBNaWxpdGFyeSBhbmQgd2l0aCBVbmlkZW50aWZpZWQgQXJtZWQgR3JvdXBzIGZpZ2h0aW5nIG1pbGl0YXJ5IGZvcmNlcy4NCg0KDQoNCmBgYHtyIHRhYmxlLWFjdG9yLXBhaXJzLWZhdGFsaXRpZXN9DQphY3RvcnNfbmV3ICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBmaWx0ZXIoc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIHBhaXJ3aXNlX2NvdW50KGFjdG9yX3NpbXBsZSwgZGF0YV9pZCwgc29ydCA9IFRSVUUsIHVwcGVyID0gRkFMU0UsIHd0ID0gZmF0YWxpdGllcykgJT4lIA0KICB0cmFuc211dGUoQWN0b3IxID0gaXRlbTEsIA0KICAgICAgICAgICAgQWN0b3IyID0gaXRlbTIsDQogICAgICAgICAgICBGYXRhbGl0aWVzID0gbikgJT4lIA0KICBoZWFkKDIwKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQ29uZmxpY3QgYWN0b3IgcGFpcnMgd2l0aCB0aGUgaGlnaGVzdCBmYXRhbGl0aWVzIGluIDIwMjEiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMTVlbSIpICU+JSANCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMzBlbSIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj4NCg0KQUNMRUQgZG9lcyBub3QgY29sbGVjdCBkYXRhIG9uIHRoZSBhY3RvciByZXNwb25zaWJsZSBmb3IgYSBmYXRhbGl0eS4gVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIHdoZXRoZXIgYSBmYXRhbGl0eSB3YXMgY2F1c2VkIGJ5IHRoZSBvdGhlciBhY3RvciBpbiBhIGNvbmZsaWN0LCBvciBhcyBhIHJlc3VsdCBvZiB0aGUgYWN0aW9ucyBvZiB0aGUgcGVyc29uIHRoYXQgZGllcy4NCkRlc3BpdGUgdGhpcywgaXQgaXMgaW50ZXJlc3RpbmcgdG8gc2VlIHdoaWNoIGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXMsIGFuZCBtYXkgYmUgY29uc2lkZXJlZCB0aGUg4oCYYmxvb2RpZXN04oCZLg0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgYWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzLCBwZXIgZXZlbnQuIE9ubHkgYWN0b3JzIHdobyBwYXJ0aWNpcGF0ZWQgaW4gbW9yZSB0aGFuIDUwIGNvbmZsaWN0IGV2ZW50cyBkdXJpbmcgMjAyMSBhcmUgaW5jbHVkZWQuIA0KDQpFYWNoIHBvaW50IHNob3dzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0b3IgZm9yIGVhY2ggY29uZmxpY3QgZXZlbnQgaXQgcGFydGljaXBhdGVkIGluLiBUaGUgd2hpc2tlcnMgc2hvdyB0aGUgcmFuZ2Ugb2YgZmF0YWxpdGllcyBhY3Jvc3MgZXZlbnRzLCB3aXRoIGF0IGxlYXN0IDk1IHBlcmNlbnQgb2YgYWxsIGNvbmZsaWN0IGV2ZW50cyBjb3ZlcmVkIHdpdGhpbiB0aGUgcmFuZ2UuIA0KDQpQb2xpdGljYWwgbWlsaXRpYXMgYW5kIHJlYmVsIGdyb3VwcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaWdoZXN0IGZhdGFsaXR5IGV2ZW50cywgd2hpY2ggaXMgbm90IHN1cnByaXNpbmcgZ2l2ZW4gdGhhdCBpbmNpZGVudHMgYmV0d2VlbiB0aGUgUGVvcGxl4oCZcyBEZWZlbnNlIEZvcmNlIGFuZCB0aGUgTWlsaXRhcnkgcmVzdWx0ZWQgaW4gdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGZhdGFsaXRpZXMsIGFzIHNob3duIGFib3ZlLg0KDQoNCjxicj4NCg0KDQpgYGB7ciBmYXRhbGl0aWVzLWFjdG9ycy1lcnJvcmJhcmgsIGZpZy5oZWlnaHQ9Ny41fQ0KYWN0b3JzX2NvbmZfaW50IDwtIGFjdG9yc19uZXcgJT4lICANCiAgZmlsdGVyKHllYXIgPD0gMjAyMSkgJT4lIA0KICBhZGRfY291bnQoYWN0b3Jfc2ltcGxlKSAlPiUgDQogIGZpbHRlcihuID4gNTApICU+JSANCiAgbmVzdCgtYWN0b3Jfc2ltcGxlKSAlPiUgDQogIG11dGF0ZShtb2RlbCA9IG1hcChkYXRhLCB+IHQudGVzdCguJGZhdGFsaXRpZXMpKSkgJT4lIA0KICB1bm5lc3RfbGVnYWN5KG1hcChtb2RlbCwgdGlkeSkpDQoNCmFjdG9yc19jb25mX2ludCAlPiUgDQogIGxlZnRfam9pbihhY3RvcnNfbmV3ICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWN0b3Jfc2ltcGxlLCBpbnRlcjEpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpLCANCiAgICAgICAgICAgIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JSANCiAgIyBsZWZ0X2pvaW4oYWN0b3JzX25ldyAlPiUgc2VsZWN0KGFjdG9yX3NpbXBsZSwgaW50ZXIxKSAlPiUgZGlzdGluY3QoKSwgYnkgPSAiYWN0b3Jfc2ltcGxlIikgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJwcm90ZXN0ZXJzIiwgImNpdmlsaWFucyIsICJzdGF0ZV9mb3JjZXMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IHN0cl9yZW1vdmUoYWN0b3Jfc2ltcGxlLCAiXFw6LioiKSwNCiAgICAgICAgIGFjdG9yX3NpbXBsZSA9IGZjdF9yZW9yZGVyKGFjdG9yX3NpbXBsZSwgZXN0aW1hdGUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gYWN0b3Jfc2ltcGxlLCBjb2xvdXIgPSBpbnRlcjEpKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gZmF0YWxpdGllcykpICsgDQogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBoZWlnaHQgPSAwLjE1KSArIA0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDkpKSArIA0KICAjIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsgDQogIGxhYnMoeCA9ICJMb2cgb2YgYXZlcmFnZSBudW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgY29uZmxpY3QgZXZlbnQiLA0KICAgICAgeSA9ICIiLCANCiAgICAgIHRpdGxlID0gIldoaWNoIGNvbmZsaWN0IGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXMgcGVyIGV2ZW50PyIsIA0KICAgICAgc3VidGl0bGUgPSAiT25seSBhY3RvcnMgaW4gbW9yZSB0aGFuIDUwIGNvbmZsaWN0IGV2ZW50c1xuU2l6ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGFjdG9yIiwgDQogICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgIGNvbG91ciA9ICIiLCBzaXplID0gIiIpICsgDQogIGd1aWRlcyhzaXplID0gIm5vbmUiKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMSkpDQoNCg0KYGBgDQoNCjxicj48YnI+IA0KDQojIyMgNS40IFN1bW1hcnkgdGFibGUgb2YgbWFpbiBjb25mbGljdCBhY3RvcnMgYnkgYWN0b3IgdHlwZQ0KDQpgYGB7ciB0YWJsZS1tYWluLWNvbmZsaWN0LWFjdG9yc30NCnRvcF9hY3RvcnMgPC0gYWN0b3JzX25ldyAlPiUgIA0KICBmaWx0ZXIoeWVhciA8PSAyMDIxICYgaW50ZXIxICE9ICJleHRlcm5hbF9vdGhlcl9mb3JjZSIpICU+JQ0KICBncm91cF9ieShpbnRlcjEpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IGZjdF9sdW1wKGFjdG9yX3NpbXBsZSwgcHJvcCA9IC4wMikpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgY291bnQoaW50ZXIxLCBhY3Rvcl9zaW1wbGUsIHNvcnQgPSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KGludGVyMSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfZ3JvdXBgID0gcm91bmQobiAvIHN1bShuKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBpbnRlcjEgPSBzdHJfdG9fdGl0bGUoaW50ZXIxKSkgJT4lDQogIHJlbmFtZShFdmVudHMgPSBuLA0KICAgICAgICAgYEFjdG9yIHR5cGVgID0gaW50ZXIxLA0KICAgICAgICAgYEFjdG9yIG5hbWVgID0gYWN0b3Jfc2ltcGxlKSAlPiUgDQogICMgdG9wX24obiA9IDUpICU+JSANCiAgYXJyYW5nZShgQWN0b3IgdHlwZWApDQoNCmthYmxlKHRvcF9hY3RvcnMsIGNhcHRpb24gPSAiVG9wIGNvbmZsaWN0IGFjdG9ycyBpbiAyMDIxLTIwMjIgYnkgYWN0b3IgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAgcGFja19yb3dzKGluZGV4ID0gdGFibGUodG9wX2FjdG9ycyRgQWN0b3IgdHlwZWApKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjUgR2VvZ3JhcGhpYyBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgYWN0b3JzDQoNClNhZ2FpbmcgaXMgaG9tZSB0byBhIGh1Z2UgY29uY2VudHJhdGlvbiBvZiBjb25mbGljdCBhY3RvcnMsIHdpdGggbWFueSBtb3JlIHRoYW4gaW4gdGhlIHRyYWRpdGlvbmFsIGNvbmZsaWN0IGFyZWFzIG9mIEthY2hpbiwgbm9ydGhlcm4gU2hhbiBhbmQgUmFraGluZS4NCg0KPGJyPg0KDQpgYGB7ciBtYXAtY29uZmxpY3QtYWN0b3JzLXRvd25zaGlwLCBmaWcuaGVpZ2h0PTEwfQ0KYWN0b3JzX25ldyAlPiUgDQogIGZpbHRlcih5ZWFyID49IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShjb25mbGljdF9hY3RvcnMgPSBuX2Rpc3RpbmN0KGFjdG9yX3NpbXBsZSkpICU+JSANCiAgbGVmdF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGNvbmZsaWN0X2FjdG9ycyksIHNpemUgPSAwLjAxKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKGZpbGwgPSAibnVtYmVyIG9mXG4gY29uZmxpY3QgYWN0b3JzIiwNCiAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgMjAyMSBjb25mbGljdCBhY3RvcnMgYXQgdG93bnNoaXAgbGV2ZWwiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KICANCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQoNCg0KDQojIyA2LiBDb3JyZWxhdGlvbnMgYmV0d2VlbiBjb25mbGljdCBhbmQgZm9vZCBzZWN1cml0eSBjbHVzdGVyIGZvb3RwcmludCANCg0KDQojIyMgNi4xIENvcnJlbGF0aW9uIHBsb3QNCg0KDQpGb29kIHNlY3VyaXR5IHBhcnRuZXJzIGFyZSBub3Qgb3BlcmF0aW5nIGluIHRoZSBwYXJ0cyBvZiBNeWFubWFyIG1vc3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QgaW4gMjAyMSwgYXMgc2hvd24gcHJldmlvdXNseSBpbiBTZWN0aW9uIDIuIFNhZ2FpbmcgcmVnaW9uIGV4cGVyaWVuY2VkIHRoZSBtb3N0IGNvbmZsaWN0IGluIDIwMjEsIGZvbGxvd2VkIGJ5IEthY2hpbiBhbmQgbm9ydGhlcm4gU2hhbiwgaG93ZXZlciBodW1hbml0YXJpYW4gcGFydG5lcnMgY29udGludWUgdG8gd29yayBpbiBSYWtoaW5lLCBLYWNoaW4gYW5kIHNvdXRoZXJuIFNoYW4sIHdpdGggc29tZSBzaGlmdCB0b3dhcmRzIHdvcmtpbmcgaW4gcGVyaS11cmJhbiBZYW5nb24gYW5kIE1hbmRhbGF5Lg0KDQpUaGUgcGxvdCBiZWxvdyBjb3JyZWxhdGVzIGNvbmZsaWN0IGluZGljYXRvcnMgd2l0aCB0aGUgbnVtYmVyIG9mIEZTQyBwYXJ0bmVycyBhbmQgYmVuZWZpY2lhcmllcyBhdCB0b3duc2hpcCBsZXZlbC4gDQoNClRoZSBkYXJrZXIgdGhlIGNvbG9yIG9mIHRoZSBjaXJjbGUgYW5kIHRoZSBsYXJnZXIgdGhlIHNpemUsIGlzIGFuIGluZGljYXRpb24gb2YgYSBncmVhdGVyIHRoZSBkZWdyZWUgb2YgY29ycmVsYXRpb24sIHdpdGggKzEgYmVpbmcgYSBwZXJmZWN0IHBvc2l0aXZlIGNvcnJlbGF0aW9uIGFuZCAtMSBiZWluZyBhIHBlcmZlY3QgbmVnYXRpdmUgY29ycmVsYXRpb24uIA0KDQpBcyBtYXkgYmUgZXhwZWN0ZWQsIGNvbmZsaWN0IGluZGljYXRvcnMgYXJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlci4gV2hhdCBpcyBvZiBjb25jZXJuIGlzIHRoZSB2ZXJ5IHdlYWsgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgcHJlc2VuY2Ugb2YgRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIGluIHJlbGF0aW9uIHRvIHRoZSBpbmNpZGVuY2Ugb2YgY29uZmxpY3QuDQoNCg0KPGJyPg0KDQpgYGB7ciBzbWFsbC1jb3JycGxvdH0NCg0KY29uZmxpY3Rfc2NvcmUgJT4lDQogIHNlbGVjdChiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgcHJvdGVzdHNfYW5kX3Jpb3RzLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgDQogICAgICAgICBmYXRhbGl0aWVzLCBwYXJ0bmVycywgYmVuZWZpY2lhcmllcykgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHBhcnRuZXJzKSAmICFpcy5uYShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBjb3IobWV0aG9kID0gYygicGVhcnNvbiIpKSAlPiUgDQogIGNvcnJwbG90KHR5cGUgPSAidXBwZXIiLCBjb2wgPSBicmV3ZXIucGFsKG4gPSA4LCBuYW1lID0gIlJkWWxCdSIpLCB0bC5zcnQgPSAzNSwgDQogICAgICAgICAgIHRpdGxlID0gIkNvcnJlbGF0aW9uIHBsb3QgYmV0d2VlbiBjb25mbGljdCBpbmRpY2F0b3JzIGFuZCBGU0MgcHJlc2VuY2UgXG4iLCAgbWFyPWMoMCwwLDIsMCksIGRpYWcgPSBGQUxTRSkNCiAgDQpgYGANCg0KPGJyPg0KDQpUaGUgcGxvdCBiZWxvdyB1c2VzIHRoZSBzYW1lIHZhcmlhYmxlcyBhcyBhYm92ZSwgYnV0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIGFuZCBpbmZvcm1hdGlvbi4gDQoNClRoZSBwbG90IGlzIHNwbGl0IGludG8gYW4gdXBwZXIgYW5kIGxvd2VyIHRyaWFuZ2xlLCBkaXZpZGVkIGRpYWdvbmFsbHkgYnkgdGhlIGJsdWUgaGlzdG9ncmFtcy4NCg0KVGhlIG51bWJlcnMgaW4gdGhlIHVwcGVyIHRyaWFuZ2xlIGFyZSB0aGUgc3BlY2lmaWMgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlIGJsdWUgYW5kIHllbGxvdyBjaXJjbGVzIGluIHRoZSBwbG90IGFib3ZlLCBpbmRpY2F0aW5nIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBvZiBiZXR3ZWVuICsxIGFuZCDigJMxLiBUaGUgYXN0ZXJpc2tzIGRlbm90ZSB0aGUgbGV2ZWwgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBjb3JyZWxhdGlvbnMuIA0KVGhlIGhpc3RvZ3JhbXMgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggdmFyaWFibGUuIEZvciB0aGUgY29uZmxpY3QgdmFyaWFibGVzIHRoZSBiYXJzIGFyZSBza2V3ZWQgdG8gdGhlIGxlZnQsIGluZGljYXRpbmcgdGhhdCBtb3N0IHRvd25zaGlwcyBleHBlcmllbmNlZCByZWxhdGl2ZWx5IGxvdyBsZXZlbHMgb2YgY29uZmxpY3QuDQoNClRoaXMgaXMgYm9ybmUgb3V0IGluIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBsb3dlciB0cmlhbmdsZSwgd2hlcmUgZWFjaCBwb2ludCBpcyBhIHRvd25zaGlwIGFuZCB0aGUgcmVkIGxpbmUgc2hvd3MgdGhlIGxpbmVhciBmaXQgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdmFyaWFibGVzLiBNb3N0IHRvd25zaGlwcyB0ZW5kIHRvIGJlIGNvbmNlbnRyYXRlZCBhcm91bmQgdGhlIGJvdHRvbS1sZWZ0IHF1YWRyYW50IG9mIHRoZSBjaGFydCwgd2l0aCBtYW55IG91dGxpZXJzLiBUaGUgc3RlZXBlciB0aGUgZ3JhZGllbnQgb2YgcmVkIGxpbmUsIHRoZSBzdHJvbmdlciB0aGUgY29ycmVsYXRpb24uDQoNCkZvciBpbnN0YW5jZSwgdGhlIHR3byB2YXJpYWJsZXMgbW9zdCBoaWdobHktY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIgYXJlIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGFuZCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzOiB0aGV5IHNoYXJlIGEgY29ycmVsYXRpb24gY29lZmZpY2llbnQgb2YgMC43OSwgbWVhbmluZyB0aGF0IGluIDc5JSBvZiB0aGUgdG93bnNoaXBzIGluIHdoaWNoIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIG9jY3VycmVkLCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIGFsc28gdG9vayBwbGFjZSAodGhlIG1vc3QgY29tbW9uIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMgd2VyZSBhcnJlc3RzIGFuZCBwcm9wZXJ0eSBkYW1hZ2UpLiBUaGlzIHJlbGF0aW9uc2hpcCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB0aGF0IGlzIHRvIHNheSwgaXQgd2FzIG5vdCBieSBjaGFuY2UgdGhhdCB0aGVzZSB0d28gdHlwZXMgb2YgY29uZmxpY3QgZXZlbnRzIHRlbmRlZCB0byBvY2N1ciBpbiB0aGUgc2FtZSBwbGFjZXMuDQoNCjxicj4NCg0KYGBge3IgY29ycnBsb3QsIGZpZy5oZWlnaHQ9Ny41fQ0KY29uZmxpY3Rfc2NvcmUgJT4lIA0KICBtdXRhdGUobG9nX2JlbmVmaWNpYXJpZXMgPSBsb2coYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgbG9nX2ZhdGFsaXRpZXMgPSBsb2coZmF0YWxpdGllcykpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYmVuZWZpY2lhcmllcywgYmF0dGxlcywgZmF0YWxpdGllcywgDQogICAgICAgICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBwcm90ZXN0c19hbmRfcmlvdHMsIA0KICAgICAgICAgICAgICAgICBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSksIA0KICAgICAgICAgICAgfiBpZmVsc2UoIWlzLmluZmluaXRlKGxvZygueCkpLCBsb2coLngpLCAwKSkgJT4lIA0KICBzZWxlY3QoYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBwcm90ZXN0c19hbmRfcmlvdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIA0KICAgICAgICAgIGZhdGFsaXRpZXMsIHBhcnRuZXJzLCBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSANCiAgIyBzZWxlY3QoKSAlPiUNCiAgcGFpcnMucGFuZWxzKHNtb290aCA9IFRSVUUsICAgICAgIyBJZiBUUlVFLCBkcmF3cyBsb2VzcyBzbW9vdGhzDQogICAgICAgICAgICAgICBzY2FsZSA9IEZBTFNFLCAgICAgICMgSWYgVFJVRSwgc2NhbGVzIHRoZSBjb3JyZWxhdGlvbiB0ZXh0IGZvbnQNCiAgICAgICAgICAgICAgIGRlbnNpdHkgPSBUUlVFLCAgICAgIyBJZiBUUlVFLCBhZGRzIGRlbnNpdHkgcGxvdHMgYW5kIGhpc3RvZ3JhbXMNCiAgICAgICAgICAgICAgIGVsbGlwc2VzID0gRkFMU0UsICAgIyBJZiBUUlVFLCBkcmF3cyBlbGxpcHNlcw0KICAgICAgICAgICAgICAgbWV0aG9kID0gInBlYXJzb24iLCAjIENvcnJlbGF0aW9uIG1ldGhvZCAoYWxzbyAic3BlYXJtYW4iIG9yICJrZW5kYWxsIikNCiAgICAgICAgICAgICAgIHBjaCA9IDgsICAgICAgICAgICAgIyBwY2ggc3ltYm9sDQogICAgICAgICAgICAgICBsbSA9IFRSVUUsICAgICAgICAgICMgSWYgVFJVRSwgcGxvdHMgbGluZWFyIGZpdCByYXRoZXIgdGhhbiB0aGUgTE9FU1MgKHNtb290aGVkKSBmaXQNCiAgICAgICAgICAgICAgIGNvciA9IFRSVUUsICAgICAgICAgIyBJZiBUUlVFLCByZXBvcnRzIGNvcnJlbGF0aW9ucw0KICAgICAgICAgICAgICAgamlnZ2xlID0gRkFMU0UsICAgICAjIElmIFRSVUUsIGRhdGEgcG9pbnRzIGFyZSBqaXR0ZXJlZA0KICAgICAgICAgICAgICAgZmFjdG9yID0gMiwgICAgICAgICAjIEppdHRlcmluZyBmYWN0b3INCiAgICAgICAgICAgICAgIGhpc3QuY29sID0gNCwgICAgICAgIyBIaXN0b2dyYW1zIGNvbG9yDQogICAgICAgICAgICAgICBzdGFycyA9IFRSVUUsICAgICAgICMgSWYgVFJVRSwgYWRkcyBzaWduaWZpY2FuY2UgbGV2ZWwgd2l0aCBzdGFycw0KICAgICAgICAgICAgICAgY2kgPSBGQUxTRSwgICAgICAgICAjIElmIFRSVUUsIGFkZHMgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgICAgICAgICAgICAgIG1haW4gPSAiQ29ycmVsYXRpb24gcGxvdCBvZiBjb25mbGljdCBpbmRpY2F0b3JzIChhY2xlZGRhdGEuY29tKSBhbmQgRlNDIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIikNCmBgYA0KDQoNClRoZSBudW1iZXJzIG9mIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIHBlciB0b3duc2hpcCB3ZXJlLCB1bnN1cnByaXNpbmdseSwgY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIuIEhvd2V2ZXIsIHRoZSBudW1iZXIgb2YgcGFydG5lcnMgcGVyIHRvd25zaGlwIHdhcyBvbmx5IHNsaWdodGx5IGNvcnJlbGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGJhdHRsZXMgYW5kIHRoZSBudW1iZXIgb2YgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIOKAkyB0aGlzIHBhdHRlcm4gbGlrZWx5IG9ubHkgaG9sZHMgZm9yIGNlcnRhaW4gc3RhdGVzLiBUaGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpcyBub3QgY29ycmVsYXRlZCB3aXRoIGFueSBjb25mbGljdCBpbmRpY2F0b3JzIA0KDQoNCjxicj48YnI+DQoNCiMjIyA2LjIgQ29uZmxpY3Qgc2NvcmUgYW5kIGJlbmVmaWNpYXJpZXMgcmVhY2hlZA0KDQpBIGNvbmZsaWN0IHNjb3JlLCBhdCBpdHMgbW9zdCBiYXNpYywgaXMgYW4gYXZlcmFnZSBvZiB0aGUgbm9ybWFsaXplZCB2YWx1ZXMgb2Yga2V5IGNvbmZsaWN0IGluZGljYXRvcnMuIEl0cyBtYWluIHVzZSBpdCB0byBhaWQgZGVjaXNpb25zIGFib3V0IGdlb2dyYXBoaWMgcHJpb3JpdGl6YXRpb24uIFVzaW5nIEFDTEVEIGRhdGEsIGEgY29uZmxpY3Qgc2NvcmUgd2FzIGNhbGN1bGF0ZWQgYXQgdG93bnNoaXAgbGV2ZWwsIGFuZCB0aGlzIGlzIHNob3duIHBsb3R0ZWQgYWdhaW5zdCBmb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJ5IHJlYWNoIGluIDIwMjEuIFRoZSBjb25mbGljdCBzY29yZSBoZXJlIGlzIGFuIHVwZGF0ZSBvZiB0aGUgY29uZmxpY3QgaW5kZXggaW4gdGhlIFtNSU1VLUhBUlAgVnVsbmVyYWJpbGl0eSBBbmFseXNpc10oaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIpLCB1c2luZyAyMDIxIGRhdGEuIFRoZSBzcGVjaWZpYyBjb25mbGljdCB2YXJpYWJsZXMgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2NvcmUgd2VyZSBiYXR0bGVzLCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIG5vbi1wZWFjZWZ1bCBwcm90ZXN0cyBhbmQgcmlvdHMsIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBhbmQgc3RyYXRlZ2ljIGRldmVsb3BtZW50cy4gDQoNClRoZSBzcHJlYWQgb2YgYmVuZWZpY2lhcmllcyBzaG93cyBubyBkaXNjZXJuaWJsZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgaW5jaWRlbmNlIG9mIGNvbmZsaWN0IGFuZCB0aGUgYmVuZWZpY2lhcmllcyBiZWluZyByZWFjaGVkLiBQbGVhc2UgZG93bmxvYWQgdGhlIGNvZGUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy9ibG9iL21hc3Rlci9hY2xlZC5SbWQpIHRvIHNlZSBpbiBkZXRhaWwgaG93IHRoZSBjb25mbGljdCBzY29yZSB3YXMgY2FsY3VsYXRlZC4gDQoNCjxicj4NCg0KYGBge3Igc2NvcmUtaS1iZW4tcGxvdH0NCiMgdGhlcmUgaXMgbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gY29uZmxpY3Qgc2NvcmUgYW5kIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBvciBudW1iZXIgb2YgcGFydG5lcnMgcGVyIHRvd25zaGlwDQpjb25mbGljdF9zY29yZSAlPiUNCiAgbXV0YXRlKGJlbl90b3QgPSBiZW5lZmljaWFyaWVzICsgYmVuZWZpY2lhcmllc18yMDIxKSAlPiUNCiAgbXV0YXRlKGJlbmVmaWNpYXJpZXMgPSBsb2coYmVuX3RvdCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvbmZsaWN0X3Njb3JlKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgbGFicyh4ID0gIkxvZyBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIkNvbmZsaWN0IHNjb3JlIiwNCnRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIDIwMjEtMjAyMiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYW5kIGNvbmZsaWN0IHNjb3JlIGF0IHRvd25zaGlwIGxldmVsIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJIaWdoZXIgY29uZmxpY3Qgc2NvcmVzIGluZGljYXRlIG1vcmUgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZXM6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20gYW5kIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIikgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDYuMyBUb3duc2hpcC1sZXZlbCBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzDQoNClRvd25zaGlwcyB0aGF0IGV4cGVyaWVuY2UgdGhlIG1vc3QgY29uZmxpY3QgZXZlbnRzIGFuZCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMsIGNvbWJpbmVkLCBjYW4gYmUgY29uc2lkZXJlZCB0aG9zZSBtb3N0IGFmZmVjdGVkLg0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSB0b3duc2hpcC4gVGhlIHRvd25zaGlwcyBpbiB0aGUgdXBwZXIgcmlnaHQgcXVhZHJhbnQgYXJlIHRoZSBtb3N0IGNvbmZsaWN0LWFmZmVjdGVkLCBvZiB3aGljaCB0aGVyZSBhcmUgNTcuIFdoaWxlIHByaW9yaXRpemF0aW9uIG9mIHN1cHBvcnQgaXMgbmVjZXNzYXJ5LCBpdCBzZWVtcyBjbGVhciB0aGVzZSB0b3duc2hpcHMgc2hvdWxkIGJlIHRhcmdldGVkLg0KDQpGdXJ0aGVyIGRldGFpbCBpcyBwcm92aWRlZCBhYm91dCB0aGVzZSB0b3duc2hpcHMgaW4gc2VjdGlvbiA5LjEuDQoNCg0KPGJyPg0KDQpgYGB7ciBzY2F0dGVycGxvdC1ldmVudHMtZmF0YWxpdGllcy10c3B9DQpjb25mbGljdF9zY2F0dGVyIDwtIGFjbGVkX25ldyAlPiUNCiAgZmlsdGVyKHllYXIgPj0gMjAyMSAmIHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0cyIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGxlZnRfam9pbihjb25mbGljdF9zY29yZSAlPiUgc2VsZWN0KHBhcnRuZXJzLCBhZG1pbjNfcGNvZGUsIGFkbWluMSA9IGFkbWluMS54LCBhZG1pbjMgPSBhZG1pbjMueCksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHBhcnRuZXJzID0gMCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRzLCB5ID0gZmF0YWxpdGllcywgY29sb3VyID0gZXZlbnRzLA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoInRvd25zaGlwOiAiLCBhZG1pbjMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZTogIiwgYWRtaW4xLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzOiAiLCBldmVudHMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZnNjX3BhcnRuZXJzOiAiLCBwYXJ0bmVycykpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBmYXRhbGl0aWVzKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBicmVha3MgPSBjKDAsIDEsIDEwLCAzMCwgMTAwLCAzMDAsIDEwMDApKSArDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGJyZWFrcyA9IGMoMCwgMSwgMTAsIDMwLCAxMDAsIDMwMCkpICsNCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1lYW4oZmF0YWxpdGllcykpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVhbihldmVudHMpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgbGFicyh4ID0gIkNvbmZsaWN0IGV2ZW50cyIsIA0KICAgICAgIHkgPSAiRmF0YWxpdGllcyIsDQogICAgICAgdGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IHRvd25zaGlwIiwgDQogICAgICAgc3VidGl0bGUgPSAiTWVhbnMgb2YgYm90aCBheGVzIGFyZSBtYXJrZWQgYnkgdGhlIGRvdHRlZCByZWQgbGluZSIpDQoNCmdncGxvdGx5KGNvbmZsaWN0X3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQ29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IHRvd25zaGlwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlsczsgbWVhbnMgbWFya2VkIGJ5IHJlZCBsaW5lczsgZmF0YWxpdGllcyBtYXJrZWQgYnkgc2l6ZSIsIjwvc3VwPiIpKSkgIA0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNy4gQWdyaWN1bHR1cmUgYW5kIGNvbmZsaWN0IA0KDQojIyMgNy4xIFN1bW1hcnkgb2YgYWdyaWN1bHR1cmFsIHN0YXRpc3RpY3MNCg0KYGBge3IgZGYtYWctbWFsaX0NCiMgYWdfbWFsaSBhcmVhcyBzb3dlZCBkYXRhc2V0DQoNCmFnX21hbGkgPC0gdnVsbW1yICU+JSANCiAgc2VsZWN0KHN0YXRlX3JlZ2lvbl9uYW1lLCBzdGF0ZV9yZWdpb25fcGNvZGUsIHRvd25zaGlwX3Bjb2RlLCANCiAgICAgICAgIGNvbnRhaW5zKCJtYWxpIiksIGNvbnRhaW5zKCJzb3duX2FyZWEiKSwgYWxsX2hhcnZlc3RlZF9uZXRfbWFyZ2luX3VzZCwgc293bl9hcmVhX29mX3BhZGR5X2FjcmVzKSAlPiUgDQogIG11dGF0ZShwY19wYWRkeSA9IHNvd25fYXJlYV9vZl9wYWRkeV9hY3JlcyAvIGFsbF9hcmVhX3Nvd2VkX21hbGkpICU+JSANCiAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGNvbnRhaW5zKCJzb3duX2FyZWEiKSwgbmFtZXNfdG8gPSAiY3JvcF90eXBlIiwgdmFsdWVzX3RvID0gImFjcmVzIikgJT4lDQogIGZpbHRlcihjcm9wX3R5cGUgIT0gInNvd25fYXJlYV9vZl9mcmVlbl9ncmFtX2FuZF9wZWdpb25fdXJhZF9wZWFfYWNyZXMiKSAlPiUgDQogIG11dGF0ZShhY3JlcyA9IHJlcGxhY2VfbmEoYWNyZXMsIDApKSAlPiUgDQogIG11dGF0ZShwY190b3RhbCA9IGFjcmVzIC8gYWxsX2FyZWFfc293ZWRfbWFsaSkgJT4lIA0KICBtdXRhdGUoY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAic293bl9hcmVhX29mXyIpLA0KICAgICAgICAgY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiX2FjcmVzIiksDQogICAgY3JvcF90eXBlID0gaWZlbHNlKGNyb3BfdHlwZSAlaW4lIGMoInBhZGR5IiwgInNlc2FtZSIsICJncmVlbl9ncmFtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyYWRfcGVhIiwgImdyb3VuZF9udXQiLCAicGlnZW9uX3BlYSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBjcm9wX3R5cGUsICJvdGhlciIpLCANCiAgICBjcm9wX3R5cGUgPSBmY3RfcmVsZXZlbChjcm9wX3R5cGUsICJvdGhlciIsIGFmdGVyID0gSW5mKSkNCg0KIyB3cml0ZV9jc3YoYWdfbWFsaSwgImFnX21hbGkuY3N2IikNCmBgYA0KDQo8YnI+IA0KDQpEZXRhaWxlZCB0b3duc2hpcC1sZXZlbCBhZ3JpY3VsdHVyYWwgc3RhdGlzdGljcyBmb3IgTXlhbm1hciB3ZXJlIGxhc3QgbWFkZSBhdmFpbGFibGUgaW4gMjAxNi4gVGhlc2Ugc3RhdGlzdGljcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBNSU1VLUhBUlAgcmVwb3J0IFtWdWxuZXJhYmlsaXR5IGluIE15YW5tYXJdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKS4gDQoNCkhvd2V2ZXIsIHRoZSBzdGF0aXN0aWNzIGFyZSBzb21ld2hhdCBsaW1pdGVkIGluIHZhbHVlIGJlY2F1c2UgdGhleSB3ZXJlIGNvbGxlY3RlZCBhZnRlciBtYWpvciBmbG9vZHMgaW4gMjAxNSBhbmQgd2VyZSB1c2VkIHRvIGRvY3VtZW50IGxvc3NlcyBhbmQgZ3VpZGUgZGV2ZWxvcG1lbnQgb2YgYSBuYXRpb25hbCByZWNvdmVyeSBwbGFuLiBNYW55IG9mIHRoZSAgdmFsdWVzICByZWxhdGVkIHRvIGFyZWFzIGhhcnZlc3RlZCBhcmUgYW5vbWFsb3VzLiBIb3dldmVyLCBhZ3JpY3VsdHVyYWwgYXJlYXMgc293biBhcmUgdW5saWtlbHkgdG8gaGF2ZSBzaGlmdGVkIGdyZWF0bHkgaW4gdGhlIHBhc3QgNiB5ZWFycywgIGluZGVlZCB0aGUgc293biBhcmVhIG9mIHBhZGR5IGZpZWxkcyBvbmx5IHZhcmllZCBieSAwLjElIGJldHdlZW4gMjAxNS8yMDE2IGFuZCAyMDE4LzIwMTkgd2hlbiBjb21wYXJlZCBhdCB0aGUgbmF0aW9uYWwgbGV2ZWwuDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSBzdGF0ZS9yZWdpb25hbCBicmVha2Rvd24gb2YgdGhlIHRvdGFsIHNvd24gYXJlYSBpbiBhY3JlcyBpbiAyMDE1LzIwMTYsIGJ5IG1ham9yIGNyb3AgdHlwZS4gDQoNCkF5ZXlhcndhZHksIFNhZ2FpbmcsIEJhZ28gYW5kIE1hZ3dheSBjb250YWluIHRoZSBtYWluIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uIGFyZWFzIG9mIE15YW5tYXIuIFRob3VnaCBNYW5kYWxheSwgTWFnd2F5IGFuZCBTYWdhaW5nIHNob3cgYSBtdWNoIGhpZ2hlciBkaXZlcnNpdHkgb2YgY3JvcCB0eXBlcyBjb21wYXJlZCB0byBvdGhlciBzdGF0ZXMvcmVnaW9ucyB3aGljaCBhcmUgZG9taW5hdGVkIGJ5IHBhZGR5IHJpY2UuDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1hcmVhLXNvd24tY3JvcC10eXBlLXNyfQ0KYWdfbWFsaSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlX3JlZ2lvbl9uYW1lLCBjcm9wX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGFjcmVzID0gc3VtKGFjcmVzKSwgLmdyb3VwID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShzdGF0ZV9yZWdpb25fbmFtZSA9IGZhY3RvcihzdGF0ZV9yZWdpb25fbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkF5ZXlhcndhZHkiLCAiU2FnYWluZyIsICJCYWdvIiwgIk1hZ3dheSIsICJNYW5kYWxheSIsICJTaGFuIiwgIllhbmdvbiIsICJSYWtoaW5lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2F5aW4iLCAiTW9uIiwgIkthY2hpbiIsICJUYW5pbnRoYXJ5aSIsICJLYXlhaCIsICJDaGluIiwgIk5heSBQeWkgVGF3IikpLA0KICAgICAgICAgc3RhdGVfcmVnaW9uX25hbWUgPSBmY3RfcmV2KHN0YXRlX3JlZ2lvbl9uYW1lKSkgJT4lIA0KICBmaWx0ZXIoc3RhdGVfcmVnaW9uX25hbWUgIT0gIk5heSBQeWkgVGF3IikgJT4lIA0KICBhcnJhbmdlKGRlc2MoYWNyZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHN0YXRlX3JlZ2lvbl9uYW1lLCB5ID0gYWNyZXMsIGZpbGwgPSBjcm9wX3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgNzAwMDAwMCwgYnkgPSAxMDAwMDAwKSkgKw0KICAjc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInR1cmJvIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgdmp1c3QgPSAwLjcpLA0KICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICBmaWxsID0gIiIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGFjcmVzIHNvd24gYnkgY3JvcCB0eXBlIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUsIExpdmVzdG9jayBhbmQgSXJyaWdhdGlvbiAoMjAxNSkiKQ0KDQojIGdnc2F2ZSgiYWdyaWN1bHR1cmVfYmFycGxvdC5wbmciLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDExLCB1bml0cyA9ICJpbiIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZSAyMDE1LzIwMTYgYWdyaWN1bHR1cmFsIGRhdGEgaXMgYWxzbyB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBuZXQgbWFyZ2lucyBwZXIgYWNyZSBvZiBjcm9wIHR5cGUsIGFuZCB0aGVyZWZvcmUgdGhlIHBvdGVudGlhbCBjb3N0IG9mIGNyb3AgbG9zc2VzIGR1ZSB0byBjb25mbGljdC4NCg0KUGFkZHkgcmljZSBjcm9wcyBwcm92aWRlZCB0aGUgbG93ZXN0IG5ldCBtYXJnaW5zLiBBcmVhcyB3aXRoIGRpdmVyc2UgY3JvcHMgZW5qb3llZCBoaWdoZXIgbWFyZ2lucyBpbiAyMDE1LzIwMTYuDQoNCkFzc3VtaW5nIHRoZXNlIG1hcmdpbnMgYXJlIHN0aWxsIGFjY3VyYXRlLCBhcmVhcyBvZiBNeWFubWFyIHdpdGggZ3JlYXRlciBsZXZlbHMgb2YgY3JvcCBkaXZlcnNpZmljYXRpb24sIHN1Y2ggYXMgTWFuZGFsYXksIE1hZ3dheSBhbmQgU2FnYWluZywgaGF2ZSBsaWtlbHkgc3VmZmVyZWQgZ3JlYXRlciBlY29ub21pYyBpbXBhY3RzIGZyb20gY29uZmxpY3QgZXZlbnRzLiANCiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1uZXQtbWFyZ2luc30NCnZ1bG1tciAlPiUgDQogIHNlbGVjdChjb250YWlucygibmV0X21hcmdpbiIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gImNyb3BfdHlwZSIsIHZhbHVlc190byA9ICJuZXRfbWFyZ2luIikgJT4lIA0KICBncm91cF9ieShjcm9wX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBzdW0oLngsIG5hLnJtID0gVFJVRSkpKSAlPiUgDQogIGZpbHRlcihjcm9wX3R5cGUgJW91dCUgYygiYWxsX2hhcnZlc3RlZF9uZXRfbWFyZ2luX3Blcl9jYXBpdGFfdXNkIiwgImFsbF9oYXJ2ZXN0ZWRfbmV0X21hcmdpbl91c2QiKSAmDQogICAgICAgICAgIHN0cl9kZXRlY3QoY3JvcF90eXBlLCAic2hhcmVfb2YiLCBuZWdhdGUgPSBUUlVFKSkgJT4lDQogICMgcmVjb2RpbmcgcGFkZHkgLS0gcGFkZHkgaXMganVzdCBjb2RlZCBhcyAibmV0X21hcmdpbl91c2QiDQogIG11dGF0ZShjcm9wX3R5cGUgPSByZWNvZGUoY3JvcF90eXBlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldF9tYXJnaW5fdXNkIiA9ICJwYWRkeSIpKSAlPiUgDQogIG11dGF0ZShjcm9wX3R5cGUgPSBzdHJfcmVtb3ZlX2FsbChjcm9wX3R5cGUsICJuZXRfbWFyZ2luXyIpLCANCiAgICAgICAgIGNyb3BfdHlwZSA9IHN0cl9yZW1vdmVfYWxsKGNyb3BfdHlwZSwgIl91c2QiKSkgJT4lIA0KICBsZWZ0X2pvaW4odnVsbW1yICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoY29udGFpbnMoImhhcnZlc3RlZF9hcmVhX29mIikpICU+JSANCiAgICAgICAgICAgICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiY3JvcF90eXBlIiwgdmFsdWVzX3RvID0gImhhcnZlc3RlZF9hcmVhIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGNyb3BfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHN1bSgueCwgbmEucm0gPSBUUlVFKSkpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiaGFydmVzdGVkX2FyZWFfb2ZfIiksIA0KICAgICAgICAgICAgICAgICAgICAgY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiX2FjcmVzIikpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNyb3BfdHlwZSA9IHJlY29kZShjcm9wX3R5cGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91bmRfbnV0IiA9ICJncm91bmRudXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdW5fZmxvd2VyIiA9ICJzdW5mbG93ZXJfc2VlZHMiKSksDQogICAgICAgICAgICAgIGJ5ID0gImNyb3BfdHlwZSIpICU+JSANCiAgbXV0YXRlKGNyb3BfdHlwZSA9IHN0cl90cmltKHN0cl9yZXBsYWNlX2FsbChjcm9wX3R5cGUsICJfIiwgIiAiKSksDQogICAgICAgICBjcm9wX3R5cGUgPSBzdHJfdG9fdGl0bGUoY3JvcF90eXBlKSkgJT4lIA0KICBtdXRhdGUoYEhhcnZlc3RlZCBhcmVhICVgID0gcm91bmQoaGFydmVzdGVkX2FyZWEgLyBzdW0oaGFydmVzdGVkX2FyZWEsIG5hLnJtID0gVFJVRSkgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgbWFyZ2luX3Blcl9hY3JlID0gcm91bmQobmV0X21hcmdpbiAvIGhhcnZlc3RlZF9hcmVhKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MobWFyZ2luX3Blcl9hY3JlKSkgJT4lIA0KICBmaWx0ZXIoaGFydmVzdGVkX2FyZWEgPiA2MDAwMDApICU+JSANCiAgcmVuYW1lKGBIYXJ2ZXN0ZWQgYXJlYSAoYWNyZXMpYCA9IGhhcnZlc3RlZF9hcmVhLCANCiAgICAgICAgIGBOZXQgbWFyZ2luIChVU0QpYCA9IG5ldF9tYXJnaW4sIA0KICAgICAgICAgYE1hcmdpbiBwZXIgYWNyZSAoVVNEKWAgPSBtYXJnaW5fcGVyX2FjcmUsIA0KICAgICAgICAgYENyb3AgdHlwZWAgPSBjcm9wX3R5cGUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJOZXQgbWFyZ2luIHBlciBhY3JlIG9mIG1ham9yIGNyb3BzICgyMDE1KSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUsIExpdmVzdG9jayBhbmQgSXJyaWdhdGlvbiAoMjAxNS8yMDE2KSIsIGdlbmVyYWxfdGl0bGUgPSAiIikgDQoNCiMgJT4lIA0KIyAgIHNhdmVfa2FibGUoZmlsZSA9ICJhZ19tYXJnaW5zLnBuZyIsIHpvb20gPSAyKSANCiAgDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNy4yIENvbmZsaWN0IHNjb3JlIGFuZCBhZ3JpY3VsdHVyZQ0KDQpDb25mbGljdCBoYXMgYSByZWFsIGVmZmVjdCBvbiBmb29kIHByaWNlcywgYXMgZGVtb25zdHJhdGVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsIEZvb2QgUG9saWN5IFJlc2VhcmNoIEluc3RpdHV0ZSAoSUZQUkkpIGluIHRoZWlyIHdvcmtpbmcgcGFwZXIgW0FncmljdWx0dXJhbCB2YWx1ZSBjaGFpbnMgaW4gYSBmcmFnaWxlIHN0YXRlOiB0aGUgY2FzZSBvZiByaWNlIGluIE15YW5tYXJdKGh0dHBzOi8vd3d3LmlmcHJpLm9yZy9wdWJsaWNhdGlvbi9hZ3JpY3VsdHVyYWwtdmFsdWUtY2hhaW5zLWZyYWdpbGUtc3RhdGUtY2FzZS1yaWNlLW15YW5tYXIpLiANCg0KSUZQUkkgbm90ZWQgdGhhdCB3aGlsc3QgbmVpdGhlciBwYWRkeSBub3IgbWlsbGVkIHJpY2UgKDEwMCBrZyBvZiBoYXJ2ZXN0ZWQgcGFkZHkgeWllbGRzIGFib3V0IDY4IGtnIG1pbGxlZCByaWNlLCB3aGljaCBpcyB0aGVuIHNvbGQgb24gdG8gcmV0YWlsZXJzKSBoYWQgc2VlbiBhbnkgbWFqb3IgcHJpY2UgY2hhbmdlcyBhZnRlciB0aGUgbWlsaXRhcnkgdGFrZW92ZXIsIHRoZSByZXRhaWwgcHJpY2Ugb2YgcmljZSBoYXMgYmVlbiBub3RpY2VhYmx5IGhpZ2hlci4gU3VydmV5ZWQgZm9vZCB2ZW5kb3JzIGFsc28gcmVwb3J0ZWQgZXhwZXJpZW5jaW5nIGEgc3RlZXAgaW5jcmVhc2UgaW4g4oCcbG9jYWwgZmFybWVyIHN1cHBseSBkaWZmaWN1bHRpZXPigJ0gYW5kIOKAnG91dHNpZGUgdmlsbGFnZSBzdXBwbHkgZGlmZmljdWx0aWVz4oCdLg0KDQpUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb25mbGljdCBpcyBpbXBhY3RpbmcgYWdyaWN1bHR1cmFsIHN1cHBseSBjaGFpbnMgYW5kIHByaWNlcy4gSW4gdG90YWwsIHJldGFpbCByaWNlIHByaWNlcyBoYXZlIGluY3JlYXNlZCAxMSBwZXIgY2VudCBzaW5jZSB0aGUgbWlsaXRhcnkgdGFrZW92ZXIuIElGUFJJIG5vdGVkIHRoYXQgMTAgYWRkaXRpb25hbCB2aW9sZW50IGV2ZW50cyBpbiB0aGUgbW9udGgtb2YgYW5kIG1vbnRoIGJlZm9yZSBhIHByaWNlIG1lYXN1cmVtZW50IHdhcyBhc3NvY2lhdGVkIHdpdGggYSAxIGFuZCAyIHBlcmNlbnQgaW5jcmVhc2UgaW4gcHJpY2UgZGlzcGVyc2lvbiwgcmVzcGVjdGl2ZWx5LCBhdCB0aGUgbWlsbCBhbmQgdmVuZG9yIGxldmVscy4gQXMgSUZQUkkgcmVwb3J0ZWQsIOKAnHRoZSBpbXBhY3Qgb2YgMTAgdmlvbGVudCBldmVudHMgaXMgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IHRvIDE2Ny0zMzMga20gb2YgZGlzdGFuY2UgYmV0d2VlbiBtaWxscyBhbmQgdmVuZG9yc+KAnS4NCg0KVGhlIHRyZWVtYXAgYmVsb3cgc2hvd3MgdGhlIGludGVyc2VjdGlvbiBvZiBhY3JlcyBvZiBsYW5kIHNvd24gYW5kIHRoZSBjb25mbGljdCBzY29yZSBjYWxjdWxhdGVkIGZyb20gQUNMRUQgZGF0YS4gVG93bnNoaXBzIGFyZSByZXByZXNlbnRlZCBieSB0aGUgc21hbGxlciByZWN0YW5nbGVzIGFuZCBhcmUgZ3JvdXBlZCBieSBzdGF0ZS9yZWdpb24uIFRoZSBhbW91bnQgb2YgYWdyaWN1bHR1cmFsIGFyZWEgc293biBpbiBhIHN0YXRlIG9yIHJlZ2lvbiBpcyByZWZsZWN0ZWQgYnkgdGhlIHNpemUgb2YgdGhlIGxhcmdlciByZWN0YW5nbGVzLiBUaGUgc2V2ZXJpdHkgb2YgY29uZmxpY3QgaW4gYSB0b3duc2hpcCBpcyBpbmRpY2F0ZWQgYnkgaXRzIGNvbG9yLiANCg0KU2FnYWluZyBhbmQgTWFnd2F5IGFyZSB0d28gb2YgdGhlIHRvcCBhcmVhcyBpbiBNeWFubWFyIGZvciBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiwgYW5kIHRoZWlyIHRvd25zaGlwcyB3ZXJlIG1vc3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QgaW4gMjAyMS4gQWdyaWN1bHR1cmFsIGFyZWFzIGluIEF5ZXlhcndhZHksIEJhZ28sIFlhbmdvbiwgUmFraGluZSBhbmQgU2hhbiAoRWFzdCkgaGF2ZSBiZWVuIGxlc3MgYWZmZWN0ZWQgYnkgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzLCBpbmRpY2F0aW5nIHRoYXQgYWNjZXNzIHRvIGZpZWxkcyBhbmQgbWFya2V0cyBub3QgYmVlbiBkaXNydXB0ZWQgYW5kIGV4aXN0aW5nIGxpdmVsaWhvb2RzIHByb2dyYW1tZSBkZXNpZ25zIG1heSBiZSBzdWZmaWNpZW50IGluIHRoZXNlIGFyZWFzLg0KDQpFbnN1cmluZyBmb29kIHNlY3VyaXR5IGluIFNhZ2FpbmcsIE1hZ3dheSwgTWFuZGFsYXksIE1vbiwgS2F5aW4sIEthY2hpbiBhbmQgS2F5YWgsIGxpdmVsaWhvb2QgcHJvZ3JhbW1pbmcgc2hvdWxkIGJlIHByZWRpY2F0ZWQgb24gc2FmZSBhY2Nlc3MgdG8gYWdyaWN1bHR1cmFsIGxhbmQgYW5kIG1hcmtldHMuIFdoaWxlIGEgbW9yZSB0aG9yb3VnaCBhbmFseXNpcyBvZiBtYXJrZXQgYWNjZXNzIGluIHRoZXNlIGFyZWFzIGlzIHdhcnJhbnRlZCwgIGZhY2lsaXRhdGluZyBhY2Nlc3MgYmV0d2VlbiBwcm9kdWNlcnMsIG1pbGxlcnMgYW5kIHZlbmRvcnMgIHdvdWxkIGNvbnRyaWJ1dGUgdG8gdGhlIHN0YWJpbGl6YXRpb24gb2YgcHJpY2VzLiBUaGVyZSBpcyBhbHNvIGEgbmVlZCBmb3IgbWluZS1yaXNrIGVkdWNhdGlvbiBhcyBtYW55IGFyZWFzIG1pZ2h0IGJlIGNvbnRhbWluYXRlZCBieSBVWE9zLiBGb3IgcmVmZXJlbmNlLCB0aGUgbWFwIGluIHNlY3Rpb24gIFszLjRdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLyNwcm9ncmVzc2lvbi1vZi1jb25mbGljdC1ldmVudHMtYnktZXZlbnQtdHlwZS1pbi0yMDIxKSB0byBzZWUgd2hlcmUgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIGhhdmUgb2NjdXJyZWQuIA0KDQoNCjxicj4gDQoNCmBgYHtyIHRyZWVtYXAtY29uZmxpY3Qtc2NvcmUtYXJlYS1zb3dufQ0KdnVsbW1yICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUgPSB0b3duc2hpcF9wY29kZSwgYXJlYV9zb3duID0gYWxsX2FyZWFfc293ZWRfbWFsaSkgJT4lIA0KICBsZWZ0X2pvaW4oY29uZmxpY3Rfc2NvcmUgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KGNvbmZsaWN0X3Njb3JlLCBhZG1pbjNfcGNvZGUsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCANCiAgICAgICAgICAgICAgICAgICB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgZmF0YWxpdGllcyksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgc2VsZWN0KHN0YXRlX25hbWUsIHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKGNvbmZsaWN0X3Njb3JlID0gcmVwbGFjZV9uYShjb25mbGljdF9zY29yZSwgMCkpICU+JSANCiAgZ2dwbG90KGFlcyhhcmVhID0gYXJlYV9zb3duLCBmaWxsID0gY29uZmxpY3Rfc2NvcmUsIHN1Ymdyb3VwID0gc3RhdGVfbmFtZSwgDQogICAgICAgICAgICAgIyB0aGVzZSBuZXh0IGFyZ3VtZW50cyBhcmUgdW5uZWNlc3NhcnkgYXMgdGhlIGdncGxvdGx5IGRvZXNuJ3Qgd29yayBmb3IgdHJlZW1hcHMgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcF9uYW1lLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfbmFtZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmVhX3Nvd246ICIsIGFyZWFfc293biwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhdHRsZXM6ICIsIGJhdHRsZXMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwbG9zaW9ucyYgcmVtb3RlIHZpb2xlbmNlOiAiLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFuczogIiwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpKSkgKw0KICBnZW9tX3RyZWVtYXAoKSArDQogIGdlb21fdHJlZW1hcF9zdWJncm91cF90ZXh0KHBsYWNlID0gImNlbnRyZSIsIGdyb3cgPSBUUlVFLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgZm9udGZhY2UgPSAiaXRhbGljIikgKw0KICBnZW9tX3RyZWVtYXBfc3ViZ3JvdXBfYm9yZGVyKGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICBsYWJzKGZpbGwgPSAiY29uZmxpY3RcbnNjb3JlIiwgDQogICAgICAgdGl0bGUgPSAiVHJlZW1hcCBvZiB0b3duc2hpcHMgYnkgYWdyaWN1bHR1cmFsIGFyZWEgc293biIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbG91cnMgaW5kaWNhdGUgY29uZmxpY3Qgc2NvcmU7IGFyZWFzIG9mIGVhY2ggc3F1YXJlIGNvcnJlc3BvbmQgdG8gYWNyZXMgc293biBieSB0b3duc2hpcCIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVELCBhY2xlZGRhdGEuY29tICgyMDIxKTsgTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUgYW5kIElycmlnYXRpb24gKDIwMTUpIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KYGBgDQoNCjxicj4NCg0KVGhlIG5leHQgdHJlZW1hcCB1c2VzIHRoZSBzYW1lIGFyZWEgc2NhbGUgYXMgYWJvdmUsICBidXQgdGhlIGNvbG91cnMgb2YgZWFjaCB0b3duc2hpcCBoYXZlIGJlZW4gY2hhbmdlZCB0byByZWZsZWN0IHRoZSBuZXQgbWFyZ2lucyBlYXJuZWQgZnJvbSBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiBpbiAyMDE1LzIwMTYuDQoNCldoaWxlIEF5ZXlhcndhZHkgaGFkIHRoZSBsYXJnZXN0IGN1bHRpdmF0ZWQgYXJlYSBvZiBhbGwgdGhlIHN0YXRlcyBhbmQgcmVnaW9ucywgaXRzIHNoYXJlIG9mIHRoZSBuZXQgbWFyZ2lucyBwZXIgYWNyZSB0ZW5kZWQgdG8gYmUgbG93ZXIgdGhhbiBpbiBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBjb3VudHJ5LiBUaGlzIGlzIGxhcmdlbHkgZHVlIHRvIHRoZSBtdWNoIGhpZ2hlciBsZXZlbHMgb2YgY3JvcCBkaXZlcnNpZmljYXRpb24gaW4gTWFnd2F5IGFuZCBTYWdhaW5nIG9yIHJhdGhlciwgdGhlIHByZWRvbWluYW5jZSBvZiBwYWRkeSBjdWx0aXZhdGlvbiBpbiBBeWV5YXJ3YWR5LiBEZXNwaXRlIHRoZSBhbm9tYWxvdXMgcG9zdC1mbG9vZCBkYXRhIGZyb20gMjAxNS8yMDE2LCB0aGlzIHNob3dzIHRoZSBhcmVhcyBvZiBTYWdhaW5nIGFuZCBNYWd3YXkgaGF2ZSB0aGUgbW9zdCB0byBsb3NlIGluIHJlbGF0aW9uIHRvIGNvbmZsaWN0IGFuZCBjcm9wIGxvc3NlcyBvciBkYW1hZ2UuDQoNCg0KPGJyPg0KDQpgYGB7ciB0cmVlbWFwLWNvbmZsaWN0LXNjb3JlLW5ldF9tYXJnaW59DQp2dWxtbXIgJT4lIHNlbGVjdChhbGxfbmV0X21hcmdpbiA9IGFsbF9oYXJ2ZXN0ZWRfbmV0X21hcmdpbl91c2QsIGFsbF9hcmVhX2hhcnZlc3RlZCA9IGFsbF9hcmVhc19oYXJ2ZXN0ZWRfbWFsaSwgDQogICAgICAgICAgICAgICAgICBhcmVhX3Nvd24gPSBhbGxfYXJlYV9zb3dlZF9tYWxpLCBhZG1pbjNfcGNvZGUgPSB0b3duc2hpcF9wY29kZSkgJT4lIA0KICBtdXRhdGUobmV0X21hcmdpbl9hY3JlID0gYWxsX25ldF9tYXJnaW4gLyBhbGxfYXJlYV9oYXJ2ZXN0ZWQpICU+JSANCiAgbGVmdF9qb2luKGNvbmZsaWN0X3Njb3JlICU+JSANCiAgICAgICAgICAgIHNlbGVjdChjb25mbGljdF9zY29yZSwgYWRtaW4zX3Bjb2RlLCBiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgDQogICAgICAgICAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIGZhdGFsaXRpZXMpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCB0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF9zY29yZSA9IHJlcGxhY2VfbmEoY29uZmxpY3Rfc2NvcmUsIDApKSAlPiUgDQogIGdncGxvdChhZXMoYXJlYSA9IGFyZWFfc293biwgZmlsbCA9IG5ldF9tYXJnaW5fYWNyZSwgc3ViZ3JvdXAgPSBzdGF0ZV9uYW1lKSkgKw0KICBnZW9tX3RyZWVtYXAoKSArDQogIGdlb21fdHJlZW1hcF9zdWJncm91cF90ZXh0KHBsYWNlID0gImNlbnRyZSIsIGdyb3cgPSBUUlVFLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgZm9udGZhY2UgPSAiaXRhbGljIikgKw0KICBnZW9tX3RyZWVtYXBfc3ViZ3JvdXBfYm9yZGVyKGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgbGFiZWxzID0gY29tbWEpICsNCiAgbGFicyhmaWxsID0gIm5ldCBtYXJnaW5cbnBlciBhY3JlXG4oVVNEKSIsIA0KICAgICAgIHRpdGxlID0gIlRyZWVtYXAgb2YgdG93bnNoaXBzIGJ5IHRvdGFsIG5ldCBtYXJnaW5zIG9mIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29sb3VycyBVU0QgbmV0IG1hcmdpbnMgb2YgYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gYnkgdG93bnNoaXA7XG5BcmVhcyBvZiBlYWNoIHNxdWFyZSBjb3JyZXNwb25kIHRvIGFjcmVzIHNvd24gYnkgdG93bnNoaXAiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRCwgYWNsZWRkYXRhLmNvbSAoMjAyMSk7IE1pbmlzdHJ5IG9mIEFncmljdWx0dXJlIGFuZCBJcnJpZ2F0aW9uICgyMDE1KSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQogIA0KYGBgDQoNCg0KDQo8YnI+PGJyPg0KDQojIyMgNy4zIE1hcHMgb2YgY29uZmxpY3QgZXZlbnRzLCBmYXRhbGl0aWVzIGFuZCBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duIA0KDQpDbGljayAqKltoZXJlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9hY2xlZF9tYXBzLykqKiB0byBzZWUgaW50ZXJhY3RpdmUgdmVyc2lvbnMgb2YgdGhlc2UgbWFwcy4gUGxlYXNlIG5vdGUgdGhlIG1hcHMgYXJlIGxhcmdlIGFuZCB3aWxsIHRha2UgYSBsb25nIHRpbWUgdG8gbG9hZC4gU3RhdGljIHZlcnNpb25zIGFyZSBiZWxvdy4gDQoNCmBgYHtyIGZpZy5oZWlnaHQgPSAxMCwgcGF0Y2h3b3JrLWFnLWNvbmZsaWN0LW1hcHN9DQoNCmFnX21hbGkgJT4lIA0KICBncm91cF9ieSh0b3duc2hpcF9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoYXJlYV9zb3duID0gbWVhbihhbGxfYXJlYV9zb3dlZF9tYWxpKSkgJT4lIA0KICBzZWxlY3QoYXJlYV9zb3duLCBhZG1pbjNfcGNvZGUgPSB0b3duc2hpcF9wY29kZSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBhcmVhX3Nvd24pLCBzaXplID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBhY2xlZCAlPiUgZmlsdGVyKHllYXIgPj0gMjAyMSAmIHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGxhdGl0dWRlLCBsb25naXR1ZGUsIGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlLCBzaXplID0gZmF0YWxpdGllcyksIGFscGhhID0gMC41LCBjb2xvdXIgPSAicmVkIikgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJlZCIsICJibGFjayIpKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC4xLCAxLjUpKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCBsYWJlbCA9IHNjYWxlczo6Y29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDUwMDAwLCAyMDAwMDAsIDQwMDAwMCwgNjAwMDAwLCA3NTAwMDApKSArIA0KICBndWlkZXMoc2l6ZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAic293biBhcmVhIChhY3JlcykiLCANCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgKDIwMjEpIGFuZCBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duICgyMDE1KSIsDQogICAgICAgY2FwdGlvbiA9ICJBQ0xFRDsgYWNsZWRkYXRhLmNvbSAmIE1pbmlzdHJ5IG9mIEFncmljdWx0dXJlIGFuZCBJcnJpZ2F0aW9uIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgDQpjb25mbGljdF9zY29yZSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCB0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF9zY29yZSA9IHJvdW5kKGNvbmZsaWN0X3Njb3JlLCBkaWdpdHMgPSAyKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHN0X2FzX3NmKCkgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGNvbmZsaWN0X3Njb3JlKSwgc2l6ZSA9IDAuMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1hZ21hIikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJDb25mbGljdCBzY29yZSIsIA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IHNjb3JlIGJ5IHRvd25zaGlwIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCiMgZ2dzYXZlKGZpbGVuYW1lID0gIi4vcGF0Y2h3b3JrX2FyZWFfc293bl9jb25mbGljdF9zY29yZV9tYXBzLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gMTQsIHVuaXRzID0gImluIikNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDguIFRleHQgbWluaW5nIGNvbmZsaWN0IGV2ZW50IGRlc2NyaXB0aW9ucw0KDQoNCiMjIyA4LjEgTmV0d29yayBncmFwaCBvZiBjb25mbGljdCBkZXNjcmlwdGlvbnMNCg0KQUNMRUQgZGF0YSBjYXRhbG9ndWVkIDE2LDI2MyBjb25mbGljdCBldmVudHMgaW4gTXlhbm1hciBpbiAyMDIxLiBGb3IgZWFjaCBldmVudCwgYSBzZXJpZXMgb2Ygbm90ZXMgaXMgbG9nZ2VkLCB3aGljaCBjb250YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LiBUaGUgZGVzY3JpcHRpb25zIGluY2x1ZGUgaW5mb3JtYXRpb24gb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBjb25mbGljdCwgdGhlIGFjdG9ycyBpbnZvbHZlZCwgYW5kIHRoZSBpbW1lZGlhdGUgaW1wYWN0LiBBIHNhbXBsZSBvZiBjb25mbGljdCBldmVudCBkZXNjcmlwdGlvbnMgZnJvbSB0aGUgQUNMRUQgZGF0YXNldCBhcmUgc2hvd24gYmVsb3cuIFRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBkYXRhLCBlYWNoIGRlc2NyaXB0aXZlIHBhcmFncmFwaCB3YXMgYnJva2VuIGRvd24gYnkgaW5kaXZpZHVhbCB3b3JkcyB0byBiZXR0ZXIgaWRlbnRpZnkga2V5IHdvcmRzIGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZW0uDQoNCg0KYGBge3IgZXZlbnQtZGVzY3JpcHRpb25zfQ0KYWNsZWRfbmV3ICU+JSAgDQogIGZpbHRlcihkYXRhX2lkICVpbiUgYygiNzY5NTcyOCIsICI3NzYxMjIzIiwgIjg2NTU0MjQiKSkgJT4lIA0KICBzZWxlY3QoZGF0YV9pZCwgbm90ZXMpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJFeGFtcGxlcyBvZiBjb25mbGljdCBkZXNjcmlwdGlvbnMgZnJvbSB0aGUgQUNMRUQgZGF0YXNldCIpICU+JSANCiAga2FibGVfcGFwZXIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIGdlbmVyYWxfdGl0bGUgPSAiIikgDQojICU+JSANCiMgIHNhdmVfa2FibGUoZmlsZSA9ICJjb25mbGljdF9kZXNjcmlwdGlvbnMucG5nIiwgem9vbSA9IDIpDQogIA0KYGBgDQoNCjxicj4NCg0KV2hlbiB0aGUgY29uZmxpY3QgZGVzY3JpcHRpb24ga2V5IHdvcmRzIGFyZSBtYXBwZWQgb250byBhIG5ldHdvcmsgZ3JhcGgsIGFzIGJlbG93LCBjbHVzdGVycyBvZiB3b3JkcyBiZWNvbWUgYXBwYXJlbnQuIE9ubHkgdGhvc2Ugd29yZHMgdGhhdCBhcHBlYXJlZCBpbiBhdCBsZWFzdCA3MCBjb25mbGljdCBkZXNjcmlwdGlvbnMsIGFuZCBoYWQgYSBjb3JyZWxhdGlvbiBvZiBhYm92ZSAwLjIgd2l0aCBhdCBsZWFzdCBvbmUgb3RoZXIgd29yZCB3ZXJlIG1hcHBlZC4NClRoZXJlIGFyZSBmb3VycyBjbHVzdGVycyBvZiB3b3JkcyBvZiBub3RlLiBUaGUgZmlyc3QgY2VudGVycyBhcm91bmQgdGhlIHdvcmQgcHJvdGVzdHMsIHRoZSBzZWNvbmQgYXJvdW5kIHByb3Rlc3QtcmVsYXRlZCB3b3JkcywgdGhlIHRoaXJkIGFyb3VuZCAqcmVtb3RlKiwgKmNvbnRyb2xsZWQqIGFuZCAqZXhwbG9zaXZlcyosIGFuZCB0aGUgZm91cnRoIGFyb3VuZCBLYWNoaW4gdG93bnNoaXAgbmFtZXMuDQoNCg0KPGJyPg0KDQpbIVtjb25mbGljdCBuZXR3b3JrIGdyYXBoXSguL3RleHRfbWluaW5nL2NvbmZsaWN0X25ldHdvcmtfZ3JhcGgucG5nKV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjL21hc3Rlci90ZXh0X21pbmluZy9jb25mbGljdF9uZXR3b3JrX2dyYXBoLnBuZyl7dGFyZ2V0PSJfYmxhbmsifQ0KQ2xpY2sgKipbaGVyZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjL21hc3Rlci90ZXh0X21pbmluZy9jb25mbGljdF9uZXR3b3JrX2dyYXBoLnBuZyl7dGFyZ2V0PSJfYmxhbmsifSoqIHRvIHNlZSB0aGUgZnVsbC1zaXplZCBncmFwaC4gDQoNCjxicj4NCg0KVGhlIGZpcnN0IGNsdXN0ZXIgY2VudGVycyBvbiB0aGUgd29yZCBwcm90ZXN0cy4gVGhlIHdvcmQgaXMgY2xvc2VseSBsaW5rZWQgdG8gb3RoZXIgd29yZHMgaW5jbHVkaW5nICpjb3VwKiBhbmQgKmRpc29iZWRpZW5jZSouIExpbmtlZCB0byB0aGlzIGNsdXN0ZXIgaXMgYSBzZWNvbmQgd2hpY2ggIGNvbnRhaW5zIHRoZSB3b3JkcyAqbGl2ZSosICpydWJiZXIqLCAqYnVsbGV0cyosICpkaXNwZXJzZSogYW5kICpjcm93ZCouIEl0IGlzIGVhc2lseSBzdXJtaXNlZCB0aGVzZSB3b3JkcyByZWxhdGUgdG8gY29uZmxpY3QgZXZlbnRzIHN1cnJvdW5kaW5nIHRoZSBGZWJydWFyeSAyMDIxIG1pbGl0YXJ5IHRha2VvdmVyIGFuZCB0aGUgbWFzcyBkZW1vbnN0cmF0aW9ucyBpbiByZXNwb25zZS4gSW5kZWVkLCB0aGUgd29yZCAqRmVicnVhcnkqIGlzIGFsc28gY2xvc2VseSBsaW5rZWQgd2l0aCBib3RoIGNsdXN0ZXJzLg0KDQpBbm90aGVyIGNsdXN0ZXIgb2Ygbm90ZSBjZW50ZXJzIGFyb3VuZCB0aGUgd29yZHMgKnJlbW90ZSosICpjb250cm9sbGVkKiBhbmQgKmV4cGxvc2l2ZXMqLiBUaGUgY2x1c3RlciBpcyBjbG9zZWx5IGxpbmtlZCB0byBhIHNlY29uZCBzZXJpZXMgb2Ygd29yZHMsIGluY2x1ZGluZyAqY29udm95KiwgKnRydWNrcyogYW5kICpsYW5kbWluZXMqLiBUaGVzZSB3b3JkIGFyZSBsaWtlbHkgbGlua2VkIHRvIGV2ZW50cyB3aGVyZSBtaWxpdGFyeSBjb252b3lzIHdlcmUgYm9tYmVkIGFuZCBhbWJ1c2hlZCBieSB0aGUgUGVvcGxl4oCZcyBEZWZlbmNlIEZvcmNlcy4NCg0KVGhlcmUgaXMgYWxzbyBhIEthY2hpbiBjbHVzdGVyIG9mIHdvcmRzLCBjZW50ZXJlZCBhcm91bmQgdGhlIHRvd25zaGlwIG5hbWVzIG9mICpNeWl0a3lpbmEqLCAqV2FpbmdtYXcqLCAqTW9uaHlpbiosICpIcGFrYW50KiwgKkJoYW1vKiwgYXMgd2VsbCBhcyAqS0lBKiwgdGhlIGFjcm9ueW0gZm9yIHRoZSBLYWNoaW4gSW5kZXBlbmRlbmNlIEFybXkuIA0KDQpUaGUgcGxvdHMgYmVsb3cgc2hvdyB0aGUgdG9wIDIwIHdvcmRzICBhc3NvY2lhdGVkIHdpdGggZWFjaCB0eXBlIG9mIGNvbmZsaWN0IGV2ZW50LiBUaGVzZSBwbG90cyBwcm92aWRlIGFuIGFsdGVybmF0aXZlIHdheSBvZiByZWFkaW5nIG9yIGludGVycHJldGluZyB0aGUgd29yZCBkYXRhLiBPZiBpbnRlcmVzdCwgdGhlIHdvcmQgKmNsYXNoZWQqIGlzIG1vc3QgbGlrZWx5IHRvIGFwcGVhciBpbiBkZXNjcmlwdGlvbnMgb2YgYmF0dGxlcywgd2hpbGUgdGhlIHdvcmQgKmNvdXAqIGlzIG1vcmUgbGlrZWx5IHRvIGFwcGVhciBpbiBkZXNjcmlwdGlvbnMgb2YgcHJvdGVzdCBldmVudHMuDQogDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtbG9nLW9kZHMtZXZlbnQtdHlwZSwgZmlnLmhlaWdodD02LjV9DQphY2xlZF93b3JkcyAlPiUNCiAgZmlsdGVyKHdvcmQgJW91dCUgYygiZmF0YWxpdHkiLCAiY29kZWQiLCAiZGVhdGgiLCAidmlsbGFnZSIsICJ0b3duc2hpcCIsICJkaXN0cmljdCIsICJ2aWxsYWdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgInRvd24iLCAidHJhY3QiLCAiZmF0YWxpdGllcyIsICJkdmIiLCAiYWFwcCIsICJ0b3RhbCIsICJpcnJhd2FkZHkiLCAicmZhIiwgImRpZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJraWxsaW5nIiwgImtpbGxlZCIsICJkZWFkIiwgImV2ZW50IiwgImV2ZW50cyIsICJjYXN1YWx0eSIsICJjYXN1YWx0aWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIsICJjb2RlIiwgInJlcG9ydCIsICJteWFubWFyIiwiY29kZWQiKSkgJT4lIA0KICBtdXRhdGUoaGFzX2ZhdGFsaXRpZXMgPSBpZmVsc2UoZmF0YWxpdGllcyA+IDAsICJ5ZXMiLCAibm8iKSkgJT4lIA0KICBjb3VudChldmVudF90eXBlLCB3b3JkKSAlPiUgDQogIGJpbmRfbG9nX29kZHMoZXZlbnRfdHlwZSwgd29yZCwgbikgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHRvcF9uKDIwLCBsb2dfb2Rkc193ZWlnaHRlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUod29yZCA9IHJlb3JkZXJfd2l0aGluKHdvcmQsIGxvZ19vZGRzX3dlaWdodGVkLCBldmVudF90eXBlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBsb2dfb2Rkc193ZWlnaHRlZCwgeSA9IHdvcmQsIGZpbGwgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfcmVvcmRlcmVkKCkgKw0KICBmYWNldF93cmFwKH4gZXZlbnRfdHlwZSwgc2NhbGVzID0gImZyZWUiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJUb3AgMjAgd29yZHMgYnkgZXZlbnQgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiT2RkcyBvZiB3b3JkcyB1c2VkIHRvIGRlc2NyaWJlIGNvbmZsaWN0IGV2ZW50cyIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgIHkgPSAiIikNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyA4LjIgUGFpcndpc2UgY29ycmVsYXRpb25zIA0KDQpUbyBmdXJ0aGVyIGludGVycm9nYXRlIHRoZSBBQ0xFRCBjb25mbGljdCBkZXNjcmlwdGlvbnMsIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIGluZGl2aWR1YWwgd29yZHMgd2VyZSBhbHNvIGFzc2Vzc2VkLiBXaGVuIGEgcGFydGljdWxhciB3b3JkIGlzIG9mIGludGVyZXN0LCBpdCBtYXkgYmUgdXNlZnVsIHRvIHNlZSBpdHMgbW9zdCBsaWtlbHkgd29yZCBwYWlyLg0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIDIwIG1vc3QgY29tbW9uIHdvcmQgcGFpcmluZ3MsIHdoZXJlIGVhY2ggd29yZCBoYXMgYXBwZWFyZWQgaW4gYW4gQUNMRUQgY29uZmxpY3QgZGVzY3JpcHRpb24gYXQgbGVhc3QgNTAgdGltZXMuIEEgY29ycmVsYXRpb24gb2YgMSBtZWFucyB0aGF0IHRoZSB3b3JkIGFsd2F5cyBhcHBlYXJzIHdpdGggaXRzIG1hdGNoIGluIHRoZSBkYXRhc2V0OyBhIGNvcnJlbGF0aW9uIG9mIDAuNSBtZWFucyB0aGF0IHRoZSB3b3JkIGFwcGVhcnMgaW4gdGhlIHNhbWUgZXZlbnQgYXMgaXRzIG1hdGNoIDUwIHBlcmNlbnQgb2YgdGhlIHRpbWUuDQoNCllvdSBjYW4gdXNlIHRoZSBmaWx0ZXIgYWJvdmUgdGhlIGNvbHVtbiB3b3JkIHRvIHNlZSBkaWZmZXJlbnQgd29yZCBwYWlyaW5ncy4gV2Ugc3VnZ2VzdCBzdGFydGluZyB3aXRoICphcnRpbGxlcnkqLCAqcHJvdGVzdCosICpsYW5kbWluZSogb3IgYSBsb2NhdGlvbiBvZiBpbnRlcmVzdCB0byBzZWUgaG93IHRoZSBwYWlyaW5ncyBjaGFuZ2UuIFRoZSBzZWFyY2ggYmFyIHdpbGwgc2VhcmNoIGluIGJvdGggY29sdW1ucyBhbmQgc28gbWF5IHByb3ZlIGxlc3MgdXNlZnVsIHRoYW4gdGhlIGZpbHRlciBmdW5jdGlvbi4NCg0KDQo8YnI+DQoNCmBgYHtyIGR0LXBhaXJ3aXNlLXdvcmRzfQ0KYWNsZWRfd29yZHMgJT4lICANCiAgZmlsdGVyKHdvcmQgJW91dCUgYygidG93bnNoaXAiLCAiZGlzdHJpY3QiLCAibXlhbm1hciIsICJyZWdpb24iLCAidmlsbGFnZSIsICJ0b3duIiwgInNpemUiLCAicmVwb3J0IiwgImNvZGUiLCAiY29kZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJkdmIiLCAiYWFwcCIsICJyZmEiLCAiaXJyYXdhZGR5IikpICU+JSANCiAgZGlzdGluY3QoZGF0YV9pZCwgd29yZCkgJT4lIA0KICBhZGRfY291bnQod29yZCkgJT4lIA0KICBmaWx0ZXIobiA+PSA1MCkgJT4lIA0KICBwYWlyd2lzZV9jb3Iod29yZCwgZGF0YV9pZCwgc29ydCA9IFRSVUUpICU+JQ0KICByZW5hbWUod29yZCA9IGl0ZW0xLCBtYXRjaCA9IGl0ZW0yKSAlPiUgDQogIGdyb3VwX2J5KHdvcmQpICU+JSANCiAgdG9wX24oY29ycmVsYXRpb24sIG4gPSAyMCkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwgDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoID0gbGlzdChyZWdleCA9IFRSVUUpDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICMgICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICMgICAgICAgIHBhc3RlMCgiJCh0aGlzLmFwaSgpLnRhYmxlKCkuY29udGFpbmVyKCkpLmNzcyh7J2ZvbnQtc2l6ZSc6ICciLCAiOC41cHQiLCAiJ30pOyIpLA0KICAjICAgICAgICAifSIpDQogICAgICAgKSwNCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjE0MCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFpcndpc2UgY29ycmVsYXRpb25zIGluIGNvbmZsaWN0IGV2ZW50IGRlc2NyaXB0aW9ucyIpDQogICAgICkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJjb3JyZWxhdGlvbiIpLCBkaWdpdHMgPSAzKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDguMyBGYXRhbGl0aWVzIGFuZCB3b3JkIGNvcnJlbGF0aW9ucw0KDQpBbm90aGVyIHdheSB0byBpbnRlcnByZXQgdGhlIEFDTEVEIGRlc2NyaXB0aW9uIGRhdGEgdGhyb3VnaCB3b3JkIGFzc29jaWF0aW9ucywgaXMgdG8gbG9vayBhdCB0aGUgd29yZHMgdXNlZCB0byBkZXNjcmliZSBjb25mbGljdCBldmVudHMgdGhhdCByZXN1bHRlZCBpbiBmYXRhbGl0aWVzLg0KDQpUaGUgcGxvdHMgYmVsb3cgc2hvdyB0aGUgdG9wIDMwIHdvcmRzIGFzc29jaWF0ZWQgd2l0aCBjb25mbGljdCBldmVudHMgdGhhdCBlaXRoZXIgcmVzdWx0ZWQgaW4gZmF0YWxpdGllcyAoc2hvd24gaW4gcmVkKSwgb3IgZGlkIG5vdCAoc2hvd24gaW4gYmx1ZSkuDQoNCkluIGVhY2ggcGxvdCwgdGhlIG1vc3QgY29tbW9uIHdvcmRzIGFyZSByYW5rZWQgIGluIHRlcm1zIG9mIGhvdyBvZnRlbiB0aGV5IGFyZSB1c2VkIHRvIGRlc2NyaWJlIGEgY29uZmxpY3QgZXZlbnQgdGhhdCBkaWQgb3IgZGlkIG5vdCByZXN1bHQgaW4gZmF0YWxpdGllcy4NCg0KT2YgaW50ZXJlc3QsIHdoZW4gYSBmYXRhbCBjb25mbGljdCBpcyBkZXNjcmliZWQsIHRoZSBkZXNjcmlwdGlvbiBtb3N0IG9mdGVuIHVzZXMgdGhlIHdvcmRzICpzaG90KiwgKnNvbGRpZXJzKiwgKmluanVyZWQqLCAqUERGKiBhbmQgKm1pbGl0YXJ5Ki4gSW4gY29udHJhc3QsIHRoZSB3b3JkcyAqZGlzcGxhY2VtZW50KiwgKmNoYW5nZSosICpmb3JtZWQqLCAqYXJyZXN0ZWQqIGFuZCAqb2ZmaWNlcyogd2VyZSBtb3N0IGxpa2VseSB0byBiZSB1c2VkIHRvIGRlc2NyaWJlIGV2ZW50cyB0aGF0IGRpZCBub3QgcmVzdWx0IGluIGZhdGFsaXRpZXMuIA0KIA0KQW4gaW50ZXJlc3RpbmcgbmV4dCBzdGVwIGluIHVuZGVyc3RhbmRpbmcgdGhlIGRlc2NyaXB0aXZlIGRhdGEgbWlnaHQgYmUgdG8gdHJ5IGFuZCBkZXZlbG9wIGEgcHJlZGljdGl2ZSBtb2RlbCBiYXNlZCBvbiB0aGUgY29uZmxpY3QgZGVzY3JpcHRpb25zIHRvIGJldHRlciB1bmRlcnN0YW5kIHdoaWNoIHR5cGVzIG9mIGV2ZW50cyBhcmUgbW9yZSBsaWtlbHkgdG8gcmVzdWx0IGluIGZhdGFsaXRpZXMuDQoNCjxicj4NCg0KYGBge3IgZmFjZXRfaGFzX2ZhdGFsaXRpZXMsIGZpZy5oZWlnaHQgPSA2fQ0KYWNsZWRfd29yZHMgJT4lDQogIGZpbHRlcihzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgZmlsdGVyKHdvcmQgJW91dCUgYygiZmF0YWxpdHkiLCAiY29kZWQiLCAiZGVhdGgiLCAidmlsbGFnZSIsICJ0b3duc2hpcCIsICJkaXN0cmljdCIsICJ2aWxsYWdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgInRvd24iLCAidHJhY3QiLCAiZmF0YWxpdGllcyIsICJkdmIiLCAiYWFwcCIsICJ0b3RhbCIsICJpcnJhd2FkZHkiLCAicmZhIiwgImRpZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJraWxsaW5nIiwgImtpbGxlZCIsICJkZWFkIiwgImV2ZW50IiwgImV2ZW50cyIsICJjYXN1YWx0eSIsICJjYXN1YWx0aWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIsICJjb2RlIiwgInJlcG9ydCIsICJteWFubWFyIiwiY29kZWQiKSkgJT4lIA0KICBtdXRhdGUoaGFzX2ZhdGFsaXRpZXMgPSBpZmVsc2UoZmF0YWxpdGllcyA+IDAsICJ5ZXMiLCAibm8iKSwNCiAgICAgICAgIGhhc19mYXRhbGl0aWVzID0gZmN0X3JldihoYXNfZmF0YWxpdGllcykpICU+JSANCiAgY291bnQoaGFzX2ZhdGFsaXRpZXMsIHdvcmQpICU+JSANCiAgYmluZF9sb2dfb2RkcyhoYXNfZmF0YWxpdGllcywgd29yZCwgbikgJT4lIA0KICBncm91cF9ieShoYXNfZmF0YWxpdGllcykgJT4lIA0KICB0b3BfbigzMCwgbG9nX29kZHNfd2VpZ2h0ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyX3dpdGhpbih3b3JkLCBsb2dfb2Rkc193ZWlnaHRlZCwgaGFzX2ZhdGFsaXRpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGxvZ19vZGRzX3dlaWdodGVkLCB5ID0gd29yZCwgZmlsbCA9IGhhc19mYXRhbGl0aWVzKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfcmVvcmRlcmVkKCkgKw0KICBmYWNldF93cmFwKH4gaGFzX2ZhdGFsaXRpZXMsIHNjYWxlcyA9ICJmcmVlIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGUgPSAiVG9wIDMwIHdvcmRzIGJ5IHdoZXRoZXIgdGhlIGV2ZW50IHJlc3VsdGVkIGluIGZhdGFsaXRpZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIk9kZHMgb2Ygd29yZHMgdXNlZCB0byBkZXNjcmliZSBjb25mbGljdCBldmVudHMgd2l0aCBhbmQgd2l0aG91dCBmYXRhbGl0aWVzIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICB5ID0gIiIpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyMgOC40IFNvdXJjZXMgdXNlZCBieSB0aGUgQUNMRUQgZGF0YXNldA0KDQoNCmBgYHtyIHNvdXJjZXMtZGZ9DQoNCmFjbGVkX3NvdXJjZSA8LSBhY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID49IDIwMjEpICU+JSANCiAgc2VwYXJhdGUoc291cmNlLCBzZXAgPSAiOyAiLCBpbnRvID0gcGFzdGUoInYiLCAxOjQsIHNlcCA9ICJfIikpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZfMTp2XzQpLCBuYW1lc190byA9ICJpZ25vcmUiLCB2YWx1ZXNfdG8gPSAic291cmNlX2xvbmciKSAlPiUgDQogIGZpbHRlcighaXMubmEoc291cmNlX2xvbmcpKQ0KDQpgYGANCg0KSW4gbW9zdCBjYXNlcywgdGhlIEFDTEVEIGRhdGFzZXTigJlzIGRlc2NyaXB0aW9ucyBvZiBlYWNoIGNvbmZsaWN0IGV2ZW50IGNvbWVzIGZyb20gbmV3cyBzb3VyY2VzLg0KDQpBIHRvdGFsIG9mIGByIGFjbGVkX3NvdXJjZSAlPiUgZGlzdGluY3Qoc291cmNlX2xvbmcpICU+JSBucm93YCBuZXdzIHNvdXJjZXMgd2VyZSB1c2VkIGluIHRoZSBBQ0xFRCBNeWFubWFyIGRhdGFzZXQuIEFib3V0IG9uZSB0aGlyZCBvZiB0aGUgY29uZmxpY3QgZXZlbnRzIGluY2x1ZGVkIGluIHRoZSBBQ0xFRCBkYXRhc2V0IGZvciAyMDIxIHdlcmUgb3JpZ2luYWxseSByZXBvcnRlZCBpbiB0aGUgW0RlbW9jcmF0aWMgVm9pY2Ugb2YgQnVybWFdKGh0dHBzOi8vZW5nbGlzaC5kdmIubm8vKS4gVGhlIG1vc3QgY29tbW9uIG5ld3Mgc291cmNlcyBhcmUgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdy4gVGhleSBhcmUgcmFua2VkIGJ5IG9yZGVyIG9mIHRoZSBzaGFyZSBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cyBhdHRyaWJ1dGVkIHRvIHRoZW0uDQoNCjxicj4NCg0KYGBge3Igc291cmNlcy1iYXJwbG90fQ0KDQphY2xlZF9zb3VyY2UgJT4lIA0KICBtdXRhdGUoc291cmNlX2xvbmcgPSBmY3RfbHVtcChzb3VyY2VfbG9uZyAlPiUgYXMuZmFjdG9yLCBuPTIwKSkgJT4lIA0KICBjb3VudChzb3VyY2VfbG9uZywgc29ydCA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHNvdXJjZV9sb25nID0gZmN0X3Jlb3JkZXIoc291cmNlX2xvbmcsIG4pLCANCiAgICAgICAgIHBjX29mX3RvdGFsID0gbiAvIHN1bShuKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwY19vZl90b3RhbCwgeSA9IHNvdXJjZV9sb25nLCBmaWxsID0gc291cmNlX2xvbmcpKSArDQogIGdlb21fY29sKCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGJyZWFrcyA9IHNlcSgwLCAwLjM4LCBieSA9IDAuMDUpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgbGFicyh4ID0gIlBlcmNlbnRhZ2Ugb2YgY29uZmxpY3QgZXZlbnRzIHJlcG9ydGVkIGJ5IHNvdXJjZSIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTW9zdCBjb21tb24gZGF0YSBzb3VyY2VzIGluIDIwMjEgaW4gdGhlIEFDTEVEIGRhdGFzZXQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2VzIG91dHNpZGUgb2YgdGhlIHRvcCAyMCB3ZXJlIHJlY29kZWQgYXMgJ090aGVyJyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KICAgICAgICANCmBgYA0KDQo8YnI+DQoNCkFzIGEgcG9pbnQgb2YgY29tcGFyaXNvbiwgQUNMRUTigJlzIG1ldGhvZG9sb2d5IGFuZCBkYXRhc2V0IHdhcyBkaXNjdXNzZWQgd2l0aCB0aGUgTmV4dXMgUmVzcG9uc2UgTWVjaGFuaXNt4oCZcyAoTlJNKSBDb25mbGljdCBBbmFseXNpcyBhbmQgUmVzZWFyY2ggRmFjaWxpdHksIHdoaWNoIGFsc28gbWFpbnRhaW5zIGl0cyBvd24gZGF0YXNldCBvZiBjb25mbGljdCBldmVudHMuIEl0IHdhcyBub3RlZCB0aGF0IHRoZSB0d28gZGF0YXNldHMgYXJlIHZlcnkgc2ltaWxhciwgYm90aCByZWx5aW5nIGxhcmdlbHkgb24gbWVkaWEgc291cmNlcywgd2l0aCB0aGUgb25seSBleGNlcHRpb24gYmVpbmcgdGhlIGluY2x1c2lvbiBvZiBzb2NpYWwgbWVkaWEgcG9zdHMgaW4gdGhlIE5STSBkYXRhc2V0LiBUaGUgRlNDIHdpbGwgY29udGludWUgdG8gdXNlIEFDTEVEIGRhdGEgZm9yIGFuYWx5c2lzIGdvaW5nIGZvcndhcmQgYXMgaXQgaXMgZnJlZSBhbmQgcHVibGljbHkgYXZhaWxhYmxlLiANCg0KPGJyPjxicj48YnI+DQoNCiMjIDkuIE5leHQgc3RlcHMNCg0KVGhlIEFDTEVEIGRhdGEgaXMgYW4gaW1wb3J0YW50IHNvdXJjZSBvZiBkYXRhIGZvciBiZXR0ZXIgdW5kZXJzdGFuZGluZyB0aGUgc2NvcGUgbmF0dXJlIG9mIGNvbmZsaWN0IGluIE15YW5tYXIuIEhvd2V2ZXIsIG1vcmUgY2FuIGJlIGRvbmUgdG8gaW50ZXJyb2dhdGUgaG93IGNvbmZsaWN0IGltcGFjdHMgZm9vZCBzZWN1cml0eSBpbiB0aGUgY291bnRyeS4gRnVydGhlcm1vcmUsIHRoZSBpbmNpZGVuY2Ugb2YgY29uZmxpY3QsIHRvLWRhdGUsIGhhcyBub3QgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBhbGxvY2F0aW5nIHJlc291cmNlcyBpbiBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIGFuZCBpdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgcHJlc2VudGVkIGluIHRoaXMgcmVwb3J0IGFyZSB1c2VkIHRvIGluZm9ybSBwcm9ncmFtbWF0aWMgYW5kIG9wZXJhdGlvbmFsIGRlY2lzaW9uIG1ha2luZy4gDQoNClRvIGJldHRlciB1bmRlcnN0YW5kIGltcGFjdCBvZiBjb25mbGljdCBvbiBmb29kIHNlY3VyaXR5LCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSByZWNvbW1lbmRlZC4NCg0KMS4gUmV2aWV3IGFsbCBmaW5kaW5ncyB3aXRoIG90aGVyIGh1bWFuaXRhcmlhbiBzdGFrZWhvbGRlcnMgYW5kIGRldmVsb3AgYXJlYS1zcGVjaWZpYyBwcm9kdWN0cywgYXMgbmVjZXNzYXJ5LiBUaGUgY29uZmxpY3Qgc2NvcmUgdGhhdCBoYXMgYmVlbiBjYWxjdWxhdGVkIGlzIGFuIGltcG9ydGFudCB0b29sIGZvciBnZW9ncmFwaGljIHByaW9yaXRpemF0aW9uIGFuZCBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIHNob3VsZCBiZSBvcmllbnRlZCBvbiBpdHMgdXNlLiBUaGUgZGF0YSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb25mbGljdCBzY29yZSBpcyBib3RoIGVhc2lseSBhY2Nlc3NpYmxlIGFuZCByZWd1bGFybHkgdXBkYXRlZCwgdGhvdWdoIGl0IHJlbWFpbnMgdG8gYmUgc2VlbiB0byB3aGF0IGV4dGVudCB0aGlzIGlzIHRydWUgZm9yIGRhdGEgb24gZGlzcGxhY2VtZW50LiANCg0KMi4gUmUtY2FsY3VsYXRlIHRoZSBjb25mbGljdCBzY29yZSBvbmNlIHVwZGF0ZWQgSURQIGRhdGEgaXMgb2J0YWluZWQgYW5kIGNvbXBhcmUgdGhlc2UgcmVzdWx0cyB0byBwcmV2aW91cyByZXN1bHRzIHJlY29yZGVkIGJ5IE1JTVUtSEFSUCBpbiB0aGVpciB2dWxuZXJhYmlsaXR5IGFuYWx5c2lzLiBUbyBub3RlLCBkaXNwbGFjZW1lbnQgaXMgbGlrZWx5IHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggdGhlIG90aGVyIGNvbmZsaWN0IGluZGljYXRvcnMgKHRoaXMgd2FzIHRoZSBjYXNlIHdpdGggdGhlIE1JTVUtSEFSUCBjb25mbGljdCBpbmRleCkuIE5ldmVydGhlbGVzcywgaXQgd2FzIGEga2V5IGNvbXBvbmVudCBvZiB0aGUgTUlNVS1IQVJQIG1vZGVsIGFuZCBpdHMgaW5jbHVzaW9uIHdpbGwgYWlkIGluIGltcHJvdmluZyBjb21wYXJhYmlsaXR5Lg0KDQozLglDb21wYXJlIGNvbmZsaWN0IHNjb3JlcyBhbmQgY29uZmxpY3QgaW5kaWNhdG9ycyB0byB0aGUgcmVzdWx0cyBvZiB0aGUgV0ZQLUZBTyBmb29kIGluc2VjdXJpdHkgc3VydmV5LiBJdCB3aWxsIGJlIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGlmIHRoZXJlIGFyZSBhbnkgc2lnbmlmaWNhbnQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIHNjb3JlcyBhbmQgcmVzdWx0cy4gRnVydGhlciwgdGhlIHR3byBkYXRhc2V0cyBjb3VsZCBiZSBmaWx0ZXJlZCB0byBvbmx5IGluY2x1ZGUgdGltZSBwZXJpb2RzIHJlbGV2YW50IHRvIHRoZSBXRlAtRkFPIHN0dWR5LiBBZGRpdGlvbmFsbHksIGNvbmZsaWN0IHNjb3JlcyBjb3VsZCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggbWFya2V0IHByaWNlcyB0byBzZWUgaWYgYSBwcmVkaWN0aXZlIG1vZGVsIGNhbiBiZSBlc3RhYmxpc2hlZC4gQ29uZmxpY3QgZGF0YSBzaG91bGQgYWxzbyBiZSBtYXBwZWQgYWdhaW5zdCBkYXRhIG9uIG1hbG51dHJpdGlvbi4gV2hpbGUgdGhlcmUgd2lsbCBsaWtlbHkgYmUgbWFueSBjaGFsbGVuZ2VzIGluIG9idGFpbmluZyBhY2N1cmF0ZSBtb3J0YWxpdHkgcmF0ZXMsIHRoZSBpbXBhY3Qgb2YgY29uZmxpY3Qgb24gbWFsbnV0cml0aW9uIHNob3VsZCBiZSBiZXR0ZXIgdW5kZXJzdG9vZC4gDQoNCjQuCUNvbXBhcmUgY29uZmxpY3QgaW5kaWNhdG9ycyB0byBtYXJrZXQgcHJpY2VzIHRvIHdoZXRoZXIgY29uZmxpY3QgZXZlbnRzIGhhdmUgaGFkIGFuIGltcGFjdCBvbiBmb29kIHByaWNlcyBhbmQgcHJpY2Ugc3RhYmlsaXR5LiBBZ2FpbiwgYSBwcmVkaWN0aXZlIG1vZGVsIGNvdWxkIGJlIGRldmVsb3BlZCBmcm9tIHRoaXMgY29tcGFyaXNvbi4NCg0KNS4JQ29tcGFyZSBBQ0xFRCBkYXRhIGFnYWluc3QgTUlNVeKAmXMgaGFyZC10by1yZWFjaCBhcmVhcyBkYXRhc2V0Lg0KDQo2LglDcm9zcy1yZWZlcmVuY2UgY29uZmxpY3QgZGF0YSB3aXRoIHBhcnRuZXIgcHJlc2VuY2UgYW5kIGFjaGlldmVtZW50cyBvZiBvdGhlciBjbHVzdGVycy4NCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgMTAuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMNCg0KDQojIyMgMTAuMSBDb25mbGljdCBldmVudHMgaW4gMjAyMSBhZ2dyZWdhdGVkIGF0IHRvd25zaGlwIGxldmVsIA0KDQpgYGB7ciBEVC1ieS10b3duc2hpcH0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhZG1pbjEsIGFkbWluMywgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGNvdW50KGV2ZW50X3R5cGUpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGV2ZW50X3R5cGUsIHZhbHVlc19mcm9tID0gbikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgfiBzdW0oLngsIG5hLnJtID0gVFJVRSkpICU+JSAgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIGxlZnRfam9pbihmc2MgJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bSh1X2JlbikpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChwYXJ0bmVycyA9IDAsIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICBzZWxlY3Qoc3RhdGUgPSBhZG1pbjEsIHRvd25zaGlwID0gYWRtaW4zLCB0b3RhbF9ldmVudHMsIGZhdGFsaXRpZXMsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlID0gZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzLA0KICAgICAgICAgc3RyYXRlZ2ljX2RldiA9IHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHZpb2xlbmNlX2NpdmlsaWFucyA9IHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCByaW90cywgcGFydG5lcnMsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcywgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9ldmVudHMpKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRQ0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICAjICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICAgICAgICAjIHBhc3RlMCgiJCh0aGlzLmFwaSgpLnRhYmxlKCkuY29udGFpbmVyKCkpLmNzcyh7J2ZvbnQtc2l6ZSc6ICciLCAiOC41cHQiLCAiJ30pOyIpLA0KICAgICAgICAgIyAifSIpKSwNCiAgICAgICAgICAgICksDQogICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjE0MCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMSBjb25mbGljdCBldmVudHMgYnkgdG93bnNoaXAiKSkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJiZW5lZmljaWFyaWVzIiksIGRpZ2l0cyA9IDApDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMTAuMiBDb25mbGljdCBhY3RvcnMgaW4gMjAyMQ0KDQpgYGB7ciBEVC1jb25mbGljdC1hY3RvcnN9DQphY3RvcnNfbmV3ICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUsIGFjdG9yX3R5cGUgPSBpbnRlcjEsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZXZlbnRfdHlwZSwgdmFsdWVzX2Zyb20gPSBjb3VudCkgJT4lICBjbGVhbl9uYW1lcygpICU+JSANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihhY3RvcnNfbmV3ICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHllYXIgPj0gMjAyMSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpLCBieSA9ICJhY3Rvcl9zaW1wbGUiKSAlPiUNCiAgcmVuYW1lKGFjdG9yX25hbWUgPSBhY3Rvcl9zaW1wbGUpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlID0gMCwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgPSAwLCBiYXR0bGVzID0gMCwgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyA9IDAsIA0KICAgICAgICAgICAgICAgICAgcmlvdHMgPSAwLCBwcm90ZXN0cyA9IDApKSAlPiUNCiAgc2VsZWN0KGFjdG9yX25hbWUsIGFjdG9yX3R5cGUsIHRvd25zaGlwcywgZmF0YWxpdGllcywgdG90YWxfZXZlbnRzLCBiYXR0bGVzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHJpb3RzLA0KICAgICAgICAgcHJvdGVzdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2V2ZW50cykpICU+JQ0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUNCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgIyAiZnVuY3Rpb24oc2V0dGluZ3MsIGpzb24pIHsiLA0KICAgICAgICAgIyBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICMgIn0iKSksDQogICAgICAgICAgICApLA0KICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjE0MCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMSBjb25mbGljdCBhY3RvcnMiKSkgJT4lDQogIGZvcm1hdFJvdW5kKGMoImZhdGFsaXRpZXMiLCAidG90YWxfZXZlbnRzIiwgImJhdHRsZXMiLCAidmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMiLCAiZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UiLCANCiAgICAgICAgICAgICAgICAicHJvdGVzdHMiLCAic3RyYXRlZ2ljX2RldmVsb3BtZW50cyIpLCBkaWdpdHMgPSAwKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjg1JSIsIGZvbnRTaXplID0gIjgwJSIpDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCg0KIyMjIDEwLjMgUmVmZXJlbmNlIG1hcHMNCg0KYGBge3IgcGF0Y2h3b3JrLW1hcHMsIGZpZy5oZWlnaHQ9MTZ9IA0KYWNsZWRfbmV3ICU+JSAgDQogIGZpbHRlcih5ZWFyID49IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdHMiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIA0KICBmdWxsX2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb3VudCksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGJ5IHRvd25zaGlwIDIwMjEtMjAyMiIsDQogICAgICAgc3VidGl0bGUgPSAiUGVhY2VmdWwgcHJvdGVzdHMgaGF2ZSBiZWVuIGV4Y2x1ZGVkIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJjb25mbGljdCBldmVudHMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKSArDQogIA0KZnNjXzIwMjIgJT4lDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSA9IGFkbWluM19wY29kZV9vbGQpICU+JQ0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBwYXJ0bmVycyksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJyZWFrcyA9IGMoMSwgMywgNiwgOSwgMTIpKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIGluIDIwMjIiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIiwNCiAgICAgICBmaWxsID0gIm51bWJlciBvZlxucGFydG5lcnMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKSArIA0KICANCmFjbGVkX25ldyAlPiUgIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBuYV9pZigwKSAlPiUgDQogIGZ1bGxfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZhdGFsaXRpZXMpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHRpdGxlID0gIkNvbmZsaWN0IGZhdGFsaXRpZXMgYnkgdG93bnNoaXAgMjAyMS0yMDIyIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJmYXRhbGl0aWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkgKw0KICANCmZzY18yMDIyICU+JQ0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBiZWdpbiA9IDAuMiwgdHJhbnMgPSAibG9nMTAiKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgaW4gMjAyMiIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiLA0KICAgICAgIGZpbGwgPSAibnVtYmVyIG9mXG5iZW5lZmljaWFyaWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkNCg0KYGBgDQoNCg0KDQo=