As the school year winds to a close, students look forward to one particular joy of home: food. The foods of home, of vacation locations, and of favorite restaurants all offer motivation to get through finals. One of these old favorite restaurants is Chipotle. With only one Vermont location, many students are unable to get their Chipotle fix until they get home. However, the ghosts of its 2015 foodborne illness outbreaks still haunt it as some old patrons still refuse to dine there. Some might say that the response to these outbreaks, a relatively common problem, was overblown. They occur in all kinds of restaurants as well as at home, in the office, and at community events. This brings one to question how common are these outbreaks really, both now and in the past? Are any Middkids going home or on vacation for the summer to an especially high-risk state? As seniors graduate and head off into the real world, which states should they dine most warily in? And how has foodborne illness and the response to it changed?

It appears that foodborne illness in America is on the decline. In general, there has been a significant decrease in foodborne illnesses in all regions from 1998 to 2015 (p < 0.001). In 2006, a spike of foodborne illnesses occured across the Midwest and West. Uncoincidentally, an outbreak of Salmonella infections linked tomatoes grown and sold to resturants in the Midwest occured in November of 2006. The Centers for Disease Control (CDC) also reported an E. coli outbreak traced to spinach largely sold in the West and Midwestern states, infecting 199 persons in October of 2006. Despite these spikes, the decrease of overall outbreaks is likely due to stricter food preparation and storage regulations, better sanitation technology, and increased public awareness about foodborne diseases (leading to increased public knowledge food preparation and storage safety at home).

Shown above is a geographical representation of all cases of illnesses, hospitalizations, and fatalities caused by foodborne illnesses in each state from 2014-2015. A lighter blue hue indicates states that have a higher rate of foodborne illness cases. We’d advise any Middkids cross-country road tripping this summer to avoid stopping for food in North Dakota, if possible. In fact, this map reinforces the previous graph that showed the Midwest had the highest rate of foodborne illnesses in the recent years. If you are staying in the Midwest this summer, make sure to prepare your own food carefully and to only dine in restaurants with high marks for health and sanitation.

We also examined the outbreaks by seasons to discern if some underyling factor associated with seasons would lead to a difference in outbreaks. We initially presumed that the hotter temperatures of summer would lead to more food spoiling and therefore more foodborne illnesses. To our surprise, summer only led the outbreaks in the 1998-99, suggesting that an improvement in food storage (perhaps better or cheaper refrigeration) occured around the turn of the millenium which reduced the outbreaks in summer. The large spike of outbreaks in the winter of 2004 is due to a pervasive spread of Norovirus, commonly called the “winter vomitting bug.” Moreover, the large increase of spring outbreaks in 2006 coincides with a multistate outbreak of E. coli in the meat of Taco Bell products. In concordance with our previous graph, we see that the outbreak incidence has typically decreased for all four seasons from 1998 to 2015.

We also looked at the six most common offenders of foodborne illness in the United States. Other than E. coli, the infectivity of these pathogens did not tend to decrease from 1998 to 2015. We speculate that the large media coverage of E. coli outbreaks in major fast food chains (Taco Bell and Chipotle) may explain why E. coli saw the only decrease in foodborne illnesses. Norovirus remains the most common cause of gastroenteritis (foodborne illness) in the United States. Norovirus becomes aerosolized when a person vomits and the aerosolized virus can remain active in the area for several days after the vomit is cleaned up. In addition, as few as 20 Norovirus particles are enough to cause infection–illustrating how easily this virus could spread in a resturant, camp, hotel, or dormitories. It is also important to note that the 2004 and 2006 spikes in illnesses caused by Norovirus coincide with similar increases in the winters of 2004 and 2006, demonstrating why the virus is dubbed the “winter vomitting bug”. In conclusion, the most common offenders of foodborne illness have generally stayed constant from 1998-2015. Our previous graphs, however, show that foodborne illnesses overall have decreased during this period. We can infer that better sanitation and stricter regulations have only been effective against the less common pathogens, such as Staphylococcus aureus. The most common offenders are hardy pathogens that can survive extreme temperature changes and are generalists that can grow in water, thrive on surfaces, and resist sanitation methods. Unfortunately, it does not seem likely that foodborne illnesses will decrease from these pathogens in the forseeable future.

As we continued our investigation, we were curious to see how the various food types contributed to outbreaks of foodborne illness. In general, all types of food have shown decreased incidence of illness from 1998-2015, which agrees with our previous assertions that foodborne illness has decreased overall. Foodborne illness in meat has demonstrated a dramatic decline in the past fifteen years, suggesting recent innovations in fields such as refrigeration or food storage have been extremely effective in reducing pathogenic agents. In fact, the meat packaging industry has recently started to package meat under high oxygen conditions and with natural antioxidants, which has been shown to significantly increase the shelf life of meats, as well as making them appear more red and appetizing. We speculate that this new combination of antioxidants and high oxygen packing conditions has been the main factor in the meat’s decline in foodborne illnesses. Despite the progress, meat remains the most likely food item in the United States to make you sick. So if you want to avoid getting sick, stick to a piece of fruit or a salad.

