By Althea Erickson

Purpose

The goal of this research is to understand overall financial security among the self-employed, compared with those working within traditional employment models. I hope this research will help identify challenges that are unique to self-employed workers, and inform the development of policy interventions to address those challenges.


Introduction

Data about the self-employed is notoriously inconsistent and incomplete, resulting in wildly different estimates of the size and characteristics of the workforce, ranging from 16.4 million to 72.7 million workers. These discrepancies arise from differences in research methodologies, particularly differences in definitions of self-employment and the wording of questions used to collect data about individual work arrangements. The result of these methodological discrepancies is broad disagreement about the nature of independent work. Is it mostly low-wage, misclassified gig workers? Highly educated and highly paid professionals? The data is inconclusive.

Data challenges have thwarted many efforts to understand the circumstances of independent workers. In part due to this lack of data, they are often overlooked in policy debates about social protections, and frequently excluded from the programs themselves. In order to bring self-employed individuals back into the public debate about financial security and social protections, we need better data on their overall financial security compared to other populations.

I hypothesize that given independent workers operate largely outside the employer-based benefit system, and are required to pay a greater share of taxes (they pay both the employee and employee portions of FICA taxes), they experience greater financial insecurity than similarly situated workers who are traditionally employed. While a traditional economist might argue that the self-employed price the additional costs they face into their fees, I believe the self-employed lack sufficient market information and bargaining power to do so, and take home less income than similarly situated employees.

To test this hypothesis, I compare the self-employed and traditionally employed within a single data set (the Annual Social and Economic Supplement of the Current Population Survey), which collects more granular information about work and supplementary income than most other public data sets, as well as detailed information about income sources, health expenditures, and tax expenditures.

First, I compare the self-employed and employed at the national level. Then, I compare the self-employed and employed who hold occupations in Arts & Design, because this occupation category includes the largest portion of self-employed workers. Looking at differences among self-employed and employed workers in the same occupation will help us begin to understand whether worker classification can help explain differences in overall financial security.


Demographics


Researchers categorize the self-employed in two ways, incorporated self-employed and unincorporated self-employed. Incorporated self-employed individuals are those who have organized themselves as a business, perhaps as a limited liability corporation (LLC). Unincorporated self-employed individuals earn income via 1099 contract work, for example as a sole proprietorship, but are not organized into a formal business entity.

The two groups of self-employed individuals differ meaningfully from each other, both in underlying demographics and overall financial security. By and large, the incorporated self-employed are more financially secure than the average worker, while the unincorporated self-employed are meaningfully less secure.

Overall, the self-employed are are slightly older than average (median age of 49 and 48, compared to 42), slightly less likely to be native to the United States, and less likely to be a member of a union (0% vs. 1-6%).



Gender


While the total workforce is slightly more male than female (52% vs. 48%), both the incorporated and unincorporated self-employed are more heavily male than other worker types. 66% of incorporated self-employed workers are men, while 59% of unincorporated self-employed workers are men.



Education


The incorporated self-employed differ meaningfully from the unincorporated self-employed when it comes to education level. 50% of the incorporated self-employed graduated from college, compared to 40% of the total workforce. On the other hand, 35% percent of the unincorporated self-employed are college graduates.



Race and Ethnicity


When it comes to race and ethnicity, the self-employed (both incorporated and unincorporated) are much more likely to be white (83% and 82% respectively) than the total workforce (77%). They are also less likely to be Black (8% and 6% vs. 11%). While the unincorporated self-employed are Hispanic at about the same rates as all workers (22%), incorporated self-employed workers are less likely to be Hispanic (15%).




Financial Security


The differences between the incorporated self-employed and unincorporated self-employed become even more apparent when examining indicators of financial security, such as household income, personal income, poverty rates, and access to social protections.



Income


Median personal and household income for unincorporated self-employed workers are both significantly lower than median incomes for the workforce as a whole, with unincorporated self-employed workers earning an average of $41,350/year, compared with the national average of $52,340.

Meanwhile, the incorporated self-employed earn much more than the average worker, with a median personal income of $75,336, higher than any other worker class.

It’s perhaps unsurprising, then, that the unincorporated self-employed would be twice as likely as the total workforce to live below the poverty line (10% vs. 5%), while fewer incorporated self-employed workers (3%) have personal income below the poverty line.



Social Protections


Financial security extends beyond income, including access to social protections. While the incorporated self-employed have health insurance at nearly the same rates as the total workforce (90% vs. 91%), the unincorporated self-employed experience lower levels of health insurance coverage than any other worker group, at 84% coverage. It’s unsurprising that the self-employed are less likely to have health insurance coverage, given the employer-based health insurance system that dominates the United States.

The unincorporated self-employed are also far less likely to contribute to a retirement savings account. Only 12% of unincorporated self-employed workers contributed to a retirement savings account last year, compared to 35% of the total workforce. The incorporated self-employed also contributed at lower rates (28%), but not nearly as low as the unincorporated self-employed. Again, given that employment-based benefits are the norm in the United States, and that the self-employed lack access to infrastructure of automatic enrollment and contributions through payroll, this difference in retirement savings activity between self-employed and employed workers is understandable.



Health Coverage


Among the self-employed who do have health insurance, the source of that coverage differs meaningfully from employed workers. Unincorporated and incorporated self-employed workers are more likely than employees to have public coverage (32% and 23% vs. 18%) or private coverage (38% and 24% vs. 22%), and much less likely to have employer-provided coverage (39% and 51% vs. 69%).

The unincorporated self-employed are far more likely to rely on public or private coverage than incorporated self-employed workers, who access employer-provided coverage at higher rates, potentially through a partner or other family member. Unincorporated self-employed workers also receive Medicaid at higher rates of 16%, compared to 11% of total workers and 9% of the incorporated self-employed.



Arts & Design Workers


Overall, the data demonstrates that unincorporated self-employed workers have less financial security, as measured by both income and access to social protections, than employed workers. However, these differences might be the result of differences in occupations and industries where these individuals tend to work, and not their classification.

To better understand the extent to which worker classification drives financial insecurity, we took a closer look at all workers in Arts & Design occupations, which is the occupation category with the highest proportion of unincorporated self-employed workers.

Within Arts and Design occupations, some demographic differences among worker classes, for example gender and age, became less pronounced. Other differences, such as education level and unionization rates, persisted within Arts and Design occupations.


Demographics in the Arts


Within Arts and Design occupations, the unincorporated self-employed are still slightly more male than all Arts Workers (50% vs. 47%), but the differences are not nearly as large among worker classifications. Overall, Arts Workers are slightly less male than all workers, of whom 52% are male.



Within Arts and Design occupations, the education gap between unincorporated self-employed individuals and employed individuals persists. While 56.4% of unincorporated self-employed individuals have a college degree, 62.5% of all Arts and Design Workers completed college. Overall, Arts and Design workers are more likely to have a college degree than all workers, of whom 39.7% have a college degree.



Racial and ethnic differences among worker classifications are much smaller within Arts and Design occupations, though they persist to a lesser degree. For example, the self employed are slightly more white (81% and 80% compared to 78%). Unlike among all occupations, the incorporated self-employed are slightly more Black (11% vs. 8%). However, given the relatively small differences between the self-employed and employed workers, as well as a relatively small sample size, it’s difficult to make any strong assertions about racial or ethnic differences between worker classifications within Arts and Design occupations.



Financial Security in the Arts


The personal and household income differentials among worker classifications persist within Arts and Design Occupations. For example, the unincorporated self-employed earn less in personal and household income than employees in Arts and Design occupations, and are much more likely to live below the poverty line (11% vs. 6%). More unincorporated self-employed arts workers are on public assistance (0.28% vs. 0.07%), and neither type of self-employed arts worker received any form of unemployment compensation.



Differences in income persist and even widen within Arts and Design occupations, compared to all occupations. Among Arts and Design workers, the median personal income of unincorporated self-employed is $38,899, compared to $55,996 among all Arts workers. In this, the unincorporated self-employed actually earn less than unincorporated self-employed workers in all occupations ($41,351), despite the fact that total Arts and Design workers earn slightly more, on average, than all workers in all occupations ($52,340).



Looking at social protections, arts and design workers are insured at relatively high rates (92.8% of all Arts & Design workers vs.90.5% of all workers), and the differentials are not as stark among worker classifications. However, the differences in retirement contributions persisted withing Arts and Design occupations, as considerably fewer unincorporated self-employed arts workers contributed to a retirement account last year (14% vs. 31% of all Arts workers and 34.8% of all workers).



Many of the health coverage trends observed among all occupations persisted within Arts and Design occupations. Though the self-employed hold similar coverage levels, the source of that coverage differs among worker classes.



Among arts workers, the incorporated self-employed are slightly less likely to have public coverage (17%) than all arts workers (20%), reflecting the relatively higher income levels. However, fully 39% of unincorporated self-employed workers have public coverage, and 20% are on Medicaid, double the portion of all Arts workers on Medicaid (10%). Meanwhile, more incorporated self-employed workers purchase health insurance directly (30%) or through the ACA marketplace (14%), than either all Arts workers (14% direct, 7% marketplace) or unincorporated self-employed (20% direct, 11% marketplace).

These differences can largely be explained by differential access to employer sponsored health insurance, which 75% of private sector arts workers have, and the differences in income levels between incorporated and unincorporated self-employed arts workers. Lower income unincorporated arts workers seem to rely more on public coverage and Medicaid, while higher income incorporated self-employed arts workers are more likely to purchase coverage directly or obtain employment coverage through a spouse or family member.


Conclusion


The self-employed are not a monolith - the experiences of incorporated and unincorporated self-employed workers differ greatly. Based on this analysis, incorporated self-employed workers seem to fit one narrative of independent work - that of highly educated, well-compensated professionals, who have more means to purchase health insurance and manage the challenges of operating outside the employer-based benefit system.

Meanwhile, unincorporated self-employed workers fit into a different narrative - that of the relatively insecure gig worker who experiences greater precarity. Unincorporated self-employed workers earn less income, rely more on public assistance and benefits, and have lower levels of social protection, even relative to others who share their occupation. When considering new programs and benefits, policymakers should focus their efforts on building a social safety net that improves financial security for the unincorporated self-employed.


Methods


All analysis based on the 2024 Annual Social and Economic Supplement to the Current Population Survey, both person and household records.

Worker classification based on the primary job of all persons. Analysis excludes those working without pay and those outside the civilian workforce such as children and individuals in the armed services. Government classification category combines federal, state, and local government workers. Private classification category combines for-profit and non-profit private workers.

CPS questionnaire only allows respondents to choose Male or Female, so gender analysis excludes other gender identities. College graduates includes all persons with a bachelors degree or above. Hispanic includes any person of any race who identified as Hispanic. All other racial groups include only individuals who identified as that race alone. All individuals who identified as more than one race included in “Other”. US Citizen includes individuals who are native and born in US, born in PR or US outlying area, and born abroad of US parent(s).

While all reported data was based on at least 100 observations, the total sample size was relatively small (70,857 observations for the total workforce, 1,454 observations for those with Arts and Design occupations). Figures presented have not been subjected to tests for statistical significance or correlation.


Next Steps


  • Ascertain whether this analysis aligns with that derived from other common measures of the US economy and workforce, such as the American Communities Survey. Conducting parallel analysis, for example of health insurance coverage by worker classification, will demonstrate the extent to which this analysis is reliable.

  • Expand this analysis with complementary data from other sources that capture additional information about the financial security of unincorporated and incorporated self-employed workers. Additional data sources will help test these findings as well as supplement them with other indicators of financial security not included in this data set, such as access to childcare, cost of childcare, access to paid leave, and other social protections. Much of this data is available in the Survey of Income and Program Participation (SIPP) data set. I also intend to explore the Gig Economy Data Hub for additional sources of information.

  • Extend this analysis back in time, to explore longer-term trends and the extent to which the conditions identified in this study have changed.

