FEMA has several Hazard Mitigation Assistance (HMA) programs that provide grants for planning, resilient infrastructure, household mitigation, and buyouts:

  1. Hazard Mitigation Grant Program (HMGP)
    • provides funding to local governments so they can develop hazard mitigation plans and rebuild in a way that reduces, or mitigates, future disaster losses in their communities.
    • Availability: after a presidentially declared disaster.
    • Activities: Planning (code enforcements, buyouts); Flood Protection (levees, floodwalls, elevations, drainage); Retrofitting
  2. Flood Mitigation Assistance (FMA)
    • provides funding to local governments for projects that reduce risk of repetitive flood damage to NFIP insured buildings
    • Subsumed two defunct programs: Repetitive Flood Claims grant program (RFC) & Severe Repetitive Loss grant program (SRL)
    • Availability:
    • Activities:
  3. Building Resilient Communities (BRIC)
    • Subsumed Pre-disaster Mitigation Program (PDM), which ended out of 2018
    • Availability:
    • Activities: “Capability and capacity building”
  4. Legislative Pre-disaster Mitigation grant program (LPDM)
    • Also known as “Pre-disaster Mitigation congressional community projects”
    • As far as I can tell, this is competitive PDM funding that is just extra and for some reason not branded as BRIC?

The full extent of how FEMA and other agencies will use the new CDRZ designations is still unknown, but FEMA has announced that CDRZ census tracts will receive priority in selection and increased federal cost share support under BRIC. We explore whether that represents a significant shift in where historical BRIC funding has been directed.

Datasets:

History of all HMA funding

History of PDM / BRIC Funding

PDM / BRIC FUNDING:
BRIC is one of the programs that CDRZs designations will affect funding for.

Comparing previous funding vs. CDRZ designations