As is seen in the graph, the percent of cases resulting in hospitalizations has increased. We see a spike in the graph after 2010, which may be due to the implementation of Obamacare causing more people to seek treatment rather than wait out their illness. The general upward trend may be due also to a general increased awareness and understanding of foodborne illness. However, the relative percent of fatalities has not changed. The protocol for many foodborne illnesses generally relies on replacing fluids. It is unclear in the data if those who died from their illnesses also went to the hospital before, but if not, it is likely that they were unable to replenish their fluids on their own. Still, this is the outcome in an incredibly small percent of cases and is highly unlikely especially if a person receives treatment.
Getting sick from food is an especially cruel outcome, since we never expect the things we love to hurt us. When a beloved restaurant like Chipotle gets bad press for this, it can be hard to regain customers’ trust. However, our investigation of foodborne illness is promising. Foodborne illness in all regions of America is on the decline overall. It is clear in these declines that improving food safety has been a priority for food providers and vendors across the nation. While there are some especially high-risk states, the overall incidence of foodborne illness is still pretty low. In addition, people appear increasingly willing to seek serious medical attention when they need it; this is always a good option if you fear about the severity of your illness. As long as you are careful when preparing your own food and make informed choices about where to dine, foodborne illness is not something to have major fears about anywhere in the United States.
Limitations
The first thing to note is that the data can never be a complete record of every case of foodborne illness in the United States. Data like this is very dependent on self reporting, and there are always a number of people who do not report their illnesses. It is likely that the more severe cases were the ones that were reported, and this may cause our conclusions regarding severity to be differ from the truth, but we continued with what data we had.
Another important thing to note is that the population data we originally had was census data, meaning it was not available for each year. We used statistical methods to interpolate population counts for the years in between. Thus, while the population data might not be completely accurate for those years, it should be close to the actual values.
When considering the kinds of pathogens, it is important to note that for some cases, information on which pathogen caused the infection was unavailable. It is likely that the information was not reported, or reported so much later than the illness that the type of pathogen could not be determined. With this in mind, we examined what data we did have.
LS0tDQp0aXRsZTogIkZvb2Rib3JuZSBJbGxuZXNzIFRyZW5kcyBpbiBBbWVyaWNhOiBUbyBGZWFyIG9yIG5vdCB0byBGZWFyPyINCmF1dGhvcjogIkpvZSBPJ0JyaWVuLCBDb25vciBIaW1zdGVhZCwgUmViZWNjYSBMaWdodG1hbiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkFzIHRoZSBzY2hvb2wgeWVhciB3aW5kcyB0byBhIGNsb3NlLCBzdHVkZW50cyBsb29rIGZvcndhcmQgdG8gb25lIHBhcnRpY3VsYXIgam95IG9mIGhvbWU6IGZvb2QuIFRoZSBmb29kcyBvZiBob21lLCBvZiB2YWNhdGlvbiBsb2NhdGlvbnMsIGFuZCBvZiBmYXZvcml0ZSByZXN0YXVyYW50cyBhbGwgb2ZmZXIgbW90aXZhdGlvbiB0byBnZXQgdGhyb3VnaCBmaW5hbHMuIE9uZSBvZiB0aGVzZSBvbGQgZmF2b3JpdGUgcmVzdGF1cmFudHMgaXMgQ2hpcG90bGUuIFdpdGggb25seSBvbmUgVmVybW9udCBsb2NhdGlvbiwgbWFueSBzdHVkZW50cyBhcmUgdW5hYmxlIHRvIGdldCB0aGVpciBDaGlwb3RsZSBmaXggdW50aWwgdGhleSBnZXQgaG9tZS4gSG93ZXZlciwgdGhlIGdob3N0cyBvZiBpdHMgMjAxNSBmb29kYm9ybmUgaWxsbmVzcyBvdXRicmVha3Mgc3RpbGwgaGF1bnQgaXQgYXMgc29tZSBvbGQgcGF0cm9ucyBzdGlsbCByZWZ1c2UgdG8gZGluZSB0aGVyZS4gU29tZSBtaWdodCBzYXkgdGhhdCB0aGUgcmVzcG9uc2UgdG8gdGhlc2Ugb3V0YnJlYWtzLCBhIHJlbGF0aXZlbHkgY29tbW9uIHByb2JsZW0sIHdhcyBvdmVyYmxvd24uIFRoZXkgb2NjdXIgaW4gYWxsIGtpbmRzIG9mIHJlc3RhdXJhbnRzIGFzIHdlbGwgYXMgYXQgaG9tZSwgaW4gdGhlIG9mZmljZSwgYW5kIGF0IGNvbW11bml0eSBldmVudHMuIFRoaXMgYnJpbmdzIG9uZSB0byBxdWVzdGlvbiBob3cgY29tbW9uIGFyZSB0aGVzZSBvdXRicmVha3MgcmVhbGx5LCBib3RoIG5vdyBhbmQgaW4gdGhlIHBhc3Q/IEFyZSBhbnkgTWlkZGtpZHMgZ29pbmcgaG9tZSBvciBvbiB2YWNhdGlvbiBmb3IgdGhlIHN1bW1lciB0byBhbiBlc3BlY2lhbGx5IGhpZ2gtcmlzayBzdGF0ZT8gQXMgc2VuaW9ycyBncmFkdWF0ZSBhbmQgaGVhZCBvZmYgaW50byB0aGUgcmVhbCB3b3JsZCwgd2hpY2ggc3RhdGVzIHNob3VsZCB0aGV5IGRpbmUgbW9zdCB3YXJpbHkgaW4/IEFuZCBob3cgaGFzIGZvb2Rib3JuZSBpbGxuZXNzIGFuZCB0aGUgcmVzcG9uc2UgdG8gaXQgY2hhbmdlZD8NCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQpvdXRicmVha3MgPC0gcmVhZF9jc3YoIm91dGJyZWFrcy5jc3YiKQ0KDQpwb3B1bGF0aW9uPC1yZWFkX2NzdigncG9wX2RhdGEuY3N2JykNCiANCg0KcG9wMjwtcmVhZF9jc3YoJ3BvcF9kYXRhLmNzdicpICMgJT4lIA0KDQoNCiMgVG8gYW5hbHl6ZSBmb29kYm9ybmUgaWxsbmVzcyB0cmVuZHMgdGhyb3VnaG91dCB0aGUgY291bnRyeSBmcm9tIDE5OTgtMjAxNQ0KDQpwb3B1bGF0aW9uPC1wb3B1bGF0aW9uICU+JSANCiAgZ2F0aGVyKGAxOTk4YCwgYDIwMDBgLGAxOTk5YCwgYDIwMDFgLGAyMDAyYCwgYDIwMDNgLGAyMDA0YCwgYDIwMDVgLGAyMDA2YCwgYDIwMDdgLGAyMDA4YCwgYDIwMDlgLGAyMDEwYCwgYDIwMTFgLGAyMDEyYCwgYDIwMTNgLGAyMDE0YCwgYDIwMTVgLCBrZXkgPSAieWVhciIsIHZhbHVlID0gInBvcCIpDQoNCnBvcDI8LXBvcDIgJT4lIA0KICAgZ2F0aGVyKGAxOTk4YCwgYDIwMDBgLGAxOTk5YCwgYDIwMDFgLGAyMDAyYCwgYDIwMDNgLGAyMDA0YCwgYDIwMDVgLGAyMDA2YCwgYDIwMDdgLGAyMDA4YCwgYDIwMDlgLGAyMDEwYCwgYDIwMTFgLGAyMDEyYCwgYDIwMTNgLGAyMDE0YCwgYDIwMTVgLCBrZXkgPSAieWVhciIsIHZhbHVlID0gInBvcCIpDQpwb3AyWzJdPC1OVUxMDQpwb3B1bGF0aW9uWzJdPC1OVUxMDQoNCnBvcHVsYXRpb248LXBvcHVsYXRpb24lPiUNCiAgcmVuYW1lKFllYXI9eWVhciklPiUNCiAgbXV0YXRlKFllYXI9YXMubnVtZXJpYyhZZWFyKSkNCg0KcG9wMjwtIHBvcDIgJT4lDQogIHJlbmFtZShZZWFyPXllYXIpJT4lDQogIG11dGF0ZShZZWFyPWFzLm51bWVyaWMoWWVhcikpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCg0KcG9wdWxhdGlvbjwtbGVmdF9qb2luKHBvcHVsYXRpb24sb3V0YnJlYWtzLGJ5PWMoJ1N0YXRlJywgJ1llYXInKSkNCg0KcCA8LSBwb3B1bGF0aW9uICU+JSANCiAgZ3JvdXBfYnkoTW9udGgsIFllYXIsIFN0YXRlKSAlPiUgDQogICBzdW1tYXJpc2UodG90YWxfY2FzZXMgPSBzdW0oSWxsbmVzc2VzKSkNCiAgICANCnMgPC0gbGVmdF9qb2luKHBvcDIscCwgYnk9YygnU3RhdGUnLCdZZWFyJykpICU+JSANCiAgbXV0YXRlKG91dGJyZWFrX2luY2lkZW5jZSA9IHRvdGFsX2Nhc2VzIC8gcG9wKQ0KDQp0IDwtIHMgJT4lIA0KICBncm91cF9ieShTdGF0ZSxZZWFyKSAlPiUgDQogICAgc3VtbWFyaXNlKHRvdGFsX2Nhc2VzID0gc3VtKHRvdGFsX2Nhc2VzLCBuYS5ybT1UUlVFKSkNCg0KbyA8LSBsZWZ0X2pvaW4ocG9wMix0LCBieT1jKCdTdGF0ZScsJ1llYXInKSkgJT4lIA0KICBtdXRhdGUob3V0YnJlYWtfcHJvcCA9IHRvdGFsX2Nhc2VzL3BvcCkNCg0KDQpOb3J0aGVhc3QgPC0gbyAlPiUgDQogIGZpbHRlcihTdGF0ZSAlaW4lIGMoJ01haW5lJywnVmVybW9udCcsJ05ldyBIYW1wc2hpcmUnLCJNYXNzYWNodXNldHRzIiwnQ29ubmVjdGljdXQnLCdSaG9kZSBJc2xhbmQnLCdOZXcgWW9yaycsICJEZWxhd2FyZSIsIk5ldyBKZXJzZXkiLCJQZW5uc3lsdmFuaWEiKSkgJT4lIA0KICBncm91cF9ieShZZWFyKSAlPiUgDQogICBzdW1tYXJpc2Uob3V0YnJlYWtfcHJldmFsZW5jZT0gc3VtKHRvdGFsX2Nhc2VzKS9zdW0ocG9wKSkgJT4lIA0KICAgICAgbXV0YXRlKFJlZ2lvbj0iTm9ydGhlYXN0IikNCg0KDQpNaWR3ZXN0IDwtIG8gJT4lIA0KICBmaWx0ZXIoU3RhdGUgJWluJSBjKCdJbGxub2lzJywgJ09oaW8nLCAiTWljaGlnYW4iLCAiV2lzY29uc2luIiwgIkluZGlhbmlhIiwgJ0lvd2EnLCAiS2Fuc2FzIiwiTWlubmVzb3RhIiwiTmVicmFza2EiLCAiTWlzc291cmkiLCJOb3J0aCBEYWtvdGEiLCJTb3V0aCBEYWtvdGEiKSkgJT4lICANCiAgZ3JvdXBfYnkoWWVhcikgJT4lIA0KICAgIHN1bW1hcmlzZShvdXRicmVha19wcmV2YWxlbmNlPSBzdW0odG90YWxfY2FzZXMpL3N1bShwb3ApKSAlPiUgDQogICAgICBtdXRhdGUoUmVnaW9uPSJNaWR3ZXN0IikNCg0KU291dGggPC0gbyAlPiUgDQogIGZpbHRlcihTdGF0ZSAlaW4lIGMoIkZsb3JpZGEiLCJHZW9yZ2lhIiwiTm9ydGggQ2Fyb2xpbmEiLCJTb3V0aCBDYXJvbGluYSIsIlZpcmdpbmlhIiwiTWFyeWxhbmQiLCJLZW50dWNreSIsIlRlbm5lc2VlIiwiV2VzdCBWaXJnaW5pYSIsIkRDIiwiQWxhYmFtYSIsIk1pc3Npc3NpcHBpIiwiQXJrYW5zYXMiLCJUZXhhcyIsIk9rbGFob21hIiwiTG91aXNhbmEiKSkgJT4lIA0KICBncm91cF9ieShZZWFyKSAlPiUgDQogICAgc3VtbWFyaXNlKG91dGJyZWFrX3ByZXZhbGVuY2U9IHN1bSh0b3RhbF9jYXNlcykvc3VtKHBvcCkpICU+JSANCiAgICAgICBtdXRhdGUoUmVnaW9uPSJTb3V0aCIpDQoNCldlc3Q8LSBvICU+JSANCiAgZmlsdGVyKFN0YXRlICVpbiUgYygiQ2FsaWZvcm5pYSIsIldhc2hpbmd0b24iLCJOZXZhZGEiLCJPcmVnb24iLCJXeW9taW5nIiwiQ29sb3JhZG8iLCJBbGFza2EiLCJNb250YW5hIiwiVXRhaCIsIk5ldyBNZXhpY28iLCJIYXdhaWkiLCJJZGFobyIpKSAlPiUgDQogIGdyb3VwX2J5KFllYXIpICU+JSANCiAgICBzdW1tYXJpc2Uob3V0YnJlYWtfcHJldmFsZW5jZT0gc3VtKHRvdGFsX2Nhc2VzKS9zdW0ocG9wKSkgJT4lIA0KICAgICAgbXV0YXRlKFJlZ2lvbj0iV2VzdCIpDQoNCg0Kb3V0YnJlYWtzX2J5X3JlZ2lvbjwtYmluZF9yb3dzKFdlc3QsU291dGgpDQpvdXRicmVha3NfYnlfcmVnaW9uIDwtYmluZF9yb3dzKG91dGJyZWFrc19ieV9yZWdpb24sTm9ydGhlYXN0KQ0Kb3V0YnJlYWtzX2J5X3JlZ2lvbiA8LSAgYmluZF9yb3dzKG91dGJyZWFrc19ieV9yZWdpb24sTWlkd2VzdCkNCg0KDQoNCmlsbG5lc3NfYnlfcmVnaW9uIDwtIGdncGxvdChkYXRhPW91dGJyZWFrc19ieV9yZWdpb24sIG1hcHBpbmcgPSBhZXMoeD1ZZWFyLCB5PSBvdXRicmVha19wcmV2YWxlbmNlLCBjb2xvciA9UmVnaW9uKSkrIA0KICBsYWJzKHk9Ik91dGJyZWFrIEluY2lkZW5jZSAoQ2FzZXMgLyBQb3B1bGF0aW9uKSIsIHRpdGxlPSJGb29kYm9ybmUgSWxsbmVzc2VzIGJ5IFJlZ2lvbiIpKw0KICBnZW9tX2xpbmUoKQ0KaWxsbmVzc19ieV9yZWdpb24NCg0KDQpgYGANCg0KSXQgYXBwZWFycyB0aGF0IGZvb2Rib3JuZSBpbGxuZXNzIGluIEFtZXJpY2EgaXMgb24gdGhlIGRlY2xpbmUuIEluIGdlbmVyYWwsIHRoZXJlIGhhcyBiZWVuIGEgc2lnbmlmaWNhbnQgZGVjcmVhc2UgaW4gZm9vZGJvcm5lIGlsbG5lc3NlcyBpbiBhbGwgcmVnaW9ucyBmcm9tIDE5OTggdG8gMjAxNSAocCA8IDAuMDAxKS4gSW4gMjAwNiwgYSBzcGlrZSBvZiBmb29kYm9ybmUgaWxsbmVzc2VzIG9jY3VyZWQgYWNyb3NzIHRoZSBNaWR3ZXN0IGFuZCBXZXN0LiBVbmNvaW5jaWRlbnRhbGx5LCBhbiBvdXRicmVhayBvZiAqU2FsbW9uZWxsYSogaW5mZWN0aW9ucyBsaW5rZWQgdG9tYXRvZXMgZ3Jvd24gYW5kIHNvbGQgdG8gcmVzdHVyYW50cyBpbiB0aGUgTWlkd2VzdCBvY2N1cmVkIGluIE5vdmVtYmVyIG9mIDIwMDYuIFRoZSBDZW50ZXJzIGZvciBEaXNlYXNlIENvbnRyb2wgKENEQykgYWxzbyByZXBvcnRlZCBhbiAqRS4gY29saSogb3V0YnJlYWsgdHJhY2VkIHRvIHNwaW5hY2ggbGFyZ2VseSBzb2xkIGluIHRoZSBXZXN0IGFuZCBNaWR3ZXN0ZXJuIHN0YXRlcywgaW5mZWN0aW5nIDE5OSBwZXJzb25zIGluIE9jdG9iZXIgb2YgMjAwNi4gRGVzcGl0ZSB0aGVzZSBzcGlrZXMsIHRoZSBkZWNyZWFzZSBvZiBvdmVyYWxsIG91dGJyZWFrcyBpcyBsaWtlbHkgZHVlIHRvIHN0cmljdGVyIGZvb2QgcHJlcGFyYXRpb24gYW5kIHN0b3JhZ2UgcmVndWxhdGlvbnMsIGJldHRlciBzYW5pdGF0aW9uIHRlY2hub2xvZ3ksIGFuZCBpbmNyZWFzZWQgcHVibGljIGF3YXJlbmVzcyBhYm91dCBmb29kYm9ybmUgZGlzZWFzZXMgKGxlYWRpbmcgdG8gaW5jcmVhc2VkIHB1YmxpYyBrbm93bGVkZ2UgZm9vZCBwcmVwYXJhdGlvbiBhbmQgc3RvcmFnZSBzYWZldHkgYXQgaG9tZSkuIA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KFVTQWJvdW5kYXJpZXMpDQpsaWJyYXJ5KHJnZW9zKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShVU0Fib3VuZGFyaWVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkobWFwdG9vbHMpDQoNCm91dGJyZWFrcyA8LSByZWFkX2Nzdigib3V0YnJlYWtzLmNzdiIpDQpwb3B1bGF0aW9uPC1yZWFkX2NzdigncG9wX2RhdGEuY3N2JykNCnBvcHVsYXRpb248LXBvcHVsYXRpb24gJT4lIA0KICBnYXRoZXIoYDE5OThgLCBgMjAwMGAsYDE5OTlgLCBgMjAwMWAsYDIwMDJgLCBgMjAwM2AsYDIwMDRgLCBgMjAwNWAsYDIwMDZgLCBgMjAwN2AsYDIwMDhgLCBgMjAwOWAsYDIwMTBgLCBgMjAxMWAsYDIwMTJgLCBgMjAxM2AsYDIwMTRgLCBgMjAxNWAsIGtleSA9ICJ5ZWFyIiwgdmFsdWUgPSAicG9wIikNCnBvcHVsYXRpb25bMl08LU5VTEwNCnBvcHVsYXRpb248LXBvcHVsYXRpb24lPiUNCiAgcmVuYW1lKFllYXI9eWVhciklPiUNCiAgbXV0YXRlKFllYXI9YXMubnVtZXJpYyhZZWFyKSkNCnBvcHVsYXRpb248LWxlZnRfam9pbihwb3B1bGF0aW9uLG91dGJyZWFrcyxieT1jKCdTdGF0ZScsICdZZWFyJykpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBvPC1wb3B1bGF0aW9uDQphbGxfc3RhdGVzIDwtIG1hcF9kYXRhKCJzdGF0ZSIpDQpwbzwtcG9wdWxhdGlvbiU+JQ0KICBmaWx0ZXIoWWVhcj4yMDEzKSU+JQ0KICByZW5hbWUocmVnaW9uPVN0YXRlKSU+JQ0KICBtdXRhdGUocmVnaW9uPXRvbG93ZXIocmVnaW9uKSklPiUNCiAgZ3JvdXBfYnkocmVnaW9uKSU+JQ0KICBzdW1tYXJpc2UoQ2FzZXM9c3VtKElsbG5lc3NlcywgSG9zcGl0YWxpemF0aW9ucywgRmF0YWxpdGllcywgbmEucm09VFJVRSkvbWVhbihwb3ApKQ0KDQphbGxfc3RhdGVzPC1hbGxfc3RhdGVzJT4lDQogIGxlZnRfam9pbihwbywgYnk9J3JlZ2lvbicpDQpwIDwtIGdncGxvdCgpDQpwIDwtIHAgKyBnZW9tX3BvbHlnb24oIGRhdGE9YWxsX3N0YXRlcywgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGw9Q2FzZXMpICxjb2xvdXI9ImdyZXkiKStjb29yZF9lcXVhbChyYXRpbyA9IDEpICsgbGFicyh4PSJMYXRpdHVkZSIsIHk9IkxvbmdpdHVkZSIsIHRpdGxlPSJJbGxuZXNzZXMsIEhvc3BpdGFsaXphdGlvbnMsIGFuZCBGYXRhbGl0aWVzIGJ5IFN0YXRlIikrdGhlbWVfYncoKSt0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQpwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpDQpwDQpgYGANClNob3duIGFib3ZlIGlzIGEgZ2VvZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBjYXNlcyBvZiBpbGxuZXNzZXMsIGhvc3BpdGFsaXphdGlvbnMsIGFuZCBmYXRhbGl0aWVzIGNhdXNlZCBieSBmb29kYm9ybmUgaWxsbmVzc2VzIGluIGVhY2ggc3RhdGUgZnJvbSAyMDE0LTIwMTUuIEEgbGlnaHRlciBibHVlIGh1ZSBpbmRpY2F0ZXMgc3RhdGVzIHRoYXQgaGF2ZSBhIGhpZ2hlciByYXRlIG9mIGZvb2Rib3JuZSBpbGxuZXNzIGNhc2VzLiBXZSdkIGFkdmlzZSBhbnkgTWlkZGtpZHMgY3Jvc3MtY291bnRyeSByb2FkIHRyaXBwaW5nIHRoaXMgc3VtbWVyIHRvIGF2b2lkIHN0b3BwaW5nIGZvciBmb29kIGluIE5vcnRoIERha290YSwgaWYgcG9zc2libGUuIEluIGZhY3QsIHRoaXMgbWFwIHJlaW5mb3JjZXMgdGhlIHByZXZpb3VzIGdyYXBoIHRoYXQgc2hvd2VkIHRoZSBNaWR3ZXN0IGhhZCB0aGUgaGlnaGVzdCByYXRlIG9mIGZvb2Rib3JuZSBpbGxuZXNzZXMgaW4gdGhlIHJlY2VudCB5ZWFycy4gSWYgeW91IGFyZSBzdGF5aW5nIGluIHRoZSBNaWR3ZXN0IHRoaXMgc3VtbWVyLCBtYWtlIHN1cmUgdG8gcHJlcGFyZSB5b3VyIG93biBmb29kIGNhcmVmdWxseSBhbmQgdG8gb25seSBkaW5lIGluIHJlc3RhdXJhbnRzIHdpdGggaGlnaCBtYXJrcyBmb3IgaGVhbHRoIGFuZCBzYW5pdGF0aW9uLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0Kb3V0YnJlYWtzIDwtIHJlYWRfY3N2KCJvdXRicmVha3MuY3N2IikNCnBvcHVsYXRpb248LXJlYWRfY3N2KCdwb3BfZGF0YS5jc3YnKQ0KcG9wMjwtcmVhZF9jc3YoJ3BvcF9kYXRhLmNzdicpDQoNCnBvcHVsYXRpb248LXBvcHVsYXRpb24gJT4lIA0KICBnYXRoZXIoYDE5OThgLCBgMjAwMGAsYDE5OTlgLCBgMjAwMWAsYDIwMDJgLCBgMjAwM2AsYDIwMDRgLCBgMjAwNWAsYDIwMDZgLCBgMjAwN2AsYDIwMDhgLCBgMjAwOWAsYDIwMTBgLCBgMjAxMWAsYDIwMTJgLCBgMjAxM2AsYDIwMTRgLCBgMjAxNWAsIGtleSA9ICJ5ZWFyIiwgdmFsdWUgPSAicG9wIikNCnBvcDI8LXBvcDIgJT4lIA0KICAgZ2F0aGVyKGAxOTk4YCwgYDIwMDBgLGAxOTk5YCwgYDIwMDFgLGAyMDAyYCwgYDIwMDNgLGAyMDA0YCwgYDIwMDVgLGAyMDA2YCwgYDIwMDdgLGAyMDA4YCwgYDIwMDlgLGAyMDEwYCwgYDIwMTFgLGAyMDEyYCwgYDIwMTNgLGAyMDE0YCwgYDIwMTVgLCBrZXkgPSAieWVhciIsIHZhbHVlID0gInBvcCIpDQpwb3AyWzJdPC1OVUxMDQpwb3B1bGF0aW9uWzJdPC1OVUxMDQpwb3B1bGF0aW9uPC1wb3B1bGF0aW9uJT4lDQogIHJlbmFtZShZZWFyPXllYXIpJT4lDQogIG11dGF0ZShZZWFyPWFzLm51bWVyaWMoWWVhcikpDQpwb3AyPC1wb3AyJT4lDQogIHJlbmFtZShZZWFyPXllYXIpJT4lDQogIG11dGF0ZShZZWFyPWFzLm51bWVyaWMoWWVhcikpDQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBBbmFseXplcyB0aGUgZm9vZCB0cmVuZHMgYWNyb3NzIHRoZSBzZWFzb25zDQoNCg0KcG9wdWxhdGlvbjwtbGVmdF9qb2luKHBvcHVsYXRpb24sb3V0YnJlYWtzLGJ5PWMoJ1N0YXRlJywgJ1llYXInKSkNCnAgPC0gcG9wdWxhdGlvbiAlPiUgDQogIGdyb3VwX2J5KE1vbnRoLCBZZWFyLCBTdGF0ZSkgJT4lIA0KICAgc3VtbWFyaXNlKHRvdGFsX2Nhc2VzID0gc3VtKElsbG5lc3NlcykpDQogICAgDQpzIDwtIGxlZnRfam9pbihwb3AyLHAsIGJ5PWMoJ1N0YXRlJywnWWVhcicpKSANCg0KU3VtbWVyIDwtIHMgJT4lIA0KICBmaWx0ZXIoTW9udGggJWluJSBjKCdKdW5lJywgJ0p1bHknLCJBdWd1c3QiKSkgJT4lIA0KICAgIHRyYW5zbXV0ZShZZWFyLHBvcCx0b3RhbF9jYXNlcykgJT4lIA0KICAgICAgZ3JvdXBfYnkoWWVhcikgJT4lIA0KICAgICAgICBzdW1tYXJpc2Uob3V0YnJlYWtfaW5jaWRlbmNlID0gc3VtKHRvdGFsX2Nhc2VzKSAvIHN1bShwb3ApKSAlPiUgDQogICAgICAgICAgbXV0YXRlKFNlYXNvbiA9ICJTdW1tZXIiKQ0KICANCkZhbGwgPC0gcyAlPiUgDQogIGZpbHRlcihNb250aCAlaW4lIGMoJ1NlcHRlbWJlcicsICdPY3RvYmVyJywiTm92ZW1iZXIiKSkgJT4lIA0KICAgIHRyYW5zbXV0ZShZZWFyLHBvcCx0b3RhbF9jYXNlcykgJT4lIA0KICAgICAgZ3JvdXBfYnkoWWVhcikgJT4lIA0KICAgICAgICBzdW1tYXJpc2Uob3V0YnJlYWtfaW5jaWRlbmNlID0gc3VtKHRvdGFsX2Nhc2VzKSAvIHN1bShwb3ApKSAlPiUgDQogICAgICAgICAgbXV0YXRlKFNlYXNvbiA9ICJGYWxsIikNCg0KV2ludGVyIDwtIHMgJT4lIA0KICBmaWx0ZXIoTW9udGggJWluJSBjKCdEZWNlbWJlcicsICdKYW51YXJ5JywiRmVicnVhcnkiKSkgJT4lIA0KICAgIHRyYW5zbXV0ZShZZWFyLHBvcCx0b3RhbF9jYXNlcykgJT4lIA0KICAgICAgZ3JvdXBfYnkoWWVhcikgJT4lIA0KICAgICAgICBzdW1tYXJpc2Uob3V0YnJlYWtfaW5jaWRlbmNlID0gc3VtKHRvdGFsX2Nhc2VzKSAvIHN1bShwb3ApKSAlPiUgDQogICAgICAgICAgbXV0YXRlKFNlYXNvbiA9ICJXaW50ZXIiKQ0KDQpTcHJpbmcgPC0gcyAlPiUgDQogIGZpbHRlcihNb250aCAlaW4lIGMoJ01hcmNoJywgJ0FwcmlsJywiTWF5IikpICU+JSANCiAgICB0cmFuc211dGUoWWVhcixwb3AsdG90YWxfY2FzZXMpICU+JSANCiAgICAgIGdyb3VwX2J5KFllYXIpICU+JSANCiAgICAgICAgc3VtbWFyaXNlKG91dGJyZWFrX2luY2lkZW5jZSA9IHN1bSh0b3RhbF9jYXNlcykgLyBzdW0ocG9wKSkgJT4lIA0KICAgICAgICAgIG11dGF0ZShTZWFzb24gPSAiU3ByaW5nIikNCg0Kb3V0YnJlYWtzX2J5X3NlYXNvbjwtYmluZF9yb3dzKFN1bW1lcixGYWxsKQ0Kb3V0YnJlYWtzX2J5X3NlYXNvbiA8LWJpbmRfcm93cyhvdXRicmVha3NfYnlfc2Vhc29uLFdpbnRlcikNCm91dGJyZWFrc19ieV9zZWFzb24gPC0gIGJpbmRfcm93cyhvdXRicmVha3NfYnlfc2Vhc29uLFNwcmluZykNCg0KZ2dwbG90KGRhdGE9b3V0YnJlYWtzX2J5X3NlYXNvbiwgbWFwcGluZyA9IGFlcyh4PVllYXIsIHk9IG91dGJyZWFrX2luY2lkZW5jZSwgY29sb3IgPVNlYXNvbikpKyANCiAgbGFicyh5PSJPdXRicmVhayBJbmNpZGVuY2UgKENhc2VzIC8gUG9wdWxhdGlvbikiLCB0aXRsZT0iRm9vZGJvcm5lIElsbG5lc3NlcyBUaHJvdWdob3V0IHRoZSBTZWFzb25zIikrDQogIGdlb21fbGluZSgpDQoNCg0KDQpgYGANCg0KV2UgYWxzbyBleGFtaW5lZCB0aGUgb3V0YnJlYWtzIGJ5IHNlYXNvbnMgdG8gZGlzY2VybiBpZiBzb21lIHVuZGVyeWxpbmcgZmFjdG9yIGFzc29jaWF0ZWQgd2l0aCBzZWFzb25zIHdvdWxkIGxlYWQgdG8gYSBkaWZmZXJlbmNlIGluIG91dGJyZWFrcy4gV2UgaW5pdGlhbGx5IHByZXN1bWVkIHRoYXQgdGhlIGhvdHRlciB0ZW1wZXJhdHVyZXMgb2Ygc3VtbWVyIHdvdWxkIGxlYWQgdG8gbW9yZSBmb29kIHNwb2lsaW5nIGFuZCB0aGVyZWZvcmUgbW9yZSBmb29kYm9ybmUgaWxsbmVzc2VzLiBUbyBvdXIgc3VycHJpc2UsIHN1bW1lciBvbmx5IGxlZCB0aGUgb3V0YnJlYWtzIGluIHRoZSAxOTk4LTk5LCBzdWdnZXN0aW5nIHRoYXQgYW4gaW1wcm92ZW1lbnQgaW4gZm9vZCBzdG9yYWdlIChwZXJoYXBzIGJldHRlciBvciBjaGVhcGVyIHJlZnJpZ2VyYXRpb24pIG9jY3VyZWQgYXJvdW5kIHRoZSB0dXJuIG9mIHRoZSBtaWxsZW5pdW0gd2hpY2ggcmVkdWNlZCB0aGUgb3V0YnJlYWtzIGluIHN1bW1lci4gVGhlIGxhcmdlIHNwaWtlIG9mIG91dGJyZWFrcyBpbiB0aGUgd2ludGVyIG9mIDIwMDQgaXMgZHVlIHRvIGEgcGVydmFzaXZlIHNwcmVhZCBvZiAqTm9yb3ZpcnVzKiwgY29tbW9ubHkgY2FsbGVkIHRoZSAid2ludGVyIHZvbWl0dGluZyBidWcuIiBNb3Jlb3ZlciwgdGhlIGxhcmdlIGluY3JlYXNlIG9mIHNwcmluZyBvdXRicmVha3MgaW4gMjAwNiBjb2luY2lkZXMgd2l0aCBhIG11bHRpc3RhdGUgb3V0YnJlYWsgb2YgKkUuIGNvbGkqIGluIHRoZSBtZWF0IG9mIFRhY28gQmVsbCBwcm9kdWN0cy4gSW4gY29uY29yZGFuY2Ugd2l0aCBvdXIgcHJldmlvdXMgZ3JhcGgsIHdlIHNlZSB0aGF0IHRoZSBvdXRicmVhayBpbmNpZGVuY2UgaGFzIHR5cGljYWxseSBkZWNyZWFzZWQgZm9yIGFsbCBmb3VyIHNlYXNvbnMgZnJvbSAxOTk4IHRvIDIwMTUuIA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0Kb3V0YnJlYWtzIDwtIHJlYWRfY3N2KCJvdXRicmVha3MuY3N2IikNCnBvcHVsYXRpb248LXJlYWRfY3N2KCdwb3BfZGF0YS5jc3YnKQ0KcG9wMjwtcmVhZF9jc3YoJ3BvcF9kYXRhLmNzdicpDQoNCnBvcHVsYXRpb248LXBvcHVsYXRpb24gJT4lIA0KICBnYXRoZXIoYDE5OThgLCBgMjAwMGAsYDE5OTlgLCBgMjAwMWAsYDIwMDJgLCBgMjAwM2AsYDIwMDRgLCBgMjAwNWAsYDIwMDZgLCBgMjAwN2AsYDIwMDhgLCBgMjAwOWAsYDIwMTBgLCBgMjAxMWAsYDIwMTJgLCBgMjAxM2AsYDIwMTRgLCBgMjAxNWAsIGtleSA9ICJ5ZWFyIiwgdmFsdWUgPSAicG9wIikNCnBvcDI8LXBvcDIgJT4lIA0KICAgZ2F0aGVyKGAxOTk4YCwgYDIwMDBgLGAxOTk5YCwgYDIwMDFgLGAyMDAyYCwgYDIwMDNgLGAyMDA0YCwgYDIwMDVgLGAyMDA2YCwgYDIwMDdgLGAyMDA4YCwgYDIwMDlgLGAyMDEwYCwgYDIwMTFgLGAyMDEyYCwgYDIwMTNgLGAyMDE0YCwgYDIwMTVgLCBrZXkgPSAieWVhciIsIHZhbHVlID0gInBvcCIpDQpwb3AyWzJdPC1OVUxMDQpwb3B1bGF0aW9uWzJdPC1OVUxMDQpwb3B1bGF0aW9uPC1wb3B1bGF0aW9uJT4lDQogIHJlbmFtZShZZWFyPXllYXIpJT4lDQogIG11dGF0ZShZZWFyPWFzLm51bWVyaWMoWWVhcikpDQpwb3AyPC1wb3AyJT4lDQogIHJlbmFtZShZZWFyPXllYXIpJT4lDQogIG11dGF0ZShZZWFyPWFzLm51bWVyaWMoWWVhcikpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCnBvcHVsYXRpb248LWxlZnRfam9pbihwb3B1bGF0aW9uLG91dGJyZWFrcyxieT1jKCdTdGF0ZScsICdZZWFyJykpDQoNCnAgPC0gcG9wdWxhdGlvbiAlPiUgDQogIG11dGF0ZSgNCiAgICBTcGVjaWVzID0gaWZlbHNlKHN0cl9zdWIoU3BlY2llcywgMSwgMTcpID09ICJFc2NoZXJpY2hpYSBjb2xpLCIsICJFc2NoZXJpY2hpYSBjb2xpIiwgU3BlY2llcyksDQogICAgU3BlY2llcyA9IGlmZWxzZShzdHJfc3ViKFNwZWNpZXMsIDEsIDEwKSA9PSAiU2FsbW9uZWxsYSIsICJTYWxtb25lbGxhIiwgU3BlY2llcyksDQogICAgU3BlY2llcyA9IGlmZWxzZShzdHJfc3ViKFNwZWNpZXMsIDEsIDkpID09ICJOb3JvdmlydXMiLCAiTm9yb3ZpcnVzIiwgU3BlY2llcyksDQogICAgU3BlY2llcyA9IGlmZWxzZShzdHJfc3ViKFNwZWNpZXMsIDEsIDMpID09ICJDYW0iLCAiQ2FtcHlsb2JhY3RlciIsIFNwZWNpZXMpLA0KICAgIFNwZWNpZXMgPSBpZmVsc2Uoc3RyX3N1YihTcGVjaWVzLCAxLCA4KSA9PSAiQmFjaWxsdXMiLCAiQmFjaWxsdXMgY2VyZXVzIiwgU3BlY2llcyksDQogICAgU3BlY2llcyA9IGlmZWxzZShzdHJfc3ViKFNwZWNpZXMsIDEsIDQpID09ICJDbG9zIiwgIkNsb3N0cmlkaXVtIHBlcmZyaW5nZW5zIiwgU3BlY2llcykNCiAgKSAlPiUgICANCiAgZ3JvdXBfYnkoU3BlY2llcyxZZWFyKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX2lsbG5lc3NlcyA9IHN1bShJbGxuZXNzZXMpKSANCg0KDQoNCg0KbW9zdF9jb21tb25fcGF0aG9nZW5zIDwtIHAgJT4lIA0KICBmaWx0ZXIoU3BlY2llcyAlaW4lIGMoJ1NhbG1vbmVsbGEnLCdOb3JvdmlydXMnLCAiQ2FtcHlsb2JhY3RlciIsIkJhY2lsbHVzIGNlcmV1cyIsIkNsb3N0cmlkaXVtIHBlcmZyaW5nZW5zIiwiRXNjaGVyaWNoaWEgY29saSIpKSAlPiUgDQogIGdyb3VwX2J5KFllYXIpIA0KICAgDQpnZ3Bsb3QoZGF0YSA9IG1vc3RfY29tbW9uX3BhdGhvZ2VucywgbWFwcGluZyA9IGFlcyh4PVllYXIsIHk9dG90YWxfaWxsbmVzc2VzLCBjb2xvciA9IFNwZWNpZXMpKSsNCiAgbGFicyh5PSJUb3RhbCBJbGxuZXNzZXMiLCB0aXRsZT0iVGhlIFNpeCBNb3N0IENvbW1vbiBPZmZlbmRlcnMiKSsNCiAgZ2VvbV9saW5lKCkNCg0KDQoNCg0KDQpgYGANCldlIGFsc28gbG9va2VkIGF0IHRoZSBzaXggbW9zdCBjb21tb24gb2ZmZW5kZXJzIG9mIGZvb2Rib3JuZSBpbGxuZXNzIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBPdGhlciB0aGFuICpFLiBjb2xpKiwgdGhlIGluZmVjdGl2aXR5IG9mIHRoZXNlIHBhdGhvZ2VucyBkaWQgbm90IHRlbmQgdG8gZGVjcmVhc2UgZnJvbSAxOTk4IHRvIDIwMTUuIFdlIHNwZWN1bGF0ZSB0aGF0IHRoZSBsYXJnZSBtZWRpYSBjb3ZlcmFnZSBvZiAqRS4gY29saSogb3V0YnJlYWtzIGluIG1ham9yIGZhc3QgZm9vZCBjaGFpbnMgKFRhY28gQmVsbCBhbmQgQ2hpcG90bGUpIG1heSBleHBsYWluIHdoeSAqRS4gY29saSogc2F3IHRoZSBvbmx5IGRlY3JlYXNlIGluIGZvb2Rib3JuZSBpbGxuZXNzZXMuICpOb3JvdmlydXMqIHJlbWFpbnMgdGhlIG1vc3QgY29tbW9uIGNhdXNlIG9mIGdhc3Ryb2VudGVyaXRpcyAoZm9vZGJvcm5lIGlsbG5lc3MpIGluIHRoZSBVbml0ZWQgU3RhdGVzLiAqTm9yb3ZpcnVzKiBiZWNvbWVzIGFlcm9zb2xpemVkIHdoZW4gYSBwZXJzb24gdm9taXRzIGFuZCB0aGUgYWVyb3NvbGl6ZWQgdmlydXMgY2FuIHJlbWFpbiBhY3RpdmUgaW4gdGhlIGFyZWEgZm9yIHNldmVyYWwgZGF5cyBhZnRlciB0aGUgdm9taXQgaXMgY2xlYW5lZCB1cC4gSW4gYWRkaXRpb24sIGFzIGZldyBhcyAyMCAqTm9yb3ZpcnVzKiBwYXJ0aWNsZXMgYXJlIGVub3VnaCB0byBjYXVzZSBpbmZlY3Rpb24tLWlsbHVzdHJhdGluZyBob3cgZWFzaWx5IHRoaXMgdmlydXMgY291bGQgc3ByZWFkIGluIGEgcmVzdHVyYW50LCBjYW1wLCBob3RlbCwgb3IgZG9ybWl0b3JpZXMuIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgMjAwNCBhbmQgMjAwNiBzcGlrZXMgaW4gaWxsbmVzc2VzIGNhdXNlZCBieSAqTm9yb3ZpcnVzKiBjb2luY2lkZSB3aXRoIHNpbWlsYXIgaW5jcmVhc2VzIGluIHRoZSB3aW50ZXJzIG9mIDIwMDQgYW5kIDIwMDYsIGRlbW9uc3RyYXRpbmcgd2h5IHRoZSB2aXJ1cyBpcyBkdWJiZWQgdGhlICJ3aW50ZXIgdm9taXR0aW5nIGJ1ZyIuIEluIGNvbmNsdXNpb24sIHRoZSBtb3N0IGNvbW1vbiBvZmZlbmRlcnMgb2YgZm9vZGJvcm5lIGlsbG5lc3MgaGF2ZSBnZW5lcmFsbHkgc3RheWVkIGNvbnN0YW50IGZyb20gMTk5OC0yMDE1LiBPdXIgcHJldmlvdXMgZ3JhcGhzLCBob3dldmVyLCBzaG93IHRoYXQgZm9vZGJvcm5lIGlsbG5lc3NlcyBvdmVyYWxsIGhhdmUgZGVjcmVhc2VkIGR1cmluZyB0aGlzIHBlcmlvZC4gV2UgY2FuIGluZmVyIHRoYXQgYmV0dGVyIHNhbml0YXRpb24gYW5kIHN0cmljdGVyIHJlZ3VsYXRpb25zIGhhdmUgb25seSBiZWVuIGVmZmVjdGl2ZSBhZ2FpbnN0IHRoZSBsZXNzIGNvbW1vbiBwYXRob2dlbnMsIHN1Y2ggYXMgKlN0YXBoeWxvY29jY3VzIGF1cmV1cyouIFRoZSBtb3N0IGNvbW1vbiBvZmZlbmRlcnMgYXJlIGhhcmR5IHBhdGhvZ2VucyB0aGF0IGNhbiBzdXJ2aXZlIGV4dHJlbWUgdGVtcGVyYXR1cmUgY2hhbmdlcyBhbmQgYXJlIGdlbmVyYWxpc3RzIHRoYXQgY2FuIGdyb3cgaW4gd2F0ZXIsIHRocml2ZSBvbiBzdXJmYWNlcywgYW5kIHJlc2lzdCBzYW5pdGF0aW9uIG1ldGhvZHMuIFVuZm9ydHVuYXRlbHksIGl0IGRvZXMgbm90IHNlZW0gbGlrZWx5IHRoYXQgZm9vZGJvcm5lIGlsbG5lc3NlcyB3aWxsIGRlY3JlYXNlIGZyb20gdGhlc2UgcGF0aG9nZW5zIGluIHRoZSBmb3JzZWVhYmxlIGZ1dHVyZS4gDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQpvdXRicmVha3MgPC0gcmVhZF9jc3YoIm91dGJyZWFrcy5jc3YiKQ0KcG9wdWxhdGlvbjwtcmVhZF9jc3YoJ3BvcF9kYXRhLmNzdicpDQpwb3AyPC1yZWFkX2NzdigncG9wX2RhdGEuY3N2JykNCg0KcG9wdWxhdGlvbjwtcG9wdWxhdGlvbiAlPiUgDQogIGdhdGhlcihgMTk5OGAsIGAyMDAwYCxgMTk5OWAsIGAyMDAxYCxgMjAwMmAsIGAyMDAzYCxgMjAwNGAsIGAyMDA1YCxgMjAwNmAsIGAyMDA3YCxgMjAwOGAsIGAyMDA5YCxgMjAxMGAsIGAyMDExYCxgMjAxMmAsIGAyMDEzYCxgMjAxNGAsIGAyMDE1YCwga2V5ID0gInllYXIiLCB2YWx1ZSA9ICJwb3AiKQ0KcG9wMjwtcG9wMiAlPiUgDQogICBnYXRoZXIoYDE5OThgLCBgMjAwMGAsYDE5OTlgLCBgMjAwMWAsYDIwMDJgLCBgMjAwM2AsYDIwMDRgLCBgMjAwNWAsYDIwMDZgLCBgMjAwN2AsYDIwMDhgLCBgMjAwOWAsYDIwMTBgLCBgMjAxMWAsYDIwMTJgLCBgMjAxM2AsYDIwMTRgLCBgMjAxNWAsIGtleSA9ICJ5ZWFyIiwgdmFsdWUgPSAicG9wIikNCnBvcDJbMl08LU5VTEwNCnBvcHVsYXRpb25bMl08LU5VTEwNCnBvcHVsYXRpb248LXBvcHVsYXRpb24lPiUNCiAgcmVuYW1lKFllYXI9eWVhciklPiUNCiAgbXV0YXRlKFllYXI9YXMubnVtZXJpYyhZZWFyKSkNCnBvcDI8LXBvcDIlPiUNCiAgcmVuYW1lKFllYXI9eWVhciklPiUNCiAgbXV0YXRlKFllYXI9YXMubnVtZXJpYyhZZWFyKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KFVTQWJvdW5kYXJpZXMpDQpsaWJyYXJ5KHJnZW9zKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShVU0Fib3VuZGFyaWVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkobWFwdG9vbHMpDQoNCm91dGJyZWFrcyA8LSByZWFkX2Nzdigib3V0YnJlYWtzLmNzdiIpDQpwb3B1bGF0aW9uPC1yZWFkX2NzdigncG9wX2RhdGEuY3N2JykNCnBvcHVsYXRpb248LXBvcHVsYXRpb24gJT4lIA0KICBnYXRoZXIoYDE5OThgLCBgMjAwMGAsYDE5OTlgLCBgMjAwMWAsYDIwMDJgLCBgMjAwM2AsYDIwMDRgLCBgMjAwNWAsYDIwMDZgLCBgMjAwN2AsYDIwMDhgLCBgMjAwOWAsYDIwMTBgLCBgMjAxMWAsYDIwMTJgLCBgMjAxM2AsYDIwMTRgLCBgMjAxNWAsIGtleSA9ICJ5ZWFyIiwgdmFsdWUgPSAicG9wIikNCnBvcHVsYXRpb25bMl08LU5VTEwNCnBvcHVsYXRpb248LXBvcHVsYXRpb24lPiUNCiAgcmVuYW1lKFllYXI9eWVhciklPiUNCiAgbXV0YXRlKFllYXI9YXMubnVtZXJpYyhZZWFyKSkNCnBvcHVsYXRpb248LWxlZnRfam9pbihwb3B1bGF0aW9uLG91dGJyZWFrcyxieT1jKCdTdGF0ZScsICdZZWFyJykpDQoNCg0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCmZvb2RzPC1wb3B1bGF0aW9uJT4lDQogIG11dGF0ZShpc01lYXQ9KHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2NoaWNrZW4nKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2JlZWYnKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3N0ZWFrJykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdoYW0nKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ21lYXQnKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3RyaS10aXAnKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2Nhcm5lJykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdicmlza2V0JykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdyaWJzJykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdwb3JrJykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdob3QgZG9nJykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICd0dXJrZXknKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2R1Y2snKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2xpdmVyJykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdnb2F0JykpfA0KICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdob2cnKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3NhdXNhZ2UnKSl8DQogICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3Zlbmlzb24nKSksDQogICAgICAgICBpc1NlYWZvb2Q9KHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2Zpc2gnKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdjbGFtcycpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ295c3RlcicpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2NyYWInKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdjcmF3ZmlzaCcpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2NyYXlmaXNoJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnc2hyaW1wJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnc2NhbGxvcHMnKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdzZWFmb29kJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnZWVsJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnZ3JvdXBlcicpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3NuYXBwZXInKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICd0dW5hJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnc2VhYmFzcycpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3NhbG1vbicpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2JhcnJhY3VkYScpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2NldmljaGUnKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdzcXVpZCcpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ29jdG9wdXMnKSksDQogICAgICAgICBpc1NhbGFkPShzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdzYWxhZCcpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2xlYWZ5JykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnbGV0dHVjZScpKXwNCiAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2thbGUnKSksDQogICAgICAgICBpc0ZydWl0PSgoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAncGluZWFwcGxlJykpfA0KICAgICAgICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnZnJ1aXQnKSl8DQogICAgICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ3BlYXInKSl8DQogICAgICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2dyYXBlJykpfA0KICAgICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICd3YXRlcm1lbG9uJykpfA0KICAgICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdjYW50YWxvdXBlJykpfA0KICAgICAgICAgICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdob25leWRldycpKXwNCiAgICAgICAgICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnYXBwbGUnKSl8DQogICAgICAgICAgICAgICAgICAgKHN0cl9kZXRlY3QodG9sb3dlcihGb29kKSwgJ2JhbmFuYScpKXwNCiAgICAgICAgICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnYmVycicpKSksDQogICAgICAgICBpc1BvdWx0cnlEYWlyeT0oc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnc3F1aWQnKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdtaWxrJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnY2hlZXNlJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnZWdnJykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAneW9ndXJ0JykpfA0KICAgICAgICAgICAoc3RyX2RldGVjdCh0b2xvd2VyKEZvb2QpLCAnY3JlYW0nKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoRm9vZCksICdidXR0ZXInKSl8DQogICAgICAgICAgIChzdHJfZGV0ZWN0KHRvbG93ZXIoSW5ncmVkaWVudCksICdlZ2cnKSkpDQogICAgICAgICAgIA0KZm9vZGdyYXBoPC1mb29kcyU+JQ0KICBncm91cF9ieShZZWFyLFN0YXRlKSU+JQ0KICBzdW1tYXJpc2UobWVhdD1zdW0oaXNNZWF0LCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIHNlYWZvb2Q9c3VtKGlzU2VhZm9vZCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBmcnVpdD1zdW0oaXNGcnVpdCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBzYWxhZD1zdW0oaXNTYWxhZCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBwb3VsdHJ5ZGFpcnk9c3VtKGlzUG91bHRyeURhaXJ5LCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIHBvcD1tZWFuKHBvcCkpDQpmb29kZ3JhcGg8LWZvb2RncmFwaCU+JQ0KICBncm91cF9ieShZZWFyKSU+JQ0KICBzdW1tYXJpc2UobWVhdD1zdW0obWVhdCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBzZWFmb29kPXN1bShzZWFmb29kLCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIGZydWl0PXN1bShmcnVpdCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBzYWxhZD1zdW0oc2FsYWQsIG5hLnJtPVRSVUUpLA0KICAgICAgICAgICAgcG91bHRyeWRhaXJ5PXN1bShwb3VsdHJ5ZGFpcnksIG5hLnJtPVRSVUUpLA0KICAgICAgICAgICAgcG9wPXN1bShwb3ApKSU+JQ0KICBnYXRoZXIoYG1lYXRgLCBgc2VhZm9vZGAsIGBmcnVpdGAsIGBzYWxhZGAsIGBwb3VsdHJ5ZGFpcnlgLCBrZXkgPSAiVHlwZSIsIHZhbHVlID0gIkNhc2VzIikNCmdncGxvdChmb29kZ3JhcGgsIGFlcyh4PVllYXIsIHk9Q2FzZXMvcG9wLCBjb2xvcj1UeXBlKSkrDQogIGdlb21fbGluZSgpKw0KICB5bGFiKCJDYXNlcyBwZXIgQ2FwaXRhIikrDQogIGxhYnModGl0bGU9J0Nhc2VzIHBlciBDYXBpdGEgYnkgWWVhciBhbmQgRm9vZCBUeXBlJykNCg0KDQoNCmBgYA0KQXMgd2UgY29udGludWVkIG91ciBpbnZlc3RpZ2F0aW9uLCB3ZSB3ZXJlIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGUgdmFyaW91cyBmb29kIHR5cGVzIGNvbnRyaWJ1dGVkIHRvIG91dGJyZWFrcyBvZiBmb29kYm9ybmUgaWxsbmVzcy4gSW4gZ2VuZXJhbCwgYWxsIHR5cGVzIG9mIGZvb2QgaGF2ZSBzaG93biBkZWNyZWFzZWQgaW5jaWRlbmNlIG9mIGlsbG5lc3MgZnJvbSAxOTk4LTIwMTUsIHdoaWNoIGFncmVlcyB3aXRoIG91ciBwcmV2aW91cyBhc3NlcnRpb25zIHRoYXQgZm9vZGJvcm5lIGlsbG5lc3MgaGFzIGRlY3JlYXNlZCBvdmVyYWxsLiBGb29kYm9ybmUgaWxsbmVzcyBpbiBtZWF0IGhhcyBkZW1vbnN0cmF0ZWQgYSBkcmFtYXRpYyBkZWNsaW5lIGluIHRoZSBwYXN0IGZpZnRlZW4geWVhcnMsIHN1Z2dlc3RpbmcgcmVjZW50IGlubm92YXRpb25zIGluIGZpZWxkcyBzdWNoIGFzIHJlZnJpZ2VyYXRpb24gb3IgZm9vZCBzdG9yYWdlIGhhdmUgYmVlbiBleHRyZW1lbHkgZWZmZWN0aXZlIGluIHJlZHVjaW5nIHBhdGhvZ2VuaWMgYWdlbnRzLiBJbiBmYWN0LCB0aGUgbWVhdCBwYWNrYWdpbmcgaW5kdXN0cnkgaGFzIHJlY2VudGx5IHN0YXJ0ZWQgdG8gcGFja2FnZSBtZWF0IHVuZGVyIGhpZ2ggb3h5Z2VuIGNvbmRpdGlvbnMgYW5kIHdpdGggbmF0dXJhbCBhbnRpb3hpZGFudHMsIHdoaWNoIGhhcyBiZWVuIHNob3duIHRvIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNoZWxmIGxpZmUgb2YgbWVhdHMsIGFzIHdlbGwgYXMgbWFraW5nIHRoZW0gYXBwZWFyIG1vcmUgcmVkIGFuZCBhcHBldGl6aW5nLiBXZSBzcGVjdWxhdGUgdGhhdCB0aGlzIG5ldyBjb21iaW5hdGlvbiBvZiBhbnRpb3hpZGFudHMgYW5kIGhpZ2ggb3h5Z2VuIHBhY2tpbmcgY29uZGl0aW9ucyBoYXMgYmVlbiB0aGUgbWFpbiBmYWN0b3IgaW4gdGhlIG1lYXQncyBkZWNsaW5lIGluIGZvb2Rib3JuZSBpbGxuZXNzZXMuIERlc3BpdGUgdGhlIHByb2dyZXNzLCBtZWF0IHJlbWFpbnMgdGhlIG1vc3QgbGlrZWx5IGZvb2QgaXRlbSBpbiB0aGUgVW5pdGVkIFN0YXRlcyB0byBtYWtlIHlvdSBzaWNrLiBTbyBpZiB5b3Ugd2FudCB0byBhdm9pZCBnZXR0aW5nIHNpY2ssIHN0aWNrIHRvIGEgcGllY2Ugb2YgZnJ1aXQgb3IgYSBzYWxhZC4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQpvdXRicmVha19yZXN1bHRzIDwtIG91dGJyZWFrcyAlPiUgDQogIHNlbGVjdChZZWFyLCBJbGxuZXNzZXMsIEhvc3BpdGFsaXphdGlvbnMsIEZhdGFsaXRpZXMpICU+JSANCiAgZ3JvdXBfYnkoWWVhcikgJT4lIA0KICBzdW1tYXJpemUoVG90YWxfSWxsbmVzc2VzID0gc3VtKElsbG5lc3NlcyksIFRvdGFsX0hvc3BpdGFsaXphdGlvbnMgPSBzdW0oSG9zcGl0YWxpemF0aW9ucywgbmEucm0gPSBUUlVFKSwgVG90YWxfRmF0YWxpdGllcyA9IHN1bShGYXRhbGl0aWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50X2hvc3BpdGFsaXphdGlvbnMgPSAoKFRvdGFsX0hvc3BpdGFsaXphdGlvbnMgLyBUb3RhbF9JbGxuZXNzZXMpICoxMDApKSAlPiUgDQogIG11dGF0ZShwZXJjZW50X2ZhdGFsaXRpZXMgPSAoKFRvdGFsX0ZhdGFsaXRpZXMgLyBUb3RhbF9JbGxuZXNzZXMpICoxMDApKSAlPiUgDQogIHNlbGVjdChZZWFyLCBwZXJjZW50X2hvc3BpdGFsaXphdGlvbnMsIHBlcmNlbnRfZmF0YWxpdGllcykNCiAgDQoNCg0KbW92aW5nX2JleW9uZF9pbGxuZXNzIDwtIGdncGxvdChkYXRhID0gb3V0YnJlYWtfcmVzdWx0cywgYWVzKHggPSBZZWFyKSkgKyANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBwZXJjZW50X2hvc3BpdGFsaXphdGlvbnMsIGNvbG9yID0gImhvc3BpdGFsaXphdGlvbnMiKSkgKyANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBwZXJjZW50X2ZhdGFsaXRpZXMsIGNvbG9yID0gImZhdGFsaXRpZXMiKSkgKw0KICAgIGxhYnModGl0bGUgPSAiTW92aW5nIEJleW9uZCBJbGxuZXNzIiwgeSA9ICJQZXJjZW50IG9mIENhc2VzIikNCg0KbW92aW5nX2JleW9uZF9pbGxuZXNzDQoNCg0KYGBgDQpBcyBpcyBzZWVuIGluIHRoZSBncmFwaCwgdGhlIHBlcmNlbnQgb2YgY2FzZXMgcmVzdWx0aW5nIGluIGhvc3BpdGFsaXphdGlvbnMgaGFzIGluY3JlYXNlZC4gV2Ugc2VlIGEgc3Bpa2UgaW4gdGhlIGdyYXBoIGFmdGVyIDIwMTAsIHdoaWNoIG1heSBiZSBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIE9iYW1hY2FyZSBjYXVzaW5nIG1vcmUgcGVvcGxlIHRvIHNlZWsgdHJlYXRtZW50IHJhdGhlciB0aGFuIHdhaXQgb3V0IHRoZWlyIGlsbG5lc3MuIFRoZSBnZW5lcmFsIHVwd2FyZCB0cmVuZCBtYXkgYmUgZHVlIGFsc28gdG8gYSBnZW5lcmFsIGluY3JlYXNlZCBhd2FyZW5lc3MgYW5kIHVuZGVyc3RhbmRpbmcgb2YgZm9vZGJvcm5lIGlsbG5lc3MuIEhvd2V2ZXIsIHRoZSByZWxhdGl2ZSBwZXJjZW50IG9mIGZhdGFsaXRpZXMgaGFzIG5vdCBjaGFuZ2VkLiBUaGUgcHJvdG9jb2wgZm9yIG1hbnkgZm9vZGJvcm5lIGlsbG5lc3NlcyBnZW5lcmFsbHkgcmVsaWVzIG9uIHJlcGxhY2luZyBmbHVpZHMuIEl0IGlzIHVuY2xlYXIgaW4gdGhlIGRhdGEgaWYgdGhvc2Ugd2hvIGRpZWQgZnJvbSB0aGVpciBpbGxuZXNzZXMgYWxzbyB3ZW50IHRvIHRoZSBob3NwaXRhbCBiZWZvcmUsIGJ1dCBpZiBub3QsIGl0IGlzIGxpa2VseSB0aGF0IHRoZXkgd2VyZSB1bmFibGUgdG8gcmVwbGVuaXNoIHRoZWlyIGZsdWlkcyBvbiB0aGVpciBvd24uIFN0aWxsLCB0aGlzIGlzIHRoZSBvdXRjb21lIGluIGFuIGluY3JlZGlibHkgc21hbGwgcGVyY2VudCBvZiBjYXNlcyBhbmQgaXMgaGlnaGx5IHVubGlrZWx5IGVzcGVjaWFsbHkgaWYgYSBwZXJzb24gcmVjZWl2ZXMgdHJlYXRtZW50Lg0KDQpHZXR0aW5nIHNpY2sgZnJvbSBmb29kIGlzIGFuIGVzcGVjaWFsbHkgY3J1ZWwgb3V0Y29tZSwgc2luY2Ugd2UgbmV2ZXIgZXhwZWN0IHRoZSB0aGluZ3Mgd2UgbG92ZSB0byBodXJ0IHVzLiBXaGVuIGEgYmVsb3ZlZCByZXN0YXVyYW50IGxpa2UgQ2hpcG90bGUgZ2V0cyBiYWQgcHJlc3MgZm9yIHRoaXMsIGl0IGNhbiBiZSBoYXJkIHRvIHJlZ2FpbiBjdXN0b21lcnMnIHRydXN0LiBIb3dldmVyLCBvdXIgaW52ZXN0aWdhdGlvbiBvZiBmb29kYm9ybmUgaWxsbmVzcyBpcyBwcm9taXNpbmcuIEZvb2Rib3JuZSBpbGxuZXNzIGluIGFsbCByZWdpb25zIG9mIEFtZXJpY2EgaXMgb24gdGhlIGRlY2xpbmUgb3ZlcmFsbC4gSXQgaXMgY2xlYXIgaW4gdGhlc2UgZGVjbGluZXMgdGhhdCBpbXByb3ZpbmcgZm9vZCBzYWZldHkgaGFzIGJlZW4gYSBwcmlvcml0eSBmb3IgZm9vZCBwcm92aWRlcnMgYW5kIHZlbmRvcnMgYWNyb3NzIHRoZSBuYXRpb24uIFdoaWxlIHRoZXJlIGFyZSBzb21lIGVzcGVjaWFsbHkgaGlnaC1yaXNrIHN0YXRlcywgdGhlIG92ZXJhbGwgaW5jaWRlbmNlIG9mIGZvb2Rib3JuZSBpbGxuZXNzIGlzIHN0aWxsIHByZXR0eSBsb3cuIEluIGFkZGl0aW9uLCBwZW9wbGUgYXBwZWFyIGluY3JlYXNpbmdseSB3aWxsaW5nIHRvIHNlZWsgc2VyaW91cyBtZWRpY2FsIGF0dGVudGlvbiB3aGVuIHRoZXkgbmVlZCBpdDsgdGhpcyBpcyBhbHdheXMgYSBnb29kIG9wdGlvbiBpZiB5b3UgZmVhciBhYm91dCB0aGUgc2V2ZXJpdHkgb2YgeW91ciBpbGxuZXNzLiBBcyBsb25nIGFzIHlvdSBhcmUgY2FyZWZ1bCB3aGVuIHByZXBhcmluZyB5b3VyIG93biBmb29kIGFuZCBtYWtlIGluZm9ybWVkIGNob2ljZXMgYWJvdXQgd2hlcmUgdG8gZGluZSwgZm9vZGJvcm5lIGlsbG5lc3MgaXMgbm90IHNvbWV0aGluZyB0byBoYXZlIG1ham9yIGZlYXJzIGFib3V0IGFueXdoZXJlIGluIHRoZSBVbml0ZWQgU3RhdGVzLg0KDQojIExpbWl0YXRpb25zDQpUaGUgZmlyc3QgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IHRoZSBkYXRhIGNhbiBuZXZlciBiZSBhIGNvbXBsZXRlIHJlY29yZCBvZiBldmVyeSBjYXNlIG9mIGZvb2Rib3JuZSBpbGxuZXNzIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBEYXRhIGxpa2UgdGhpcyBpcyB2ZXJ5IGRlcGVuZGVudCBvbiBzZWxmIHJlcG9ydGluZywgYW5kIHRoZXJlIGFyZSBhbHdheXMgYSBudW1iZXIgb2YgcGVvcGxlIHdobyBkbyBub3QgcmVwb3J0IHRoZWlyIGlsbG5lc3Nlcy4gSXQgaXMgbGlrZWx5IHRoYXQgdGhlIG1vcmUgc2V2ZXJlIGNhc2VzIHdlcmUgdGhlIG9uZXMgdGhhdCB3ZXJlIHJlcG9ydGVkLCBhbmQgdGhpcyBtYXkgY2F1c2Ugb3VyIGNvbmNsdXNpb25zIHJlZ2FyZGluZyBzZXZlcml0eSB0byBiZSBkaWZmZXIgZnJvbSB0aGUgdHJ1dGgsIGJ1dCB3ZSBjb250aW51ZWQgd2l0aCB3aGF0IGRhdGEgd2UgaGFkLg0KDQpBbm90aGVyIGltcG9ydGFudCB0aGluZyB0byBub3RlIGlzIHRoYXQgdGhlIHBvcHVsYXRpb24gZGF0YSB3ZSBvcmlnaW5hbGx5IGhhZCB3YXMgY2Vuc3VzIGRhdGEsIG1lYW5pbmcgaXQgd2FzIG5vdCBhdmFpbGFibGUgZm9yIGVhY2ggeWVhci4gV2UgdXNlZCBzdGF0aXN0aWNhbCBtZXRob2RzIHRvIGludGVycG9sYXRlIHBvcHVsYXRpb24gY291bnRzIGZvciB0aGUgeWVhcnMgaW4gYmV0d2Vlbi4gVGh1cywgd2hpbGUgdGhlIHBvcHVsYXRpb24gZGF0YSBtaWdodCBub3QgYmUgY29tcGxldGVseSBhY2N1cmF0ZSBmb3IgdGhvc2UgeWVhcnMsIGl0IHNob3VsZCBiZSBjbG9zZSB0byB0aGUgYWN0dWFsIHZhbHVlcy4NCg0KV2hlbiBjb25zaWRlcmluZyB0aGUga2luZHMgb2YgcGF0aG9nZW5zLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGZvciBzb21lIGNhc2VzLCBpbmZvcm1hdGlvbiBvbiB3aGljaCBwYXRob2dlbiBjYXVzZWQgdGhlIGluZmVjdGlvbiB3YXMgdW5hdmFpbGFibGUuIEl0IGlzIGxpa2VseSB0aGF0IHRoZSBpbmZvcm1hdGlvbiB3YXMgbm90IHJlcG9ydGVkLCBvciByZXBvcnRlZCBzbyBtdWNoIGxhdGVyIHRoYW4gdGhlIGlsbG5lc3MgdGhhdCB0aGUgdHlwZSBvZiBwYXRob2dlbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gV2l0aCB0aGlzIGluIG1pbmQsIHdlIGV4YW1pbmVkIHdoYXQgZGF0YSB3ZSBkaWQgaGF2ZS4NCg0KIyBFeHRyYSBJbmZvcm1hdGlvbjoNCldlIGRlZmluZWQgdGhlIHZhcmlvdXMgcmVnaW9ucyBhY2NvcmRpbmcgdG8gdGhlIFVTIENlbnN1cyBCdXJlYS4gVGhlIE5vcnRoZWFzdCBpbmNsdWRlcyBNYWluZSwgVmVybW9udCwgTmV3IEhhbXBzaGlyZSwgTWFzc2FjaHVzZXR0cywgQ29ubmVjdGljdXQsIFJob2RlIElzbGFuZCwgTmV3IFlvcmssIERlbGF3YXJlLCBOZXcgSmVyc2V5LCBQZW5uc3lsdmFuaWE7IHRoZSBNaWR3ZXN0IGluY2x1ZGVzIElsbG5vaXMsIE9oaW8sIE1pY2hpZ2FuLCBXaXNjb25zaW4sIEluZGlhbmlhLCBJb3dhLCBLYW5zYXMsIE1pbm5lc290YSwgTmVicmFza2EsIE1pc3NvdXJpLCBOb3J0aCBEYWtvdGEsIFNvdXRoIERha290YTsgdGhlIFNvdXRoIGluY2x1ZGVzIEZsb3JpZGEsIEdlb3JnaWEsIE5vcnRoIENhcm9saW5hLCBTb3V0aCBDYXJvbGluYSwgVmlyZ2luaWEsIE1hcnlsYW5kLCBLZW50dWNreSwgVGVubmVzZWUsIFdlc3QgVmlyZ2luaWEsIERDLCBBbGFiYW1hLCBNaXNzaXNzaXBwaSwgQXJrYW5zYXMsIFRleGFzLCBPa2xhaG9tYSwgTG91aXNhbmE7IGFuZCB0aGUgV2VzdCBpbmNsdWRlcyBDYWxpZm9ybmlhLCBXYXNoaW5ndG9uLCBOZXZhZGEsIE9yZWdvbiwgV3lvbWluZywgQ29sb3JhZG8sIEFsYXNrYSwgTW9udGFuYSwgVXRhaCwgTmV3IE1leGljbywgSGF3YWlpLCBJZGFoby4gVG8gYWNjb3VudCBmb3IgcG9wdWxhdGlvbiBmbHVjdHVhdGlvbnMsIHdlIGludHJhcG9sYXRlZCB0aGUgc3RhdGUgcG9wdWxhdGlvbnMgdXNpbmcgdGhlIDE5OTAsIDIwMDAsIGFuZCAyMDEwIENlbnN1cyBkYXRhLiANCg0KDQoNCiMjIyMgSHlwb3RoZXNpcyB0ZXN0IGFuZCByZWdyZXNzaW9uIGZvciBvdXRicmVha3MgdnMgeWVhcg0KYGBge3IsIGVjaG89RkFMU0V9DQojIGh5cG90aGVzaXMgdGVzdCBhbmQgcmVncmVzc2lvbiBmb3Igb3V0YnJlYWtzIGFuZCB5ZWFyDQoNCm1vZGVsMSA8LSBsbShvdXRicmVha19wcmV2YWxlbmNlIH4gWWVhciwgZGF0YSA9IG91dGJyZWFrc19ieV9yZWdpb24pDQptb2RlbF90YWJsZTEgPC0gdGlkeShtb2RlbDEsIGNvbmYuaW50PVRSVUUpICU+JSBrYWJsZShkaWdpdHM9MykNCm1vZGVsX3RhYmxlMQ0KDQoNCmBgYA0KDQoNCiMjIyMgSHlwb3RoZXNpcyB0ZXN0IGFuZCByZWdyZXNzaW9uIGZvciBvdXRicmVha3MgdnMgc2Vhc29uDQpgYGB7ciwgZWNobz1GQUxTRX0NCm1vZGVsMiA8LSBsbShvdXRicmVha19pbmNpZGVuY2UgfiBZZWFyLCBkYXRhID0gb3V0YnJlYWtzX2J5X3NlYXNvbikNCm1vZGVsX3RhYmxlMiA8LSB0aWR5KG1vZGVsLCBjb25mLmludD1UUlVFKSAlPiUga2FibGUoZGlnaXRzPTMpDQptb2RlbF90YWJsZTINCmBgYA0KDQoNCiMjIyMgSHlwb3RoZXNpcyB0ZXN0IGZvciBtb3N0IGNvbW1vbiBwYXRob2dlbnMgdnMgeWVhciANCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbW9kZWwgPC0gbG0odG90YWxfaWxsbmVzc2VzIH4gWWVhciwgZGF0YSA9IG1vc3RfY29tbW9uX3BhdGhvZ2VucykNCm1vZGVsX3RhYmxlIDwtIHRpZHkobW9kZWwsIGNvbmYuaW50PVRSVUUpICU+JSBrYWJsZShkaWdpdHM9MykNCm1vZGVsX3RhYmxlDQpgYGANCg0KIyMjIyBIeXBvdGhlc2lzIHRlc3QgYW5kIHJlZ3Jlc3Npb24gZm9yIHBhdGhvZ2VuIHNwZWNpZXMgdnMgdG90YWwgaWxsbmVzcyANCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbW9kZWwzIDwtIGxtKHRvdGFsX2lsbG5lc3NlcyB+IFNwZWNpZXMsIGRhdGEgPSBtb3N0X2NvbW1vbl9wYXRob2dlbnMpDQptb2RlbF90YWJsZTMgPC0gdGlkeShtb2RlbDMsIGNvbmYuaW50PVRSVUUpICU+JSBrYWJsZShkaWdpdHM9MykNCm1vZGVsX3RhYmxlMw0KYGBgDQoNCiMjIyMgSHlwb3RoZXNpcyB0ZXN0IGFuZCByZWdyZXNzaW9uIGZvciBob3NwaXRhbGl6YXRpb25zIHZzIHllYXINCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbW9kZWw0IDwtIGxtKHBlcmNlbnRfaG9zcGl0YWxpemF0aW9uc35ZZWFyLCBkYXRhPW91dGJyZWFrX3Jlc3VsdHMpDQp0aWR5KG1vZGVsNCwgY29uZi5pbnQgPSBUUlVFKSAlPiUga2FibGUoZGlnaXRzPTMpDQpgYGANCg0KIyMjIyBIeXBvdGhlc2lzIHRlc3QgYW5kIHJlZ3Jlc3Npb24gZm9yIGZhdGFsaXRpZXMgdnMgeWVhcg0KYGBge3IsIGVjaG89RkFMU0V9DQptb2RlbDUgPC0gbG0ocGVyY2VudF9mYXRhbGl0aWVzflllYXIsIGRhdGE9b3V0YnJlYWtfcmVzdWx0cykNCnRpZHkobW9kZWw1LCBjb25mLmludCA9IFRSVUUpICU+JSBrYWJsZShkaWdpdHM9MykNCg0KYGBgDQoNCiMgU291cmNlcw0KW0NlbnRlciBmb3IgRGlzZWFzZSBDb250cm9sXShodHRwczovL3d3dy5jZGMuZ292L2Zvb2RzYWZldHkvb3V0YnJlYWtzL211bHRpc3RhdGUtb3V0YnJlYWtzL291dGJyZWFrcy1saXN0Lmh0bWwpDQoNCltOb3JvdmlydXMgRmFjdHNdKGh0dHBzOi8vd3d3LmNkYy5nb3Yvbm9yb3ZpcnVzLykNCg0KW091dGJyZWFrIERhdGEgU2V0XShodHRwczovL3d3dy5rYWdnbGUuY29tL2NkYy9mb29kYm9ybmUtZGlzZWFzZXMpDQoNCltVUyBDZW5zdXMgRGF0YSBTZXRdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS90YWJsZXMvMjAxNi9kZW1vL3BvcGVzdC9zdGF0ZS10b3RhbC5odG1sKQ0KDQpbSW1wcm92aW5nIFNoZWxmIExpZmUgb2YgTWVhdHNdKGh0dHBzOi8vd3d3LmhpbmRhd2kuY29tL2pvdXJuYWxzL2lqZnMvMjAxNC82MjkwNjIvKQ0KDQo=