Loan list

This link will let you download the full list of loans for the metro area. This might end up being a little big for your computer, depending on the size of the area. The largest, New York, has 229,000 rows. But it gets smaller very quickly. The fifth-largest, Washington, DC, has about 75,000.

Here is a summary by zip code area, which you can search for names of post offices. There are additional columns giving you a little more feel for the demographics in the downloadable version. There will be some small zip codes that will have really weird answers because the count of USPS businesses is less than the count of the number of loans.

(Note: There are 479 extra business addresses across the U.S. buried somewhere in this data file, out of 12.6 million. I believe it comes from rounding the number of vacancies when allocating tracts to zip codes, but I’m not sure. I decided not to worry about it. It’s a 0.004 percent error.)

Local map

How to read this map:

Each area is a zip code area – it may include some postal Zip Codes that are single buildings or companies located there. It’s shaded by an approximate percentage of businesses that got PPP loans in both rounds, through December 2020. The percentage is based on the estimate of USPS business addresses that were not considered vacant as of December 2019.

The dots show you what the dominant ethnic group of the zip code area is.

Clicking on the area gives you a little more information about it, including median income (when available), the number of loans in each round, and the postal name of the zip code.

Lenders

This section provides some data on the lenders in an area. All of the lenders with at least 50 loans in this area are listed separately, and the rest are grouped into a “999” group.

Here is the portion of loans in this area taken up by lenders by size:

This table provides some metrics for each lender:

How to read it:

For each lender, there is a percentage of the loans for each type of zip code by ethnicity. For example, if “White %” says “35%” for Chase, it means that 35 percent of Chase’s loans in this market were to majority White zip codes. This is reapeated for any type of zip code with at least 5 percent of the market’s loans. They won’t add to 100% because you are not seeing the ones that were under 5% of the market.

Then there are two sets of comparisons for each group: The percent of loans compared with the average for that market, and a comparison to the distribution if it were the same as the underlying businesses from the USPS. In those columns, anything over 1.0 means that the group is over-represented. Anything under 1.0 means that it’s under-represented.

For example, if the number for Chase under “Hispanic / Latino” is 1.1, it means that Chase is 10 percent more likely to have loans in Hispanic / Latino areas than the rest of the market. If it’s .9, it means that Chase is 10 percent less likely to have loans in that area.

Prepared by Sarah Cohen, December 22, 2020