LS0tCnRpdGxlOiAiRmluYW5jaWFsIFNlY3VyaXR5IEFtb25nIHRoZSBTZWxmLUVtcGxveWVkIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB5ZXRpCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3IgcGFja2FnZXMsIGluY2x1ZGU9RkFMU0V9CgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnY2hhcnRzKQpsaWJyYXJ5KGdnYmxhbmtldCkgCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoRFQpIApsaWJyYXJ5KHRpZHlyKQoKcmF3X2Nwc19oaHB1YiA8LSByZWFkX2NzdigiZGF0YS9yYXcvYXNlY3B1YjI0Y3N2L2hocHViMjQuY3N2IikgCnJhd19jcHNfcHBwdWIgPC0gcmVhZF9jc3YoImRhdGEvcmF3L2FzZWNwdWIyNGNzdi9wcHB1YjI0LmNzdiIpCgpzZWxmX2VtcGxveWVkX2NwcyA8LSByYXdfY3BzX3BwcHViICU+JSAKICBsZWZ0X2pvaW4oCiAgICByYXdfY3BzX2hocHViICU+JSBzZWxlY3QoSF9TRVEsIEhUT1RWQUwsIEhISU5DLCBIUENUQ1VUKSwKICAgIGJ5ID0gYygiUEhfU0VRIiA9ICJIX1NFUSIpKSAlPiUKICBzZWxlY3QoUEVSSUROVU0sIFBIX1NFUSwKICAgICAgICAgQV9DSVZMRiwgUEVJTzFDT1csCiAgICAgICAgIEhISU5DLCBIUENUQ1VULCBIVE9UVkFMLCBQVE9UVkFMLCBQRUFSTlZBTCwgUFRPVF9SLAogICAgICAgICBBX0RUSU5ELCBBX0RUT0NDLAogICAgICAgICBDT1YsIFBVQiwgUFJJVl9DWVIsIEdSUCwgSElQQUlELCBESVIsIE1SSywgTUNBSUQsIE1PT1AsCiAgICAgICAgIFJFVENCX1ZBTCwgU1VCVUMsIFBBV19ZTiwgRklDQSwgUEVSTElTLAogICAgICAgICBBX1VOTUVNLCBBX0FHRSwgQV9FTlJMVywgQV9IR0EsIEFfTUFSSVRMLCBBX1NFWCwgUEVIU1BOT04sIFBSQ0lUU0hQLCBQUkRUUkFDRSkgJT4lCiAgZmlsdGVyKEFfQ0lWTEYgIT0gMCwKICAgICAgICAgUEVJTzFDT1cgIT0gMCkgJT4lCiAgcmVuYW1lKGxhYm9yX2ZvcmNlID0gQV9DSVZMRiwKICAgICAgICAgd3Jrcl9jbGFzcyA9IFBFSU8xQ09XLAogICAgICAgICBoaGkgPSBIVE9UVkFMLAogICAgICAgICBoaGlfcGN0ID0gSFBDVENVVCwKICAgICAgICAgaGhpX2JpbnMgPSBISElOQywKICAgICAgICAgaW5kdXN0cnkgPSBBX0RUSU5ELAogICAgICAgICBvY2N1cGF0aW9uID0gQV9EVE9DQywKICAgICAgICAgdG90X2luY29tZSA9IFBUT1RWQUwsCiAgICAgICAgIHRvdF9pbmNvbWVfY2F0ID0gUFRPVF9SLAogICAgICAgICB0b3RfZWFybmluZ3MgPSBQRUFSTlZBTCwKICAgICAgICAgaGlfY292ID0gQ09WLAogICAgICAgICBwdWJfY292ID0gUFVCLCAKICAgICAgICAgcHJpX2NvdiA9IFBSSVZfQ1lSLAogICAgICAgICBlbXBsX2NvdiA9IEdSUCwKICAgICAgICAgZGlyX2NvdiA9IERJUiwKICAgICAgICAgbXRrcF9jb3YgPSBNUkssCiAgICAgICAgIG1lZGljYWlkID0gTUNBSUQsCiAgICAgICAgIHJldF9jb250ID0gUkVUQ0JfVkFMLAogICAgICAgICB1bmVtcCA9IFNVQlVDLAogICAgICAgICBwdWJsaWNfYXNzaXN0ID0gUEFXX1lOLAogICAgICAgICBwb3ZlcnR5ID0gUEVSTElTLAogICAgICAgICBmaWNhX3RheCA9IEZJQ0EsCiAgICAgICAgIHVuaW9uID0gQV9VTk1FTSwKICAgICAgICAgYWdlID0gQV9BR0UsCiAgICAgICAgIGVkdV9hdHRhaW4gPSBBX0hHQSwKICAgICAgICAgbWFyaXRhbCA9IEFfTUFSSVRMLAogICAgICAgICBzZXggPSBBX1NFWCwKICAgICAgICAgaGlzcGFuaWMgPSBQRUhTUE5PTiwKICAgICAgICAgbmF0aXZlX2Jvcm4gPSBQUkNJVFNIUCwKICAgICAgICAgcmFjZSA9IFBSRFRSQUNFKSAgJT4lIAogIG11dGF0ZSgKICAgIHdya3JfY2xhc3NfbGFiZWwgPSBjYXNlX3doZW4oCiAgICAgIHdya3JfY2xhc3MgPT0gMCB+ICJOSVUiLAogICAgICB3cmtyX2NsYXNzICVpbiUgYygxLCAyLCAzKSB+ICJHb3Zlcm5tZW50IiwKICAgICAgd3Jrcl9jbGFzcyAlaW4lIGMoNCwgNSkgfiAiUHJpdmF0ZSIsCiAgICAgIHdya3JfY2xhc3MgPT0gNiB+ICJTZWxmLUVtcGxveWVkIChJbmNvcnBvcmF0ZWQpIiwKICAgICAgd3Jrcl9jbGFzcyA9PSA3IH4gIlNlbGYtRW1wbG95ZWQgKFVuaW5jb3Jwb3JhdGVkKSIsCiAgICAgIHdya3JfY2xhc3MgPT0gOCB+ICJXaXRob3V0LXBheSIsCiAgICAgIFRSVUUgfiAiVW5rbm93biIpLAogICAgZ292ZXJubWVudF9zZWN0b3IgPSBjYXNlX3doZW4oCiAgICAgIHdya3JfY2xhc3MgPT0gMSB+ICJHb3Zlcm5tZW50LWZlZGVyYWwiLAogICAgICB3cmtyX2NsYXNzID09IDIgfiAiR292ZXJubWVudC1zdGF0ZSIsCiAgICAgIHdya3JfY2xhc3MgPT0gMyB+ICJHb3Zlcm5tZW50LWxvY2FsIiwKICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgcHJpdmF0ZV9zZWN0b3IgPSBjYXNlX3doZW4oCiAgICAgIHdya3JfY2xhc3MgPT0gNCB+ICJQcml2YXRlLWZvci1wcm9maXQiLAogICAgICB3cmtyX2NsYXNzID09IDUgfiAiUHJpdmF0ZS1ub25wcm9maXQiLAogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICBjb2xsZWdlID0gaWZlbHNlKGVkdV9hdHRhaW4gJWluJSBjKDQzLCA0NCwgNDUsIDQ2KSwgMSwgMCksCiAgICB1c19ib3JuID0gaWZlbHNlKG5hdGl2ZV9ib3JuICVpbiUgYygxLCAyLCAzKSwgMSwgMCksCiAgICB3aGl0ZV9hbG9uZSA9IGlmZWxzZShyYWNlID09IDEsIDEsIDApLAogICAgYmxhY2tfYWxvbmUgPSBpZmVsc2UocmFjZSA9PSAyLCAxLCAwKSwKICAgIGFzaWFuX2Fsb25lID0gaWZlbHNlKHJhY2UgPT0gNCwgMSwgMCksCiAgICBhbWVyaWNhbl9pbmRpYW5fYWxvbmUgPSBpZmVsc2UocmFjZSA9PSAzLCAxLCAwKSwKICAgIGhhd2FpaWFuX3BhY2lmaWNfaXNsYW5kZXJfYWxvbmUgPSBpZmVsc2UocmFjZSA9PSA1LCAxLCAwKSwKICAgIG90aGVyX3JhY2UgPSBpZmVsc2UocmFjZSA+PSA2LCAxLCAwKSwKICAgIHRvdGFsX2hlYWx0aF9jb3N0cyA9IGlmZWxzZShpcy5uYShNT09QKSwgMCwgTU9PUCksCiAgICBwY3RfaGVhbHRoX2Nvc3RzID0gdG90YWxfaGVhbHRoX2Nvc3RzIC90b3RfaW5jb21lLAogICAgcGN0X2ZpY2EgPSBmaWNhX3RheCAvIHRvdF9pbmNvbWUpICU+JSAKICBmaWx0ZXIod3Jrcl9jbGFzcyE9OCkKYGBgCjxicj4KQnkgQWx0aGVhIEVyaWNrc29uCjwvYnI+CjwvYnI+CgojIyBQdXJwb3NlCgpUaGUgZ29hbCBvZiB0aGlzIHJlc2VhcmNoIGlzICB0byB1bmRlcnN0YW5kIG92ZXJhbGwgZmluYW5jaWFsIHNlY3VyaXR5IGFtb25nIHRoZSBzZWxmLWVtcGxveWVkLCBjb21wYXJlZCB3aXRoIHRob3NlIHdvcmtpbmcgd2l0aGluIHRyYWRpdGlvbmFsIGVtcGxveW1lbnQgbW9kZWxzLiBJIGhvcGUgdGhpcyByZXNlYXJjaCB3aWxsIGhlbHAgaWRlbnRpZnkgY2hhbGxlbmdlcyB0aGF0IGFyZSB1bmlxdWUgdG8gc2VsZi1lbXBsb3llZCB3b3JrZXJzLCBhbmQgaW5mb3JtIHRoZSBkZXZlbG9wbWVudCBvZiBwb2xpY3kgaW50ZXJ2ZW50aW9ucyB0byBhZGRyZXNzIHRob3NlIGNoYWxsZW5nZXMuCgo8L2JyPgoKIyMgSW50cm9kdWN0aW9uIAoKRGF0YSBhYm91dCB0aGUgc2VsZi1lbXBsb3llZCBpcyBbbm90b3Jpb3VzbHkgaW5jb25zaXN0ZW50IGFuZCBpbmNvbXBsZXRlXShodHRwczovL3d3dy5naWdlY29ub215ZGF0YS5vcmcvYmFzaWNzL2hvdy1tYW55LWdpZy13b3JrZXJzLWFyZS10aGVyZSl7dGFyZ2V0PSJfYmxhbmsifSwgcmVzdWx0aW5nIGluIHdpbGRseSBbZGlmZmVyZW50IGVzdGltYXRlc10oaHR0cHM6Ly93d3cuYW1lcmljYW5wcm9ncmVzcy5vcmcvYXJ0aWNsZS91bmRlcnN0YW5kaW5nLXRoZS1zZWxmLWVtcGxveWVkLWluLXRoZS11bml0ZWQtc3RhdGVzLyl7dGFyZ2V0PSJfYmxhbmsifSBvZiB0aGUgc2l6ZSBhbmQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB3b3JrZm9yY2UsICByYW5naW5nIGZyb20gMTYuNCBtaWxsaW9uIHRvIDcyLjcgbWlsbGlvbiB3b3JrZXJzLiBUaGVzZSBkaXNjcmVwYW5jaWVzIGFyaXNlIGZyb20gZGlmZmVyZW5jZXMgaW4gcmVzZWFyY2ggbWV0aG9kb2xvZ2llcywgcGFydGljdWxhcmx5IGRpZmZlcmVuY2VzIGluIGRlZmluaXRpb25zIG9mIHNlbGYtZW1wbG95bWVudCBhbmQgdGhlIHdvcmRpbmcgb2YgcXVlc3Rpb25zIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFib3V0IGluZGl2aWR1YWwgd29yayBhcnJhbmdlbWVudHMuIFRoZSByZXN1bHQgb2YgdGhlc2UgbWV0aG9kb2xvZ2ljYWwgZGlzY3JlcGFuY2llcyBpcyBicm9hZCBkaXNhZ3JlZW1lbnQgYWJvdXQgdGhlIG5hdHVyZSBvZiBpbmRlcGVuZGVudCB3b3JrLiBJcyBpdCBtb3N0bHkgbG93LXdhZ2UsIG1pc2NsYXNzaWZpZWQgZ2lnIHdvcmtlcnM/IEhpZ2hseSBlZHVjYXRlZCBhbmQgaGlnaGx5IHBhaWQgcHJvZmVzc2lvbmFscz8gVGhlIGRhdGEgaXMgaW5jb25jbHVzaXZlLiAKCkRhdGEgY2hhbGxlbmdlcyBoYXZlIHRod2FydGVkIG1hbnkgZWZmb3J0cyB0byB1bmRlcnN0YW5kIHRoZSBjaXJjdW1zdGFuY2VzIG9mIGluZGVwZW5kZW50IHdvcmtlcnMuIEluIHBhcnQgZHVlIHRvIHRoaXMgbGFjayBvZiBkYXRhLCB0aGV5IGFyZSBvZnRlbiBvdmVybG9va2VkIGluIHBvbGljeSBkZWJhdGVzIGFib3V0IHNvY2lhbCBwcm90ZWN0aW9ucywgYW5kIGZyZXF1ZW50bHkgZXhjbHVkZWQgZnJvbSB0aGUgcHJvZ3JhbXMgdGhlbXNlbHZlcy4gSW4gb3JkZXIgdG8gYnJpbmcgc2VsZi1lbXBsb3llZCBpbmRpdmlkdWFscyBiYWNrIGludG8gdGhlIHB1YmxpYyBkZWJhdGUgYWJvdXQgZmluYW5jaWFsIHNlY3VyaXR5IGFuZCBzb2NpYWwgcHJvdGVjdGlvbnMsIHdlIG5lZWQgYmV0dGVyIGRhdGEgb24gdGhlaXIgb3ZlcmFsbCBmaW5hbmNpYWwgc2VjdXJpdHkgY29tcGFyZWQgdG8gb3RoZXIgcG9wdWxhdGlvbnMuIAoKSSBoeXBvdGhlc2l6ZSB0aGF0IGdpdmVuIGluZGVwZW5kZW50IHdvcmtlcnMgb3BlcmF0ZSBsYXJnZWx5IG91dHNpZGUgdGhlIGVtcGxveWVyLWJhc2VkIGJlbmVmaXQgc3lzdGVtLCBhbmQgYXJlIHJlcXVpcmVkIHRvIHBheSBhIGdyZWF0ZXIgc2hhcmUgb2YgdGF4ZXMgKHRoZXkgcGF5IGJvdGggdGhlIGVtcGxveWVlIGFuZCBlbXBsb3llZSBwb3J0aW9ucyBvZiBGSUNBIHRheGVzKSwgdGhleSBleHBlcmllbmNlIGdyZWF0ZXIgZmluYW5jaWFsIGluc2VjdXJpdHkgdGhhbiBzaW1pbGFybHkgc2l0dWF0ZWQgd29ya2VycyB3aG8gYXJlIHRyYWRpdGlvbmFsbHkgZW1wbG95ZWQuIFdoaWxlIGEgdHJhZGl0aW9uYWwgZWNvbm9taXN0IG1pZ2h0IGFyZ3VlIHRoYXQgdGhlIHNlbGYtZW1wbG95ZWQgcHJpY2UgdGhlIGFkZGl0aW9uYWwgY29zdHMgdGhleSBmYWNlIGludG8gdGhlaXIgZmVlcywgSSBiZWxpZXZlIHRoZSBzZWxmLWVtcGxveWVkIGxhY2sgc3VmZmljaWVudCBtYXJrZXQgaW5mb3JtYXRpb24gYW5kIGJhcmdhaW5pbmcgcG93ZXIgdG8gZG8gc28sIGFuZCB0YWtlIGhvbWUgbGVzcyBpbmNvbWUgdGhhbiBzaW1pbGFybHkgc2l0dWF0ZWQgZW1wbG95ZWVzLiAKClRvIHRlc3QgdGhpcyBoeXBvdGhlc2lzLCBJIGNvbXBhcmUgdGhlIHNlbGYtZW1wbG95ZWQgYW5kIHRyYWRpdGlvbmFsbHkgZW1wbG95ZWQgd2l0aGluIGEgc2luZ2xlIGRhdGEgc2V0ICh0aGUgW0FubnVhbCBTb2NpYWwgYW5kIEVjb25vbWljIFN1cHBsZW1lbnRdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS9kYXRhc2V0cy90aW1lLXNlcmllcy9kZW1vL2Nwcy9jcHMtYXNlYy5odG1sKSBvZiB0aGUgW0N1cnJlbnQgUG9wdWxhdGlvbiBTdXJ2ZXldKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9jcHMuaHRtbCkpLCB3aGljaCBjb2xsZWN0cyBtb3JlIGdyYW51bGFyIGluZm9ybWF0aW9uIGFib3V0IHdvcmsgYW5kIHN1cHBsZW1lbnRhcnkgaW5jb21lIHRoYW4gbW9zdCBvdGhlciBwdWJsaWMgZGF0YSBzZXRzLCBhcyB3ZWxsIGFzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGluY29tZSBzb3VyY2VzLCBoZWFsdGggZXhwZW5kaXR1cmVzLCBhbmQgdGF4IGV4cGVuZGl0dXJlcy4gCgpGaXJzdCwgSSBjb21wYXJlIHRoZSBzZWxmLWVtcGxveWVkIGFuZCBlbXBsb3llZCBhdCB0aGUgbmF0aW9uYWwgbGV2ZWwuIFRoZW4sIEkgY29tcGFyZSB0aGUgc2VsZi1lbXBsb3llZCBhbmQgZW1wbG95ZWQgd2hvIGhvbGQgb2NjdXBhdGlvbnMgaW4gQXJ0cyAmIERlc2lnbiwgYmVjYXVzZSB0aGlzIG9jY3VwYXRpb24gY2F0ZWdvcnkgaW5jbHVkZXMgdGhlIGxhcmdlc3QgcG9ydGlvbiBvZiBzZWxmLWVtcGxveWVkIHdvcmtlcnMuIExvb2tpbmcgYXQgZGlmZmVyZW5jZXMgYW1vbmcgc2VsZi1lbXBsb3llZCBhbmQgZW1wbG95ZWQgd29ya2VycyBpbiB0aGUgc2FtZSBvY2N1cGF0aW9uIHdpbGwgaGVscCB1cyBiZWdpbiB0byB1bmRlcnN0YW5kIHdoZXRoZXIgd29ya2VyIGNsYXNzaWZpY2F0aW9uIGNhbiBoZWxwIGV4cGxhaW4gZGlmZmVyZW5jZXMgaW4gb3ZlcmFsbCBmaW5hbmNpYWwgc2VjdXJpdHkuIAoKPC9icj4KCiMjIERlbW9ncmFwaGljcwoKPGJyPgoKUmVzZWFyY2hlcnMgY2F0ZWdvcml6ZSB0aGUgc2VsZi1lbXBsb3llZCBpbiB0d28gd2F5cywgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYW5kIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQuIEluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGluZGl2aWR1YWxzIGFyZSB0aG9zZSB3aG8gaGF2ZSBvcmdhbml6ZWQgdGhlbXNlbHZlcyBhcyBhIGJ1c2luZXNzLCBwZXJoYXBzIGFzIGEgbGltaXRlZCBsaWFiaWxpdHkgY29ycG9yYXRpb24gKExMQykuIFVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgaW5kaXZpZHVhbHMgZWFybiBpbmNvbWUgdmlhIDEwOTkgY29udHJhY3Qgd29yaywgZm9yIGV4YW1wbGUgYXMgYSBzb2xlIHByb3ByaWV0b3JzaGlwLCBidXQgYXJlIG5vdCBvcmdhbml6ZWQgaW50byBhIGZvcm1hbCBidXNpbmVzcyBlbnRpdHkuIAoKVGhlIHR3byBncm91cHMgb2Ygc2VsZi1lbXBsb3llZCBpbmRpdmlkdWFscyBkaWZmZXIgbWVhbmluZ2Z1bGx5IGZyb20gZWFjaCBvdGhlciwgYm90aCBpbiB1bmRlcmx5aW5nIGRlbW9ncmFwaGljcyBhbmQgb3ZlcmFsbCBmaW5hbmNpYWwgc2VjdXJpdHkuIEJ5IGFuZCBsYXJnZSwgdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFyZSBtb3JlIGZpbmFuY2lhbGx5IHNlY3VyZSB0aGFuIHRoZSBhdmVyYWdlIHdvcmtlciwgd2hpbGUgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIG1lYW5pbmdmdWxseSBsZXNzIHNlY3VyZS4gCgpPdmVyYWxsLCB0aGUgc2VsZi1lbXBsb3llZCBhcmUgYXJlIHNsaWdodGx5IG9sZGVyIHRoYW4gYXZlcmFnZSAobWVkaWFuIGFnZSBvZiA0OSBhbmQgNDgsIGNvbXBhcmVkIHRvIDQyKSwgc2xpZ2h0bHkgbGVzcyBsaWtlbHkgdG8gYmUgbmF0aXZlIHRvIHRoZSBVbml0ZWQgU3RhdGVzLCBhbmQgbGVzcyBsaWtlbHkgdG8gYmUgYSBtZW1iZXIgb2YgYSB1bmlvbiAoMCUgdnMuIDEtNiUpLiAKCjxicj4KCmBgYHtyIERlbW9ncmFwaGljIHRhYmxlLCBlY2hvPUZBTFNFfQoKdG90YWxfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBwY3RfbWFsZSA9IHBhc3RlMChyb3VuZChtZWFuKHNleCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2NvbGxlZ2UgPSBwYXN0ZTAocm91bmQobWVhbihjb2xsZWdlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdW5pb25fbWVtID0gcGFzdGUwKHJvdW5kKG1lYW4odW5pb24gPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICB1c19ib3JuX3JhdGUgPSBwYXN0ZTAocm91bmQobWVhbih1c19ib3JuID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lICAKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUgIAogIHN1bW1hcml6ZSgKICAgIHBjdF9tYWxlID0gcGFzdGUwKHJvdW5kKG1lYW4oc2V4ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLCAgICAKICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2NvbGxlZ2UgPSBwYXN0ZTAocm91bmQobWVhbihjb2xsZWdlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdW5pb25fbWVtID0gcGFzdGUwKHJvdW5kKG1lYW4odW5pb24gPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICB1c19ib3JuX3JhdGUgPSBwYXN0ZTAocm91bmQobWVhbih1c19ib3JuID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfZGVtb3MgPC0gYmluZF9yb3dzKHRvdGFsX2RlbW9zLCBzZV9kZW1vcykKCmRhdGF0YWJsZSgKICBzZV9kZW1vcywKICBjb2xuYW1lcyA9IGMoIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJNYWxlIiwgIk1lZGlhbiBBZ2UiLCAiQ29sbGVnZSBHcmFkIiwgIlVuaW9uIE1lbWJlciIsICJVUyBDaXRpemVuIiksCiAgb3B0aW9ucyA9IGxpc3QoCiAgICBwYWdpbmcgPSBGQUxTRSwKICAgIHNlYXJjaGluZyA9IEZBTFNFLCAKICAgIGluZm8gPSBGQUxTRSwgCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwgCiAgICBkb20gPSAndCcpLAogIGVzY2FwZSA9IEZBTFNFLCAKICByb3duYW1lcyA9IEZBTFNFKQoKYGBgCjwvYnI+CgoKIyMjIEdlbmRlcgo8YnI+CldoaWxlIHRoZSB0b3RhbCB3b3JrZm9yY2UgaXMgc2xpZ2h0bHkgbW9yZSBtYWxlIHRoYW4gZmVtYWxlICg1MiUgdnMuIDQ4JSksIGJvdGggdGhlIGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgbW9yZSBoZWF2aWx5IG1hbGUgdGhhbiBvdGhlciB3b3JrZXIgdHlwZXMuIDY2JSBvZiBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGFyZSBtZW4sIHdoaWxlIDU5JSBvZiB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIG1lbi4gCgo8L2JyPgoKYGBge3IgR2VuZGVyIHZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0V9Cgp0b3RhbF9kZW1vcyA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBzdW1tYXJpemUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIiwKICAgIHBjdF9tYWxlID0gbWVhbihzZXggPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwKICAgIHBjdF9mZW1hbGUgPSBtZWFuKHNleCA9PSAyLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lCiAgc3VtbWFyaXplKAogICAgcGN0X21hbGUgPSBtZWFuKHNleCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLAogICAgcGN0X2ZlbWFsZSA9IG1lYW4oc2V4ID09IDIsIG5hLnJtID0gVFJVRSkgKiAxMDApCgpzZV9kZW1vcyA8LSBiaW5kX3Jvd3ModG90YWxfZGVtb3MsIHNlX2RlbW9zKQoKc2VfZGVtb3NfbG9uZyA8LSBzZV9kZW1vcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhwY3RfbWFsZSwgcGN0X2ZlbWFsZSksCiAgICBuYW1lc190byA9ICJnZW5kZXIiLAogICAgdmFsdWVzX3RvID0gInBlcmNlbnRhZ2UiKSAlPiUKICBtdXRhdGUoCiAgICBnZW5kZXIgPSByZWNvZGUoZ2VuZGVyLCBwY3RfbWFsZSA9ICJNYWxlIiwgcGN0X2ZlbWFsZSA9ICJGZW1hbGUiKSwKICAgIHdya3JfY2xhc3NfbGFiZWwgPSBmYWN0b3IoCiAgICAgIHdya3JfY2xhc3NfbGFiZWwsCiAgICAgIGxldmVscyA9IGMoCiAgICAgICAgIlRvdGFsIiwKICAgICAgICB1bmlxdWUoc2VfZGVtb3Mkd3Jrcl9jbGFzc19sYWJlbFtzZV9kZW1vcyR3cmtyX2NsYXNzX2xhYmVsICE9ICJUb3RhbCJdKSkpKQoKZ2VuZGVyX3Bsb3QgPC0gZ2dwbG90KHNlX2RlbW9zX2xvbmcsIGFlcygKICB4ID0gd3Jrcl9jbGFzc19sYWJlbCwKICB5ID0gcGVyY2VudGFnZSwKICBmaWxsID0gZ2VuZGVyLAogIHRleHQgPSBwYXN0ZTAoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uOiAiLCB3cmtyX2NsYXNzX2xhYmVsLCAiPGJyPiIsCiAgICAiR2VuZGVyOiAiLCBnZW5kZXIsICI8YnI+IiwKICAgICJQZXJjZW50YWdlOiAiLCByb3VuZChwZXJjZW50YWdlKSwgIiUiICMgRml4ZWQgdG9vbHRpcCBmb3JtYXR0aW5nCiAgKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTWFsZSIgPSAiI2RkYzA1NyIsICJGZW1hbGUiID0gIiM0NDg1YWYiKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJHZW5kZXIgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIiwKICAgIGZpbGwgPSAiR2VuZGVyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgppbnRlcmFjdGl2ZV9nZW5kZXJfcGxvdCA8LSBnZ3Bsb3RseShnZW5kZXJfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgbGF5b3V0KAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiR2VuZGVyIiksCiAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIikpCgppbnRlcmFjdGl2ZV9nZW5kZXJfcGxvdAoKYGBgCjwvYnI+CgojIyMgRWR1Y2F0aW9uCgo8YnI+CgpUaGUgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgZGlmZmVyIG1lYW5pbmdmdWxseSBmcm9tIHRoZSB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdoZW4gaXQgY29tZXMgdG8gZWR1Y2F0aW9uIGxldmVsLiA1MCUgb2YgdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGdyYWR1YXRlZCBmcm9tIGNvbGxlZ2UsIGNvbXBhcmVkIHRvIDQwJSBvZiB0aGUgdG90YWwgd29ya2ZvcmNlLiBPbiB0aGUgb3RoZXIgaGFuZCwgMzUlIHBlcmNlbnQgb2YgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIGNvbGxlZ2UgZ3JhZHVhdGVzLgoKPGJyPgoKYGBge3IgY29sbGVnZSBncmFkcywgZWNobz1GQUxTRX0KCnRvdGFsX2NvbGxlZ2UgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfY29sbGVnZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKY29sbGVnZV9kYXRhIDwtIGJpbmRfcm93cyh0b3RhbF9jb2xsZWdlLCBzZV9jb2xsZWdlKQoKY29sbGVnZV9kYXRhIDwtIGNvbGxlZ2VfZGF0YSAlPiUKICBtdXRhdGUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gZmFjdG9yKHdya3JfY2xhc3NfbGFiZWwsIGxldmVscyA9IGMoIlRvdGFsIiwgdW5pcXVlKHdya3JfY2xhc3NfbGFiZWxbd3Jrcl9jbGFzc19sYWJlbCAhPSAiVG90YWwiXSkpKSwKICAgIGdyb3VwID0gaWZlbHNlKHdya3JfY2xhc3NfbGFiZWwgPT0gIlRvdGFsIiwgIlRvdGFsIiwgIldvcmtlciBDbGFzcyIpLAogICAgdG9vbHRpcCA9IHBhc3RlMCgiUGVyY2VudCBDb2xsZWdlIEdyYWRzOiAiLCByb3VuZChwY3RfY29sbGVnZSwgMCksICIlIikpCgp0b3RhbF9wY3RfY29sbGVnZSA8LSB0b3RhbF9jb2xsZWdlJHBjdF9jb2xsZWdlCgpjb2xsZWdlX3Bsb3QgPC0gZ2dwbG90KGNvbGxlZ2VfZGF0YSwgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gcGN0X2NvbGxlZ2UsIGZpbGwgPSBncm91cCwgdGV4dCA9IHRvb2x0aXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0b3RhbF9wY3RfY29sbGVnZSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNSkgKyAKICBsYWJzKAogICAgdGl0bGUgPSAiQ29sbGVnZSBHcmFkdWF0ZXMgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRvdGFsIiA9ICIjYWIxZDc5IiwgIldvcmtlciBDbGFzcyIgPSAiI2RkODEyYiIpLAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiR3JvdXAiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoc2NhbGUgPSAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKaW50ZXJhY3RpdmVfY29sbGVnZV9wbG90IDwtIGdncGxvdGx5KGNvbGxlZ2VfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX2NvbGxlZ2VfcGxvdAoKYGBgCgo8L2JyPgoKIyMjIFJhY2UgYW5kIEV0aG5pY2l0eQoKPGJyPgoKV2hlbiBpdCBjb21lcyB0byByYWNlIGFuZCBldGhuaWNpdHksIHRoZSBzZWxmLWVtcGxveWVkIChib3RoIGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQpIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIGJlIHdoaXRlICg4MyUgYW5kIDgyJSByZXNwZWN0aXZlbHkpIHRoYW4gdGhlIHRvdGFsIHdvcmtmb3JjZSAoNzclKS4gVGhleSBhcmUgYWxzbyBsZXNzIGxpa2VseSB0byBiZSBCbGFjayAoOCUgYW5kIDYlIHZzLiAxMSUpLiBXaGlsZSB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgSGlzcGFuaWMgYXQgYWJvdXQgdGhlIHNhbWUgcmF0ZXMgYXMgYWxsIHdvcmtlcnMgKDIyJSksIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIEhpc3BhbmljICgxNSUpLiAKCjxicj4KCmBgYHtyIFJhY2UgdGFibGUsIGVjaG89RkFMU0V9Cgp0b3RhbF9yYWNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JSAgCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsIAogICAgcGN0X3doaXRlID0gcGFzdGUwKHJvdW5kKG1lYW4od2hpdGVfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfYmxhY2sgPSBwYXN0ZTAocm91bmQobWVhbihibGFja19hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9hc2lhbiA9IHBhc3RlMChyb3VuZChtZWFuKGFzaWFuX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2hpc3BhbmljID0gcGFzdGUwKHJvdW5kKG1lYW4oaGlzcGFuaWMgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfaGF3YWlpYW5fcGkgPSBwYXN0ZTAocm91bmQobWVhbihoYXdhaWlhbl9wYWNpZmljX2lzbGFuZGVyX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X25hdGl2ZV9hbSA9IHBhc3RlMChyb3VuZChtZWFuKGFtZXJpY2FuX2luZGlhbl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9vdGhlciA9IHBhc3RlMChyb3VuZChtZWFuKG90aGVyX3JhY2UgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIikpCgpzZV9yYWNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JSAgCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lICAKICBzdW1tYXJpemUoCiAgICBwY3Rfd2hpdGUgPSBwYXN0ZTAocm91bmQobWVhbih3aGl0ZV9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9ibGFjayA9IHBhc3RlMChyb3VuZChtZWFuKGJsYWNrX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2FzaWFuID0gcGFzdGUwKHJvdW5kKG1lYW4oYXNpYW5fYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfaGlzcGFuaWMgPSBwYXN0ZTAocm91bmQobWVhbihoaXNwYW5pYyA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9oYXdhaWlhbl9waSA9IHBhc3RlMChyb3VuZChtZWFuKGhhd2FpaWFuX3BhY2lmaWNfaXNsYW5kZXJfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfbmF0aXZlX2FtID0gcGFzdGUwKHJvdW5kKG1lYW4oYW1lcmljYW5faW5kaWFuX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X290aGVyID0gcGFzdGUwKHJvdW5kKG1lYW4ob3RoZXJfcmFjZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSkKCnNlX3JhY2UgPC0gYmluZF9yb3dzKHRvdGFsX3JhY2UsIHNlX3JhY2UpCgpkYXRhdGFibGUoCiAgc2VfcmFjZSwKICBjb2xuYW1lcyA9IGMoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uIiwgIldoaXRlIiwgIkJsYWNrIiwgIkFzaWFuIiwgIkhpc3BhbmljIiwKICAgICJIYXdhaWlhbi9QSSIsICJOYXRpdmUgQW1lcmljYW4iLCAiT3RoZXIiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLCAgICAgICAgIAogICAgc2VhcmNoaW5nID0gRkFMU0UsICAgICAgCiAgICBpbmZvID0gRkFMU0UsICAgICAgICAgICAKICAgIGxlbmd0aENoYW5nZSA9IEZBTFNFLCAgIAogICAgZG9tID0gJ3QnKSwKICBlc2NhcGUgPSBGQUxTRSwgCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAo8YnI+Cjxicj4KCiMjIEZpbmFuY2lhbCBTZWN1cml0eQoKPGJyPgoKVGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFuZCB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGJlY29tZSBldmVuIG1vcmUgYXBwYXJlbnQgd2hlbiBleGFtaW5pbmcgaW5kaWNhdG9ycyBvZiBmaW5hbmNpYWwgc2VjdXJpdHksIHN1Y2ggYXMgaG91c2Vob2xkIGluY29tZSwgcGVyc29uYWwgaW5jb21lLCBwb3ZlcnR5IHJhdGVzLCBhbmQgYWNjZXNzIHRvIHNvY2lhbCBwcm90ZWN0aW9ucy4gCgo8YnI+CgpgYGB7ciBmaW5hbmNpYWwgc2VjdXJpdHksIGVjaG89RkFMU0V9Cgp0b3RhbF9maW5hbmNpYWxfc2VjdXJpdHkgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsICAKICAgIG1lZF9oaGkgPSBkb2xsYXIobWVkaWFuKGhoaSwgbmEucm0gPSBUUlVFKSksCiAgICBtZWRfaW5jb21lID0gZG9sbGFyKG1lZGlhbih0b3RfaW5jb21lLCBuYS5ybSA9IFRSVUUpKSwKICAgIGNvdW50ID0gbigpLAogICAgcGN0X2JlbG93X3BvdmVydHkgPSBwZXJjZW50KHN1bShwb3ZlcnR5ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF9oaV9jb3YgPSBwZXJjZW50KHN1bShoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X3JldF9jb250ID0gcGVyY2VudChzdW0ocmV0X2NvbnQgPiAwLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfdW5lbXAgPSBwZXJjZW50KHN1bSh1bmVtcCA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gLjAxKSwKICAgIHBjdF9wdWJfYXNzaXN0ID0gcGVyY2VudChzdW0ocHVibGljX2Fzc2lzdCA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gLjAxKSkgJT4lCiAgc2VsZWN0KC1jb3VudCkKCnNlX2ZpbmFuY2lhbF9zZWN1cml0eSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudCA9IG4oKSwKICAgIG1lZF9oaGkgPSBkb2xsYXIobWVkaWFuKGhoaSwgbmEucm0gPSBUUlVFKSksCiAgICBtZWRfaW5jb21lID0gZG9sbGFyKG1lZGlhbih0b3RfaW5jb21lLCBuYS5ybSA9IFRSVUUpKSwKICAgIHBjdF9iZWxvd19wb3ZlcnR5ID0gcGVyY2VudChzdW0ocG92ZXJ0eSA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfaGlfY292ID0gcGVyY2VudChzdW0oaGlfY292ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF9yZXRfY29udCA9IHBlcmNlbnQoc3VtKHJldF9jb250ID4gMCwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X3VuZW1wID0gcGVyY2VudChzdW0odW5lbXAgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IC4wMSksCiAgICBwY3RfcHViX2Fzc2lzdCA9IHBlcmNlbnQoc3VtKHB1YmxpY19hc3Npc3QgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IC4wMSksCiAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBzZWxlY3QoLWNvdW50KQoKc2VfZmluYW5jaWFsX3NlY3VyaXR5IDwtIGJpbmRfcm93cyh0b3RhbF9maW5hbmNpYWxfc2VjdXJpdHksIHNlX2ZpbmFuY2lhbF9zZWN1cml0eSkKCmRhdGF0YWJsZSgKICBzZV9maW5hbmNpYWxfc2VjdXJpdHksCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJNZWRpYW4gSEggSW5jb21lIiwgIk1lZGlhbiBQZXJzb25hbCBJbmNvbWUiLCAiQmVsb3cgUG92ZXJ0eSIsCiAgICAiSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSIsICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiBMYXN0IFllYXIiLCAiVW5lbXBsb3ltZW50IENvbXAiLCAiT24gUHVibGljIEFzc2lzdGFuY2UiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAoKPGJyPgoKIyMjIEluY29tZQoKPGJyPgoKTWVkaWFuIHBlcnNvbmFsIGFuZCBob3VzZWhvbGQgaW5jb21lIGZvciB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIGJvdGggc2lnbmlmaWNhbnRseSBsb3dlciB0aGFuIG1lZGlhbiBpbmNvbWVzIGZvciB0aGUgd29ya2ZvcmNlIGFzIGEgd2hvbGUsIHdpdGggdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGVhcm5pbmcgYW4gYXZlcmFnZSBvZiAkNDEsMzUwL3llYXIsIGNvbXBhcmVkIHdpdGggdGhlIG5hdGlvbmFsIGF2ZXJhZ2Ugb2YgJDUyLDM0MC4gCgpNZWFud2hpbGUsIHRoZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBlYXJuIG11Y2ggbW9yZSB0aGFuIHRoZSBhdmVyYWdlIHdvcmtlciwgd2l0aCBhIG1lZGlhbiBwZXJzb25hbCBpbmNvbWUgb2YgJDc1LDMzNiwgaGlnaGVyIHRoYW4gYW55IG90aGVyIHdvcmtlciBjbGFzcy4gCgpJdCdzIHBlcmhhcHMgdW5zdXJwcmlzaW5nLCB0aGVuLCB0aGF0IHRoZSB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvdWxkIGJlIHR3aWNlIGFzIGxpa2VseSBhcyB0aGUgdG90YWwgd29ya2ZvcmNlIHRvIGxpdmUgYmVsb3cgdGhlIHBvdmVydHkgbGluZSAoMTAlIHZzLiA1JSksIHdoaWxlIGZld2VyIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgKDMlKSBoYXZlIHBlcnNvbmFsIGluY29tZSBiZWxvdyB0aGUgcG92ZXJ0eSBsaW5lLgoKPGJyPgoKYGBge3IgcGVyc29uYWwgaW5jb21lLCBlY2hvPUZBTFNFfQoKdG90YWxfaW5jb21lX2RhdGEgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBtZWRpYW5faW5jb21lID0gbWVkaWFuKHRvdF9pbmNvbWUsIG5hLnJtID0gVFJVRSkpCgppbmNvbWVfYnlfY2xhc3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lCiAgc3VtbWFyaXplKAogICAgbWVkaWFuX2luY29tZSA9IG1lZGlhbih0b3RfaW5jb21lLCBuYS5ybSA9IFRSVUUpLAogICAgLmdyb3VwcyA9ICJkcm9wIikKCmluY29tZV9ieV9jbGFzcyA8LSBiaW5kX3Jvd3ModG90YWxfaW5jb21lX2RhdGEsIGluY29tZV9ieV9jbGFzcykKCmluY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsIDwtIGZhY3RvcihpbmNvbWVfYnlfY2xhc3Mkd3Jrcl9jbGFzc19sYWJlbCwgbGV2ZWxzID0gYygiVG90YWwiLCB1bmlxdWUoaW5jb21lX2J5X2NsYXNzJHdya3JfY2xhc3NfbGFiZWwpW3VuaXF1ZShpbmNvbWVfYnlfY2xhc3Mkd3Jrcl9jbGFzc19sYWJlbCkgIT0gIlRvdGFsIl0pKQoKaW5jb21lX3Bsb3QgPC0gZ2dwbG90KGluY29tZV9ieV9jbGFzcywgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gbWVkaWFuX2luY29tZSwgdGV4dCA9IHBhc3RlMCgiTWVkaWFuIEluY29tZTogIiwgc2NhbGVzOjpkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkobWVkaWFuX2luY29tZSkpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhZXMoZmlsbCA9IGlmZWxzZSh3cmtyX2NsYXNzX2xhYmVsID09ICJUb3RhbCIsICJUb3RhbCIsICJXb3JrZXIgQ2xhc3MiKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0b3RhbF9pbmNvbWVfZGF0YSRtZWRpYW5faW5jb21lLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArCiAgbGFicygKICAgIHRpdGxlID0gIk1lZGlhbiBQZXJzb25hbCBJbmNvbWUgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRvdGFsIiA9ICIjZGRjMDU3IiwgIldvcmtlciBDbGFzcyIgPSAiI2FiMWQ3OSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKaW50ZXJhY3RpdmVfaW5jb21lX3Bsb3QgPC0gZ2dwbG90bHkoaW5jb21lX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCgppbnRlcmFjdGl2ZV9pbmNvbWVfcGxvdAoKYGBgCgo8YnI+CgojIyMgU29jaWFsIFByb3RlY3Rpb25zCgo8YnI+CgpGaW5hbmNpYWwgc2VjdXJpdHkgZXh0ZW5kcyBiZXlvbmQgaW5jb21lLCBpbmNsdWRpbmcgYWNjZXNzIHRvIHNvY2lhbCBwcm90ZWN0aW9ucy4gV2hpbGUgdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGhhdmUgaGVhbHRoIGluc3VyYW5jZSBhdCBuZWFybHkgdGhlIHNhbWUgcmF0ZXMgYXMgdGhlIHRvdGFsIHdvcmtmb3JjZSAoOTAlIHZzLiA5MSUpLCB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBleHBlcmllbmNlIGxvd2VyIGxldmVscyBvZiBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlIHRoYW4gYW55IG90aGVyIHdvcmtlciBncm91cCwgYXQgODQlIGNvdmVyYWdlLiBJdCdzIHVuc3VycHJpc2luZyB0aGF0IHRoZSBzZWxmLWVtcGxveWVkIGFyZSBsZXNzIGxpa2VseSB0byBoYXZlIGhlYWx0aCBpbnN1cmFuY2UgY292ZXJhZ2UsIGdpdmVuIHRoZSBlbXBsb3llci1iYXNlZCBoZWFsdGggaW5zdXJhbmNlIHN5c3RlbSB0aGF0IGRvbWluYXRlcyB0aGUgVW5pdGVkIFN0YXRlcy4gIAoKVGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIGFsc28gZmFyIGxlc3MgbGlrZWx5IHRvIGNvbnRyaWJ1dGUgdG8gYSByZXRpcmVtZW50IHNhdmluZ3MgYWNjb3VudC4gT25seSAxMiUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGNvbnRyaWJ1dGVkIHRvIGEgcmV0aXJlbWVudCBzYXZpbmdzIGFjY291bnQgbGFzdCB5ZWFyLCBjb21wYXJlZCB0byAzNSUgb2YgdGhlIHRvdGFsIHdvcmtmb3JjZS4gVGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFsc28gY29udHJpYnV0ZWQgYXQgbG93ZXIgcmF0ZXMgKDI4JSksIGJ1dCBub3QgbmVhcmx5IGFzIGxvdyBhcyB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZC4gQWdhaW4sIGdpdmVuIHRoYXQgZW1wbG95bWVudC1iYXNlZCBiZW5lZml0cyBhcmUgdGhlIG5vcm0gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGFuZCB0aGF0IHRoZSBzZWxmLWVtcGxveWVkIGxhY2sgYWNjZXNzIHRvIGluZnJhc3RydWN0dXJlIG9mIGF1dG9tYXRpYyBlbnJvbGxtZW50IGFuZCBjb250cmlidXRpb25zIHRocm91Z2ggcGF5cm9sbCwgdGhpcyBkaWZmZXJlbmNlIGluIHJldGlyZW1lbnQgc2F2aW5ncyBhY3Rpdml0eSBiZXR3ZWVuIHNlbGYtZW1wbG95ZWQgYW5kIGVtcGxveWVkIHdvcmtlcnMgaXMgdW5kZXJzdGFuZGFibGUuCgo8YnI+CgpgYGB7ciBoZWFsdGggYW5kIHJldGlyZW1lbnQsIGVjaG89RkFMU0V9CgpzZV9oZWFsdGhfcmV0aXJlbWVudCA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfaGlfY292ID0gbWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSwKICAgIHBjdF9yZXRfY29udCA9IG1lYW4ocmV0X2NvbnQgPiAwLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMocGN0X2hpX2NvdiwgcGN0X3JldF9jb250KSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY292ZXJhZ2VfdHlwZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwZXJjZW50YWdlIikgJT4lCiAgYmluZF9yb3dzKAogICAgc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgICAgIHN1bW1hcml6ZSgKICAgICAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIiwKICAgICAgICBwY3RfaGlfY292ID0gbWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICBwY3RfcmV0X2NvbnQgPSBtZWFuKHJldF9jb250ID4gMCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhwY3RfaGlfY292LCBwY3RfcmV0X2NvbnQpLAogICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY292ZXJhZ2VfdHlwZSIsCiAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicGVyY2VudGFnZSIpKQoKc2VfaGVhbHRoX3JldGlyZW1lbnQgPC0gc2VfaGVhbHRoX3JldGlyZW1lbnQgJT4lCiAgbXV0YXRlKAogICAgY292ZXJhZ2VfdHlwZSA9IHJlY29kZShjb3ZlcmFnZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicGN0X2hpX2NvdiIgPSAiSGVhbHRoIENvdmVyYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjdF9yZXRfY29udCIgPSAiUmV0aXJlbWVudCBDb250cmlidXRpb24iKSwKICAgIHRvb2x0aXAgPSBwYXN0ZShjb3ZlcmFnZV90eXBlLCAiOiAiLCByb3VuZChwZXJjZW50YWdlICogMTAwLCAxKSwgIiUiKSkKCnNlX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwgPC0gZmFjdG9yKAogIHNlX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwsCiAgbGV2ZWxzID0gYygiVG90YWwiLCBzZXRkaWZmKHVuaXF1ZShzZV9oZWFsdGhfcmV0aXJlbWVudCR3cmtyX2NsYXNzX2xhYmVsKSwgIlRvdGFsIikpKQoKdG90YWxfaGVhbHRoX2NvdmVyYWdlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIHN1bW1hcml6ZSgKICAgIHBjdF9oaV9jb3YgPSBtZWFuKGhpX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X3JldF9jb250ID0gbWVhbihyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkpCgpwIDwtIGdncGxvdChzZV9oZWFsdGhfcmV0aXJlbWVudCwgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gcGVyY2VudGFnZSAqIDEwMCwgZmlsbCA9IGNvdmVyYWdlX3R5cGUsIHRleHQgPSB0b29sdGlwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2hsaW5lKGRhdGEgPSB0b3RhbF9oZWFsdGhfY292ZXJhZ2UsIGFlcyh5aW50ZXJjZXB0ID0gcGN0X2hpX2NvdiAqIDEwMCksIGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUpICsKICBnZW9tX2hsaW5lKGRhdGEgPSB0b3RhbF9oZWFsdGhfY292ZXJhZ2UsIGFlcyh5aW50ZXJjZXB0ID0gcGN0X3JldF9jb250ICogMTAwKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTb2NpYWwgUHJvdGVjdGlvbnMgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIiwKICAgIGZpbGwgPSAiIgogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJIZWFsdGggQ292ZXJhZ2UiID0gIiM0NDg1YWYiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiIgPSAiI2RkODEyYiIpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJIZWFsdGggQ292ZXJhZ2UiLCAiUmV0aXJlbWVudCBDb250cmlidXRpb24iKSkgKyAgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSAgCgpnZ3Bsb3RseShwLCB0b29sdGlwID0gInRleHQiKQoKYGBgCgo8YnI+CgojIyMgSGVhbHRoIENvdmVyYWdlCgo8YnI+CgpBbW9uZyB0aGUgc2VsZi1lbXBsb3llZCB3aG8gZG8gaGF2ZSBoZWFsdGggaW5zdXJhbmNlLCB0aGUgc291cmNlIG9mIHRoYXQgY292ZXJhZ2UgZGlmZmVycyBtZWFuaW5nZnVsbHkgZnJvbSBlbXBsb3llZCB3b3JrZXJzLiBVbmluY29ycG9yYXRlZCAgYW5kIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIG1vcmUgbGlrZWx5IHRoYW4gZW1wbG95ZWVzIHRvIGhhdmUgcHVibGljIGNvdmVyYWdlICgzMiUgYW5kIDIzJSB2cy4gMTglKSBvciBwcml2YXRlIGNvdmVyYWdlICgzOCUgYW5kIDI0JSB2cy4gMjIlKSwgYW5kIG11Y2ggbGVzcyBsaWtlbHkgdG8gaGF2ZSBlbXBsb3llci1wcm92aWRlZCBjb3ZlcmFnZSAoMzklIGFuZCA1MSUgdnMuIDY5JSkuIAoKVGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIGZhciBtb3JlIGxpa2VseSB0byByZWx5IG9uIHB1YmxpYyBvciBwcml2YXRlIGNvdmVyYWdlIHRoYW4gaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2Vycywgd2hvIGFjY2VzcyBlbXBsb3llci1wcm92aWRlZCBjb3ZlcmFnZSBhdCBoaWdoZXIgcmF0ZXMsIHBvdGVudGlhbGx5IHRocm91Z2ggYSBwYXJ0bmVyIG9yIG90aGVyIGZhbWlseSBtZW1iZXIuIFVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2VycyBhbHNvIHJlY2VpdmUgTWVkaWNhaWQgYXQgaGlnaGVyIHJhdGVzIG9mIDE2JSwgY29tcGFyZWQgdG8gMTElIG9mIHRvdGFsIHdvcmtlcnMgYW5kIDklIG9mIHRoZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZC4gIAoKPGJyPgoKYGBge3IgaGVhbHRoIGluc3VyYW5jZSwgZWNobz1GQUxTRX0KCnRvdGFsX2hlYWx0aF9pbnN1cmFuY2UgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBjb3VudCA9IG4oKSwKICAgIHBjdF9oaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHViX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHB1Yl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHJpX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHByaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZW1wbF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihlbXBsX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9kaXJfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZGlyX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tdGtwX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG10a3BfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X21lZGljYWlkX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG1lZGljYWlkID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfaGVhbHRoX2luc3VyYW5jZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudCA9IG4oKSwKICAgIHBjdF9oaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHViX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHB1Yl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHJpX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHByaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZW1wbF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihlbXBsX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9kaXJfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZGlyX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tdGtwX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG10a3BfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X21lZGljYWlkX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG1lZGljYWlkID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfaGVhbHRoX2luc3VyYW5jZSA8LSBiaW5kX3Jvd3ModG90YWxfaGVhbHRoX2luc3VyYW5jZSwgc2VfaGVhbHRoX2luc3VyYW5jZSkKCnNlX2hlYWx0aF9pbnN1cmFuY2UgPC0gc2VfaGVhbHRoX2luc3VyYW5jZSAlPiUKICBzZWxlY3QoLWNvdW50KQoKZGF0YXRhYmxlKAogIHNlX2hlYWx0aF9pbnN1cmFuY2UsCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJIZWFsdGggSW5zdXJhbmNlIiwgIlB1YmxpYyIsICJQcml2YXRlIiwKICAgICJFbXBsb3llciIsICJEaXJlY3QiLCAiTWFya2V0cGxhY2UiLCAiTWVkaWNhaWQiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAoKPGJyPgoKIyMgQXJ0cyAmIERlc2lnbiBXb3JrZXJzCgo8YnI+CgpPdmVyYWxsLCB0aGUgZGF0YSBkZW1vbnN0cmF0ZXMgdGhhdCB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgaGF2ZSBsZXNzIGZpbmFuY2lhbCBzZWN1cml0eSwgYXMgbWVhc3VyZWQgYnkgYm90aCBpbmNvbWUgYW5kIGFjY2VzcyB0byBzb2NpYWwgcHJvdGVjdGlvbnMsIHRoYW4gZW1wbG95ZWQgd29ya2Vycy4gSG93ZXZlciwgdGhlc2UgZGlmZmVyZW5jZXMgbWlnaHQgYmUgdGhlIHJlc3VsdCBvZiBkaWZmZXJlbmNlcyBpbiBvY2N1cGF0aW9ucyBhbmQgaW5kdXN0cmllcyB3aGVyZSB0aGVzZSBpbmRpdmlkdWFscyB0ZW5kIHRvIHdvcmssIGFuZCBub3QgdGhlaXIgY2xhc3NpZmljYXRpb24uIAoKVG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGV4dGVudCB0byB3aGljaCB3b3JrZXIgY2xhc3NpZmljYXRpb24gZHJpdmVzIGZpbmFuY2lhbCBpbnNlY3VyaXR5LCB3ZSB0b29rIGEgY2xvc2VyIGxvb2sgYXQgYWxsIHdvcmtlcnMgaW4gQXJ0cyAmIERlc2lnbiBvY2N1cGF0aW9ucywgd2hpY2ggaXMgdGhlIG9jY3VwYXRpb24gY2F0ZWdvcnkgd2l0aCB0aGUgaGlnaGVzdCBwcm9wb3J0aW9uIG9mIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2Vycy4KCldpdGhpbiBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMsIHNvbWUgZGVtb2dyYXBoaWMgZGlmZmVyZW5jZXMgYW1vbmcgd29ya2VyIGNsYXNzZXMsIGZvciBleGFtcGxlIGdlbmRlciBhbmQgYWdlLCBiZWNhbWUgbGVzcyBwcm9ub3VuY2VkLiBPdGhlciBkaWZmZXJlbmNlcywgc3VjaCBhcyBlZHVjYXRpb24gbGV2ZWwgYW5kIHVuaW9uaXphdGlvbiByYXRlcywgcGVyc2lzdGVkIHdpdGhpbiBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMuICAKCjxicj4KCiMjIyBEZW1vZ3JhcGhpY3MgaW4gdGhlIEFydHMKCmBgYHtyIERlbW9ncmFwaGljIGFydHMgdGFibGUsIGVjaG89RkFMU0V9Cgp0b3RhbF9hcnRzX2RlbW9zIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JSAKICBzdW1tYXJpemUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIEFydHMiLAogICAgcGN0X21hbGUgPSBwYXN0ZTAocm91bmQobWVhbihzZXggPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBtZWRpYW5fYWdlID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIHBjdF9jb2xsZWdlID0gcGFzdGUwKHJvdW5kKG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHVuaW9uX21lbSA9IHBhc3RlMChyb3VuZChtZWFuKHVuaW9uID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdXNfYm9ybl9yYXRlID0gcGFzdGUwKHJvdW5kKG1lYW4odXNfYm9ybiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSkKCnNlX2FydHNfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lICAKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUgIAogIHN1bW1hcml6ZSgKICAgIHBjdF9tYWxlID0gcGFzdGUwKHJvdW5kKG1lYW4oc2V4ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLCAgICAKICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2NvbGxlZ2UgPSBwYXN0ZTAocm91bmQobWVhbihjb2xsZWdlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdW5pb25fbWVtID0gcGFzdGUwKHJvdW5kKG1lYW4odW5pb24gPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICB1c19ib3JuX3JhdGUgPSBwYXN0ZTAocm91bmQobWVhbih1c19ib3JuID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfYXJ0c19kZW1vcyA8LSBiaW5kX3Jvd3ModG90YWxfYXJ0c19kZW1vcywgc2VfYXJ0c19kZW1vcykKCmRhdGF0YWJsZSgKICBzZV9hcnRzX2RlbW9zLAogIGNvbG5hbWVzID0gYygiV29ya2VyIENsYXNzaWZpY2F0aW9uIiwgIk1hbGUiLCAiTWVkaWFuIEFnZSIsICJDb2xsZWdlIEdyYWQiLCAiVW5pb24gTWVtYmVyIiwgIlVTIENpdGl6ZW4iKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLCAgICAgICAgIAogICAgc2VhcmNoaW5nID0gRkFMU0UsICAgICAgCiAgICBpbmZvID0gRkFMU0UsICAgICAgICAgICAKICAgIGxlbmd0aENoYW5nZSA9IEZBTFNFLCAgICAKICAgIGRvbSA9ICd0JyApLAogIGVzY2FwZSA9IEZBTFNFLCAKICByb3duYW1lcyA9IEZBTFNFKQoKYGBgCgo8YnI+CgpXaXRoaW4gQXJ0cyBhbmQgRGVzaWduIG9jY3VwYXRpb25zLCB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgc3RpbGwgc2xpZ2h0bHkgbW9yZSBtYWxlIHRoYW4gYWxsIEFydHMgV29ya2VycyAoNTAlIHZzLiA0NyUpLCBidXQgdGhlIGRpZmZlcmVuY2VzIGFyZSBub3QgbmVhcmx5IGFzIGxhcmdlIGFtb25nIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMuIE92ZXJhbGwsIEFydHMgV29ya2VycyBhcmUgc2xpZ2h0bHkgbGVzcyBtYWxlIHRoYW4gYWxsIHdvcmtlcnMsIG9mIHdob20gNTIlIGFyZSBtYWxlLiAKCjxicj4KCmBgYHtyIEFydHMgR2VuZGVyLCBlY2hvPUZBTFNFfQoKdG90YWxfYXJ0c19kZW1vcyA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUgCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCBBcnRzIiwKICAgIHBjdF9tYWxlID0gbWVhbihzZXggPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwKICAgIHBjdF9mZW1hbGUgPSBtZWFuKHNleCA9PSAyLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfYXJ0c19kZW1vcyA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUgIAogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JQogIGdyb3VwX2J5KHdya3JfY2xhc3NfbGFiZWwpICU+JSAgCiAgc3VtbWFyaXplKAogICAgcGN0X21hbGUgPSBtZWFuKHNleCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLAogICAgcGN0X2ZlbWFsZSA9IG1lYW4oc2V4ID09IDIsIG5hLnJtID0gVFJVRSkgKiAxMDApCgpzZV9hcnRzX2RlbW9zIDwtIGJpbmRfcm93cyh0b3RhbF9hcnRzX2RlbW9zLCBzZV9hcnRzX2RlbW9zKQoKc2VfYXJ0c19kZW1vc19sb25nIDwtIHNlX2FydHNfZGVtb3MgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMocGN0X21hbGUsIHBjdF9mZW1hbGUpLAogICAgbmFtZXNfdG8gPSAiZ2VuZGVyIiwKICAgIHZhbHVlc190byA9ICJwZXJjZW50YWdlIikgJT4lCiAgbXV0YXRlKAogICAgZ2VuZGVyID0gcmVjb2RlKGdlbmRlciwgcGN0X21hbGUgPSAiTWFsZSIsIHBjdF9mZW1hbGUgPSAiRmVtYWxlIiksCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gZmFjdG9yKAogICAgICB3cmtyX2NsYXNzX2xhYmVsLCAKICAgICAgbGV2ZWxzID0gYygKICAgICAgICAiVG90YWwgQXJ0cyIsIAogICAgICAgIHVuaXF1ZShzZV9hcnRzX2RlbW9zJHdya3JfY2xhc3NfbGFiZWxbc2VfYXJ0c19kZW1vcyR3cmtyX2NsYXNzX2xhYmVsICE9ICJUb3RhbCBBcnRzIl0pKSkpCgpnZW5kZXJfYXJ0c19wbG90IDwtIGdncGxvdChzZV9hcnRzX2RlbW9zX2xvbmcsIGFlcygKICB4ID0gd3Jrcl9jbGFzc19sYWJlbCwgCiAgeSA9IHBlcmNlbnRhZ2UsIAogIGZpbGwgPSBnZW5kZXIsIAogIHRleHQgPSBwYXN0ZTAoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uOiAiLCB3cmtyX2NsYXNzX2xhYmVsLCAiPGJyPiIsCiAgICAiR2VuZGVyOiAiLCBnZW5kZXIsICI8YnI+IiwKICAgICJQZXJjZW50YWdlOiAiLCByb3VuZChwZXJjZW50YWdlLCAwKSwgIiUiKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTWFsZSIgPSAiI2RkYzA1NyIsICJGZW1hbGUiID0gIiM0NDg1YWYiKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJBcnRzIFdvcmtlcnM6IEdlbmRlciBieSBXb3JrZXIgQ2xhc3NpZmljYXRpb24iLAogICAgeCA9ICIiLAogICAgeSA9ICIiLAogICAgZmlsbCA9ICJHZW5kZXIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoc2NhbGUgPSAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCmludGVyYWN0aXZlX2dlbmRlcl9hcnRzX3Bsb3QgPC0gZ2dwbG90bHkoZ2VuZGVyX2FydHNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX2dlbmRlcl9hcnRzX3Bsb3QKCmBgYAoKPGJyPgoKV2l0aGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucywgdGhlIGVkdWNhdGlvbiBnYXAgYmV0d2VlbiB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGluZGl2aWR1YWxzIGFuZCBlbXBsb3llZCBpbmRpdmlkdWFscyBwZXJzaXN0cy4gV2hpbGUgNTYuNCUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBpbmRpdmlkdWFscyBoYXZlIGEgY29sbGVnZSBkZWdyZWUsIDYyLjUlIG9mIGFsbCBBcnRzIGFuZCBEZXNpZ24gV29ya2VycyBjb21wbGV0ZWQgY29sbGVnZS4gT3ZlcmFsbCwgQXJ0cyBhbmQgRGVzaWduIHdvcmtlcnMgYXJlIG1vcmUgbGlrZWx5IHRvIGhhdmUgYSBjb2xsZWdlIGRlZ3JlZSB0aGFuIGFsbCB3b3JrZXJzLCBvZiB3aG9tIDM5LjclIGhhdmUgYSBjb2xsZWdlIGRlZ3JlZS4gCgo8YnI+CgpgYGB7ciBBcnRzIGNvbGxlZ2UsIGVjaG89RkFMU0V9Cgp0b3RhbF9hcnRzX2NvbGxlZ2UgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lIAogIHN1bW1hcml6ZSgKICAgIHdya3JfY2xhc3NfbGFiZWwgPSAiVG90YWwgQXJ0cyIsCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfYXJ0c19jb2xsZWdlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JSAKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKY29sbGVnZV9hcnRzX2RhdGEgPC0gYmluZF9yb3dzKHRvdGFsX2FydHNfY29sbGVnZSwgc2VfYXJ0c19jb2xsZWdlKQoKY29sbGVnZV9hcnRzX2RhdGEgPC0gY29sbGVnZV9hcnRzX2RhdGEgJT4lCiAgbXV0YXRlKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9IGZhY3Rvcih3cmtyX2NsYXNzX2xhYmVsLCBsZXZlbHMgPSBjKCJUb3RhbCBBcnRzIiwgdW5pcXVlKHdya3JfY2xhc3NfbGFiZWxbd3Jrcl9jbGFzc19sYWJlbCAhPSAiVG90YWwgQXJ0cyJdKSkpKQoKY29sbGVnZV9hcnRzX2RhdGEgPC0gY29sbGVnZV9hcnRzX2RhdGEgJT4lCiAgbXV0YXRlKAogICAgZ3JvdXAgPSBpZmVsc2Uod3Jrcl9jbGFzc19sYWJlbCA9PSAiVG90YWwgQXJ0cyIsICJUb3RhbCBBcnRzIiwgIldvcmtlciBDbGFzcyIpLAogICAgdG9vbHRpcCA9IHBhc3RlMCgiQ29sbGVnZSBHcmFkdWF0ZXM6ICIsIHJvdW5kKHBjdF9jb2xsZWdlLCAxKSwgIiUiKSkKCnRvdGFsX3BjdF9hcnRzX2NvbGxlZ2UgPC0gdG90YWxfYXJ0c19jb2xsZWdlJHBjdF9jb2xsZWdlICAKCmNvbGxlZ2VfYXJ0c19wbG90IDwtIGdncGxvdChjb2xsZWdlX2FydHNfZGF0YSwgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gcGN0X2NvbGxlZ2UsIGZpbGwgPSBncm91cCwgdGV4dCA9IHRvb2x0aXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0b3RhbF9wY3RfYXJ0c19jb2xsZWdlLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArICAjIERvdHRlZCBsaW5lLCBncmV5IGFuZCB0aGlubmVyCiAgbGFicygKICAgIHRpdGxlID0gIkFydHMgV29ya2VyczogQ29sbGVnZSBHcmFkdWF0ZXMgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRvdGFsIEFydHMiID0gIiNhYjFkNzkiLCAiV29ya2VyIENsYXNzIiA9ICIjZGQ4MTJiIiksCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJHcm91cCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChzY2FsZSA9IDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgppbnRlcmFjdGl2ZV9jb2xsZWdlX2FydHNfcGxvdCA8LSBnZ3Bsb3RseShjb2xsZWdlX2FydHNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX2NvbGxlZ2VfYXJ0c19wbG90CgpgYGAKCjxicj4KClJhY2lhbCBhbmQgZXRobmljIGRpZmZlcmVuY2VzIGFtb25nIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMgYXJlIG11Y2ggc21hbGxlciB3aXRoaW4gQXJ0cyBhbmQgRGVzaWduIG9jY3VwYXRpb25zLCB0aG91Z2ggdGhleSBwZXJzaXN0IHRvIGEgbGVzc2VyIGRlZ3JlZS4gRm9yIGV4YW1wbGUsIHRoZSBzZWxmIGVtcGxveWVkIGFyZSBzbGlnaHRseSBtb3JlIHdoaXRlICg4MSUgYW5kIDgwJSBjb21wYXJlZCB0byA3OCUpLiBVbmxpa2UgYW1vbmcgYWxsIG9jY3VwYXRpb25zLCB0aGUgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIHNsaWdodGx5IG1vcmUgQmxhY2sgKDExJSB2cy4gOCUpLiBIb3dldmVyLCBnaXZlbiB0aGUgcmVsYXRpdmVseSBzbWFsbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzZWxmLWVtcGxveWVkIGFuZCBlbXBsb3llZCB3b3JrZXJzLCBhcyB3ZWxsIGFzIGEgcmVsYXRpdmVseSBzbWFsbCBzYW1wbGUgc2l6ZSwgaXQncyBkaWZmaWN1bHQgdG8gbWFrZSBhbnkgc3Ryb25nIGFzc2VydGlvbnMgYWJvdXQgcmFjaWFsIG9yIGV0aG5pYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMgd2l0aGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucy4gCgo8YnI+CgpgYGB7ciBhcnRzIHJhY2UsIGVjaG89RkFMU0V9CnRvdGFsX2FydHNfcmFjZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUgIAogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JSAKICBzdW1tYXJpemUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIEFydHMiLCAKICAgIHBjdF93aGl0ZSA9IHBhc3RlMChyb3VuZChtZWFuKHdoaXRlX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2JsYWNrID0gcGFzdGUwKHJvdW5kKG1lYW4oYmxhY2tfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfYXNpYW4gPSBwYXN0ZTAocm91bmQobWVhbihhc2lhbl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9oaXNwYW5pYyA9IHBhc3RlMChyb3VuZChtZWFuKGhpc3BhbmljID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2hhd2FpaWFuX3BpID0gcGFzdGUwKHJvdW5kKG1lYW4oaGF3YWlpYW5fcGFjaWZpY19pc2xhbmRlcl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9uYXRpdmVfYW0gPSBwYXN0ZTAocm91bmQobWVhbihhbWVyaWNhbl9pbmRpYW5fYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3Rfb3RoZXIgPSBwYXN0ZTAocm91bmQobWVhbihvdGhlcl9yYWNlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfYXJ0c19yYWNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JSAgCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lIAogIGdyb3VwX2J5KHdya3JfY2xhc3NfbGFiZWwpICU+JSAgCiAgc3VtbWFyaXplKAogICAgcGN0X3doaXRlID0gcGFzdGUwKHJvdW5kKG1lYW4od2hpdGVfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfYmxhY2sgPSBwYXN0ZTAocm91bmQobWVhbihibGFja19hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9hc2lhbiA9IHBhc3RlMChyb3VuZChtZWFuKGFzaWFuX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2hpc3BhbmljID0gcGFzdGUwKHJvdW5kKG1lYW4oaGlzcGFuaWMgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfaGF3YWlpYW5fcGkgPSBwYXN0ZTAocm91bmQobWVhbihoYXdhaWlhbl9wYWNpZmljX2lzbGFuZGVyX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X25hdGl2ZV9hbSA9IHBhc3RlMChyb3VuZChtZWFuKGFtZXJpY2FuX2luZGlhbl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9vdGhlciA9IHBhc3RlMChyb3VuZChtZWFuKG90aGVyX3JhY2UgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIikpCgpzZV9hcnRzX3JhY2UgPC0gYmluZF9yb3dzKHRvdGFsX2FydHNfcmFjZSwgc2VfYXJ0c19yYWNlKQoKZGF0YXRhYmxlKAogIHNlX2FydHNfcmFjZSwKICBjb2xuYW1lcyA9IGMoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uIiwgIldoaXRlIiwgIkJsYWNrIiwgIkFzaWFuIiwgIkhpc3BhbmljIiwKICAgICJIYXdhaWlhbi9QSSIsICJOYXRpdmUgQW1lcmljYW4iLCAiT3RoZXIiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsIAogICAgbGVuZ3RoQ2hhbmdlID0gRkFMU0UsIAogICAgZG9tID0gJ3QnKSwKICBlc2NhcGUgPSBGQUxTRSwKICByb3duYW1lcyA9IEZBTFNFKSAKCmBgYAo8YnI+CgojIyMgRmluYW5jaWFsIFNlY3VyaXR5IGluIHRoZSBBcnRzCgo8YnI+ClRoZSBwZXJzb25hbCBhbmQgaG91c2Vob2xkIGluY29tZSBkaWZmZXJlbnRpYWxzIGFtb25nIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMgcGVyc2lzdCB3aXRoaW4gQXJ0cyBhbmQgRGVzaWduIE9jY3VwYXRpb25zLiBGb3IgZXhhbXBsZSwgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgZWFybiBsZXNzIGluIHBlcnNvbmFsIGFuZCBob3VzZWhvbGQgaW5jb21lIHRoYW4gZW1wbG95ZWVzIGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucywgYW5kIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIGxpdmUgYmVsb3cgdGhlIHBvdmVydHkgbGluZSAoMTElIHZzLiA2JSkuIE1vcmUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcnRzIHdvcmtlcnMgYXJlIG9uIHB1YmxpYyBhc3Npc3RhbmNlICgwLjI4JSB2cy4gMC4wNyUpLCBhbmQgbmVpdGhlciB0eXBlIG9mIHNlbGYtZW1wbG95ZWQgYXJ0cyB3b3JrZXIgcmVjZWl2ZWQgYW55IGZvcm0gb2YgdW5lbXBsb3ltZW50IGNvbXBlbnNhdGlvbi4KCjxicj4KCmBgYHtyIEFydHMgZmluYW5jaWFsIHNlY3VyaXR5LCBlY2hvPUZBTFNFfQoKdG90YWxfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHkgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCBBcnRzIiwgIAogICAgbWVkX2hoaSA9IGRvbGxhcihtZWRpYW4oaGhpLCBuYS5ybSA9IFRSVUUpKSwKICAgIG1lZF9pbmNvbWUgPSBkb2xsYXIobWVkaWFuKHRvdF9pbmNvbWUsIG5hLnJtID0gVFJVRSkpLAogICAgY291bnQgPSBuKCksCiAgICBwY3RfYmVsb3dfcG92ZXJ0eSA9IHBlcmNlbnQoc3VtKHBvdmVydHkgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X2hpX2NvdiA9IHBlcmNlbnQoc3VtKGhpX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfcmV0X2NvbnQgPSBwZXJjZW50KHN1bShyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF91bmVtcCA9IHBlcmNlbnQoc3VtKHVuZW1wID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpLAogICAgcGN0X3B1Yl9hc3Npc3QgPSBwZXJjZW50KHN1bShwdWJsaWNfYXNzaXN0ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpKSAlPiUKICBzZWxlY3QoLWNvdW50KQoKc2VfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHkgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnQgPSBuKCksCiAgICBtZWRfaGhpID0gZG9sbGFyKG1lZGlhbihoaGksIG5hLnJtID0gVFJVRSkpLAogICAgbWVkX2luY29tZSA9IGRvbGxhcihtZWRpYW4odG90X2luY29tZSwgbmEucm0gPSBUUlVFKSksCiAgICBwY3RfYmVsb3dfcG92ZXJ0eSA9IHBlcmNlbnQoc3VtKHBvdmVydHkgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X2hpX2NvdiA9IHBlcmNlbnQoc3VtKGhpX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfcmV0X2NvbnQgPSBwZXJjZW50KHN1bShyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF91bmVtcCA9IHBlcmNlbnQoc3VtKHVuZW1wID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpLAogICAgcGN0X3B1Yl9hc3Npc3QgPSBwZXJjZW50KHN1bShwdWJsaWNfYXNzaXN0ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpLAogICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgc2VsZWN0KC1jb3VudCkKCnNlX2FydHNfZmluYW5jaWFsX3NlY3VyaXR5IDwtIGJpbmRfcm93cyh0b3RhbF9hcnRzX2ZpbmFuY2lhbF9zZWN1cml0eSwgc2VfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHkpCgpkYXRhdGFibGUoCiAgc2VfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHksCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJNZWRpYW4gSEggSW5jb21lIiwgIk1lZGlhbiBQZXJzb25hbCBJbmNvbWUiLCAiQmVsb3cgUG92ZXJ0eSIsCiAgICAiSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSIsICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiBMYXN0IFllYXIiLCAiVW5lbXBsb3ltZW50IENvbXAiLCAiT24gUHVibGljIEFzc2lzdGFuY2UiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAoKPGJyPgoKRGlmZmVyZW5jZXMgaW4gaW5jb21lIHBlcnNpc3QgYW5kIGV2ZW4gd2lkZW4gd2l0aGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucywgY29tcGFyZWQgdG8gYWxsIG9jY3VwYXRpb25zLiBBbW9uZyBBcnRzIGFuZCBEZXNpZ24gd29ya2VycywgdGhlIG1lZGlhbiBwZXJzb25hbCBpbmNvbWUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBpcyAkMzgsODk5LCBjb21wYXJlZCB0byAkNTUsOTk2IGFtb25nIGFsbCBBcnRzIHdvcmtlcnMuIEluIHRoaXMsIHRoZSB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFjdHVhbGx5IGVhcm4gbGVzcyB0aGFuIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2VycyBpbiBhbGwgb2NjdXBhdGlvbnMgKCQ0MSwzNTEpLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdG90YWwgQXJ0cyBhbmQgRGVzaWduIHdvcmtlcnMgZWFybiBzbGlnaHRseSBtb3JlLCBvbiBhdmVyYWdlLCB0aGFuIGFsbCB3b3JrZXJzIGluIGFsbCBvY2N1cGF0aW9ucyAoJDUyLDM0MCkuCgo8YnI+CgpgYGB7ciBhcnRzIHBlcnNvbmFsIGluY29tZSwgZWNobz1GQUxTRX0KCnRvdGFsX2FydHNfaW5jb21lX2RhdGEgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCBBcnRzIiwKICAgIG1lZGlhbl9pbmNvbWUgPSBtZWRpYW4odG90X2luY29tZSwgbmEucm0gPSBUUlVFKSkKCmFydHNfaW5jb21lX2J5X2NsYXNzIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JQogIGdyb3VwX2J5KHdya3JfY2xhc3NfbGFiZWwpICU+JQogIHN1bW1hcml6ZSgKICAgIG1lZGlhbl9pbmNvbWUgPSBtZWRpYW4odG90X2luY29tZSwgbmEucm0gPSBUUlVFKSwKICAgIC5ncm91cHMgPSAiZHJvcCIpCgphcnRzX2luY29tZV9ieV9jbGFzcyA8LSBiaW5kX3Jvd3ModG90YWxfYXJ0c19pbmNvbWVfZGF0YSwgYXJ0c19pbmNvbWVfYnlfY2xhc3MpCgphcnRzX2luY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsIDwtIGZhY3RvcihhcnRzX2luY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsLCBsZXZlbHMgPSBjKCJUb3RhbCBBcnRzIiwgdW5pcXVlKGFydHNfaW5jb21lX2J5X2NsYXNzJHdya3JfY2xhc3NfbGFiZWwpW3VuaXF1ZShhcnRzX2luY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsKSAhPSAiVG90YWwgQXJ0cyJdKSkKCmFydHNfaW5jb21lX3Bsb3QgPC0gZ2dwbG90KGFydHNfaW5jb21lX2J5X2NsYXNzLCBhZXMoeCA9IHdya3JfY2xhc3NfbGFiZWwsIHkgPSBtZWRpYW5faW5jb21lLCB0ZXh0ID0gcGFzdGUoIk1lZGlhbiBJbmNvbWU6ICIsIHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKG1lZGlhbl9pbmNvbWUpKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgYWVzKGZpbGwgPSBpZmVsc2Uod3Jrcl9jbGFzc19sYWJlbCA9PSAiVG90YWwgQXJ0cyIsICJUb3RhbCBBcnRzIiwgIkFydHMgV29ya2VyIENsYXNzIikpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdG90YWxfYXJ0c19pbmNvbWVfZGF0YSRtZWRpYW5faW5jb21lLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArCiAgbGFicygKICAgIHRpdGxlID0gIkFydHMgV29ya2VyczogTWVkaWFuIFBlcnNvbmFsIEluY29tZSBieSBXb3JrZXIgQ2xhc3NpZmljYXRpb24iLAogICAgeCA9ICIiLAogICAgeSA9ICIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiVG90YWwgQXJ0cyIgPSAiI2RkYzA1NyIsICJBcnRzIFdvcmtlciBDbGFzcyIgPSAiI2FiMWQ3OSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKaW50ZXJhY3RpdmVfYXJ0c19pbmNvbWVfcGxvdCA8LSBnZ3Bsb3RseShhcnRzX2luY29tZV9wbG90LCB0b29sdGlwID0gInRleHQiKQoKaW50ZXJhY3RpdmVfYXJ0c19pbmNvbWVfcGxvdAoKYGBgCgo8YnI+CgpMb29raW5nIGF0IHNvY2lhbCBwcm90ZWN0aW9ucywgYXJ0cyBhbmQgZGVzaWduIHdvcmtlcnMgYXJlIGluc3VyZWQgYXQgcmVsYXRpdmVseSBoaWdoIHJhdGVzICg5Mi44JSBvZiBhbGwgQXJ0cyAmIERlc2lnbiB3b3JrZXJzIHZzLjkwLjUlIG9mIGFsbCB3b3JrZXJzKSwgYW5kIHRoZSBkaWZmZXJlbnRpYWxzIGFyZSBub3QgYXMgc3RhcmsgYW1vbmcgd29ya2VyIGNsYXNzaWZpY2F0aW9ucy4gSG93ZXZlciwgdGhlIGRpZmZlcmVuY2VzIGluIHJldGlyZW1lbnQgY29udHJpYnV0aW9ucyBwZXJzaXN0ZWQgd2l0aGluZyBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMsIGFzIGNvbnNpZGVyYWJseSBmZXdlciB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFydHMgd29ya2VycyBjb250cmlidXRlZCB0byBhIHJldGlyZW1lbnQgYWNjb3VudCBsYXN0IHllYXIgKDE0JSB2cy4gMzElIG9mIGFsbCBBcnRzIHdvcmtlcnMgYW5kIDM0LjglIG9mIGFsbCB3b3JrZXJzKS4KCjxicj4KCmBgYHtyIGFydHMgaGVhbHRoIGFuZCByZXRpcmVtZW50LCBlY2hvPUZBTFNFfQoKYXJ0c19oZWFsdGhfcmV0aXJlbWVudCA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfaGlfY292ID0gbWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSwKICAgIHBjdF9yZXRfY29udCA9IG1lYW4ocmV0X2NvbnQgPiAwLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhwY3RfaGlfY292LCBwY3RfcmV0X2NvbnQpLAogICAgbmFtZXNfdG8gPSAiY292ZXJhZ2VfdHlwZSIsCiAgICB2YWx1ZXNfdG8gPSAicGVyY2VudGFnZSIpICU+JQogIGJpbmRfcm93cygKICAgIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogICAgICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICAgICAgc3VtbWFyaXplKAogICAgICAgIHdya3JfY2xhc3NfbGFiZWwgPSAiVG90YWwgQXJ0cyIsCiAgICAgICAgcGN0X2hpX2NvdiA9IG1lYW4oaGlfY292ID09IDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgcGN0X3JldF9jb250ID0gbWVhbihyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkpICU+JQogICAgICBwaXZvdF9sb25nZXIoCiAgICAgICAgY29scyA9IGMocGN0X2hpX2NvdiwgcGN0X3JldF9jb250KSwKICAgICAgICBuYW1lc190byA9ICJjb3ZlcmFnZV90eXBlIiwKICAgICAgICB2YWx1ZXNfdG8gPSAicGVyY2VudGFnZSIpKQoKYXJ0c19oZWFsdGhfcmV0aXJlbWVudCA8LSBhcnRzX2hlYWx0aF9yZXRpcmVtZW50ICU+JQogIG11dGF0ZSgKICAgIGNvdmVyYWdlX3R5cGUgPSByZWNvZGUoCiAgICAgIGNvdmVyYWdlX3R5cGUsCiAgICAgICJwY3RfaGlfY292IiA9ICJIZWFsdGggQ292ZXJhZ2UiLAogICAgICAicGN0X3JldF9jb250IiA9ICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiIpLAogICAgd3Jrcl9jbGFzc19sYWJlbCA9IGZhY3RvcigKICAgICAgd3Jrcl9jbGFzc19sYWJlbCwKICAgICAgbGV2ZWxzID0gYygiVG90YWwgQXJ0cyIsIHVuaXF1ZShhcnRzX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwpW3VuaXF1ZShhcnRzX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwpICE9ICJUb3RhbCBBcnRzIl0pKSwKICAgIHRvb2x0aXAgPSBwYXN0ZShjb3ZlcmFnZV90eXBlLCAiOiAiLCByb3VuZChwZXJjZW50YWdlICogMTAwLCAxKSwgIiUiKSkKCnAgPC0gZ2dwbG90KGFydHNfaGVhbHRoX3JldGlyZW1lbnQsIGFlcyh4ID0gd3Jrcl9jbGFzc19sYWJlbCwgeSA9IHBlcmNlbnRhZ2UgKiAxMDAsIGZpbGwgPSBjb3ZlcmFnZV90eXBlLCB0ZXh0ID0gdG9vbHRpcCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkFydHMgV29ya2VyczogU29jaWFsIFByb3RlY3Rpb25zIGJ5IENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIiwKICAgIGZpbGwgPSAiIgogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIkhlYWx0aCBDb3ZlcmFnZSIgPSAiIzQ0ODVhZiIsICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiIgPSAiI2RkODEyYiIpLAogICAgbGFiZWxzID0gYygiSGVhbHRoIENvdmVyYWdlIiwgIlJldGlyZW1lbnQgQ29udHJpYnV0aW9uIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgppbnRlcmFjdGl2ZV9wbG90IDwtIGdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpCmludGVyYWN0aXZlX3Bsb3QKCmBgYAoKPGJyPgoKTWFueSBvZiB0aGUgaGVhbHRoIGNvdmVyYWdlIHRyZW5kcyBvYnNlcnZlZCBhbW9uZyBhbGwgb2NjdXBhdGlvbnMgcGVyc2lzdGVkIHdpdGhpbiBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMuIFRob3VnaCB0aGUgc2VsZi1lbXBsb3llZCBob2xkIHNpbWlsYXIgY292ZXJhZ2UgbGV2ZWxzLCB0aGUgc291cmNlIG9mIHRoYXQgY292ZXJhZ2UgZGlmZmVycyBhbW9uZyB3b3JrZXIgY2xhc3Nlcy4KCjxicj4KCmBgYHtyIGhlYWx0aCBjb3ZlcmFnZSBhcnRzLCBlY2hvPUZBTFNFfQoKdG90YWxfYXJ0c19oZWFsdGhfaW5zdXJhbmNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JQogIHN1bW1hcml6ZSgKICAgIHdya3JfY2xhc3NfbGFiZWwgPSAiVG90YWwiLAogICAgY291bnQgPSBuKCksCiAgICBwY3RfaGlfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oaGlfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X3B1Yl9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihwdWJfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X3ByaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihwcmlfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2VtcGxfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZW1wbF9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZGlyX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKGRpcl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfbXRrcF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihtdGtwX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tZWRpY2FpZF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihtZWRpY2FpZCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSkKCnNlX2FydHNfaGVhbHRoX2luc3VyYW5jZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudCA9IG4oKSwKICAgIHBjdF9oaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHViX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHB1Yl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHJpX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHByaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZW1wbF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihlbXBsX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9kaXJfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZGlyX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tdGtwX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG10a3BfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X21lZGljYWlkX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG1lZGljYWlkID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfYXJ0c19oZWFsdGhfaW5zdXJhbmNlIDwtIGJpbmRfcm93cyh0b3RhbF9hcnRzX2hlYWx0aF9pbnN1cmFuY2UsIHNlX2FydHNfaGVhbHRoX2luc3VyYW5jZSkKCmRhdGF0YWJsZSgKICBzZV9hcnRzX2hlYWx0aF9pbnN1cmFuY2UsCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJUb3RhbCBDb3VudCIsICJIZWFsdGggSW5zdXJhbmNlIiwgIlB1YmxpYyIsICJQcml2YXRlIiwKICAgICJFbXBsb3llciIsICJEaXJlY3QiLCAiTWFya2V0cGxhY2UiLCAiTWVkaWNhaWQiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAo8YnI+CgpBbW9uZyBhcnRzIHdvcmtlcnMsIHRoZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgc2xpZ2h0bHkgbGVzcyBsaWtlbHkgdG8gaGF2ZSBwdWJsaWMgY292ZXJhZ2UgKDE3JSkgdGhhbiBhbGwgYXJ0cyB3b3JrZXJzICgyMCUpLCByZWZsZWN0aW5nIHRoZSByZWxhdGl2ZWx5IGhpZ2hlciBpbmNvbWUgbGV2ZWxzLiBIb3dldmVyLCBmdWxseSAzOSUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGhhdmUgcHVibGljIGNvdmVyYWdlLCBhbmQgMjAlIGFyZSBvbiBNZWRpY2FpZCwgZG91YmxlIHRoZSBwb3J0aW9uIG9mIGFsbCBBcnRzIHdvcmtlcnMgb24gTWVkaWNhaWQgKDEwJSkuIE1lYW53aGlsZSwgbW9yZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIHB1cmNoYXNlIGhlYWx0aCBpbnN1cmFuY2UgZGlyZWN0bHkgKDMwJSkgb3IgdGhyb3VnaCB0aGUgQUNBIG1hcmtldHBsYWNlICgxNCUpLCB0aGFuIGVpdGhlciBhbGwgQXJ0cyB3b3JrZXJzICgxNCUgZGlyZWN0LCA3JSBtYXJrZXRwbGFjZSkgb3IgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCAoMjAlIGRpcmVjdCwgMTElIG1hcmtldHBsYWNlKS4gCgpUaGVzZSBkaWZmZXJlbmNlcyBjYW4gbGFyZ2VseSBiZSBleHBsYWluZWQgYnkgZGlmZmVyZW50aWFsIGFjY2VzcyB0byBlbXBsb3llciBzcG9uc29yZWQgaGVhbHRoIGluc3VyYW5jZSwgd2hpY2ggNzUlIG9mIHByaXZhdGUgc2VjdG9yIGFydHMgd29ya2VycyBoYXZlLCBhbmQgdGhlIGRpZmZlcmVuY2VzIGluIGluY29tZSBsZXZlbHMgYmV0d2VlbiBpbmNvcnBvcmF0ZWQgYW5kIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJ0cyB3b3JrZXJzLiBMb3dlciBpbmNvbWUgdW5pbmNvcnBvcmF0ZWQgYXJ0cyB3b3JrZXJzIHNlZW0gdG8gcmVseSBtb3JlIG9uIHB1YmxpYyBjb3ZlcmFnZSBhbmQgTWVkaWNhaWQsIHdoaWxlIGhpZ2hlciBpbmNvbWUgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJ0cyB3b3JrZXJzIGFyZSBtb3JlIGxpa2VseSB0byBwdXJjaGFzZSBjb3ZlcmFnZSBkaXJlY3RseSBvciBvYnRhaW4gZW1wbG95bWVudCBjb3ZlcmFnZSB0aHJvdWdoIGEgc3BvdXNlIG9yIGZhbWlseSBtZW1iZXIuIAoKPGJyPgoKIyMgQ29uY2x1c2lvbgoKPGJyPgoKVGhlIHNlbGYtZW1wbG95ZWQgYXJlIG5vdCBhIG1vbm9saXRoIC0gdGhlIGV4cGVyaWVuY2VzIG9mIGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGRpZmZlciBncmVhdGx5LiBCYXNlZCBvbiB0aGlzIGFuYWx5c2lzLCBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIHNlZW0gdG8gZml0IG9uZSBuYXJyYXRpdmUgb2YgaW5kZXBlbmRlbnQgd29yayAtIHRoYXQgb2YgaGlnaGx5IGVkdWNhdGVkLCB3ZWxsLWNvbXBlbnNhdGVkIHByb2Zlc3Npb25hbHMsIHdobyBoYXZlIG1vcmUgbWVhbnMgdG8gcHVyY2hhc2UgaGVhbHRoIGluc3VyYW5jZSBhbmQgbWFuYWdlIHRoZSBjaGFsbGVuZ2VzIG9mIG9wZXJhdGluZyBvdXRzaWRlIHRoZSBlbXBsb3llci1iYXNlZCBiZW5lZml0IHN5c3RlbS4gCgpNZWFud2hpbGUsIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2VycyBmaXQgaW50byBhIGRpZmZlcmVudCBuYXJyYXRpdmUgLSB0aGF0IG9mIHRoZSByZWxhdGl2ZWx5IGluc2VjdXJlIGdpZyB3b3JrZXIgd2hvIGV4cGVyaWVuY2VzIGdyZWF0ZXIgcHJlY2FyaXR5LiBVbmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgZWFybiBsZXNzIGluY29tZSwgcmVseSBtb3JlIG9uIHB1YmxpYyBhc3Npc3RhbmNlIGFuZCBiZW5lZml0cywgYW5kIGhhdmUgbG93ZXIgbGV2ZWxzIG9mIHNvY2lhbCBwcm90ZWN0aW9uLCBldmVuIHJlbGF0aXZlIHRvIG90aGVycyB3aG8gc2hhcmUgdGhlaXIgb2NjdXBhdGlvbi4gV2hlbiBjb25zaWRlcmluZyBuZXcgcHJvZ3JhbXMgYW5kIGJlbmVmaXRzLCBwb2xpY3ltYWtlcnMgc2hvdWxkIGZvY3VzIHRoZWlyIGVmZm9ydHMgb24gYnVpbGRpbmcgYSBzb2NpYWwgc2FmZXR5IG5ldCB0aGF0IGltcHJvdmVzIGZpbmFuY2lhbCBzZWN1cml0eSBmb3IgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQuIAoKPGJyPgoKIyMgTWV0aG9kcwoKPGJyPgoKQWxsIGFuYWx5c2lzIGJhc2VkIG9uIHRoZSBbMjAyNCBBbm51YWwgU29jaWFsIGFuZCBFY29ub21pYyBTdXBwbGVtZW50XShodHRwczovL3d3dy5jZW5zdXMuZ292L2RhdGEvZGF0YXNldHMvdGltZS1zZXJpZXMvZGVtby9jcHMvY3BzLWFzZWMuaHRtbCkgdG8gdGhlIFtDdXJyZW50IFBvcHVsYXRpb24gU3VydmV5XShodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvY3BzLmh0bWwpLCBib3RoIHBlcnNvbiBhbmQgaG91c2Vob2xkIHJlY29yZHMuICAKCldvcmtlciBjbGFzc2lmaWNhdGlvbiBiYXNlZCBvbiB0aGUgcHJpbWFyeSBqb2Igb2YgYWxsIHBlcnNvbnMuIEFuYWx5c2lzIGV4Y2x1ZGVzIHRob3NlIHdvcmtpbmcgd2l0aG91dCBwYXkgYW5kIHRob3NlIG91dHNpZGUgdGhlIGNpdmlsaWFuIHdvcmtmb3JjZSBzdWNoIGFzIGNoaWxkcmVuIGFuZCBpbmRpdmlkdWFscyBpbiB0aGUgYXJtZWQgc2VydmljZXMuIEdvdmVybm1lbnQgY2xhc3NpZmljYXRpb24gY2F0ZWdvcnkgY29tYmluZXMgZmVkZXJhbCwgc3RhdGUsIGFuZCBsb2NhbCBnb3Zlcm5tZW50IHdvcmtlcnMuIFByaXZhdGUgY2xhc3NpZmljYXRpb24gY2F0ZWdvcnkgY29tYmluZXMgZm9yLXByb2ZpdCBhbmQgbm9uLXByb2ZpdCBwcml2YXRlIHdvcmtlcnMuIAoKQ1BTIHF1ZXN0aW9ubmFpcmUgb25seSBhbGxvd3MgcmVzcG9uZGVudHMgdG8gY2hvb3NlIE1hbGUgb3IgRmVtYWxlLCBzbyBnZW5kZXIgYW5hbHlzaXMgZXhjbHVkZXMgb3RoZXIgZ2VuZGVyIGlkZW50aXRpZXMuIENvbGxlZ2UgZ3JhZHVhdGVzIGluY2x1ZGVzIGFsbCBwZXJzb25zIHdpdGggYSBiYWNoZWxvcnMgZGVncmVlIG9yIGFib3ZlLiBIaXNwYW5pYyBpbmNsdWRlcyBhbnkgcGVyc29uIG9mIGFueSByYWNlIHdobyBpZGVudGlmaWVkIGFzIEhpc3BhbmljLiBBbGwgb3RoZXIgcmFjaWFsIGdyb3VwcyBpbmNsdWRlIG9ubHkgaW5kaXZpZHVhbHMgd2hvIGlkZW50aWZpZWQgYXMgdGhhdCByYWNlIGFsb25lLiBBbGwgaW5kaXZpZHVhbHMgd2hvIGlkZW50aWZpZWQgYXMgbW9yZSB0aGFuIG9uZSByYWNlIGluY2x1ZGVkIGluICJPdGhlciIuIFVTIENpdGl6ZW4gaW5jbHVkZXMgaW5kaXZpZHVhbHMgd2hvIGFyZSBuYXRpdmUgYW5kIGJvcm4gaW4gVVMsIGJvcm4gaW4gUFIgb3IgVVMgb3V0bHlpbmcgYXJlYSwgYW5kIGJvcm4gYWJyb2FkIG9mIFVTIHBhcmVudChzKS4KCldoaWxlIGFsbCByZXBvcnRlZCBkYXRhIHdhcyBiYXNlZCBvbiBhdCBsZWFzdCAxMDAgb2JzZXJ2YXRpb25zLCB0aGUgdG90YWwgc2FtcGxlIHNpemUgd2FzIHJlbGF0aXZlbHkgc21hbGwgKDcwLDg1NyBvYnNlcnZhdGlvbnMgZm9yIHRoZSB0b3RhbCB3b3JrZm9yY2UsIDEsNDU0IG9ic2VydmF0aW9ucyBmb3IgdGhvc2Ugd2l0aCBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMpLiBGaWd1cmVzIHByZXNlbnRlZCBoYXZlIG5vdCBiZWVuIHN1YmplY3RlZCB0byB0ZXN0cyBmb3Igc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9yIGNvcnJlbGF0aW9uLiAgICAKCjxicj4KCiMjIE5leHQgU3RlcHMKCjxicj4KCiogQXNjZXJ0YWluIHdoZXRoZXIgdGhpcyBhbmFseXNpcyBhbGlnbnMgd2l0aCB0aGF0IGRlcml2ZWQgZnJvbSBvdGhlciBjb21tb24gbWVhc3VyZXMgb2YgdGhlIFVTIGVjb25vbXkgYW5kIHdvcmtmb3JjZSwgc3VjaCBhcyB0aGUgQW1lcmljYW4gQ29tbXVuaXRpZXMgU3VydmV5LiBDb25kdWN0aW5nIHBhcmFsbGVsIGFuYWx5c2lzLCBmb3IgZXhhbXBsZSBvZiBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlIGJ5IHdvcmtlciBjbGFzc2lmaWNhdGlvbiwgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoaXMgYW5hbHlzaXMgaXMgcmVsaWFibGUuIAoKKiBFeHBhbmQgdGhpcyBhbmFseXNpcyB3aXRoIGNvbXBsZW1lbnRhcnkgZGF0YSBmcm9tIG90aGVyIHNvdXJjZXMgdGhhdCBjYXB0dXJlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbmFuY2lhbCBzZWN1cml0eSBvZiB1bmluY29ycG9yYXRlZCBhbmQgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2Vycy4gQWRkaXRpb25hbCBkYXRhIHNvdXJjZXMgd2lsbCBoZWxwIHRlc3QgdGhlc2UgZmluZGluZ3MgYXMgd2VsbCBhcyBzdXBwbGVtZW50IHRoZW0gd2l0aCBvdGhlciBpbmRpY2F0b3JzIG9mIGZpbmFuY2lhbCBzZWN1cml0eSBub3QgaW5jbHVkZWQgaW4gdGhpcyBkYXRhIHNldCwgc3VjaCBhcyBhY2Nlc3MgdG8gY2hpbGRjYXJlLCBjb3N0IG9mIGNoaWxkY2FyZSwgYWNjZXNzIHRvIHBhaWQgbGVhdmUsIGFuZCBvdGhlciBzb2NpYWwgcHJvdGVjdGlvbnMuIE11Y2ggb2YgdGhpcyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgW1N1cnZleSBvZiBJbmNvbWUgYW5kIFByb2dyYW0gUGFydGljaXBhdGlvbiAoU0lQUCldKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9zaXBwLmh0bWwpIGRhdGEgc2V0LiBJIGFsc28gaW50ZW5kIHRvIGV4cGxvcmUgdGhlIFtHaWcgRWNvbm9teSBEYXRhIEh1Yl0oaHR0cHM6Ly93d3cuZ2lnZWNvbm9teWRhdGEub3JnLykgZm9yIGFkZGl0aW9uYWwgc291cmNlcyBvZiBpbmZvcm1hdGlvbi4gCgoqIEV4dGVuZCB0aGlzIGFuYWx5c2lzIGJhY2sgaW4gdGltZSwgdG8gZXhwbG9yZSBsb25nZXItdGVybSB0cmVuZHMgYW5kIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGNvbmRpdGlvbnMgaWRlbnRpZmllZCBpbiB0aGlzIHN0dWR5IGhhdmUgY2hhbmdlZC4gCg==