LS0tDQp0aXRsZTogIkZFTUEncyBIYXphcmQgTWl0aWdhdGlvbiBGdW5kaW5nICYgQ0RSWiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSkNCnNldHdkKCJ+L0FuYWx5c2lzL0ZFTUFfZnVuZGluZyIpDQpQYWNrYWdlcyA8LSBjKCJkcGx5ciIsICJnZ3Bsb3QyIiwgInRpZHl2ZXJzZSIsICJodHRyIiwgImpzb25saXRlIiwgInJlYWR4bCIsICJ0aWR5Y2Vuc3VzIiwgInRpZHlyIikNCmxhcHBseShQYWNrYWdlcywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0Kc291cmNlKCJmdW5jdGlvbnMvYW5hbHlzaXNfZnVuY3Rpb25zLlIiKQ0KYGBgDQoNCkZFTUEgaGFzIHNldmVyYWwgSGF6YXJkIE1pdGlnYXRpb24gQXNzaXN0YW5jZSAoSE1BKSBwcm9ncmFtcyB0aGF0IHByb3ZpZGUgZ3JhbnRzIGZvciBwbGFubmluZywgcmVzaWxpZW50IGluZnJhc3RydWN0dXJlLCBob3VzZWhvbGQgbWl0aWdhdGlvbiwgYW5kIGJ1eW91dHM6ICANCg0KMS4gKipIYXphcmQgTWl0aWdhdGlvbiBHcmFudCBQcm9ncmFtIChITUdQKSoqICANCiAgICArIHByb3ZpZGVzIGZ1bmRpbmcgdG8gbG9jYWwgZ292ZXJubWVudHMgc28gdGhleSBjYW4gZGV2ZWxvcCBoYXphcmQgbWl0aWdhdGlvbiBwbGFucyBhbmQgcmVidWlsZCBpbiBhIHdheSB0aGF0IHJlZHVjZXMsIG9yIG1pdGlnYXRlcywgZnV0dXJlIGRpc2FzdGVyIGxvc3NlcyBpbiB0aGVpciBjb21tdW5pdGllcy4gICANCiAgICArIEF2YWlsYWJpbGl0eTogYWZ0ZXIgYSBwcmVzaWRlbnRpYWxseSBkZWNsYXJlZCBkaXNhc3Rlci4gIA0KICAgICsgQWN0aXZpdGllczogUGxhbm5pbmcgKGNvZGUgZW5mb3JjZW1lbnRzLCBidXlvdXRzKTsgRmxvb2QgUHJvdGVjdGlvbiAobGV2ZWVzLCBmbG9vZHdhbGxzLCBlbGV2YXRpb25zLCBkcmFpbmFnZSk7IFJldHJvZml0dGluZyAgICAgDQoyLiAqKkZsb29kIE1pdGlnYXRpb24gQXNzaXN0YW5jZSAoRk1BKSoqICANCiAgICArIHByb3ZpZGVzIGZ1bmRpbmcgdG8gbG9jYWwgZ292ZXJubWVudHMgZm9yIHByb2plY3RzIHRoYXQgcmVkdWNlIHJpc2sgb2YgcmVwZXRpdGl2ZSBmbG9vZCBkYW1hZ2UgdG8gTkZJUCBpbnN1cmVkIGJ1aWxkaW5ncw0KICAgICsgU3Vic3VtZWQgdHdvIGRlZnVuY3QgcHJvZ3JhbXM6IFJlcGV0aXRpdmUgRmxvb2QgQ2xhaW1zIGdyYW50IHByb2dyYW0gKFJGQykgJiBTZXZlcmUgUmVwZXRpdGl2ZSBMb3NzIGdyYW50IHByb2dyYW0gKFNSTCkgIA0KICAgICsgQXZhaWxhYmlsaXR5OiAgDQogICAgKyBBY3Rpdml0aWVzOiAgDQozLiAqKkJ1aWxkaW5nIFJlc2lsaWVudCBDb21tdW5pdGllcyAoQlJJQykqKiAgDQogICAgKyBTdWJzdW1lZCBQcmUtZGlzYXN0ZXIgTWl0aWdhdGlvbiBQcm9ncmFtIChQRE0pLCB3aGljaCBlbmRlZCBvdXQgb2YgMjAxOCANCiAgICArIEF2YWlsYWJpbGl0eToNCiAgICArIEFjdGl2aXRpZXM6ICJDYXBhYmlsaXR5IGFuZCBjYXBhY2l0eSBidWlsZGluZyIgDQo0LiAqKkxlZ2lzbGF0aXZlIFByZS1kaXNhc3RlciBNaXRpZ2F0aW9uIGdyYW50IHByb2dyYW0gKExQRE0pKiogIA0KICAgICsgQWxzbyBrbm93biBhcyAiUHJlLWRpc2FzdGVyIE1pdGlnYXRpb24gY29uZ3Jlc3Npb25hbCBjb21tdW5pdHkgcHJvamVjdHMiICANCiAgICArIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGlzIGlzIGNvbXBldGl0aXZlIFBETSBmdW5kaW5nIHRoYXQgaXMganVzdCBleHRyYSBhbmQgZm9yIHNvbWUgcmVhc29uIG5vdCBicmFuZGVkIGFzIEJSSUM/ICAgDQoNClRoZSBmdWxsIGV4dGVudCBvZiBob3cgRkVNQSBhbmQgb3RoZXIgYWdlbmNpZXMgd2lsbCB1c2UgdGhlIG5ldyBDRFJaIGRlc2lnbmF0aW9ucyBpcyBzdGlsbCB1bmtub3duLCBidXQgRkVNQSBoYXMgYW5ub3VuY2VkIHRoYXQgQ0RSWiBjZW5zdXMgdHJhY3RzIHdpbGwgcmVjZWl2ZSBwcmlvcml0eSBpbiBzZWxlY3Rpb24gYW5kIGluY3JlYXNlZCBmZWRlcmFsIGNvc3Qgc2hhcmUgc3VwcG9ydCB1bmRlciAqKkJSSUMqKi4gV2UgZXhwbG9yZSB3aGV0aGVyIHRoYXQgcmVwcmVzZW50cyBhIHNpZ25pZmljYW50IHNoaWZ0IGluIHdoZXJlIGhpc3RvcmljYWwgQlJJQyBmdW5kaW5nIGhhcyBiZWVuIGRpcmVjdGVkLiAgIA0KDQojIyMjIyBEYXRhc2V0czogIA0KKiBbKkhhemFyZCBNaXRpZ2F0aW9uIEFzc2lzdGFuY2UgUHJvamVjdHMgKFYzKSpdKGh0dHBzOi8vd3d3LmZlbWEuZ292L29wZW5mZW1hLWRhdGEtcGFnZS9oYXphcmQtbWl0aWdhdGlvbi1hc3Npc3RhbmNlLXByb2plY3RzLXYzKQ0KICArIGZ1bmRlZCBwcm9qZWN0cyB1bmRlciBITUEgZ3JhbnQgcHJvZ3JhbXMsIGluY2x1ZGluZyBITUdQLCBGTUEsIFBETSwgYW5kIEJSSUMgDQogICsgRlkyMDAyIC0gRlkyMDIzIChGWTIwMTkgZm9yIEJSSUMpDQoqIFsqSE1BIFN1YmFwcGxpY2F0aW9ucypdKGh0dHBzOi8vd3d3LmZlbWEuZ292L29wZW5mZW1hLWRhdGEtcGFnZS9obWEtc3ViYXBwbGljYXRpb25zLXYxKQ0KICArIHN1YmFwcGxpY2F0aW9ucyAvIHN1YmdyYW50cyBmb3IgRkVNQSBITUEgZ3JhbnRzLCB3aXRoIGRhdGEgY29sbGVjdGVkIHVuZGVyIEZFTUEgR3JhbnRzIE91dGNvbWUgKEZFTUEgR08pIGdyYW50IHN5c3RlbS4gQ29udGFpbnMgZmllbGRzIG5vdCBpbmNsdWRlZCBpbiBwcmlvciBwcm9qZWN0IGRhdGEsIGR1ZSB0byBpbXByb3ZlZCBncmFudCBtYW5hZ2VtZW50IHN5c3RlbS4gDQogICsgSW5jbHVkZXMgQlJJQyAmIEZNQTsgd2lsbCBpbmNsdWRlIEJSSUMgaW4gQ1kgMjAyMyAgIA0KICArIEZZMjAyMCAtIEZZMjAyMiAgDQoqIFsqSGF6YXJkIE1pdGlnYXRpb24gQXNzaXN0YW5jZSBNaXRpZ2F0ZWQgUHJvcGVydGllcypdKGh0dHBzOi8vd3d3LmZlbWEuZ292L29wZW5mZW1hLWRhdGEtcGFnZS9oYXphcmQtbWl0aWdhdGlvbi1hc3Npc3RhbmNlLW1pdGlnYXRlZC1wcm9wZXJ0aWVzLXYzKSAgDQogICsgZGF0YSBvbiB0aGUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBtaXRpZ2F0ZWQgdW5kZXIgSE1BIGdyYW50IHByb2dyYW1zLCByZXByZXNlbnRpbmcgYSBzdWJzZXQgb2YgdGhlIEhNQSBQcm9qZWN0cyAoVjMpIGZ1bmRzDQogICsgRlkxOTg5IC0gRlkyMDIzDQoNCmBgYHtyfQ0KI0hNQSBkYXRhDQpobWFfcHJvaiA8LSByZWFkLmNzdigiZGF0YV9yYXcvSGF6YXJkTWl0aWdhdGlvbkFzc2lzdGFuY2VQcm9qZWN0cy5jc3YiKQ0KaG1hX3Byb3BzIDwtIHJlYWQuY3N2KCJkYXRhX3Jhdy9IYXphcmRNaXRpZ2F0aW9uQXNzaXN0YW5jZU1pdGlnYXRlZFByb3BlcnRpZXMuY3N2IikNCmhtYV9zdWJhcHBzIDwtIHJlYWQuY3N2KCJkYXRhX3Jhdy9IbWFTdWJhcHBsaWNhdGlvbnMuY3N2IikNCmBgYA0KDQpgYGB7cn0NCiNvdGhlciBkYXRhc2V0cw0KY2RyeiA8LSByZWFkLmNzdigiZGF0YV9yYXcvRkVNQV9Db21tdW5pdHlEaXNhc3RlclJlc2lsaWVuY2Vab25lc18wLmNzdiIpICU+JSANCiAgbXV0YXRlKEdFT0lEMjAgPSBhcy5jaGFyYWN0ZXIoR0VPSUQyMCksIA0KICAgICAgICAgR0VPSUQyMCA9IHN0cl9wYWQoR0VPSUQyMCwgd2lkdGg9MTEsIHNpZGU9ImxlZnQiLCBwYWQ9IjAiKSkNCnh3YWxrIDwtIHJlYWRfZXhjZWwoImRhdGFfcmF3L1RSQUNUX1pJUF8wMzIwMjMueGxzeCIpDQpgYGANCg0KYGBge3J9DQojRGF0YSBrZXlzDQpzdGF0ZXMgPC0gcmVhZC5jc3YoImtleXMvc3RhdGVfZmlwcy5jc3YiLCBjb2xDbGFzc2VzPSJjaGFyYWN0ZXIiKQ0Kc3RhdGVfRklQUyA8LSBkcGx5cjo6cHVsbChzdGF0ZXMsIEZJUFMpDQpicmljX2ZpZWxkcyA8LSByZWFkLmNzdigia2V5cy9icmljX2RhdGFmaWVsZHMuY3N2IikNCmBgYA0KICANCiAgDQojIyMgSGlzdG9yeSBvZiBhbGwgSE1BIGZ1bmRpbmcgIA0KDQpgYGB7cn0NCiNHYXRoZXIgUERNICsgQlJJQyBmdW5kaW5nIGZyb20gdHdvIGRhdGFzZXRzDQpuZXduYW1lcyA8LSBkcGx5cjo6cHVsbChicmljX2ZpZWxkcywgbmV3KQ0Kb2xkbmFtZXMgPC0gZHBseXI6OnB1bGwoYnJpY19maWVsZHMsIG9sZCkNCg0KcHJlMjAyMCA8LSBobWFfcHJvaiAlPiUgDQogIHJlbmFtZV93aXRoKH4gbmV3bmFtZXNbd2hpY2gob2xkbmFtZXMgPT0gLngpXSwgLmNvbHMgPSBvbGRuYW1lcykNCg0KcG9zdDIwMjAgPC0gaG1hX3N1YmFwcHMgJT4lIA0KICBmaWx0ZXIoc3RhdHVzID09ICJzdWJBd2FyZEFjY2VwdGVkIikgJT4lIA0KICBtdXRhdGUoc3ViYXBwbGljYW50WmlwQ29kZSA9IGFzLmNoYXJhY3RlcihzdWJhcHBsaWNhbnRaaXBDb2RlKSkgJT4lIA0KICBtdXRhdGUoc3ViYXBwbGljYW50WmlwQ29kZSA9IHN0cl9wYWQoc3ViYXBwbGljYW50WmlwQ29kZSwgd2lkdGg9NSwgc2lkZT0ibGVmdCIsIHBhZD0iMCIpKQ0KYGBgDQoNCmBgYHtyfQ0KI2NvbWJpbmUgcHJvamVjdCAmIEZFTUEgR08gZGF0YXNldA0KZnVsbF9ITUEgPC0gcG9zdDIwMjAgJT4lIGJpbmRfcm93cyhwcmUyMDIwKSAlPiUgDQogIHNlbGVjdChzdWJhcHBsaWNhdGlvbklkZW50aWZpZXIsIGlkLCBwcm9ncmFtLCBmaXNjYWxZZWFyLCANCiAgICAgICAgIHN1YmFwcGxpY2FudFN0YXRlLCBiZW5lZml0aW5nQ291bnRpZXMsIGFwcGxpY2FudE5hbWUsDQogICAgICAgICBzdGF0dXMsIHRvdGFsU3ViYXBwbGljYXRpb25BbW91bnQsIHRvdGFsT2JsaWdhdGVkQW1vdW50LCBmZWRlcmFsU2hhcmVQZXJjZW50YWdlLCANCiAgICAgICAgIGJlbmVmaXRDb3N0UmF0aW8sIGZ1bmRpbmdDYXRlZ29yeSwgcHJpbWFyeUFjdGl2aXR5LCBwcm9qZWN0VHlwZSkgJT4lIA0KICBtdXRhdGUocHJvZ3JhbSA9IHN0cl9yZXBsYWNlX2FsbChwcm9ncmFtLCBjKCJCdWlsZGluZyBSZXNpbGllbnQgSW5mcmFzdHJ1Y3R1cmUgYW5kIENvbW11bml0aWVzIiA9ICJCUklDIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsb29kIE1pdGlnYXRpb24gQXNzaXN0YW5jZSIgPSAiRk1BIikpKSAlPiUgDQogICMgcmVsYWJlbGluZyBkZWZ1bmN0IHByb2dyYW1zDQogIG11dGF0ZShwcm9ncmFtID0gc3RyX3JlcGxhY2VfYWxsKHByb2dyYW0sIGMoIlJGQyIgPSAiRk1BIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNSTCIgPSAiRk1BIikpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIlBETSIgPSAiQlJJQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJMQlJJQyIgPSAiTFBETSIpKSkNCmBgYA0KDQpgYGB7cn0NCiNDUEkgY29udmVyc2lvbg0KbW9uZXl2YXJzIDwtIGMoInRvdGFsT2JsaWdhdGVkQW1vdW50IiwgInRvdGFsU3ViYXBwbGljYXRpb25BbW91bnQiKQ0KDQpmdWxsX0hNQSA8LSBhcHBseV9jcGkoYmFzZV95ZWFyPSIyMDIyIiwgZGY9ZnVsbF9ITUEsIA0KICAgICAgICAgICAgICAgICAgbW9uZXlfZmllbGRzPW1vbmV5dmFycywgeWVhcl9jb25jYXQ9YygiZmlzY2FsWWVhciIgPSAiWWVhciIpKQ0KDQpgYGANCg0KYGBge3J9DQojZ3JhcGggZGF0YSBmcmFtZQ0KZ2RmIDwtIGZ1bGxfSE1BICU+JSBncm91cF9ieShwcm9ncmFtLCBmaXNjYWxZZWFyKSAlPiUgc3VtbWFyaXplKG9ibGlnYXRlZCA9IHN1bSh0b3RhbE9ibGlnYXRlZEFtb3VudCksIGFwcF90b3RhbHMgPSBzdW0odG90YWxTdWJhcHBsaWNhdGlvbkFtb3VudCwgbmEucm09VFJVRSkpICU+JSANCiAgI2NvbnZlcnQgdG8gQklMTElPTlMNCiAgbXV0YXRlKG9ibGlnYXRlZCA9IG9ibGlnYXRlZCAvIDEwMDAwMDAwMDApDQpgYGANCg0KYGBge3J9DQpwIDwtIGdkZiAlPiUNCiAgZ2dwbG90KCBhZXMoeD1maXNjYWxZZWFyLCB5PW9ibGlnYXRlZCwgZmlsbD1mYWN0b3IocHJvZ3JhbSwgbGV2ZWxzPWMoIkhNR1AiLCAiRk1BIiwiUERNIiwiQlJJQyIsICJMUERNIikpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5ODksIDIwMjMsIDMpKSArDQogICNnZW9tX3BvaW50KCkgKw0KICBnZ3RpdGxlKCJBbGwgRkVNQSBITUEgZnVuZGVkIHByb2plY3RzIGJ5IEZpc2NhbCBZZWFyIikgKw0KICB5bGFiKCIkQmlsbGlvbnMgKCQyMDIyKSIpICsNCiAgeGxhYigiRmlzY2FsIFllYXIiKSArDQogIGxhYnMoY2FwdGlvbj0iTm90ZTogRk1BIGluY2x1ZGVzIFJGQyAmIFNSTDsgQlJJQyBpbmNsdWRlcyBQRE0iLA0KICAgICAgIGZpbGw9InByb2dyYW0iKSArIA0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KcA0KYGBgDQoNCiMjIyBIaXN0b3J5IG9mIFBETSAvIEJSSUMgRnVuZGluZyAgDQogIA0KKioqUERNIC8gQlJJQyBGVU5ESU5HOioqKiAgDQpCUklDIGlzIG9uZSBvZiB0aGUgcHJvZ3JhbXMgdGhhdCBDRFJacyBkZXNpZ25hdGlvbnMgd2lsbCBhZmZlY3QgZnVuZGluZyBmb3IuICANCiAgDQoqIFByaW9yIHRvIDIwMjA6ICpITUEgUHJvamVjdHMqICANCiAgKyBQcmUtMjAxOTogQlJJQyB3YXMgY2FsbGVkIHRoZSAicHJlLWRpc2FzdGVyIG1pdGlnYXRpb24iIChQRE0pIHByb2dyYW0gIA0KICArIDIwMTk6IHJlbmFtZWQgYXMgIkJSSUMiICAgIA0KKiAyMDIwIG9ud2FyZDogKkhNQSBTdWJhcHBsaWNhdGlvbnMqICANCg0KYGBge3J9DQpmdWxsX0JSSUMgPC0gZnVsbF9ITUEgJT4lIA0KICBmaWx0ZXIocHJvZ3JhbSA9PSAiUERNIiB8IHByb2dyYW0gPT0gIkxQRE0iIHwgcHJvZ3JhbSA9PSAiQlJJQyIpDQpgYGANCg0KDQpgYGB7cn0NCiMgZ3JhcGggZGF0YSBmcmFtZQ0KZ2RmIDwtIGZ1bGxfQlJJQyAlPiUgZ3JvdXBfYnkocHJvZ3JhbSwgZmlzY2FsWWVhcikgJT4lIHN1bW1hcml6ZShvYmxpZ2F0ZWQgPSBzdW0odG90YWxPYmxpZ2F0ZWRBbW91bnQpLCBhcHBfdG90YWxzID0gc3VtKHRvdGFsU3ViYXBwbGljYXRpb25BbW91bnQsIG5hLnJtPVRSVUUpKSAlPiUgDQogICMgY29udmVydCB0byBNSUxMSU9OUw0KICBtdXRhdGUob2JsaWdhdGVkID0gb2JsaWdhdGVkIC8gMTAwMDAwMCkNCmBgYA0KDQpgYGB7cn0NCnAgPC0gZ2RmICU+JQ0KICBnZ3Bsb3QoIGFlcyh4PWZpc2NhbFllYXIsIHk9b2JsaWdhdGVkLCBmaWxsPXByb2dyYW0pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCwgMjAyMywgMikpICsNCiAgI2dlb21fcG9pbnQoKSArDQogIGdndGl0bGUoIlByZS1EaXNhc3RlciBNaXRpZ2F0aW9uICsgQnVpbGRpbmcgUmVzaWxpZW50IENvbW11bml0aWVzIGZ1bmRpbmcgYnkgRmlzY2FsIFllYXIiKSArDQogIHlsYWIoIiRNaWxsaW9ucyAobm9taW5hbCkiKSArDQogIHhsYWIoIkZpc2NhbCBZZWFyIikgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNFNzhBQzMiLCAiI0E2RDg1NCIsICIjOERBMENCIikpDQogICNzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KcA0KYGBgDQoNCg0KYGBge3J9DQojIEJSSUMgKyBDRFJaIG92ZXJsYXANCiMgZXN0aW1hdGUgcGVyIGNvdW50eSBiZW5lZml0cyBvZiBCUklDIGZ1bmRpbmcgKGZ1bmRpbmcgaXMgZXF1YWxseSBkaXN0cmlidXRlZCBhY3Jvc3MgImJlbmVmaXRpbmcgY291bnRpZXMiKQ0KIyBmIDwtIEJSSUNfcG9zdDIwMjAgJT4lIA0KIyAgIHNlbGVjdChzdWJhcHBsaWNhdGlvbklkZW50aWZpZXIsIHN1YmFwcGxpY2FudFN0YXRlLCBiZW5lZml0aW5nQ291bnRpZXMsIHRvdGFsT2JsaWdhdGVkQW1vdW50LCBmZWRlcmFsU2hhcmVQZXJjZW50YWdlKSAlPiUgDQojICAgc2VwYXJhdGVfbG9uZ2VyX2RlbGltKGJlbmVmaXRpbmdDb3VudGllcywgZGVsaW0gPSAiOyAiKSAlPiUgDQojICAgZ3JvdXBfYnkoc3ViYXBwbGljYXRpb25JZGVudGlmaWVyKSAlPiUgDQojICAgbXV0YXRlKGRpc3RyaWJ1dGVkX2Ftb3VudCA9IHRvdGFsT2JsaWdhdGVkQW1vdW50IC8gbigpKSAlPiUgDQojICAgdW5ncm91cCgpICU+JSANCiMgICBtdXRhdGUoc3ViYXBwbGljYW50U3RhdGUgPSBzdHJfdG9fdGl0bGUoc3ViYXBwbGljYW50U3RhdGUpLA0KIyAgICAgICAgICBiZW5lZml0aW5nQ291bnRpZXMgPSBzdHJfdG9fdGl0bGUoYmVuZWZpdGluZ0NvdW50aWVzKSkgJT4lIA0KIyAgIG11dGF0ZShiZW5lZml0aW5nQ291bnRpZXMgPSBzdHJfcmVtb3ZlX2FsbChiZW5lZml0aW5nQ291bnRpZXMsICIgQ291bnR5IikpICU+JSANCiMgICBncm91cF9ieShzdWJhcHBsaWNhbnRTdGF0ZSwgYmVuZWZpdGluZ0NvdW50aWVzKSAlPiUgDQojICAgc3VtbWFyaXplKHN1bV9kaXN0cmlidXRlZF9hbW91bnQgPSBzdW0oZGlzdHJpYnV0ZWRfYW1vdW50KSkNCiMgDQojICNzdW1tYXJpemUgIyBvZiBjZHJ6IHRyYWN0cyBpbiBjb3VudHkNCiMgYyA8LSBjZHJ6ICU+JSBncm91cF9ieShTdGF0ZSwgQ291bnR5KSAlPiUgc3VtbWFyaXplKG5fdHJhY3RzID0gbigpKQ0KIyANCiMgIyBqb2luIGNkcnogdHJhY3QgY291bnQgKyBmdW5kaW5nIGVzdGltYXRlcw0KIyBjZiA8LSBmICU+JSBmdWxsX2pvaW4oYywgYnk9Yygic3ViYXBwbGljYW50U3RhdGUiID0gIlN0YXRlIiwgImJlbmVmaXRpbmdDb3VudGllcyIgPSAiQ291bnR5IikpDQpgYGANCg0KDQpgYGB7cn0NCiMgQlJJQyArIENEUlogb3ZlcmxhcA0KIyBlc3RpbWF0ZSBwZXIgY291bnR5IGJlbmVmaXRzIG9mIEJSSUMgZnVuZGluZyAoZnVuZGluZyBpcyBlcXVhbGx5IGRpc3RyaWJ1dGVkIGFjcm9zcyAiYmVuZWZpdGluZyBjb3VudGllcyIpDQpmIDwtIGZ1bGxfQlJJQyAlPiUgDQogIHNlbGVjdChzdWJhcHBsaWNhdGlvbklkZW50aWZpZXIsIHN1YmFwcGxpY2FudFN0YXRlLCBiZW5lZml0aW5nQ291bnRpZXMsIHRvdGFsT2JsaWdhdGVkQW1vdW50LCBmZWRlcmFsU2hhcmVQZXJjZW50YWdlKSAlPiUgDQogIHNlcGFyYXRlX2xvbmdlcl9kZWxpbShiZW5lZml0aW5nQ291bnRpZXMsIGRlbGltID0gIjsgIikgJT4lIA0KICBncm91cF9ieShzdWJhcHBsaWNhdGlvbklkZW50aWZpZXIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGVkX2Ftb3VudCA9IHRvdGFsT2JsaWdhdGVkQW1vdW50IC8gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShzdWJhcHBsaWNhbnRTdGF0ZSA9IHN0cl90b190aXRsZShzdWJhcHBsaWNhbnRTdGF0ZSksDQogICAgICAgICBiZW5lZml0aW5nQ291bnRpZXMgPSBzdHJfdG9fdGl0bGUoYmVuZWZpdGluZ0NvdW50aWVzKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpdGluZ0NvdW50aWVzID0gc3RyX3JlbW92ZV9hbGwoYmVuZWZpdGluZ0NvdW50aWVzLCAiIENvdW50eSIpKSAlPiUgDQogIGdyb3VwX2J5KHN1YmFwcGxpY2FudFN0YXRlLCBiZW5lZml0aW5nQ291bnRpZXMpICU+JSANCiAgc3VtbWFyaXplKHN1bV9kaXN0cmlidXRlZF9hbW91bnQgPSBzdW0oZGlzdHJpYnV0ZWRfYW1vdW50KSkNCg0KI3N1bW1hcml6ZSAjIG9mIGNkcnogdHJhY3RzIGluIGNvdW50eQ0KYyA8LSBjZHJ6ICU+JSBncm91cF9ieShTdGF0ZSwgQ291bnR5KSAlPiUgc3VtbWFyaXplKG5fdHJhY3RzID0gbigpKQ0KDQojIGpvaW4gY2RyeiB0cmFjdCBjb3VudCArIGZ1bmRpbmcgZXN0aW1hdGVzDQpjZiA8LSBmICU+JSBmdWxsX2pvaW4oYywgYnk9Yygic3ViYXBwbGljYW50U3RhdGUiID0gIlN0YXRlIiwgImJlbmVmaXRpbmdDb3VudGllcyIgPSAiQ291bnR5IikpDQpgYGANCg0KDQpgYGB7cn0NCiMgSk9JTiB0byBhbGwgY291bnRpZXMNCiNwdWxsIGZ1bGwgbGlzdCBvZiBjb3VudGllcw0KYWxsX2NvdW50aWVzIDwtIHRpZ3Jpczo6Y291bnRpZXMoc3RhdGU9c3RhdGVfRklQUywgY2I9VFJVRSkgJT4lDQogIHRpZ3Jpczo6c2hpZnRfZ2VvbWV0cnkoKQ0KDQpjb3VudGllc19jZiA8LSBhbGxfY291bnRpZXMgJT4lIA0KICBsZWZ0X2pvaW4oY2YsIGJ5PWMoIlNUQVRFX05BTUUiID0gInN1YmFwcGxpY2FudFN0YXRlIiwgIk5BTUUiID0gImJlbmVmaXRpbmdDb3VudGllcyIpKSAlPiUgDQogIG11dGF0ZShzdW1fYnVja2V0cyA9IG50aWxlKHN1bV9kaXN0cmlidXRlZF9hbW91bnQsIDEwKSkgJT4lIA0KICBtdXRhdGUoc3VtX21pbGwgPSBzdW1fZGlzdHJpYnV0ZWRfYW1vdW50LzEwMDAwMDApDQoNCmBgYA0KDQoNCiMjIyBDb21wYXJpbmcgcHJldmlvdXMgZnVuZGluZyB2cy4gQ0RSWiBkZXNpZ25hdGlvbnMgIA0KKiBFc3RpbWF0aW9ucyBhdCBjb3VudHkgbGV2ZWwgIA0KKiBCUklDIGZ1bmRpbmcgcG9zdCBGWTIwMjAgYXR0cmlidXRlZCB0byBhbGwgImJlbmVmaXR0aW5nIGNvdW50aWVzIi4gV2hlbiBtdWx0aXBsZSBhcmUgbGlzdGVkLCB0b3RhbCBvYmxpZ2F0ZWQgZnVuZHMgYXJlIGVxdWFsbHkgZGlzdHJpYnV0ZWQgIA0KKiBQZXIgQ291bnR5IEZ1bmRpbmcgc3VtbWVkIGFjcm9zcyBhbGwgZmlzY2FsIHllYXJzIChGWTIwMDAgLSBGWTIwMjEpICANCiogQ0RSWiBzdW1tZWQgYXMgYSBjb3VudCB3aXRoaW4gdGhlIGNvdW50eSAgDQoqIFNvbWUgaGlzdG9yaWNhbCByZWNvcmRzIHByZSBGWTIwMjAgZG8gbm90IGhhdmUgYSAiYmVuZWZpdHRpbmcgY291bnR5IiBkZXNpZ25hdGVkLiBJJ3ZlIG9taXR0ZWQgdGhvc2UgZm9yIG5vdy4gDQoNCmBgYHtyfQ0KIyBjb3VudGllc19jZiAlPiUNCiMgICBnZ3Bsb3QoIGFlcyh4PXN1bV9taWxsKSkgKw0KIyAgICAgZ2VvbV9oaXN0b2dyYW0oYmlucz00MCwgZmlsbD0nc2t5Ymx1ZScsIGNvbG9yPScjNjliM2EyJykNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9MTF9DQpsaWJyYXJ5KHZpcmlkaXMsIGNvd3Bsb3QpDQojY29sLnJhbXAgPC0gdmlyaWRpcyhuID0gMTApDQojY291bnRpZXNfY2YgPC0gY291bnRpZXNfY2YgJT4lIG11dGF0ZShzdW1fbWlsbCA9IHJlcGxhY2VfbmEoc3VtX21pbGwsMCkpDQoNCnFhIDwtIHF1YW50aWxlKGNvdW50aWVzX2NmJHN1bV9taWxsLCBjKDAsIDAuMSwgMC4yLCAwLjMsIDAuNCwgMC41LCAwLjYsIDAuNywgMC44LCAwLjksMS4wKSwgbmEucm09VFJVRSkNCmNvdW50aWVzX2NmJHN1bV9taWxsX3EgPC0gY3V0KGNvdW50aWVzX2NmJHN1bV9taWxsLCBxYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAtMTAlIiwgIjIwJSIsICIzMCUiLCAiNDAlIiwgIjUwJSIsICI2MCUiLCAiNzAlIiwgIjgwJSIsICI5MCUiLCAiPjkwJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKQ0KY29sLnBhbCA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiM1NTk5OTkiLCAiZ3JleTgwIiwgIiNCQjY1MEIiKSkoMTApDQoNCg0KcDEgPC0gZ2dwbG90KGRhdGE9Y291bnRpZXNfY2YsIGFlcyhmaWxsPXN1bV9taWxsX3EpKSArIA0KICBnZW9tX3NmKGNvbG9yPU5BKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2wucGFsLCBuYS52YWx1ZSA9ICJncmV5NTAiKSArDQogICNzY2FsZV9maWxsX3ZpcmlkaXMoKSArDQogIGxhYnMoZmlsbD0iQmVuZWZpdHNcblBlcmNlbnRpbGUiKSArIA0KICB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNSwgdW5pdHM9ImNtIiksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkNCg0KcDIgPC0gZ2dwbG90KGRhdGE9Y291bnRpZXNfY2YsIGFlcyhmaWxsPXN1bV9taWxsKSkgKyANCiAgZ2VvbV9zZihjb2xvcj1OQSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IGMoMCwgMTApLCBvb2IgPSBzY2FsZXM6OnNxdWlzaCkgKyANCiAgbGFicyhmaWxsPSJCZW5lZml0c1xuTWlsbGlvbnMgKCQyMDIyKSIpICsgDQogIHRoZW1lKGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC41LCB1bml0cz0iY20iKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQ0KDQojIHRpdGxlX2dnIDwtIGdncGxvdCgpICsgDQojICAgbGFicyh0aXRsZSA9ICJUb3RhbCBGRU1BIFBETStCUklDIEZlZGVyYWwgRnVuZGluZyBCZW5lZml0cywgYnkgQ291bnR5IiwgDQojICAgICAgICBzdWJ0aXRsZSA9ICJPYmxpZ2F0ZWQgcHJvamVjdCBmdW5kaW5nIGZyb20gRlkyMDAwIC0gRlkyMDIxIikNCg0KcHRpdGxlIDwtIGNvd3Bsb3Q6OmdnZHJhdygpICsgDQogIGNvd3Bsb3Q6OmRyYXdfbGFiZWwoIlRvdGFsIEZFTUEgUERNK0JSSUMgRmVkZXJhbCBGdW5kaW5nIEJlbmVmaXRzLCBieSBDb3VudHkiKSArDQogICNjb3dwbG90OjpkcmF3X2xhYmVsKCJPYmxpZ2F0ZWQgcHJvamVjdCBmdW5kaW5nIGZyb20gRlkyMDAwIC0gRlkyMDIxIikgKyANCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpDQoNCmNvd3Bsb3Q6OnBsb3RfZ3JpZChwdGl0bGUsIHAxLCBwMiwgbmNvbD0xLCByZWxfaGVpZ2h0cyA9IGMoMC4xLCAxLCAxKSkNCg0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTExfQ0KcDEgPC0gZ2dwbG90KGRhdGE9Y291bnRpZXNfY2YsIGFlcyhmaWxsPWZhY3RvcihuX3RyYWN0cykpKSArIA0KICBnZW9tX3NmKGNvbG9yPU5BKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIllsT3JSZCIsIG5hLnZhbHVlID0gImdyZXk1MCIpICsNCiAgICAjc2NhbGVfZmlsbF9ncmFkaWVudDIoKSArIA0KICBsYWJzKGZpbGw9IiMgQ0RSWnMgVHJhY3RzIikgKyANCiAgdGhlbWUobGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjUsIHVuaXRzPSJjbSIpLCANCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpDQoNCiMgdGl0bGVfZ2cgPC0gZ2dwbG90KCkgKyANCiMgICBsYWJzKHRpdGxlID0gIlRvdGFsIEZFTUEgUERNK0JSSUMgRmVkZXJhbCBGdW5kaW5nIEJlbmVmaXRzLCBieSBDb3VudHkiLCANCiMgICAgICAgIHN1YnRpdGxlID0gIk9ibGlnYXRlZCBwcm9qZWN0IGZ1bmRpbmcgZnJvbSBGWTIwMDAgLSBGWTIwMjEiKQ0KDQpwdGl0bGUgPC0gY293cGxvdDo6Z2dkcmF3KCkgKyANCiAgY293cGxvdDo6ZHJhd19sYWJlbCgiQ291bnQgb2YgQ0RSWi1kZXNpZ25hdGVkIFRyYWN0cywgYnkgQ291bnR5IikgKw0KICAjY293cGxvdDo6ZHJhd19sYWJlbCgiT2JsaWdhdGVkIHByb2plY3QgZnVuZGluZyBmcm9tIEZZMjAwMCAtIEZZMjAyMSIpICsgDQogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDcpKQ0KDQpjb3dwbG90OjpwbG90X2dyaWQocHRpdGxlLCBwMSwgbmNvbD0xLCByZWxfaGVpZ2h0cyA9IGMoMC4xLCAxKSkNCg0KYGBgDQoNCg0K