LS0tCmF1dGhvcjogIlNhcmFoIENvaGVuIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB1bml0ZWQKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpwYXJhbXM6CiAgbWV0cm86IDMxMDgwLTMxMDg0CiAgY2l0eTogTG9zIEFuZ2VsZXMKICBwcmludGNvZGU6IGZhbHNlCiAgY3N2X2xpbms6ICJodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL215bzF0YmlzbnB4cTgwNS9jYV9sb3NfYW5nZWxlcy5jc3Y/ZGw9MSIKICByb290X25hbWUgOiBjYV9sb3NfYW5nZWxlcwp0aXRsZTogIlBQUCBSZXBvcnQgZm9yIGByIHBhcmFtcyRjaXR5YCIKLS0tCgo8IS0tIFRoZSBiZWdpbm5pbmcgb2YgdGhpcyBSIE1hcmtkb3duIHNldHMgdXAgdGhlIGxpYnJhcmllcyBuZWVkZWQgYWxvbmcgd2l0aCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIAogICAgIEkgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgc2VwYXJhdGUgY3N2cyBvZiBlYWNoIG1ldHJvIGFyZWEsIGJhc2VkIG9uIHRoZSBuYW1lcyBtYXRjaGVkIHVwIHdpdGggdGhlIG1ldHJvIGNvZGVzLiBTbyBvbmNlCiAgICAgSSBrbm93IHdoaWNoIG1ldHJvIGNvZGUgSSB3YW50LCB0aGlzIHdpbGwgcnVuIHRoZSBzdGFuZGFyZCBzdHVmZiBmb3IgdGhhdCBtZXRybyBjb2RlLiAKICAgICAKICAgICBJZGVhbGx5LCBJIHdvdWxkIHNldCB0aGlzIHVwIHNvIHRoYXQgeW91IGNvdWxkIGp1c3QgY3JlYXRlIGluIGFkdmFuY2UgYWxsIG9mIHRoZSBtZXRyb3MsIGJ1dCBJIGp1c3QgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdCByaWdodCBub3cuCiAgICAgSSBrbm93IHRoZXJlJ3MgYSB3YXkgc28gSSBjYW4gZmlndXJlIGl0IG91dCBpZiB3ZSBuZWVkIHRvLgotLT4KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyMgYmUgY2FyZWZ1bCB3aXRoIHRoZSBjYWNoZSBiZWNhdXNlIGl0IHNvbWV0aW1lcyBnZXRzIG1lc3NlZCB1cC4gCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gcGFyYW1zJHByaW50Y29kZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9RkFMU0UpCgojIGZvciBtYXBzCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShzZikKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkobGVhZmxldC5leHRyYXMpCmxpYnJhcnkobGVhZmxldC5wcm92aWRlcnMpCmxpYnJhcnkoY2xhc3NJbnQpCgoKCiMgbm9ybWFsCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KERUKQojIGZvciBjb21wbGV4IHNlYXJjaC1hbmQtcmVwbGFjZSB0byBnZXQgdGl0bGVzIG9mIGhlYWRpbmdzIHJpZ2h0CmxpYnJhcnkoc3RyaW5naSkKCiN0aWdyaXMgY2FuIHRha2UgYSB3aGlsZQpvcHRpb25zKHRpZ3Jpc191c2VfY2FjaGU9VFJVRSwgZHBseXIuc3VtbWFyaXNlLmluZm9ybT1GQUxTRSwgc2NpcGVuPTk5OSkKCiN0aGlzIGhhcyBldmVyeXRoaW5nIGVsc2Ugd2UgbmVlZCwgSSB0aGluay4gCmxvYWQgKCJkYXRhL3pjdGFfbWFzdGVyX21hcC5SZGEiKQoKCmBgYAoKCgojIyBMb2FuIGxpc3QKClRoaXMgbGluayB3aWxsIGxldCB5b3UgW2Rvd25sb2FkIHRoZSBmdWxsIGxpc3Qgb2YgbG9hbnMgZm9yIHRoZSBtZXRybyBhcmVhXShgciBwYXJhbXMkY3N2X2xpbmtgKS4gVGhpcyBtaWdodCBlbmQgdXAgYmVpbmcgYSBsaXR0bGUgYmlnIGZvciB5b3VyIGNvbXB1dGVyLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGFyZWEuIFRoZSBsYXJnZXN0LCBOZXcgWW9yaywgaGFzIDIyOSwwMDAgcm93cy4gQnV0IGl0IGdldHMgc21hbGxlciB2ZXJ5IHF1aWNrbHkuIFRoZSBmaWZ0aC1sYXJnZXN0LCBXYXNoaW5ndG9uLCBEQywgaGFzIGFib3V0IDc1LDAwMC4gCgoKSGVyZSBpcyBhIHN1bW1hcnkgYnkgemlwIGNvZGUgYXJlYSwgd2hpY2ggeW91IGNhbiBzZWFyY2ggZm9yIG5hbWVzIG9mIHBvc3Qgb2ZmaWNlcy4gVGhlcmUgYXJlIGFkZGl0aW9uYWwgY29sdW1ucyBnaXZpbmcgeW91IGEgbGl0dGxlIG1vcmUgZmVlbCBmb3IgdGhlIGRlbW9ncmFwaGljcyBpbiB0aGUgZG93bmxvYWRhYmxlIHZlcnNpb24uIFRoZXJlIHdpbGwgYmUgc29tZSBzbWFsbCB6aXAgY29kZXMgdGhhdCB3aWxsIGhhdmUgcmVhbGx5IHdlaXJkIGFuc3dlcnMgYmVjYXVzZSB0aGUgY291bnQgb2YgVVNQUyBidXNpbmVzc2VzIGlzIGxlc3MgdGhhbiB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBsb2Fucy4gCgpgYGB7cn0KCnpjdGFfbWFwICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBmaWx0ZXIgKCBtZXRyb19jb2RlID09IHBhcmFtcyRtZXRybykgJT4lCiAgYXJyYW5nZSAoIHpjdGEpICU+JQogIG11dGF0ZSAoYE5hbWVgID0gcGFzdGUoemN0YV9uYW1lLCBzdF9hYmJyZXYsIHNlcD0iLCAiKSwgCiAgICAgICAgICBgJSBidXMgdy8gbG9hbnNgID0gbG9hbnMgLyBidXNfbm92YWNhbnQpICU+JQogIHNlbGVjdCAoIGBaaXAgY29kZWAgPSB6Y3RhLCAKICAgICAgICAgICBgTmFtZWAgLAogICAgICAgICAgIGBFdGhuaWNpdHlgID0gemN0YV9ldGhuaWMsCiAgICAgICAgICAgYExvYW5zYCA9IGxvYW5zLAogICAgICAgICAgIGAlIGJ1cyB3LyBsb2Fuc2AsCiAgICAgICAgICAgYFJvdW5kIDFgID0gbG9hbnNfcjEsIAogICAgICAgICAgIGBSb3VuZCAyYCA9IGxvYW5zX3IyLCAKICAgICAgICAgICBgQW1vdW50YCA9IGxvYW5fYW1vdW50LAogICAgICAgICAgIGBVU1BTIE5vbi12YWNhbnQgYnVzaW5lc3Nlc2AgPSBidXNfbm92YWNhbnQsIAogICAgICAgICAgIGBOb24tdmFjYW50IGFkZHJlc3Nlc2AgPSBhbGxfbm92YWNhbnQsCiAgICAgICAgICAgYENlbnN1cyBidXNpbmVzc2VzYCA9IHpicF9idXMsIAogICAgICAgICAgIGBQb3B1bGF0aW9uYCA9IHRvdF9wb3AsCiAgICAgICAgICAgYEhvdXNlaG9sZHNgID0gaG91c2Vob2xkcywKICAgICAgICAgICBgUGN0IFdoaXRlIG5vbi1IaXNwYW5pYyBjYXRlZ29yeWAgPSB3aGl0ZV9uaF9ncm91cCwgCiAgICAgICAgICAgYFdoaXRlICVgID0gcGN0X3doaXRlX25oLCAKICAgICAgICAgICBgQmxhY2sgJWAgPSBwY3RfYmxhY2tfbmgsIAogICAgICAgICAgIGBIaXNwYW5pYyAvIExhdGlubyAlYCA9IHBjdF9oaXNwYW5pYywKICAgICAgICAgICBgQXNpYW4gJWAgPSBwY3RfYXNpYW5fbmgsIAogICAgICAgICAgIGBOYXRpdmUgQW1lcmljYW4gJWA9IHBjdF9haWFuX25oLCAKICAgICAgICAgICBgTWVkaWFuIGluY29tZWAgPSBtZWRpYW5faW5jXzIwMTgsIAogICAgICAgICAgIGAlIGNvbGxlZ2UgZ3JhZGAgPSBwY3RfY29sbGVnZV9ncmFkLCAKICAgICAgICAgICBgVW5lbXBsb3ltZW50IHJhdGUgYXZnIDIwMTQtMThgID0gdW5lbXBsX3JhdGUpICU+JQogICMgZ2xpbXBzZSgpCiAgIGRhdGF0YWJsZSgKICAgICAgICAgICAgcm93bmFtZXM9RkFMU0UsCiAgICAgICAgICAgIGV4dGVuc2lvbnM9IkJ1dHRvbnMiLCAKICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QgKAogICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCAKICAgICAgICAgICAgICAgc2Nyb2xsWCA9IFRSVUUsCiAgICAgICAgICAgICAgIHNjcm9sbFkgPSBUUlVFLAogICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCAoIGxpc3QgKCB3aWR0aD0nMTUwcHgnLCB0YXJnZXRzPWMoMSwyLDEzKSkgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgKCB2aXNpYmxlPUZBTFNFLCB0YXJnZXRzPWMoOSwgMTE6MTMsIDE4LCAyMDoyMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAsIAogICAgICAgICAgICAgICBvcmRlciA9IGxpc3QgKGxpc3QgKDAsICJhcyIpICksIAogICAgICAgICAgICAgICAjZG9tID0gImZsQnJ0aXAiLCAKICAgICAgICAgICAgICAgZG9tID0gJzwidG9wIkJpZj5ydDwiYm90dG9tImxwPjwiY2xlYXIiPicsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjICgiY29weSIsICJjc3YiLCAiZXhjZWwiKQogICAgICAgICAgICApCikgJT4lCiAgZm9ybWF0Um91bmQgKGMoNCwgNiw3LCA5LCAxMCwgMTEsIDEyLCAxMyApLCBkaWdpdHM9MCwgbWFyaz0iLCIgLCBpbnRlcnZhbD0zKSAlPiUKICBmb3JtYXRDdXJyZW5jeSAoIGMoOCwgIDIwKSwgZGlnaXRzPTApICU+JQogIGZvcm1hdFBlcmNlbnRhZ2UoIGMoIDUsIDE1OjE5KSkKCiAgCgoKYGBgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAooTm90ZTogVGhlcmUgYXJlIDQ3OSBleHRyYSBidXNpbmVzcyBhZGRyZXNzZXMgYWNyb3NzIHRoZSBVLlMuIGJ1cmllZCBzb21ld2hlcmUgaW4gdGhpcyBkYXRhIGZpbGUsIG91dCBvZiAxMi42IG1pbGxpb24uIEkgYmVsaWV2ZSBpdCBjb21lcyBmcm9tIHJvdW5kaW5nIHRoZSBudW1iZXIgb2YgdmFjYW5jaWVzIHdoZW4gYWxsb2NhdGluZyB0cmFjdHMgdG8gemlwIGNvZGVzLCBidXQgSSdtIG5vdCBzdXJlLiBJIGRlY2lkZWQgbm90IHRvIHdvcnJ5IGFib3V0IGl0LiBJdCdzIGEgMC4wMDQgcGVyY2VudCBlcnJvci4pIAoKIyMgTG9jYWwgbWFwCgo8IS0tQWxyZWFkeSBsb2FkZWQgdGhlIG9iamVjdCBmcm9tIHRpZ3JpcyBhbmQgc2YsIHNvIHRoZSB6Y3RhX21hcCBvYmplY3QgaXMgYWxyZWFkeSBhIG11bHRpcG9seWdvbiBzaW1wbGUgZmVhdHVyZS4tLT4KCgo8IS0tIFN0ZXAgMjogUHVsbCBvdXQganVzdCB0aGUgbWV0cm8gYXJlYSB5b3Ugd2FudCByaWdodCBub3cgLS0gdGhhdCdzIHdpbGwgYmUgYSBmdW5jdGlvbiBvZiB0aGUgbWV0cm8gYXJlYXMgZnJvbSB0aGUgbGlzdCBpbiB0aGUgcHJldmlvdXMgc3RlcC4gCkFmdGVyIHRoaXMsIHdlJ2xsIGhhdmUgdGhlIGBhcHByb3hfY2VudGVyYCBvZiB0aGUgbWFwLCB0aGUgYHNwYW5fYm91bmRzYCBvZiB0aGUgbWFwLCBhbmQgdGhlIGBicmVha3NgIGJhc2VkIG9uIEplbmtzIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCA1ICUuICBXZSBjYW4gYWxzbyBzZXQgdGhlIHBhbGV0dGUgbm93IHRoYXQgd2Uga25vdyB0aGUgYnJlYWtzLiBJdCBzZXRzIHRoZSBwYWxldHRlcyBhcyBgZGlzY3JldGVfcGFsYCB1c2luZyBhbGwgbGV2ZWxzIG9mIHRoZSBldGhuaWNpdHkgZnJvbSB0aGUgbmF0aW9uYWwgZmlsZTsgYW5kIGBibHVlX3BhbGAgYXMgYmlubmVkIGZyb20gdGhlIGplbmtzIGJyZWFrcy4gIEl0IGFsc28gY3JlYXRlcyBhIHBvaW50IGxheWVyIGZvciB0aGUgbWV0cm8gYXJlYS4gCi0tPgoKCmBgYHtyIGdldF9tZXRyb19iYXNlLCB3YXJuaW5nPUZBTFNFfQoKbWV0cm9fbWFwX2Jhc2UgPC0gZmlsdGVyICggemN0YV9tYXAsIG1ldHJvX2NvZGUgPT0gcGFyYW1zJG1ldHJvKSAgJT4lCiAgbXV0YXRlICggcGN0X2xvYW4gPSByb3VuZCAoIHBtaW4gKCBsb2FucyAvIGJ1c19ub3ZhY2FudCAsIDEpICwgMyApICkKCm1ldHJvX21hcF9wdCA8LSAgc3RfY2VudHJvaWQgKCBtZXRyb19tYXBfYmFzZSkgCgoKIyBub3cgZ2V0IHR3byBtZWFzdXJlczogVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgbWFwIGFuZCB0aGUgamVua3MgYnJlYWtzCmJveCA8LSBzdF9iYm94IChtZXRyb19tYXBfYmFzZSkKYXBwcm94X2NlbnRlciA8LQogICBjICggbWVhbiAoYyhib3hbMV0sIGJveFszXSkpLCAKICAgICAgICAgbWVhbihjKGJveFsyXSwgYm94WzRdKSkpCgojIHB1dHRpbmcgYSBwcmV0dHkgYmlnIHJhbmdlIGFyb3VuZCB0aGlzIC0tIHdvbid0IGVuZCB1cCBvdXQgaW4gQXNpYSwgYnV0IG1pZ2h0IGhhdmUgdG8gcGFuIGEgbGl0dGxlISAKc3Bhbl9ib3VuZHMgPSB1bm5hbWUoIGMgKGJveFsneG1pbiddLTEsIGJveFsneW1pbiddLTEsIGJveFsneG1heCddKzEsIGJveFsneW1heCddKzEpKQoKIyBqZW5rcyBicmVha3MgLSByb3VuZCB0byA1IGdyb3Vwcz8gCmplbmtzIDwtIGNsYXNzSW50OjpjbGFzc0ludGVydmFscyhtZXRyb19tYXBfYmFzZSRwY3RfbG9hbiwgbj01LCBzdHlsZT0iamVua3MiKSRicmtzCiMgKCBmbG9vciAoLjc1IC8gLjA1KSAqIC4wNSkgbm8gaWRlYSB3aHkgdGhpcyB3b3JrcyBidXQgaXQgZG9lcwpicmVha3MgPC0gKCBjZWlsaW5nIChqZW5rcy8gLjA1KSAqIC4wNSkKI2Jya3MgPC0gYyggMCwgLjI1LCAuNCwgLjU1LCAuOCwgMSkKCgpibHVlX3BhbCA8LSBjb2xvckJpbiAocGFsZXR0ZT0iQmx1ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gbWV0cm9fbWFwX2Jhc2UkcGN0X2xvYW4sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MsCiAgICAgICAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIndoaXRlIikKCiNzZXQgdGhlIGNvbG9ycyBmb3IgdGhlIGNpcmNsZXMgYmFzZWQgb24gdGhlIGxhcmdlciBkYXRhc2V0IHNvIHRoZXkncmUgYWx3YXlzIHRoZSBzYW1lLiAKCmRpc2NyZXRlX3BhbCA8LSBjb2xvckZhY3RvcihwYWxldHRlPSJEYXJrMiIsIGRvbWFpbiA9IHpjdGFfbWFwJHpjdGFfZXRobmljKQoKYGBgCgoKPCEtLU5vdyBjcmVhdGUgdGhlIG1hcC4gLS0+CgpIb3cgdG8gcmVhZCB0aGlzIG1hcDogCgpFYWNoIGFyZWEgaXMgYSB6aXAgY29kZSBhcmVhIC0tIGl0IG1heSBpbmNsdWRlIHNvbWUgcG9zdGFsIFppcCBDb2RlcyB0aGF0IGFyZSBzaW5nbGUgYnVpbGRpbmdzIG9yIGNvbXBhbmllcyBsb2NhdGVkIHRoZXJlLiBJdCdzIHNoYWRlZCBieSBhbiBhcHByb3hpbWF0ZSBwZXJjZW50YWdlIG9mIGJ1c2luZXNzZXMgdGhhdCBnb3QgUFBQIGxvYW5zIGluIGJvdGggcm91bmRzLCB0aHJvdWdoIERlY2VtYmVyIDIwMjAuICBUaGUgcGVyY2VudGFnZSBpcyBiYXNlZCBvbiB0aGUgZXN0aW1hdGUgb2YgVVNQUyBidXNpbmVzcyBhZGRyZXNzZXMgdGhhdCB3ZXJlIG5vdCBjb25zaWRlcmVkIHZhY2FudCBhcyBvZiBEZWNlbWJlciAyMDE5LiAKClRoZSBkb3RzIHNob3cgeW91IHdoYXQgdGhlIGRvbWluYW50IGV0aG5pYyBncm91cCBvZiB0aGUgemlwIGNvZGUgYXJlYSBpcy4gCgpDbGlja2luZyBvbiB0aGUgYXJlYSBnaXZlcyB5b3UgYSBsaXR0bGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBpdCwgaW5jbHVkaW5nIG1lZGlhbiBpbmNvbWUgKHdoZW4gYXZhaWxhYmxlKSwgdGhlIG51bWJlciBvZiBsb2FucyBpbiBlYWNoIHJvdW5kLCBhbmQgdGhlIHBvc3RhbCBuYW1lIG9mIHRoZSB6aXAgY29kZS4gCgoKYGBge3IgbGVhZmxldF9tYXB9CgptIDwtIGxlYWZsZXQgKCBtZXRyb19tYXBfYmFzZSkgJT4lCiAgICAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZFN0cmVldE1hcCwgCiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gcHJvdmlkZXJUaWxlT3B0aW9ucyggbWluWm9vbSA9IDcpKSAgJT4lCiAgICAgc2V0VmlldyggYXBwcm94X2NlbnRlclsxXSwgYXBwcm94X2NlbnRlclsyXSwgIHpvb209MTApICU+JQogICAgIHNldE1heEJvdW5kcyAoc3Bhbl9ib3VuZHNbMV0sIHNwYW5fYm91bmRzWzJdLCBzcGFuX2JvdW5kc1szXSwgc3Bhbl9ib3VuZHNbNF0gKSU+JQogICAgIGFkZFBvbHlnb25zICggZmlsbENvbG9yID0gfmJsdWVfcGFsKCBwY3RfbG9hbiksCiAgICAgICAgICAgICAgICAgICAjY29sPSIjNzgyMDBFIiwgCiAgICAgICAgICAgICAgICAgICBzdHJva2UgPTEsIAogICAgICAgICAgICAgICAgICAgd2VpZ2h0PS4zLCAKICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjcgLCAKICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+IHBhc3RlMCAoICJaaXAgQ29kZSAiLCB6Y3RhICwgIiwgIiwgemN0YV9uYW1lLCAiLCAgIiwgY291bnR5X25hbWUsICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaaXAgY29kZSBldGhuaWNpdHk6ICIgLCAgemN0YV9ldGhuaWMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsICIlIG9mIG5vbi12YWNhbnQgVVNQUyBidXNpbmVzc2VzIHdpdGggbG9hbnM6ICIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCggcGN0X2xvYW4sIGFjY3VyYWN5PS4xKSAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsICJMb2FucyA6IFJvdW5kIDEtICAiLCBsb2Fuc19yMSwgIiwgUm91bmQgMiAtICIsICBsb2Fuc19yMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IE1lZGlhbiBJbmNvbWUgIiAsIGRvbGxhciggbWVkaWFuX2luY18yMDE4KSkpICU+JQogICAgIGFkZENpcmNsZU1hcmtlcnMgKCBkYXRhPSBtZXRyb19tYXBfcHQsIAogICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSA0LCAKICAgICAgICAgICAgICAgICAgICAgICAgI3JhZGl1cyA9IH5zcXJ0KCBsb2FucyAvIDQwKSAsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj0gfmRpc2NyZXRlX3BhbCAoemN0YV9ldGhuaWMpLCBzdHJva2U9RkFMU0UgLCBmaWxsT3BhY2l0eSA9IC44LCAKICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAiY2lyY2xlcyIpICU+JSAgIAogIGFkZFJlc2V0TWFwQnV0dG9uKCkgJT4lCiAgYWRkTGVnZW5kICgidG9wcmlnaHQiLCBwYWw9ZGlzY3JldGVfcGFsLCB2YWx1ZXMgPSB+emN0YV9ldGhuaWMsIGdyb3VwPSJjaXJjbGVzIiwgdGl0bGU9IkV0aG5pY2l0eSIpICU+JSAKICBhZGRMZWdlbmQgKCJib3R0b21sZWZ0IiwgcGFsPWJsdWVfcGFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gfnBjdF9sb2FuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQgKHN1ZmZpeD0iJSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gKHgpIHsxMDAqeH0pICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgb2YgVVNQUyBhY3RpdmUgYnVzLiIpCiAgCm0KCmBgYAoKPCEtLSBjbGVhbiB1cCBlbnZpcm9ubWVudCBzbyBpdCdzIG5vdCBjb25mdXNpbmcgbGF0ZXIgLS0+CgpgYGB7cn0KCnJtIChsaXN0ID0gYygnbScsJ3pjdGFfbWFwJywgJ21ldHJvX21hcF9wdCcsICdhcHByb3hfY2VudGVyJywgJ2JveCcsICdicmVha3MnLCAnamVua3MnLCAnc3Bhbl9ib3VuZHMnLCAnYmx1ZV9wYWwnLCAnZGlzY3JldGVfcGFsJykgKSAKCmBgYAoKCiMjIExlbmRlcnMKCjwhLS0gdGhpcyByZWFkcyBpbiB0aGUgY3N2IGZpbGUgZnJvbSB0aGUgc2F2ZWQgb25lcywgd2hpY2ggaXMgbXVjaCBmYXN0ZXIgdGhhbiBsb2FkaW5nIGFsbCBvZiB0aGUgbG9hbnMgZnJvbSB0aGUgb3JpZ2luYWwuIE5lZWQgdG8gZml4IHRoZSB0cmVhdG1lbnQgb2YgemlwIGNvZGVzIGFuZCBuYWljcyBpbnRvIGNoYXJhY3Rlci4tLT4KClRoaXMgc2VjdGlvbiBwcm92aWRlcyBzb21lIGRhdGEgb24gdGhlIGxlbmRlcnMgaW4gYW4gYXJlYS4gQWxsIG9mIHRoZSBsZW5kZXJzIHdpdGggYXQgbGVhc3QgNTAgbG9hbnMgaW4gdGhpcyBhcmVhIGFyZSBsaXN0ZWQgc2VwYXJhdGVseSwgYW5kIHRoZSByZXN0IGFyZSBncm91cGVkIGludG8gYSAiOTk5IiBncm91cC4gIAoKPCEtLQpOb3cgSSBoYXZlIHRvIGF1dG9tYXRlIGdldHRpbmcgdGhlIGxlbmRlcnMgaW50byBhIHRhYmxlIHdpdGggYW4gZXhwb3J0IHRvIEV4Y2VsIGJ1dHRvbi4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyBtYXJrZXQgc2hhcmUsIHdoaWNoIGlzIGEgcmVhbGx5IHNtYWxsIG51bWJlciBmb3IgZWFjaCBsZW5kZXIsIEknbSBjb21wYXJpbmcgdGhlIHBlcmNlbnQgb2YgbG9hbnMgZnJvbSB0aGUgbGVuZGVyIGJ5IGdyb3VwIHRvIHRoZSBwZXJjZW50IGluIHRoZSByZWdpb24uIFRoYXQgY29tZXMgb3V0IHRvIHRoZSBzYW1lIGRpZmZlcmVuY2UgaW4gbWFya2V0IHNoYXJlLCBidXQgaXQncyBhIGxpdHRsZSBlYXNpZXIgdG8gcmVhZC4gCgpGb3IgZWFjaCBtZXRybyBhcmVhLCBJJ20gc2VsZWN0aW5nIGFueSBsZW5kZXIgd2l0aCBhdCBsZWFzdCAxMDAgbG9hbnMuIFRoZXJlIGFyZW4ndCB0aGF0IG1hbnkgb2YgdGhlbSwgYW5kIHRoZXkgdXN1YWxseSBtYWtlIHVwIGFib3V0IDk1IHBlcmNlbnQgb2YgdGhlIGxvYW5zIGluIHRoZSBhcmVhLiBFdmVyeXRoaW5nIGVsc2UgaXMgYmVpbmcgcHV0IGludG8gYW4gImV2ZXJ5b25lIGVsc2UiIGNhdGVnb3J5LiAKCkl0IHdvdWxkIGJlIGdyZWF0IHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgdGhpcyBvdXRwdXQgYXMgSFRNTCBXaWRnZXQgdG8gc2F2ZSByYXRoZXIgdGhhbiBoYXZlIHRvIHJlZG8gaXQgZm9yIGVhY2ggc2luY2UgdGhlIGxvYW4gZGF0YSB0YWtlcyBzbyBsb25nIHRvIHJlYWQgaW4uIChCZXR0ZXIgdG8gYWRkIHRoZSB3aWRnZXQgdG8gYW4gZXhpc3Rpbmcgcm1kIHRoYW4gdG8gZG8gaXQgYXMgaXRzIG93biBybWFya2Rvd24uKQotLT4KCkhlcmUgaXMgdGhlIHBvcnRpb24gb2YgbG9hbnMgaW4gdGhpcyBhcmVhIHRha2VuIHVwIGJ5IGxlbmRlcnMgYnkgc2l6ZTogCgoKPCEtLSBTb21ldGhpbmcgSSBoYXZlIHRvIGRvOiBzZXQgdXAgYSBrZXkgZm9yIHRoZSBldGhuaWNpdGllcyBzbyB0aGF0IHRoZXkgY3JlYXRlIGdvb2QgdmFyaWFibGUgbmFtZXMgbGF0ZXIgb24gLS0+CgpgYGB7cn0KCmV0aG5pY19rZXkgPC0gYyggIjAwIC0gTm8gcGVvcGxlIiAgPSAiTm8gcGVvcGxlIiwgCiAgICAgICAgICAgICAgICAgIjAxIC0gTWFqb3JpdHkgd2hpdGUiID0gIldoaXRlIiwgCiAgICAgICAgICAgICAgICAgIjAyIC0gTm8gZGlzdGluY3QgbWlub3JpdHkiID0iTm8gZGlzdGluY3QgbWlub3JpdHkiLCAKICAgICAgICAgICAgICAgICAiMDMgLSBCbGFjayIgPSAiQmxhY2siLCAKICAgICAgICAgICAgICAgICAiMDQgLSBIaXNwYW5pYyIgPSAiSGlzcGFuaWMgLyBMYXRpbm8iLAogICAgICAgICAgICAgICAgICIwNSAtIEFzaWFuIiA9ICJBc2lhbiIgLAogICAgICAgICAgICAgICAgICIwNiAtIE5hdGl2ZSBBbWVyaWNhbiIgPSAiTmF0aXZlIEFtZXJpY2FuIikKCgoKYGBgCgoKCgoKYGBge3IgcGlja19sZW5kZXJzfQoKYXJlYV9sb2FucyA8LSByZWFkX2NzdihwYXN0ZTAoImRhdGEvbWV0cm9fY3N2cy8iLCBwYXJhbXMkcm9vdF9uYW1lLCAiLmNzdiIpLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXM9IGNvbHMgKC5kZWZhdWx0PSBjb2xfZ3Vlc3MoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpjdGEgPSAiYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAgPSAiYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWljc19jb2RlID0gImMiKSkKCgoKbGVuZGVyX3JhbmtzIDwtIAogIGFyZWFfbG9hbnMgJT4lCiAgZ3JvdXBfYnkgKGxlbmRlcikgJT4lCiAgc3VtbWFyaXNlICggbGVuZGVyX2xvYW5zID0gbigpKSAlPiUKICBtdXRhdGUgKCByYW5rID0gbWluX3JhbmsgKCAtbGVuZGVyX2xvYW5zKSwgCiAgICAgICAgICAgbGVuZGVyX2dyb3VwID0gaWZfZWxzZSAoIGxlbmRlcl9sb2FucyA+PSA1MCwgcmFuaywgYXMuaW50ZWdlcig5OTkpKSwgCiAgICAgICAgICAgbGVuZGVyX2lkID0gb3JkZXJlZCggcGFzdGUoIHNwcmludGYgKCIlMDNkIiwgbGVuZGVyX2dyb3VwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZSAobGVuZGVyX2dyb3VwID09IDk5OSwgIlNtYWxsIGxlbmRlcnMiLCBsZW5kZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcD0iIC0gIikpKQoKCgpsZW5kZXJfcmFua3MgJT4lICAKICBhcnJhbmdlICgtbGVuZGVyX2xvYW5zKSAlPiUKICBncm91cF9ieSAoYmluID0gY3V0IChsZW5kZXJfbG9hbnMsIGJyZWFrcz1jICgwLCA1MCwgMTAwLCA1MDAsIEluZiksIGluY2x1ZGUubG93ZXN0PUZBTFNFLCByaWdodD1GQUxTRSwgbGFiZWxzPWMoIjAtNDkiLCAiNTAtOTkiLCAiMTAwLTQ5OSIsICI1MDAgJiB1cCIpICkpICU+JQogIHN1bW1hcmlzZSAgKCIjIG9mIGxlbmRlcnMiID0gbigpLCB0b3RhbCA9IHN1bShsZW5kZXJfbG9hbnMpKSAgJT4lCiAgYXJyYW5nZSAoIC1hcy5udW1lcmljKGJpbikpICU+JQogIG11dGF0ZSAoIkN1bXVsYXRpdmUgJSIgPSBjdW1zdW0odG90YWwpL3N1bSh0b3RhbCkpICU+JQogIHJlbmFtZSAoIlJhbmdlIiA9IGJpbiwgIiMgb2YgbG9hbnMiID0gdG90YWwpICU+JQogIGRhdGF0YWJsZSAoIG9wdGlvbnMgPSBsaXN0KGRvbT0idCIsIHdpZHRoPSI4MCUiLCBvcmRlcmluZz1GQUxTRSksIAogICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsIAogICAgICAgICAgICAgIHdpZHRoPSI1MCUiKSAlPiUKICBmb3JtYXRSb3VuZCAoYygyKSwgZGlnaXRzPTIsIGludGVydmFsPTMsIG1hcms9IiwiKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlKCBjKDMsNCksIGRpZ2l0cz0xKSAKCmBgYAoKVGhpcyB0YWJsZSBwcm92aWRlcyBzb21lIG1ldHJpY3MgZm9yIGVhY2ggbGVuZGVyOiAKCiogVGhlIG1hcmtldCBzaGFyZSAKKiBUaGUgcGVyY2VudGFnZSBvZiBsb2FucyBieSBldGhuaWNpdHkgb2YgdGhlIHppcCBjb2RlcyBmb3IgZWFjaCBsZW5kZXIsIHZlcnN1cyB0aG9zZSBpbiB0aGUgbWFya2V0IGFzIGEgd2hvbGUKKiBUaGUgcGVyY2VudGFnZSBvZiBsb2FucyBieSBldGhuaWNpdHkgb2YgdGhlIHppcCBjb2RlcyBmb3IgZWFjaCBsZW5kZXIgdmVyc3VzIHRoZSBudW1iZXIgb2Ygbm9uLXZhY2FudCBidXNpbmVzcyBhZGRyZXNzZXMgaW4gdGhlIG1hcmtldC4gCgoKCmBgYHtyIGxlbmRlcl9jb21wYXJpc29uc30KIyBzZXQgdXAgc29tZSBtb3JlIHByaW50LWZyaWVuZGx5IGNvbHVtbiBoZWFkaW5ncyAKZXRobmljX2tleSA8LSBjKCAiMDAgLSBObyBwZW9wbGUiICA9ICJObyBwZW9wbGUiLCAKICAgICAgICAgICAgICAgICAiMDEgLSBNYWpvcml0eSB3aGl0ZSIgPSAiV2hpdGUiLCAKICAgICAgICAgICAgICAgICAiMDIgLSBObyBkaXN0aW5jdCBtaW5vcml0eSIgPSJObyBkaXN0aW5jdCBtaW5vcml0eSIsIAogICAgICAgICAgICAgICAgICIwMyAtIEJsYWNrIiA9ICJCbGFjayIsIAogICAgICAgICAgICAgICAgICIwNCAtIEhpc3BhbmljIiA9ICJIaXNwYW5pYyAvIExhdGlubyIsCiAgICAgICAgICAgICAgICAgIjA1IC0gQXNpYW4iID0gIkFzaWFuIiAsCiAgICAgICAgICAgICAgICAgIjA2IC0gTmF0aXZlIEFtZXJpY2FuIiA9ICJOYXRpdmUgQW1lcmljYW4iKQoKdmFybmFtZV9sb29rdXAgPC0gYygibGVuZGVyX2V0aG5pYyIgPSAiJSAiLCAgImxlbmRlcl9ta3RfcmVsIiA9ICJ2cy4gbWFya2V0IiwgImxlbmRlcl9idXNfcmVsIiA9ICJ2cy4gVVNQUyBidXNpbmVzc2VzIikKCgphcmVhX3RvdGFscyA8LSAKICBtZXRyb19tYXBfYmFzZSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgZ3JvdXBfYnkgKHpjdGFfZXRobmljKSAlPiUKICBzdW1tYXJpc2UgKGFyZWFfbG9hbnMgPSBzdW0gKGxvYW5zKSwgCiAgICAgICAgICAgICBhcmVhX2J1c2luZXNzZXMgPSBzdW0oYnVzX25vdmFjYW50KSkgJT4lCiAgbXV0YXRlICggc3VtX2FyZWFfbG9hbnMgPSBzdW0oYXJlYV9sb2FucyksIAogICAgICAgICAgIHN1bV9hcmVhX2J1c2luZXNzZXMgPSBzdW0oYXJlYV9idXNpbmVzc2VzKSkKCiMganVzdCBjaGVjayB0byBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbG9hbnMgd2UganVzdCBwaWNrZWQgdXAuIAojIHN1bShhcmVhX3RvdGFscyRhcmVhX2xvYW5zLCBuYS5ybT1UUlVFKSA9PSBucm93KCBhcmVhX2xvYW5zKQoKI2Rvbid0IHVzZSBsZW5kZXJfbG9hbnMgZnJvbSB0aGUgcmFua3MgZGF0YSAtLSBpdCB3aWxsIGNoYW5nZW4gbm93IHRoYXQgd2UgaGF2ZSB0aGUgOTk5J3MgY29tYmluZWQuCgpsZW5kZXJfdG90YWxzIDwtIAogIGFyZWFfbG9hbnMgJT4lCiAgaW5uZXJfam9pbiAoc2VsZWN0IChsZW5kZXJfcmFua3MsIGxlbmRlciwgbGVuZGVyX2lkKSAsIGJ5PWMoImxlbmRlciI9ImxlbmRlciIpKSAlPiUKICBncm91cF9ieSAobGVuZGVyX2lkLCB6Y3RhX2V0aG5pYykgJT4lIAogIHN1bW1hcmlzZSAoIGxlbmRlcl9sb2FucyA9IG4oKSAsIC5ncm91cHM9ImRyb3BfbGFzdCIpICU+JSAKICBtdXRhdGUgKCBzdW1fbGVuZGVyX2xvYW5zID0gc3VtKGxlbmRlcl9sb2FucykpCgpsZW5kZXJfcmF3X2NvdW50cyA8LSAKICAgYXJlYV90b3RhbHMgJT4lCiAgIGxlZnRfam9pbiAoIGxlbmRlcl90b3RhbHMgLCBieT1jKCJ6Y3RhX2V0aG5pYyIgPSAiemN0YV9ldGhuaWMiKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgYXJyYW5nZSAobGVuZGVyX2lkLCB6Y3RhX2V0aG5pYykgJT4lCiAgIG11dGF0ZSAoIG1rdF9zaGFyZSA9IHN1bV9sZW5kZXJfbG9hbnMvIHN1bV9hcmVhX2xvYW5zICwgCiAgICAgICAgICAgIGxlbmRlcl9ldGhuaWMgPSBsZW5kZXJfbG9hbnMgLyBzdW1fbGVuZGVyX2xvYW5zLCAKICAgICAgICAgICAgbWt0X2V0aG5pYyA9IGFyZWFfbG9hbnMgLyBzdW1fYXJlYV9sb2FucywgCiAgICAgICAgICAgIGJ1c19ldGhuaWMgPSBhcmVhX2J1c2luZXNzZXMgLyBzdW1fYXJlYV9idXNpbmVzc2VzLCAKICAgICAgICAgICAgbGVuZGVyX21rdF9yZWwgPSBsZW5kZXJfZXRobmljIC8gbWt0X2V0aG5pYywgCiAgICAgICAgICAgIGxlbmRlcl9idXNfcmVsID0gbGVuZGVyX2V0aG5pYyAvIGJ1c19ldGhuaWMsIAogICAgICAgICAgICAjIHRoaXMgcmVuYW1lcyB0aGUgZXRobmljaXRpZXMgc28gdGhhdCB3aGVuIHdlIGZsaXAgdGhlIGRhdGEgZnJhbWUgaXQgd2lsbCAKICAgICAgICAgICAgZXRobmljID0gcmVjb2RlIChvcmRlcmVkKHpjdGFfZXRobmljKSwgISEhYXMubGlzdChldGhuaWNfa2V5ICkpIAogICApCiAgICAgICAgICAgIAoKbnVtX2V0aG5pY19ncm91cHMgPC0gbGVuZGVyX3Jhd19jb3VudHMgJT4lIGZpbHRlciggbWt0X2V0aG5pYyA+PSAuMDUpICU+JSBkaXN0aW5jdCggemN0YV9ldGhuaWMpICU+JSBzdW1tYXJpc2UobigpKSAlPiUgYXMubnVtZXJpYygpCiAgICAgICAgICAgIAojIyBGbGlwIHRoaXMgYW5kIGtlZXAgdGhlIHRoaW5ncyB3ZSBjYXJlIGFib3V0IAojIyBUaGlzIGlzIHRoZSBvbmx5IHdheSBJIGtub3cgaG93IHRvIG1ha2UgdGhlIG5hbWVzIHdvcmsgb3V0IGNvcnJlY3RseTogCnBpdm90ZWRfbG9hbnMgPC0gCiAgbGVuZGVyX3Jhd19jb3VudHMgJT4lCiAgZmlsdGVyIChta3RfZXRobmljID49IC4wNSkgJT4lCiAgc2VsZWN0ICggbGVuZGVyX2lkLCB6Y3RhX2V0aG5pYywgc3VtX2xlbmRlcl9sb2FucywgCiAgICAgICAgICAgbWt0X3NoYXJlICwgbGVuZGVyX2V0aG5pYywgbGVuZGVyX21rdF9yZWwsIAogICAgICAgICAgIGxlbmRlcl9idXNfcmVsKSAlPiUKICBwaXZvdF9sb25nZXIgKGNvbHMgID0gYyhsZW5kZXJfZXRobmljOiBsZW5kZXJfYnVzX3JlbCkgLCBuYW1lc190byA9ICJ2bmFtZSIsIHZhbHVlc190bz0gInBjdHMiKSAlPiUKICBtdXRhdGUgKHZuYW1lMiA9IHN0cmlfcmVwbGFjZV9hbGxfZml4ZWQodm5hbWUsIG5hbWVzKHZhcm5hbWVfbG9va3VwKSwgdW5uYW1lKHZhcm5hbWVfbG9va3VwKSwgdmVjdG9yaXNlX2FsbCA9IEZBTFNFICksIAogICAgICAgICAgZXRobmljID0gc3RyaV9yZXBsYWNlX2FsbF9maXhlZCggemN0YV9ldGhuaWMsIG5hbWVzKGV0aG5pY19rZXkpLCB1bm5hbWUoZXRobmljX2tleSksIHZlY3RvcmlzZV9hbGw9RkFMU0UpLCAKICAgICAgICAgIG5ld192bmFtZSA9IHBhc3RlKGV0aG5pYywgdm5hbWUyLCBzZXA9IiAiKQopICU+JQogIHNlbGVjdCAoLXZuYW1lMiwgLWV0aG5pYykgJT4lCiAgcGl2b3Rfd2lkZXIgKCBpZF9jb2xzPWMobGVuZGVyX2lkLCBta3Rfc2hhcmUsIHN1bV9sZW5kZXJfbG9hbnMpLCB2YWx1ZXNfZnJvbT1wY3RzLCBuYW1lc19mcm9tPW5ld192bmFtZSwgdmFsdWVzX2ZpbGw9MCApICU+JQogIHNlbGVjdCAoTGVuZGVyID0gbGVuZGVyX2lkLCAiTG9hbnMiID0gc3VtX2xlbmRlcl9sb2FucyAsIGBNYXJrZXQgc2hhcmVgPW1rdF9zaGFyZSwgZW5kc193aXRoKCIlICIpLCBlbmRzX3dpdGgoInZzLiBtYXJrZXQiKSwgZW5kc193aXRoKCJ2cy4gVVNQUyBidXNpbmVzc2VzIikpIAoKIApgYGAKCkhvdyB0byByZWFkIGl0OiAKCkZvciBlYWNoIGxlbmRlciwgdGhlcmUgaXMgYSBwZXJjZW50YWdlIG9mIHRoZSBsb2FucyBmb3IgZWFjaCB0eXBlIG9mIHppcCBjb2RlIGJ5IGV0aG5pY2l0eS4gRm9yIGV4YW1wbGUsIGlmICJXaGl0ZSAlIiBzYXlzICIzNSUiIGZvciBDaGFzZSwgaXQgbWVhbnMgdGhhdCAzNSBwZXJjZW50IG9mIENoYXNlJ3MgbG9hbnMgaW4gdGhpcyBtYXJrZXQgd2VyZSB0byBtYWpvcml0eSBXaGl0ZSB6aXAgY29kZXMuIFRoaXMgaXMgcmVhcGVhdGVkIGZvciBhbnkgdHlwZSBvZiB6aXAgY29kZSB3aXRoIGF0IGxlYXN0IDUgcGVyY2VudCBvZiB0aGUgbWFya2V0J3MgbG9hbnMuIFRoZXkgd29uJ3QgYWRkIHRvIDEwMCUgYmVjYXVzZSB5b3UgYXJlIG5vdCBzZWVpbmcgdGhlIG9uZXMgdGhhdCB3ZXJlIHVuZGVyIDUlIG9mIHRoZSBtYXJrZXQuCgpUaGVuIHRoZXJlIGFyZSB0d28gc2V0cyBvZiBjb21wYXJpc29ucyBmb3IgZWFjaCBncm91cDogVGhlIHBlcmNlbnQgb2YgbG9hbnMgY29tcGFyZWQgd2l0aCB0aGUgYXZlcmFnZSBmb3IgdGhhdCBtYXJrZXQsIGFuZCBhIGNvbXBhcmlzb24gdG8gdGhlIGRpc3RyaWJ1dGlvbiBpZiBpdCB3ZXJlIHRoZSBzYW1lIGFzIHRoZSB1bmRlcmx5aW5nIGJ1c2luZXNzZXMgZnJvbSB0aGUgVVNQUy4gSW4gdGhvc2UgY29sdW1ucywgYW55dGhpbmcgb3ZlciAxLjAgbWVhbnMgdGhhdCB0aGUgZ3JvdXAgaXMgb3Zlci1yZXByZXNlbnRlZC4gQW55dGhpbmcgdW5kZXIgMS4wIG1lYW5zIHRoYXQgaXQncyB1bmRlci1yZXByZXNlbnRlZC4gCgpGb3IgZXhhbXBsZSwgaWYgdGhlIG51bWJlciBmb3IgQ2hhc2UgdW5kZXIgIkhpc3BhbmljIC8gTGF0aW5vIiBpcyAxLjEsIGl0IG1lYW5zIHRoYXQgQ2hhc2UgaXMgMTAgcGVyY2VudCBtb3JlIGxpa2VseSB0byBoYXZlIGxvYW5zIGluIEhpc3BhbmljIC8gTGF0aW5vIGFyZWFzIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIG1hcmtldC4gSWYgaXQncyAuOSwgaXQgbWVhbnMgdGhhdCBDaGFzZSBpcyAxMCBwZXJjZW50IGxlc3MgbGlrZWx5IHRvIGhhdmUgbG9hbnMgaW4gdGhhdCBhcmVhLiAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgphcmVhX2xvYW5zICU+JQogIHNlbGVjdCAoIHJvd2lkLCBsZW5kZXIsIHpjdGFfZXRobmljICkgJT4lCiAgZmlsdGVyICggc3RyX2RldGVjdCAobGVuZGVyLCAiQ2l0aWJhbmsiKSkKCgpgYGAKYGBge3J9CiMgYnVpbGQgdGhlIHRhYmxlCgpjb2xfZXRobmljX2NvdW50IDwtIG51bV9ldGhuaWNfZ3JvdXBzICogMwpwY3RhZ2VfY29scyA8LSBjKDQ6KDMrbnVtX2V0aG5pY19ncm91cHMpKQpyb3VuZF9jb2xzIDwtIGMoIChtYXgocGN0YWdlX2NvbHMpICsgMSk6KG1heChwY3RhZ2VfY29scykgKyAoMipudW1fZXRobmljX2dyb3VwcykgKSkKbWF4X2NvbF9udW0gPC0gbWF4KHJvdW5kX2NvbHMpCgpwaXZvdGVkX2xvYW5zICU+JQogICBkYXRhdGFibGUoIGNsYXNzPSJjb21wYWN0IiwgCiAgICAgICAgICAgIHJvd25hbWVzPUZBTFNFLAogICAgICAgICAgICBleHRlbnNpb25zPSJCdXR0b25zIiwgCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0ICgKICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwgCiAgICAgICAgICAgICAgIHNjcm9sbFggPSBUUlVFLAogICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCAoIGxpc3QgKCB3aWR0aD0nMTUwcHgnLCB0YXJnZXRzPWMoMCkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNsaXN0ICggdmlzaWJsZT1GQUxTRSwgdGFyZ2V0cz1jKDAsOSwgMTE6MjAgICkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICwgCiAgICAgICAgICAgICAgIG9yZGVyID0gbGlzdCAobGlzdCAoMCwgImFzYyIpKSAsIAogICAgICAgICAgICAgICBkb20gPSAiQmZydGlwIiwgCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjICgiY29weSIsICJjc3YiLCAiZXhjZWwiKQogICAgICAgICAgICApLAogICAgICAgICAgICkgJT4lCiAgIyB0aGlzIGlzIHdlaXJkIC0gdGhlIHN0dWZmIGluICJvcHRpb25zIiBpcyAwYmFzZWQgYW5kIHRoZSBzdHVmZiBoZXJlIGlzIDEtYmFzZWQuCiAgZm9ybWF0Um91bmQgKCByb3VuZF9jb2xzICwgZGlnaXRzPTIsIGludGVydmFsPTMsIG1hcms9IiwiKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlICggcGN0YWdlX2NvbHMsIGRpZ2l0cz0wKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlICggYygzKSwgZGlnaXRzPTIpICU+JQogIGZvcm1hdFJvdW5kICgyLCBkaWdpdHM9MCwgaW50ZXJ2YWw9MywgbWFyaz0iLCIpCgoKCgoKYGBgCgo8ZGl2IHN0eWxlPSJzaXplOjgwJTtjb2xvcjpncmF5O2ZvbnQtc3R5bGU6aXRhbGljOyI+ClByZXBhcmVkIGJ5IFNhcmFoIENvaGVuLCBgciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVCICVkLCAlWSIpYAo8L2Rpdj4=