LyoKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKCQkJICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSAiYnR0dnAuaCIKI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CgovKiBmd2QgZGVjbCAqLwpzdGF0aWMgdm9pZCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbik7CnN0YXRpYyB2b2lkIGJvb3RfYnQ4MzIoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGhhdXBwYXVnZV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIG1vZHRlY19lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGluaXRfUFhDMjAwKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBpbml0X1JUVjI0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQgd2ludmlld19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBsdDk0MTVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAoJCQkJICAgIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwKCQkJCSAgICAgIGludCBzZXQpOwpzdGF0aWMgdm9pZCB0ZXJyYXR2X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGd2YmN0djNwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZ3ZiY3R2NXBjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCB3aW5mYXN0MjAwMF9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBwdmJ0ODc4cDliX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGZ2MjAwMHNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgd2luZHZyX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGFkdHZrNTAzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBlYWdsZV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgeGd1YXJkX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGd2YzExMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CgpzdGF0aWMgdm9pZCBQWEMyMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CgpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQgdGliZXRDUzE2X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCB0aWJldENTMTZfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCBzaWdtYVNMQ19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgc2lnbWFTUV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyBpbnQgdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgaW50IHRlYTU3NTdfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHZhbHVlKTsKc3RhdGljIHZvaWQgaWRlbnRpZnlfYnlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl0pOwpzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYm9vdChzdHJ1Y3QgYnR0diAqYnR2KTsKCi8qIGNvbmZpZyB2YXJpYWJsZXMgKi8Kc3RhdGljIHVuc2lnbmVkIGludCB0cml0b24xOwpzdGF0aWMgdW5zaWduZWQgaW50IHZzZng7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwppbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQ7CiNlbmRpZgpzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9tYXNrID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9hbGwgPSBVTlNFVDsKc3RhdGljIHVuc2lnbmVkIGludCBhdWRpb211eFs1XSA9IHsgWyAwIC4uLiA0IF0gPSBVTlNFVCB9OwoKLyogaW5zbW9kIG9wdGlvbnMgKi8KbW9kdWxlX3BhcmFtKHRyaXRvbjEsICAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbSh2c2Z4LCAgICAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0obm9fb3ZlcmxheSwgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGxhdGVuY3ksICAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShncGlvbWFzaywgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oYXVkaW9hbGwsICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1dG9sb2FkLCAgIGludCwgMDQ0NCk7Cgptb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShwbGwsICAgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHR1bmVyLCAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkoc3ZocywgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShyZW1vdGUsICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KGF1ZGlvbXV4LCBpbnQsIE5VTEwsIDA0NDQpOwoKTU9EVUxFX1BBUk1fREVTQyh0cml0b24xLCJzZXQgRVRCRiBwY2kgY29uZmlnIGJpdCAiCgkJICJbZW5hYmxlIGJ1ZyBjb21wYXRpYmlsaXR5IGZvciB0cml0b24xICsgb3RoZXJzXSIpOwpNT0RVTEVfUEFSTV9ERVNDKHZzZngsInNldCBWU0ZYIHBjaSBjb25maWcgYml0ICIKCQkgIlt5ZXQgYW5vdGhlciBjaGlwc2V0IGZsYXcgd29ya2Fyb3VuZF0iKTsKTU9EVUxFX1BBUk1fREVTQyhsYXRlbmN5LCJwY2kgbGF0ZW5jeSB0aW1lciIpOwpNT0RVTEVfUEFSTV9ERVNDKGNhcmQsInNwZWNpZnkgVFYvZ3JhYmJlciBjYXJkIG1vZGVsLCBzZWUgQ0FSRExJU1QgZmlsZSBmb3IgYSBsaXN0Iik7Ck1PRFVMRV9QQVJNX0RFU0MocGxsLCJzcGVjaWZ5IGluc3RhbGxlZCBjcnlzdGFsICgwPW5vbmUsIDI4PTI4IE1IeiwgMzU9MzUgTUh6KSIpOwpNT0RVTEVfUEFSTV9ERVNDKHR1bmVyLCJzcGVjaWZ5IGluc3RhbGxlZCB0dW5lciB0eXBlIik7Ck1PRFVMRV9QQVJNX0RFU0MoYXV0b2xvYWQsImF1dG9tYXRpY2FsbHkgbG9hZCBpMmMgbW9kdWxlcyBsaWtlIHR1bmVyLm8sIGRlZmF1bHQgaXMgMSAoeWVzKSIpOwpNT0RVTEVfUEFSTV9ERVNDKG5vX292ZXJsYXksImFsbG93IG92ZXJyaWRlIG92ZXJsYXkgZGVmYXVsdCAoMCBkaXNhYmxlcywgMSBlbmFibGVzKSIKCQkiIFtzb21lIFZJQS9TSVMgY2hpcHNldHMgYXJlIGtub3duIHRvIGhhdmUgcHJvYmxlbSB3aXRoIG92ZXJsYXldIik7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBsaXN0IG9mIGNhcmQgSURzIGZvciBidDg3OCsgY2FyZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHN0cnVjdCBDQVJEIHsKCXVuc2lnbmVkIGlkOwoJaW50IGNhcmRucjsKCWNoYXIgKm5hbWU7Cn0gY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewoJeyAweDEzZWIwMDcwLCBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3OCwgICJIYXVwcGF1Z2UgV2luVFYiIH0sCgl7IDB4MzkwMDAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UVi1EIiB9LAoJeyAweDQ1MDAwMDcwLCBCVFRWX0JPQVJEX0hBVVBQQVVHRVBWUiwgICJIYXVwcGF1Z2UgV2luVFYvUFZSIiB9LAoJeyAweGZmMDAwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTF4MCwgICAgICJPc3ByZXktMTAwIiB9LAoJeyAweGZmMDEwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTJ4MF9TVklELCJPc3ByZXktMjAwIiB9LAoJeyAweGZmMDIwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTUwMCwgICAgICJPc3ByZXktNTAwIiB9LAoJeyAweGZmMDMwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTIwMDAsICAgICJPc3ByZXktMjAwMCIgfSwKCXsgMHhmZjA0MDA3MCwgQlRUVl9CT0FSRF9PU1BSRVk1NDAsICAgICAiT3NwcmV5LTU0MCIgfSwKCXsgMHhmZjA3MDA3MCwgQlRUVl9CT0FSRF9PU1BSRVk0NDAsICAgICAiT3NwcmV5LTQ0MCIgfSwKCgl7IDB4MDAwMTEwMDIsIEJUVFZfQk9BUkRfQVRJX1RWV09OREVSLCAgIkFUSSBUViBXb25kZXIiIH0sCgl7IDB4MDAwMzEwMDIsIEJUVFZfQk9BUkRfQVRJX1RWV09OREVSVkUsIkFUSSBUViBXb25kZXIvVkUiIH0sCgoJeyAweDY2MDYxMDdkLCBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHg2NjA3MTA3ZCwgQlRUVl9CT0FSRF9XSU5GQVNUVkMxMDAsICAiTGVhZHRlayBXaW5GYXN0IFZDIDEwMCIgfSwKCXsgMHg2NjA5MTA3ZCwgQlRUVl9CT0FSRF9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBUViAyMDAwIFhQIiB9LAoJeyAweDI2MzYxMGI0LCBCVFRWX0JPQVJEX1NUQjIsICAgICAgICAgICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IiB9LAoJeyAweDI2NDUxMGI0LCBCVFRWX0JPQVJEX1NUQjIsICAgICAgICAgICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IiB9LAoJeyAweDQwMjAxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjNQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjMvUENJIiB9LAoJeyAweDQwNTAxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAoJeyAweDQwNzAxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAoJeyAweGQwMTgxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAoKCXsgMHgwMDEyMTFiZCwgQlRUVl9CT0FSRF9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCS8qIHNvbWUgY2FyZHMgc2hpcCB3aXRoIGJ5dGVzd2FwcGVkIElEcyAuLi4gKi8KCXsgMHgxMjAwYmQxMSwgQlRUVl9CT0FSRF9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJeyAweGZmMDBiZDExLCBCVFRWX0JPQVJEX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIFtic3dhcF0iIH0sCgkvKiB0aGlzIHNlZW1zIHRvIGhhcHBlbiBhcyB3ZWxsIC4uLiAqLwoJeyAweGZmMTIxMWJkLCBCVFRWX0JPQVJEX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIiB9LAoKCXsgMHgzMDAwMTIxYSwgQlRUVl9CT0FSRF9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDI2MzcxMGI0LCBCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNLCAgICIzRGZ4IFZvb2Rvb1RWIEZNLyBWb29kb29UViAyMDAiIH0sCgl7IDB4MzA2MDEyMWEsIEJUVFZfQk9BUkRfU1RCMiwJICAiM0RmeCBWb29kb29UViAxMDAvIFNUQiBPRU0iIH0sCgoJeyAweDMwMDAxNDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjMsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2eCIgfSwKCXsgMHhhMDA1MTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzLCAiQ1BIMDZYIFRWaWV3OTktQ2FyZCIgfSwKCXsgMHgzMDAyMTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYxLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNXgiIH0sCgl7IDB4MzAwNTE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDYxLzA2TCAoVDEvTEMpIiB9LAoJeyAweDUwMDAxNDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjEsICJBc2tleSBDUEgwNTAiIH0sCgl7IDB4MzAwMDE0ZmYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MSwgIlRWaWV3IDk5IChDUEgwNjEpIiB9LAoJeyAweDMwMDIxNGZmLCBCVFRWX0JPQVJEX1BIT0VCRV9UVk1BUywgICJQaG9lYmUgVFYgTWFzdGVyIChDUEgwNjApIiB9LAoKCXsgMHgwMDAxMTQ2MSwgQlRUVl9CT0FSRF9BVlBIT05FOTgsICAgICAiQVZlck1lZGlhIFRWUGhvbmU5OCIgfSwKCXsgMHgwMDAyMTQ2MSwgQlRUVl9CT0FSRF9BVkVSTUVESUE5OCwgICAiQVZlcm1lZGlhIFRWQ2FwdHVyZSA5OCIgfSwKCXsgMHgwMDAzMTQ2MSwgQlRUVl9CT0FSRF9BVlBIT05FOTgsICAgICAiQVZlck1lZGlhIFRWUGhvbmU5OCIgfSwKCXsgMHgwMDA0MTQ2MSwgQlRUVl9CT0FSRF9BVkVSTUVESUE5OCwgICAiQVZlck1lZGlhIFRWQ2FwdHVyZSA5OCIgfSwKCXsgMHgwMzAwMTQ2MSwgQlRUVl9CT0FSRF9BVkVSTUVESUE5OCwgICAiVkRPTUFURSBUViBUVU5FUiBDQVJEIiB9LAoKCXsgMHgxMTE3MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBCL0cpIiB9LAoJeyAweDExMTgxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKFRlbWljIFBBTCBCL0cpIiB9LAoJeyAweDExMTkxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKFBoaWxpcHMgUEFMIEkpIiB9LAoJeyAweDExMWExNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKFRlbWljIFBBTCBJKSIgfSwKCgl7IDB4MTEyMzE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVlJBRElPLCAgIlRlcnJhdGVjIFRWIFJhZGlvKyIgfSwKCXsgMHgxMTI3MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWLCAgICAgICAiVGVycmF0ZWMgVFYrIChWMS4wNSkiICAgIH0sCgkvKiBjbGFzaGVzIHdpdGggRmx5VmlkZW8KCSAqeyAweDE4NTIxODUyLCBCVFRWX0JPQVJEX1RFUlJBVFYsICAgICAiVGVycmF0ZWMgVFYrIChWMS4xMCkiICAgIH0sICovCgl7IDB4MTEzNDE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoTFIxMDIpIiB9LAoJeyAweDExMzUxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8qIExSMTAyICovCgl7IDB4NTAxODE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSIgfSwgICAgICAgLyogPz8gKi8KCXsgMHhmZjNiMTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvKiA/PyAqLwoKCXsgMHg0MDAwMTViMCwgQlRUVl9CT0FSRF9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViIgfSwKCXsgMHg0MDBhMTViMCwgQlRUVl9CT0FSRF9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViIgfSwKCXsgMHg0MDBkMTViMCwgQlRUVl9CT0FSRF9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTAxNWIwLCBCVFRWX0JPQVJEX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgl7IDB4NDAxNjE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCgl7IDB4MTQzMGFhMDAsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQSIgfSwKCXsgMHgxNDMxYWEwMCwgQlRUVl9CT0FSRF9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNCIiB9LAoJeyAweDE0MzJhYTAwLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0MiIH0sCgl7IDB4MTQzM2FhMDAsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzRCIgfSwKCXsgMHgxNDMzYWEwMywgQlRUVl9CT0FSRF9QVjE0MywgICAgICAgICAiU2VjdXJpdHkgRXllcyIgfSwKCgl7IDB4MTQ2MGFhMDAsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0xIiB9LAoJeyAweDE0NjFhYTAxLCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMiIgfSwKCXsgMHgxNDYyYWEwMiwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTMiIH0sCgl7IDB4MTQ2M2FhMDMsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS00IiB9LAoKCXsgMHgxNDY0YWEwNCwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTEiIH0sCgl7IDB4MTQ2NWFhMDUsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0yIiB9LAoJeyAweDE0NjZhYTA2LCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMyIgfSwKCXsgMHgxNDY3YWEwNywgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTQiIH0sCgoJeyAweGExMzJmZjAwLCBCVFRWX0JPQVJEX0lWQzEwMCwgICAgICAgICJJVkMtMTAwIiAgfSwKCXsgMHhhMTU1MDAwMCwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDEsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAyLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMywgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAxMDAsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAxLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMiwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDMsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExODJmZjAwLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMSwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDIsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAzLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNCwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDUsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA2LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNywgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDgsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA5LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYSwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGIsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBjLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZCwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGUsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBmLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCgl7IDB4NDE0MjQzNDQsIEJUVFZfQk9BUkRfR1JBTkRURUMsICAgICAgIkdyYW5kVGVjIE11bHRpIENhcHR1cmUiIH0sCgl7IDB4MDEwMjAzMDQsIEJUVFZfQk9BUkRfWEdVQVJELCAgICAgICAgIkdyYW5kdGVjIEdyYW5kIFgtR3VhcmQiIH0sCgoJeyAweDE4NTAxODUxLCBCVFRWX0JPQVJEX0NIUk9OT1NfVlMyLCAgICJGbHlWaWRlbyA5OCAoTFI1MCkvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIgfSwKCXsgMHhhMDUwMTg1MSwgQlRUVl9CT0FSRF9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4MTg1MTE4NTEsIEJUVFZfQk9BUkRfRkxZVklERU85OEVaLCAgIkZseVZpZGVvIDk4RVogKExSNTEpLyBDeWJlck1haWwgQVYiIH0sCgl7IDB4MTg1MjE4NTIsIEJUVFZfQk9BUkRfVFlQSE9PTl9UVklFVywgIkZseVZpZGVvIDk4Rk0gKExSNTApLyBUeXBob29uIFRWaWV3IFRWL0ZNIFR1bmVyIiB9LAoJeyAweDQxYTBhMDUxLCBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4Rk0sICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIFJldiBRIiB9LAoJeyAweDE4NTAxZjdmLCBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4LCAgICJMaWZldmlldyBGbHl2aWRlbyA5OCIgfSwKCiAgICAJeyAweDAxMDExNWNiLCBCVFRWX0JPQVJEX0dNVjEsICAgICAgICAgICJBRyBHTVYxIiB9LAoJeyAweDAxMDExNGM3LCBCVFRWX0JPQVJEX01PRFRFQ18yMDUsICAgICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViIgfSwKCgl7IDB4MTBiNDI2MzYsIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4LCAgIlNUQiA/Pz8iIH0sCgl7IDB4MjE3ZDY2MDYsIEJUVFZfQk9BUkRfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweGZmZjZmNmZmLCBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHgwMzExNjAwMCwgQlRUVl9CT0FSRF9TRU5TT1JBWTMxMSwgICAiU2Vuc29yYXkgMzExIiB9LAoJeyAweDAwNzkwZTExLCBCVFRWX0JPQVJEX1dJTkRWUiwgICAgICAgICJDYW5vcHVzIFdpbkRWUiBQQ0kiIH0sCgl7IDB4YTBmY2ExYTAsIEJUVFZfQk9BUkRfWk9MVFJJWCwgICAgICAgIkZhY2UgdG8gRmFjZSBUdm1heCIgfSwKCXsgMHg4MmIyYWE2YSwgQlRUVl9CT0FSRF9TSU1VU19HVkMxMTAwLCAiU0lNVVMgR1ZDMTEwMCIgfSwKCXsgMHgxNDZjYWEwYywgQlRUVl9CT0FSRF9QVjk1MSwgICAgICAgICAiaXR1bmVyIHNwZWN0cmE4IiB9LAoJeyAweDIwMGExMjk1LCBCVFRWX0JPQVJEX1BYQzIwMCwgICAgICAgICJJbWFnZU5hdGlvbiBQWEMyMDBBIiB9LAoKCXsgMHg0MDExMTU1NCwgQlRUVl9CT0FSRF9QVl9CVDg3OFBfOUIsICAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQiIH0sCgl7IDB4MTdkZTBhMDEsIEJUVFZfQk9BUkRfS1dPUkxELCAgICAgICAgIk1lY2VyIFRWL0ZNL1ZpZGVvIFR1bmVyIiB9LAoKCXsgMHgwMTA1MTgwNSwgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMxIiB9LAoJeyAweDAxMDYxODA1LCBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzIiIH0sCgl7IDB4MDEwNzE4MDUsIEJUVFZfQk9BUkRfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMyIgfSwKCXsgMHgwMTA4MTgwNSwgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICM0IiB9LAoKCXsgMHgxNTQwOTUxMSwgQlRUVl9CT0FSRF9BQ09SUF9ZODc4RiwgIkFjb3JwIFk4NzhGIiB9LAoKCS8qIGxpa2VseSBicm9rZW4sIHZlbmRvciBpZCBkb2Vzbid0IG1hdGNoIHRoZSBvdGhlciBtYWdpYyB2aWV3cyAuLi4KCSAqIHsgMHhhMGZjYTA0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzLCAiR3VpbGxlbW90IE1heGkgVFYgVmlkZW8gMyIgfSwgKi8KCgkvKiBEdXBsaWNhdGUgUENJIElELCByZWNvbmZpZ3VyZSBmb3IgdGhpcyBib2FyZCBkdXJpbmcgdGhlIGVlcHJvbSByZWFkLgoJKiB7IDB4MTNlYjAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFX0lNUEFDVFZDQiwgICJIYXVwcGF1Z2UgSW1wYWN0VkNCIiB9LCAqLwoKCS8qIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikgKi8KCXsgMHgwMDFjMTFiZCwgQlRUVl9CT0FSRF9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCgl7IDB4MDEwMTAwNzEsIEJUVFZfQk9BUkRfTkVCVUxBX0RJR0lUViwgIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfQk9BUkRfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4MDAyNjExYmQsIEJUVFZfQk9BUkRfVFdJTkhBTl9EU1QsICAgIlBpbm5hY2xlIFBDVFYgU0FUIENJIiB9LAoJeyAweDAwMDExODIyLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULCAgICJUd2luaGFuIFZpc2lvblBsdXMgRFZCIiB9LAoJeyAweGZjMDAyNzBmLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKCXsgMHgwNzcxMTQ2MSwgQlRUVl9CT0FSRF9BVkRWQlRfNzcxLCAgICAiQVZlcm1lZGlhIEF2ZXJUViBEVkItVCA3NzEiIH0sCgl7IDB4MDc2MTE0NjEsIEJUVFZfQk9BUkRfQVZEVkJUXzc2MSwgICAgIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiB9LAoJeyAweGRiMTAxOGFjLCBCVFRWX0JPQVJEX0RWSUNPX0RWQlRfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CgkvKiAtLS0tIGNhcmQgMHgwMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9VTktOT1dOXSA9IHsKCQkubmFtZQkJPSAiICoqKiBVTktOT1dOL0dFTkVSSUMgKioqICIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCB9LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUlST10gPSB7CgkJLm5hbWUJCT0gIk1JUk8gUENUViIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMiwgMCwgMCwgMCwgMTAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0VdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0IH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfU1RCXSA9IHsKCQkubmFtZQkJPSAiU1RCLCBHYXRld2F5IFAvTiA2MDAwNjk5IChidDg0OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMSB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgwNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9JTlRFTF0gPSB7CgkJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnR1bmVyX3R5cGUJPSA0LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0RJQU1PTkRdID0gewoJCS5uYW1lCQk9ICJEaWFtb25kIERUVjIwMDAiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCB9LAoJCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgMyB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FWRVJNRURJQV0gPSB7CgkJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVlBob25lIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tYXNrCT0gMHgwZiwKCQkuYXVkaW9tdXgJPSB7IDB4MGMsIDB4MDQsIDB4MDgsIDB4MDQsIDAgfSwKCQkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT05dID0gewoJCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwIH0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDA4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0ZMWVZJREVPXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gSUkgKEJ0ODQ4KSBMUjI2IC8gTUFYSSBUViBWaWRlbyBQQ0kyIExSMjYiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhjMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDB4YzAwLCAweDgwMCwgMHg0MDAsIDB4YzAwLCAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVFVSQk9UVl0gPSB7CgkJLm5hbWUJCT0gIklNUy9JWG1pY3JvIFR1cmJvVFYiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMSwgMSwgMiwgMywgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzhdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01JUk9QUk9dID0gewoJCS5uYW1lCQk9ICJNSVJPIFBDVFYgcHJvIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MzAxNGYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgwYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BRFNURUNIX1RWXSA9IHsKCQkubmFtZQkJPSAiQURTIFRlY2hub2xvZ2llcyBDaGFubmVsIFN1cmZlciBUViAoYnQ4NDgpIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQVZFUk1FRElBOThdID0gewoJCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gNCwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5tc3AzNHh4X2FsdCAgICA9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVkhYXSA9IHsKCQkubmFtZQkJPSAiQWltc2xhYiBWaWRlbyBIaWdod2F5IFh0cmVtZSAoVkhYKSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0IH0sIC8qIG9sZDogezAsIDEsIDIsIDMsIDR9ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAwICwgMCwgMSAsIDAsIDEwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDEwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJWFZJRVdQTEFZVFZdID0gewoJCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQbGF5VFYgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJI2lmIDAKCQkvKiBvbGQgKi8KCQkuYXVkaW9tdXgJPSB7IDB4MDFjMDAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCgkjZWxzZQoJCS8qIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PiAqLwoJCS5hdWRpb211eCAgICAgICA9IHsgMHgwMDFlMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKCSNlbmRpZgoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJfSwKCVtCVFRWX0JPQVJEX1dJTlZJRVdfNjAxXSA9IHsKCQkubmFtZQkJPSAiTGVhZHRlayBXaW5WaWV3IDYwMSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDgzMDBmOCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwwIH0sCgkJLmF1ZGlvbXV4CT0geyAweDRmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNyB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gd2ludmlld19hdWRpbywKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BVkVDX0lOVEVSQ0FQXSA9IHsKCQkubmFtZQkJPSAiQVZFQyBJbnRlcmNhcHR1cmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMSwgMCwgMCwgMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0xJRkVfRkxZS0lUXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gSUkgRVogL0ZseUtpdCBMUjM4IEJ0ODQ4IChjYXB0dXJlIG9ubHkpIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMHg4ZGZmMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQ0VJX1JBRkZMRVNdID0gewoJCS5uYW1lCQk9ICJDRUkgUmFmZmxlcyBDYXJkIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9DT05GRVJFTkNFVFZdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OC8gTHVja3kgU3RhciBJbWFnZSBXb3JsZCBDb25mZXJlbmNlVFYgTFI1MCIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDIsICAvKiB0dW5lciwgbGluZSBpbiAqLwoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxODAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9QSE9FQkVfVFZNQVNdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGMwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMCwgMSwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01PRFRFQ18yMDVdID0gewoJCS5uYW1lCQk9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViwgYnQ4NzgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCQkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCQjVfUEFMX0ksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjFdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhlMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7MHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4YzAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9WT0JJU19CT09TVEFSXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjAgKEJ0ODQ4KS8gVGVycmEgVFZhbHVlIFZlcnNpb24gMS4wLyBWb2JpcyBUVi1Cb29zdGFyIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MWYwZmZmLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gdGVycmF0dl9hdWRpbywKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR19XQ0FNXSA9IHsKCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpbkNhbSBuZXdlciAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDAsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDQgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NQVhJXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgxYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9URVJSQVRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjEgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDFmMGZmZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gdGVycmF0dl9hdWRpbywKCQkvKiBHUElPIHdpcmluZzoKCQlFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCgkJZ3BpbzAwOiBpMmMtc2RhCgkJZ3BpbzAxOiBpMmMtc2NsCgkJZ3BpbzAyOiBvbTU2MTAtZGF0YQoJCWdwaW8wMzogb201NjEwLWNsawoJCWdwaW8wNDogb201NjEwLXdyZQoJCWdwaW8wNTogb201NjEwLXN0ZXJlbwoJCWdwaW8wNjogcmRzNjU4OC1kYXZuCgkJZ3BpbzA3OiBQaW4gNyBuLmMuCgkJZ3BpbzA4OiBuSU9XCgkJZ3BpbzA5KzEwOiBuSU9SLCBuU0VMID8/IChidDg3OCkKCQkJZ3BpbzA5OiBuSU9SIChidDg0OCkKCQkJZ3BpbzEwOiBuU0VMIChidDg0OCkKCQlTb3VuZCBSb3V0aW5nOgoJCWdwaW8xNjogdTItQTAgKDFzdCA0MDUyYnQpCgkJZ3BpbzE3OiB1Mi1BMQoJCWdwaW8xODogdTItbkVOCgkJZ3BpbzE5OiB1NC1BMCAoMm5kIDQwNTIpCgkJZ3BpbzIwOiB1NC1BMQoJCQl1NC1uRU4gLSBHTkQKCQlCdHNweToKCQkJMDAwMDAgOiBDZHJvbSAoaW50ZXJuYWwgYXVkaW8gaW5wdXQpCgkJCTEwMDAwIDogZXh0LiBWaWRlbyBhdWRpbyBpbnB1dAoJCQkyMDAwMCA6IFRWIE1vbm8KCQkJYTAwMDAgOiBUViBNb25vLzIKCQkxYTAwMDAgOiBUViBTdGVyZW8KCQkJMzAwMDAgOiBSYWRpbwoJCQk0MDAwMCA6IE11dGUKCSovCgoJfSwKCVtCVFRWX0JPQVJEX1BYQzIwMF0gPSB7CgkJLyogSmFubmlrIEZyaXRzY2ggPGphbm5pa0B0ZWNoZmFrLnVuaS1iaWVsZWZlbGQuZGU+ICovCgkJLm5hbWUJCT0gIkltYWdlbmF0aW9uIFBYQzIwMCIsCgkJLnZpZGVvX2lucHV0cwk9IDUsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDEsIC8qIHdhczogNCAqLwoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJCS5hdWRpb211eAk9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IFBYQzIwMF9tdXhzZWwsCgoJfSwKCVtCVFRWX0JPQVJEX0ZMWVZJREVPXzk4XSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsICAvKiAweDhkZmUwMCAqLwoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDA4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9JUFJPVFZdID0gewoJCS5uYW1lCQk9ICJGb3JtYWMgaVByb1RWLCBGb3JtYWMgUHJvVFYgSSAoYnQ4NDgpIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDEsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDAsIDAsIDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSU5URUxfQ19TX1BDSV0gPSB7CgkJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnR1bmVyX3R5cGUJPSA0LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFUlJBVFZBTFVFXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVmFsdWUgVmVyc2lvbiBCdDg3OCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCwgMHg5MDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUMjAwMF0gPSB7CgkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCAyMDAwLyBXaW5GYXN0IDIwMDAgWFAiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDAgfSwgLyogVFYsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLwoJI2lmIDAKCQkuZ3Bpb21hc2sJPSAweGMzMzAwMCwKCQkuYXVkaW9tdXgJPSB7IDB4NDIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKCSNlbHNlCgkJLyogQWxleGFuZGVyIFZhcmFraW4gPGF2YXJha2luQGhvdG1haWwuY29tPiBbc3RlcmVvIHZlcnNpb25dICovCgkJLmdwaW9tYXNrCT0gMHhiMzMwMDAsCgkJLmF1ZGlvbXV4CT0geyAweDEyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCgkjZW5kaWYKCQkvKiBBdWRpbyBSb3V0aW5nIGZvciAiV2luRmFzdCAyMDAwIFhQIiAobm8gdHYgc3RlcmVvICEpCgkJCWdwaW8yMyAtLSBoZWY0MDUyOm5FbmFibGUgKDB4ODAwMDAwKQoJCQlncGlvMTIgLS0gaGVmNDA1MjpBMQoJCQlncGlvMTMgLS0gaGVmNDA1MjpBMAoJCTB4MDAwMDogZXh0ZXJuYWwgYXVkaW8KCQkweDEwMDA6IEZNCgkJMHgyMDAwOiBUVgoJCTB4MzAwMDogbi5jLgoJCU5vdGU6IFRoZXJlIGV4aXN0cyBhbm90aGVyIHZhcmlhbnQgIldpbmZhc3QgMjAwMCIgd2l0aCB0diBzdGVyZW8gIT8KCQlOb3RlOiBlZXByb20gb25seSBjb250YWlucyBGRiBhbmQgcGNpIHN1YnN5c3RlbSBpZCAxMDdkOjY2MDYKCQkqLwoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkuaGFzX3JhZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IDUsIC8qIGRlZmF1bHQgZm9yIG5vdywgZ3BpbyByZWFkcyBCRkZGMDYgZm9yIFBhbCBiZytkayAqLwoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gd2luZmFzdDIwMDBfYXVkaW8sCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9DSFJPTk9TX1ZTMl0gPSB7CgkJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAgLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAzLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxODAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDI0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1RZUEhPT05fVFZJRVddID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAgLyBUeXBob29uIFRWaWV3IFRWL0ZNIFR1bmVyIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1BYRUxWV1BMVFZQUk9dID0gewoJCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsVmlldyBQbGF5VFYgcHJvIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZmYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjEsIDB4MjAsIDB4MjQsIDB4MmMsIDB4MjksIDB4MjkgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzXSA9IHsKCQkubmFtZQkJPSAiQXNrZXkgQ1BIMDZYIFRWaWV3OTkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHg1NTFlMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKCQkuYXVkaW9tdXgJPSB7IDB4NTUxNDAwLCAweDU1MTIwMCwgMCwgMCwgMHg1NTFjMDAsIDB4NTUxMjAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1BJTk5BQ0xFXSA9IHsKCQkubmFtZQkJPSAiUGlubmFjbGUgUENUViBTdHVkaW8vUmF2ZSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAzMDAwRiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMiwgMHhkMDAwMSwgMCwgMCwgMSB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9TVEIyXSA9IHsKCQkubmFtZQkJPSAiU1RCIFRWIFBDSSBGTSwgR2F0ZXdheSBQL04gNjAwMDcwNCAoYnQ4NzgpLCAzRGZ4IFZvb2Rvb1RWIDEwMCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZQSE9ORTk4XSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUgOTgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSA0LAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMTUsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDEzLCA0LCAxMSwgNywgMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCgl9LAoJW0JUVFZfQk9BUkRfUFY5NTFdID0gewoJCS5uYW1lCQk9ICJQcm9WaWRlbyBQVjk1MSIsIC8qIHBpYzE2YzU0ICovCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAxLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX09OQUlSX1RWXSA9IHsKCQkubmFtZQkJPSAiTGl0dGxlIE9uQWlyIFRWIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZTAwYiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHhmZjlmZjYsIDB4ZmY5ZmY2LCAweGZmMWZmNywgMCwgMHhmZjNmZmMgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfU0lHTUFfVFZJSV9GTV0gPSB7CgkJLm5hbWUJCT0gIlNpZ21hIFRWSUktRk0iLAoJCS52aWRlb19pbnB1dHMJPSAyLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDEsIDAsIDIsIDMgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfTk9ORSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT04yXSA9IHsKCQkubmFtZQkJPSAiTUFUUklYLVZpc2lvbiBNVi1EZWx0YSAyIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwIH0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRV0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhiY2YwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDB4YmM4MDNmLCAweGJjOTAzZiwgMHhiY2IwM2YsIDAsIDB4YmNiMDNmIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMjEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVEVSUkFUVlJBRElPXSA9IHsKCQkubmFtZQkJPSAiVGVycmF0ZWMgVFYvUmFkaW8rIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4NzAwMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAsIDB4NDAwMDAsIDB4MjAwMDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzM1LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfRFlOQUxJTktdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4CT0gezIsMCwwLDAsMSB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0dWQkNUVjNQQ0ldID0gewoJCS5uYW1lCQk9ICJJT0RBVEEgR1YtQkNUVjMvUENJIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MDEwZjAwLAoJCS5tdXhzZWwJCT0gezIsIDMsIDAsIDAgfSwKCQkuYXVkaW9tdXgJPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMCB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FMUFNfVFNIQzZfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vawk9IGd2YmN0djNwY2lfYXVkaW8sCgl9LAoJW0JUVFZfQk9BUkRfUFhFTFZXUExUVlBBS10gPSB7CgkJLm5hbWUJCT0gIlByb2xpbmsgUFYtQlQ4NzhQKzRFIC8gUGl4ZWxWaWV3IFBsYXlUViBQQUsgLyBMZW5jbyBNWFRWLTk1NzggQ1AiLAoJCS52aWRlb19pbnB1dHMJPSA1LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDMsCgkJLmdwaW9tYXNrCT0gMHhBQTAwMDAsCgkJLm11eHNlbAkJPSB7IDIsMywxLDEsLTEgfSwKCQkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMCwgMHg4MDAwMCwgMHg4MDAwMCwgMHhhODAwMCwgMHg0NjAwMCAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlCT0gMSwKCQkvKiBHUElPIHdpcmluZzogKGRpZmZlcmVudCBmcm9tIFJldi40QyAhKQoJCQlHUElPMTc6IFU0LkEwIChmaXJzdCBoZWY0MDUyYnQpCgkJCUdQSU8xOTogVTQuQTEKCQkJR1BJTzIwOiBVNS5BMSAoc2Vjb25kIGhlZjQwNTJidCkKCQkJR1BJTzIxOiBVNC5uRU4KCQkJR1BJTzIyOiBCVDgzMiBSZXNldCBMaW5lCgkJCUdQSU8yMzogQTUsQTAsIFU1LG5FTgoJCU5vdGU6IEF0IGkyYz0weDhhIGlzIGEgQnQ4MzIgY2hpcCwgd2hpY2ggY2hhbmdlcyB0byAweDg4IGFmdGVyIGJlaW5nIHJlc2V0IHZpYSBHUElPMjIKCQkqLwoJfSwKCVtCVFRWX0JPQVJEX0VBR0xFXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiRWFnbGUgV2lyZWxlc3MgQ2Fwcmljb3JuMiAoYnQ4NzhBKSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJTk5BQ0xFUFJPXSA9IHsKCQkvKiBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQDJnZW4uY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDB4ZDAwMDEsIDAsIDAsIDEwIH0sCgkJCQkvKiBzb3VuZCBwYXRoICg1IHNvdXJjZXMpOgoJCQkJTVVYMSAobWFzayAweDAzKSwgRW5hYmxlIFBpbiAweDA4ICgwPWVuYWJsZSwgMT1kaXNhYmxlKQoJCQkJCTA9IGV4dC4gQXVkaW8gSU4KCQkJCQkxPSBmcm9tIE1VWDIKCQkJCQkyPSBNb25vIFRWIHNvdW5kIGZyb20gVHVuZXIKCQkJCQkzPSBub3QgY29ubmVjdGVkCgkJCQlNVVgyIChtYXNrIDB4MzAwMDApOgoJCQkJCTAsMiwzPSBmcm9tIE1TUDM0eHgKCQkJCQkxPSBGTSBzdGVyZW8gUmFkaW8gZnJvbSBUdW5lciAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RWSUVXX1JEU19GTV0gPSB7CgkJLyogQ2xhYXMgTGFuZ2JlaG4gPGNsYWFzQGJpZ2Zvb3QuY29tPiwKCQlTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLwoJCS5uYW1lCQk9ICJUeXBob29uIFRWaWV3IFJEUyArIEZNIFN0ZXJlbyAvIEtOQzEgVFYgU3RhdGlvbiBSRFMiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAzLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxYywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0xJRkVURUNfOTQxNV0gPSB7CgkJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCQlpbiBkZS5jb21wLm9zLnVuaXgubGludXguaGFyZHdhcmU6CgkJCW9wdGlvbnMgYnR0diBjYXJkPTAgcGxsPTEgcmFkaW89MSBncGlvbWFzaz0weDE4ZTAKCQkJYXVkaW9tdXg9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCQlvcHRpb25zIHR1bmVyIHR5cGU9NSAqLwoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwIC9GbHlWaWRlbyBBMi8gTGlmZXRlYyBMVCA5NDE1IFRWIFtMUjkwXSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4ZTAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4ZTAgfSwKCQkJLyogRm9yIGNhcmRzIHdpdGggdGRhOTgyMC90ZGE5ODIxOgoJCQkJMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCgkJCQkweDAwODA6IFR1bmVyIEEyIFNBUCAoc2Vjb25kIGF1ZGlvIHByb2dyYW0gPSBad2Vpa2FuYWx0b24pCgkJCQkweDA4ODA6IFR1bmVyIEEyIHN0ZXJlbyAqLwoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQkVTVEJVWV9FQVNZVFZdID0gewoJCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CgkJb2xkIEVhc3kgVFYgQlQ4NDggdmVyc2lvbiAobW9kZWwgQ1BIMDMxKSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwMzEvIEJFU1RCVVkgRWFzeSBUViIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHhGLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMCwgMTAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgzOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9GTFlWSURFT185OEZNXSA9IHsKCQkvKiBHb3Jkb24gSGV5ZG9uIDxnamhleWRvbkBiaWdmb290LmNvbSAoJzk4KSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxODAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgkJLyogVGhpcyBpcyB0aGUgdWx0aW1hdGUgY2hlYXBvIGNhcHR1cmUgY2FyZAoJCSoganVzdCBhIEJUODQ4QSBvbiBhIHNtYWxsIFBDQiEKCQkqIFN0ZXZlIEhvc2dvb2QgPHN0ZXZlQGVxdWlpbmV0LmNvbT4gKi8KCVtCVFRWX0JPQVJEX0dSQU5EVEVDXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgJ0dyYW5kIFZpZGVvIENhcHR1cmUnIChCdDg0OCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9BU0tFWV9DUEgwNjBdID0gewoJCS8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQXNrZXkgQ1BIMDYwLyBQaG9lYmUgVFYgTWFzdGVyIE9ubHkgKE5vIEZNKSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4ODAwLCAweDQwMCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9BU0tFWV9DUEgwM1hdID0gewoJCS8qIE1hdHRpIE1vdHR1cyA8bW90dHVzQHBoeXNpYy51dC5lZT4gKi8KCQkubmFtZQkJPSAiQXNrZXkgQ1BIMDN4IFRWIENhcHR1cmVyIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTU0xMDBQQ1RWXSA9IHsKCQkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCgkJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAxMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDEsIDggfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0dNVjFdID0gewoJCS8qIEFkcmlhbiBDb3ggPGFkcmlhbkBodW1ib2xkdC5jby51ayAqLwoJCS5uYW1lCQk9ICJBRyBFbGVjdHJvbmljcyBHTVYxIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDEsCgkJLmdwaW9tYXNrICAgICAgID0gMHhGLAoJCS5tdXhzZWwJCT0geyAyLCAyIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9CRVNUQlVZX0VBU1lUVjJdID0gewoJCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CgkJbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQoJCXNwZWNpYWwgdGhhbmtzIHRvIEluZm9ybWF0aWNhIE1pZXJlcyBmb3IgcHJvdmlkaW5nIHRoZSBjYXJkICovCgkJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDIsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAxLCAwLCA0LCA0LCA5IH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FUSV9UVldPTkRFUl0gPSB7CgkJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCQkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGYwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKCQkuYXVkaW9tdXgJPSB7IDB4YmZmZSwgMCwgMHhiZmZmLCAwLCAweGJmZmUgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHg0MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BVElfVFZXT05ERVJWRV0gPSB7CgkJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCQkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciBWRSIsCgkJLnZpZGVvX2lucHV0cwk9IDIsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMCwgMSB9LAoJCS5hdWRpb211eAk9IHsgMCwgMCwgMSwgMCwgMCB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0ZMWVZJREVPMjAwMF0gPSB7CgkJLyogRGVlSmF5IDxkZWVqYXlAd2VzdGVsOTAwLm5ldCAoMjAwMFMpICovCgkJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrCT0gMHgxOGUwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxIH0sCgkJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCgkJCQlGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KCQkJCS8qIC1kay0/Pz86IHNldCBtdXRlPTB4MTgwMCBmb3IgdGRhOTg3NGggZGF1Z2h0ZXJib2FyZCAqLwoJCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MTgwMCwgMHgxMDgwIH0sCgkJLmF1ZGlvX2hvb2sJPSBmdjIwMDBzX2F1ZGlvLAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhOTg3NQk9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9URVJSQVRWQUxVRVJdID0gewoJCS5uYW1lCQk9ICJUZXJyYXRlYyBUVmFsdWVSYWRpbyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHg1MDAsIDB4NTAwLCAweDMwMCwgMHg5MDAsIDB4OTAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoJW0JUVFZfQk9BUkRfR1ZCQ1RWNFBDSV0gPSB7CgkJLyogVEFOQUtBIEtlaSA8cGVnMDA2MjVAbmlmdHkuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjQvUENJIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDEwZjAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDAgfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSBndmJjdHYzcGNpX2F1ZGlvLAoJfSwKCgkvKiAtLS0tIGNhcmQgMHg0NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9WT09ET09UVl9GTV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIjNEZnggVm9vZG9vVFYgRk0gKEV1cm8pLCBWb29kb29UViAyMDAgKFVTQSkiLAoJCS8qIHRyeSAiaW5zbW9kIG1zcDM0MDAgc2ltcGxlPTAiIGlmIHlvdSBoYXZlCgkJKiBzb3VuZCBwcm9ibGVtcyB3aXRoIHRoaXMgY2FyZC4gKi8KCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDRmOGEwMCwKCQkvKiAweDEwMDAwMDogMT1NU1AgZW5hYmxlZCAoMD1kaXNhYmxlIGFnYWluKQoJCSogMHgwMTAwMDA6IENvbm5lY3RlZCB0byAiUzAiIG9uIHRkYTk4ODAgKDA9UGFsL0JHLCAxPU5UU0MpICovCgkJLmF1ZGlvbXV4ICAgICAgID0gezB4OTQ3ZmZmLCAweDk4N2ZmZiwweDk0N2ZmZiwweDk0N2ZmZiwgMHg5NDdmZmZ9LAoJCS8qIHR2dHVuZXIsIHJhZGlvLCAgIGV4dGVybmFsLGludGVybmFsLCBtdXRlLCAgc3RlcmVvCgkJKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMSB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsCQk9IFBMTF8yOCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BSU1NU10gPSB7CgkJLyogUGhpbGlwIEJsdW5kZWxsIDxwYkBuZXh1cy5jby51az4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQWN0aXZlIEltYWdpbmcgQUlNTVMiLAoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLmdwaW9tYXNrICAgICAgID0gMAoJfSwKCVtCVFRWX0JPQVJEX1BWX0JUODc4UF9QTFVTXSA9IHsKCQkvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gNCwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMTUsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAxMSwgNywgMTMsIDAgfSwgLyogVFYgYW5kIFJhZGlvIHdpdGggc2FtZSBHUElPICEgKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAyNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJCS8qIEdQSU8gd2lyaW5nOgoJCQlHUElPMDogVTQuQTAgKGhlZjQwNTJidCkKCQkJR1BJTzE6IFU0LkExCgkJCUdQSU8yOiBVNC5BMSAoc2Vjb25kIGhlZjQwNTJidCkKCQkJR1BJTzM6IFU0Lm5FTiwgVTUuQTAsIEE1Lm5FTgoJCQlHUElPOC0xNTogdnJkODY2YiA/CgkJKi8KCX0sCglbQlRUVl9CT0FSRF9GTFlWSURFTzk4RVpdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEVaIChjYXB0dXJlIG9ubHkpIExSNTEiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDIsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwgLyogQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTICovCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDQ4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX0JUODc4UF85Ql0gPSB7CgkJLyogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4gKi8KCQkubmFtZQkJPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKzlCIChQbGF5VFYgUHJvIHJldi45QiBGTStOSUNBTSkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgzZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHgwMSwgMHgwMCwgMHgwMywgMHgwMywgMHgwOSwgMHgwMiB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvICovCgkJLmhhc19yYWRpbwk9IDEsICAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8gKi8KCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJCS8qIEdQSU8gd2lyaW5nOgoJCQlHUElPMDogQTAgaGVmNDA1MgoJCQlHUElPMTogQTEgaGVmNDA1MgoJCQlHUElPMzogbkVOIGhlZjQwNTIKCQkJR1BJTzgtMTU6IHZyZDg2NmIKCQkJR1BJTzIwLDIyLDIzOiBSMzAsUjI5LFIyOAoJCSovCgl9LAoJW0JUVFZfQk9BUkRfU0VOU09SQVkzMTFdID0gewoJCS8qIENsYXkgS3VueiA8Y2t1bnpAbWFpbC5hcmMubmFzYS5nb3Y+ICovCgkJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTZW5zb3JheSAzMTEiLAoJCS52aWRlb19pbnB1dHMgICA9IDUsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSA0LAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9SVjYwNV0gPSB7CgkJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJSZW1vdGVWaXNpb24gTVggKFJWNjA1KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4MDdmZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDB4MzMsIDB4MTMsIDB4MjMsIDB4NDMsIDB4ZjMsIDB4NzMsIDB4ZTMsIDB4MDMsCgkJCQkweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IHJ2NjA1X211eHNlbCwKCX0sCglbQlRUVl9CT0FSRF9QT1dFUkNMUl9NVFY4NzhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxQzgwMEYsICAvKiBCaXQwLTI6IEF1ZGlvIHNlbGVjdCwgOC0xMjpyZW1vdGUgY29udHJvbCAxNDpyZW1vdGUgdmFsaWQgMTU6cmVtb3RlIHJlc2V0ICovCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxLCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgNCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbAkJPSBQTExfMjgsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDRjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1dJTkRWUl0gPSB7CgkJLyogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MTQwMDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNCwgMCB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCgl9LAoJW0JUVFZfQk9BUkRfR1JBTkRURUNfTVVMVEldID0gewoJCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIENhcmQgKEJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9LV09STERdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLyogVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IgKi8KCQkuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvKiBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKCQkJCQkJKiBUaGlzIGNhcmQgbGFja3MgZXh0ZXJuYWwgQXVkaW8gSW4sIHNvIHdlIG11dGUgaXQgb24gRXh0LiAmIEludC4KCQkJCQkJKiBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KCQkJCQkJKiBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KCQkJCQkJKiBhdWRpb211eD0xOiBsb3dlciB2b2x1bWUsIDIrMzogbXV0ZQoJCQkJCQkqIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCgkJCQkJCSovCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS8qIFNhbXN1bmcgVENQQTkwOTVQQzI3QSAoQkcrREspLCBwaGlsaXBzIGNvbXBhdGlibGUsIHcvRk0sIHN0ZXJlbyBhbmQKCQlyYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuICovCgkJLmhhc19yYWRpbwk9IDEsCgkJLyogR1BJTyBJbmZvOgoJCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKCQkJR1BJTzI6ICAgICBIRUY0MDUyIG5FTkFCTEUKCQkJR1BJTzMtNzogICBuLmMuCgkJCUdQSU84LTEzOiAgSVJEQzM1NyBkYXRhMC01IChkYXRhNiBuLmMuID8pIFtjaGlwIG5vdCBwcmVzZW50IG9uIG15IGNhcmRdCgkJCUdQSU8xNCwxNTogPz8KCQkJR1BJTzE2LTIxOiBuLmMuCgkJCUdQSU8yMiwyMzogPz8KCQkJPz8gICAgICAgOiBtdHU4YjU2ZXAgbWljcm9jb250cm9sbGVyIGZvciBJUiAoR1BJTyB3aXJpbmcgdW5rbm93bikqLwoJfSwKCVtCVFRWX0JPQVJEX0RTUF9UQ1ZJREVPXSA9IHsKCQkvKiBBcnRodXIgVGV0emxhZmYtRGVhcywgRFNQIERlc2lnbiBMdGQgPHNvZnR3YXJlQGRzcGRlc2lnbi5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9IQVVQUEFVR0VQVlJdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMSB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5hdWRpb211eCAgICAgICA9IHs3fSwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFY1UENJXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY1L1BDSSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsweDAzMDAwMCwgMHgwMTAwMDAsIDAsIDAsIDB4MDIwMDAwLCAwfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSBndmJjdHY1cGNpX2F1ZGlvLAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMXgwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg3OCkiLCAvKiAweDEoMnwzKS00NUM2LUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gNCwgICAgICAgICAgICAgICAgICAvKiBpZC1pbnB1dHMtY2xvY2sgKi8KCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAyLCAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTF4MF84NDhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODQ4KSIsIC8qIDB4MDQtNTRDMC1DMSAmIG9sZGVyIGJvYXJkcyAqLwoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDU0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTEwMV84NDhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxICg4NDgpIiwgLyogMHgwNS00MEMwLUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTF4MV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIiwgICAgICAgLyogMHgxKDR8NSktMDAwNC1DNCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSURdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSB3LyBzdmlkIiwgIC8qIDB4KDE2fDE3fDIwKS0wMEM0LUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTJ4eF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjAxLzI1MC8yNTEiLCAgLyogMHgxKDh8OXxFfEYpLTAwMDQtQzQgKi8KCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjUwIiwgICAvKiAweDEoQXxCKS0wMEM0LUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMngwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAiLCAgIC8qIDB4MShBfEIpLTA0QzAtQzEgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBVTlNFVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVk1MDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTAwIiwgICAvKiA1MDAgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZNTQwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDU0MCIsICAgLyogNTQwICovCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJI2lmIDAgLyogVE9ETyAuLi4gKi8KCQkuc3ZocyAgICAgICAgICAgPSBPU1BSRVk1NDBfU1ZJRF9BTkFMT0csCgkJLm11eHNlbCAgICAgICAgID0geyAgICAgICBbT1NQUkVZNTQwX0NPTVBfQU5BTE9HXSA9IDIsCgkJCQkJW09TUFJFWTU0MF9TVklEX0FOQUxPR10gPSAzLCB9LAoJI2VuZGlmCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJI2lmIDAgLyogVE9ETyAuLi4gKi8KCQkubXV4c2VsX2hvb2sgICAgPSBvc3ByZXlfNTQwX211eHNlbCwKCQkucGljdHVyZV9ob29rICAgPSBvc3ByZXlfNTQwX3NldF9waWN0dXJlLAoJI2VuZGlmCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVkyMDAwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMDAiLCAgLyogMjAwMCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLCAgICAgIC8qIG11c3QgYXZvaWQsIGNvbmZsaWN0cyB3aXRoIHRoZSBidDg2MCAqLwoJfSwKCVtCVFRWX0JPQVJEX0lEU19FQUdMRV0gPSB7CgkJLyogTSBHIEJlcmJlcmljaCA8YmVyYmVyaWNAZm9yd2lzcy51bmktcGFzc2F1LmRlPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJRFMgRWFnbGUiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSwgMiwgMyB9LAoJCS5tdXhzZWxfaG9vayAgICA9IGVhZ2xlX211eHNlbCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCVtCVFRWX0JPQVJEX1BJTk5BQ0xFU0FUXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMiB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfRk9STUFDX1BST1RWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiRm9ybWFjIFByb1RWIElJIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMiwKCQkvKiBUViwgQ29tcDEsIENvbXBvc2l0ZSBvdmVyIFNWSUQgY29uLCBTVklEICovCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAyLCAwLCAwLCAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkvKiBzb3VuZCByb3V0aW5nOgoJCUdQSU89MHgwMCwweDAxLDB4MDM6IG11dGUgKD8pCgkJMHgwMjogYm90aCBUViBhbmQgcmFkaW8gKHR1bmVyOiBGTTEyMTYvSSkKCQlUaGUgY2FyZCBoYXMgb25ib2FyZCBhdWRpbyBjb25uZWN0b3JzIGxhYmVsZWQgImNkcm9tIiBhbmQgImJvYXJkIiwKCQlub3Qgc29sZGVyZWQgaGVyZSwgdGhvdWdoIHVua25vd24gd2lyaW5nLgoJCUNhcmQgbGFja3M6IGV4dGVybmFsIGF1ZGlvIGluLCBwY2kgc3Vic3lzdGVtIGlkLgoJKi8KCX0sCgoJCS8qIC0tLS0gY2FyZCAweDYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX01BQ0hUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9FVVJFU1lTX1BJQ09MT10gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkV1cmVzeXMgUGljb2xvIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMX0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1BWMTUwXSA9IHsKCQkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTUwIiwgLyogMHg0ZiAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQURfVFZLNTAzXSA9IHsKCQkvKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4gKi8KCQkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCgkJLm5hbWUgICAgICAgICAgID0gIkFELVRWSzUwMyIsIC8qIDB4NjMgKi8KCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAxZTgwMDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLyogICAgICAgICAgICAgICAgICBUdW5lciwgUmFkaW8sIGV4dGVybmFsLCBpbnRlcm5hbCwgb2ZmLCAgb24gKi8KCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDgsICAweDBmLCAgMHgwYSwgICAgIDB4MDgsICAgICAweDBmLCAweDA4IH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAyLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gYWR0dms1MDNfYXVkaW8sCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg2NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9IRVJDVUxFU19TTV9UVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkhlcmN1bGVzIFNtYXJ0IFRWIFN0ZXJlbyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkvKiBOb3RlczoKCQktIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElECgkJLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCgkJLSBBdWRpbyBSb3V0aW5nOgoJCQlhbHdheXMgZnJvbSB0ZGE5ODc0IGluZGVwZW5kZW50IG9mIEdQSU8gKD8pCgkJCWV4dGVybmFsIGxpbmUgaW46IHVua25vd24KCQktIE90aGVyIGNoaXBzOiBlbTc4cDE1NmVscCBAIDB4OTYgKHByb2JhYmx5IElSIHJlbW90ZSBjb250cm9sKQoJCQloZWY0MDUzIChpbnN0ZWFkIDQwNTIpIGZvciB1bmtub3duIGZ1bmN0aW9uCgkJKi8KCX0sCglbQlRUVl9CT0FSRF9QQUNFVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQYWNlIFRWICYgUmFkaW8gQ2FyZCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgLyogVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLwoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IDEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLyogQnQ4NzgsIEJ0ODMyLCBGSTEyNDYgdHVuZXI7IG5vIHBjaSBzdWJzeXN0ZW0gaWQKCQlvbmx5IGludGVybmFsIGxpbmUgb3V0OiAoNHBpbiBoZWFkZXIpIFJHR0wKCQlSYWRpbyBtdXN0IGJlIGRlY29kZWQgYnkgbXNwMzQxMGQgKG5vdCByb3V0ZWQgdGhyb3VnaCkqLwoJCS8qCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwgIHRvZG8hCgkJKi8KCX0sCglbQlRUVl9CT0FSRF9JVkMyMDBdID0gewoJCS8qIENocmlzIFdpbGxpbmcgPGNocmlzQHZpc2xhYi51c3lkLmVkdS5hdT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiSVZDLTIwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4ZGYsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCVtCVFRWX0JPQVJEX1hHVUFSRF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkdyYW5kIFgtR3VhcmQgLyBUcnVzdCA4MTRQQ0kiLAoJCS52aWRlb19pbnB1dHMgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gNCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuZ3Bpb21hc2syICAgICAgPSAweGZmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwyLDIsMiwgMywzLDMsMywgMSwxLDEsMSwgMCwwLDAsMCB9LAoJCS5tdXhzZWxfaG9vayAgICA9IHhndWFyZF9tdXhzZWwsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTkVCVUxBX0RJR0lUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgkJLmhhc19yZW1vdGUJPSAxLAoJCS5ncGlvbWFzawk9IDB4MWIsCgkJLm5vX2dwaW9pcnEgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9QVjE0M10gPSB7CgkJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTQzIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1ZEMDA5WDFfTUlOSURJTl0gPSB7CgkJLyogTS5LbGFockBwaHl0ZWMuZGUgKi8KCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBNaW5pRElOIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCQkuc3ZocyAgICAgICAgICAgPSAzLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVkQwMDlYMV9DT01CSV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDZjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1ZEMDA5X01JTklESU5dID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IE1pbmlESU4gKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTAsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCQkuc3ZocyAgICAgICAgICAgPSA5LAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KCQkJCQl2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCgkJCQkJeHRlcm5hbCB2aWRlby1tdXggKi8KCQkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDAgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WRDAwOV9DT01CSV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgQ29tYmkgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTAsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCQkuc3ZocyAgICAgICAgICAgPSA5LAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KCQkJCQl2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCgkJCQkJeHRlcm5hbCB2aWRlby1tdXggKi8KCQkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9JVkMxMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMHhkZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoJW0JUVFZfQk9BUkRfSVZDMTIwXSA9IHsKCQkvKiBJVkMtMTIwRyAtIEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiSVZDLTEyMEciLAoJCS52aWRlb19pbnB1dHMgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsICAgIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLnR1bmVyICAgICAgICAgID0gLTEsICAgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyBzdmhzICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKCQkJCTB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfSwKCQkubXV4c2VsX2hvb2sgICAgPSBpdmMxMjBfbXV4c2VsLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDcwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BDX0hEVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJwY0hEVFYgSEQtMjAwMCBUViIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0FUU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9UV0lOSEFOX0RTVF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlR3aW5oYW4gRFNUICsgY2xvbmVzIiwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX3ZpZGVvICAgICAgID0gMSwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1dJTkZBU1RWQzEwMF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIldpbmZhc3QgVkMxMDAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgMyB9LCAvKiBWaWQgSW4sIFNWaWQgSW4sIFZpZCBvdmVyIFNWaWQgaW4gY29ubmVjdG9yICovCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9URVY1NjBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDEsIDEsIDEsIDEsIDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDc0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1NJTVVTX0dWQzExMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJTSU1VUyBHVkMxMTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMiB9LAoJCS5ncGlvbWFzayAgICAgICA9IDB4M0YsCgkJLm11eHNlbF9ob29rICAgID0gZ3ZjMTEwMF9tdXhzZWwsCgl9LAoJW0JUVFZfQk9BUkRfTkdTVFZfUExVU10gPSB7CgkJLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCgkJLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMCwgMCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMHgwMDAwMDMsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9MTUxCVDRdID0gewoJCS8qIGh0dHA6Ly9saW51eG1lZGlhbGFicy5jb20gKi8KCQkubmFtZSAgICAgICAgICAgPSAiTE1MQlQ0IiwKCQkudmlkZW9faW5wdXRzICAgPSA0LCAvKiBJTjEsSU4yLElOMyxJTjQgKi8KCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVEVLUkFNX00yMDVdID0gewoJCS8qIEhlbG1yb29zIEhhcnJpIDxoYXJyaS5oZWxtcm9vc0BwcC5pbmV0LmZpPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJUZWtyYW0gTTIwNSBQUk8iLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDY4LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMHg2OCwgMHg2OCwgMHg2MSwgMHg2MSwgMHgwMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDc4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0NPTlRWRk1JXSA9IHsKCQkvKiBKYXZpZXIgQ2VuZGFuIEFyZXMgPGpjZW5kYW5AbHljb3MuZXM+ICovCgkJLyogYnQ4NzggVFYgKyBGTSB3aXRob3V0IHN1YnN5c3RlbSBJRCAqLwoJCS5uYW1lICAgICAgICAgICA9ICJDb25jZXB0cm9uaWMgQ09OVFZGTWkiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCAzIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQXSA9IHsKCQkvKkVyaWMgREVCSUVGIDxkZWJpZWZAdGVsZW1zYS5jb20+Ki8KCQkvKkVVUkVTWVMgUGljb2xvIFRldHJhIDogNCBDb25leGFudCBGdXNpb24gODc4QSwgbm8gYXVkaW8sIHZpZGVvIGlucHV0IHNldCB3aXRoIGFuYWxvZyBtdWx0aXBsZXhlcnMgR1BJTyBjb250cm9sZWQqLwoJCS8qIGFkZHMgcGljb2xvX3RldHJhX211eHNlbCgpLCBwaWNvbG9fdGV0cmFfaW5pdCgpLCB0aGUgZm9sb3dpbmcgZGVjbGFyYXRpb24gc3RydWN1cmUsIGFuZCAjZGVmaW5lIEJUVFZfQk9BUkRfUElDT0xPX1RFVFJBX0NISVAqLwoJCS8qMHg3OSBpbiBidHR2LmgqLwoJCS5uYW1lICAgICAgICAgICA9ICJFdXJlc3lzIFBpY29sbyBUZXRyYSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLmdwaW9tYXNrMiAgICAgID0gMHgzQzw8MTYsLypTZXQgdGhlIEdQSU9bMThdLT5HUElPWzIxXSBhcyBvdXRwdXQgcGluLj09PiBkcml2ZSB0aGUgdmlkZW8gaW5wdXRzIHRocm91Z2ggYW5hbG9nIG11bHRpcGxleGVycyovCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0gezIsMiwyLDJ9LC8qODc4QSBpbnB1dCBpcyBhbHdheXMgTVVYMCwgc2VlIGFib3ZlLiovCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm11eHNlbF9ob29rICAgID0gcGljb2xvX3RldHJhX211eHNlbCwvKlJlcXVpcmVkIGFzIGl0IGRvZXNuJ3QgZm9sbG93IHRoZSBjbGFzc2ljIGlucHV0IHNlbGVjdGlvbiBwb2xpY3kqLwoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1NQSVJJVF9UVl0gPSB7CgkJLyogU3Bpcml0IFRWIFR1bmVyIGZyb20gaHR0cDovL3NwaXJpdG1vZGVtcy5jb20uYXUgKi8KCQkvKiBTdGFmZm9yZCBHb29kc2VsbCA8c3VyZ2VAZ29saWF0aC5ob21ldW5peC5vcmc+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlNwaXJpdCBUViBUdW5lciIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwMDAwMDBmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZEVkJUXzc3MV0gPSB7CgkJLyogV29sZnJhbSBKb29zdCA8d29qb0Bmcm9rYXNjaHdlaS5kZT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbCAgICAgICAgID0geyAzICwgMyB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4N2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQVZEVkJUXzc2MV0gPSB7CgkJLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51az4gKi8KCQkvKiBCYXNlZCBvbiB0aGUgTmVidWxhIGNhcmQgZGF0YSAtIGFkZGVkIHJlbW90ZSBhbmQgbmV3IGNhcmQgbnVtYmVyIC0gQlRUVl9CT0FSRF9BVkRWQlRfNzYxLCBzZWUgYWxzbyBpci1rYmQtZ3Bpby5jICovCgkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwIH0sIC8qIENvbXAwLCBTLVZpZGVvLCA/LCA/ICovCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgkJLm5vX2dwaW9pcnEgICAgID0gMSwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT05TUV0gPSB7CgkJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TUSIsCgkJLnZpZGVvX2lucHV0cyAgICAgPSAxNiwKCQkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkJLnR1bmVyICAgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAoJCQkJMywgMywgMywgMywgMywgMywgMywgMyB9LAoJCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTUV9tdXhzZWwsCgkJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCQkubm9fbXNwMzR4eCAgICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgkgID0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT05TTENdID0gewoJCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLwoJCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU0xDIiwKCQkudmlkZW9faW5wdXRzICAgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgICAgPSAwLAoJCS50dW5lciAgICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgICA9IDB4MCwKCQkubXV4c2VsICAgICAgICAgICA9IHsgMiwgMiwgMiwgMiB9LAoJCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTTENfbXV4c2VsLAoJCS5hdWRpb211eCAgICAgICAgID0geyAwIH0sCgkJLm5vX21zcDM0eHggICAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgkJLyogQlRUVl9CT0FSRF9BUEFDX1ZJRVdDT01QICovCglbQlRUVl9CT0FSRF9BUEFDX1ZJRVdDT01QXSA9IHsKCQkvKiBBdHRpbGEgS29uZG9yb3MgPGF0dGlsYS5rb25kb3Jvc0BjaGVsbG8uaHU+ICovCgkJLyogYnQ4NzggVFYgKyBGTSAweDAwMDAwMDAwIHN1YnN5c3RlbSBJRCAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBUEFDIFZpZXdjb21wIDg3OChBTUFYKSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwgICAvKiBtaW5pcmVtb3RlIHdvcmtzLCBzZWUgaXIta2JkLWdwaW8uYyAqLwoJCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg4MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEVdID0gewoJCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5ub192aWRlbyAgICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WR0VBUl9NWVZDRF0gPSB7CgkJLyogU3RldmVuIDxwaG90b24zOEBwY2hvbWUuY29tLnR3PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJWLUdlYXIgTXlWQ0QiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgzZiwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbyAgICAgID0gMCwKCSNpZiAwCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCSNlbmRpZgoJfSwKCVtCVFRWX0JPQVJEX1NVUEVSX1RWXSA9IHsKCQkvKiBSaWNrIEMgPGNyeXB0ZHJhZ29vbkBnbWFpbC5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlN1cGVyIFRWIFR1bmVyIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9USUJFVF9DUzE2XSA9IHsKCQkvKiBDaHJpcyBGYW5uaW5nIDx2aWRlbzRsaW51eEBoYXlkb24ubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYiLAoJCS52aWRlb19pbnB1dHMgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubXV4c2VsX2hvb2sgICAgPSB0aWJldENTMTZfbXV4c2VsLAoJfSwKCVtCVFRWX0JPQVJEX0tPRElDT01fNDQwMFJdID0gewoJCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwoJCS8qCgkJKiBOb3RlIHRoYXQsIGJlY2F1c2Ugb2YgdGhlIGNhcmQncyB3aXJpbmcsIHRoZSAibWFzdGVyIgoJCSogQlQ4NzhBIGNoaXAgKGkuZS4gdGhlIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaAoJCSogYW5kIG11c3QgdXNlIHRoaXMgY2FyZCB0eXBlKSBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZQoJCSogb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIGNhcmQgdHlwZSAweDg1LCB3aG9zZSBkZXNjcmlwdGlvbgoJCSogZm9sbG93cyB0aGlzIG9uZS4gIFRoZXJlIGlzIGEgRUVQUk9NIG9uIHRoZSBjYXJkICh3aGljaCBpcwoJCSogY29ubmVjdGVkIHRvIHRoZSBJMkMgb2Ygb25lIG9mIHRob3NlIG90aGVyIGNoaXBzKSwgYnV0IGlzCgkJKiBub3QgY3VycmVudGx5IGhhbmRsZWQuICBUaGVyZSBpcyBhbHNvIGEgZmFjaWxpdHkgZm9yIGEKCQkqICJtb25pdG9yIiwgd2hpY2ggaXMgYWxzbyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgoJCSovCgkJLm5hbWUgICAgICAgICAgID0gIktvZGljb20gNDQwMFIgKG1hc3RlcikiLAoJCS52aWRlb19pbnB1dHMJPSAxNiwKCQkuYXVkaW9faW5wdXRzCT0gMCwKCQkudHVuZXIJCT0gLTEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocwkJPSAtMSwKCQkvKiBHUElPIGJpdHMgMC05IHVzZWQgZm9yIGFuYWxvZyBzd2l0Y2g6CgkJKiAgIDAwIC0gMDM6CWNhbWVyYSBzZWxlY3RvcgoJCSogICAwNCAtIDA2OgljaGFubmVsIChjb250cm9sbGVyKSBzZWxlY3RvcgoJCSogICAwNzoJZGF0YSAoMS0+b24sIDAtPm9mZikKCQkqICAgMDg6CXN0cm9iZQoJCSogICAwOToJcmVzZXQKCQkqIGJpdCAxNiBpcyBpbnB1dCBmcm9tIHN5bmMgc2VwYXJhdG9yIGZvciB0aGUgY2hhbm5lbAoJCSovCgkJLmdwaW9tYXNrCT0gMHgwMDAzZmYsCgkJLm5vX2dwaW9pcnEgICAgID0gMSwKCQkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhNzQzMgk9IDEsCgkJLm5vX3RkYTk4NzUJPSAxLAoJCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCgl9LAoJW0JUVFZfQk9BUkRfS09ESUNPTV80NDAwUl9TTF0gPSB7CgkJLyogQmlsbCBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+ICovCgkJLyogTm90ZSB0aGF0LCBmb3IgcmVhc29ucyB1bmtub3duLCB0aGUgIm1hc3RlciIgQlQ4NzhBIGNoaXAgKGkuZS4gdGhlCgkJKiBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBtdXN0IHVzZSB0aGUgY2FyZCB0eXBlKQoJCSogaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUgb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIHRoaXMgY2FyZAoJCSogdHlwZQoJCSovCgkJLm5hbWUJCT0gIktvZGljb20gNDQwMFIgKHNsYXZlKSIsCgkJLnZpZGVvX2lucHV0cwk9IDE2LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDB4MDEwMDAwLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLm5vX3RkYTc0MzIJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkubXV4c2VsX2hvb2sJPSBrb2RpY29tNDQwMHJfbXV4c2VsLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FETElOS19SVFYyNF0gPSB7CgkJLyogTWljaGFlbCBIZW5zb24gPG1oZW5zb25AY2xhcml0eXZpLmNvbT4gKi8KCQkvKiBBZGxpbmsgUlRWMjQgd2l0aCBzcGVjaWFsIHVubG9jayBjb2RlcyAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBZGxpbmsgUlRWMjQiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9MSVRFXSA9IHsKCQkvKiBNaWNoYWVsIEtydWZreSA8bWtydWZreUBtMWsubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIDUgTGl0ZSIsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19URFZTX0gwNjJGLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxIH0sCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMGUwMDAwNywKCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDA0MDAwMDUsIDAsIDB4MDAwMDAwMDEsIDAsIDB4MDBjMDAwMDcsIDAgfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FDT1JQX1k4NzhGXSA9IHsKCQkvKiBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAYnJ0dXJiby5jb20uYnI+ICovCgkJLm5hbWUJCT0gIkFjb3JwIFk4NzhGIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MDFmZTAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRiwKCQkudHVuZXJfYWRkcgk9IDB4YzEgPj4xLAoJCS5yYWRpb19hZGRyICAgICA9IDB4YzEgPj4xLAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4OSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9DT05DRVBUUk9OSUNfQ1RWRk1JMl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkNvbmNlcHRyb25pYyBDVFZGTWkgdjIiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDFjMDAwNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDMgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU5BXzk1MzNfREksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9QVl9CVDg3OFBfMkVdID0gewoJCS5uYW1lICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi4yRSkiLAoJCS52aWRlb19pbnB1dHMgID0gNSwKCQkuYXVkaW9faW5wdXRzICA9IDEsCgkJLnR1bmVyICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICA9IDB4MDFmZTAwLAoJCS5tdXhzZWwgICAgICAgID0geyAyLDMsMSwxLC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJCS5hdWRpb211eCAgICAgID0geyAweDAwNDAwLCAweDEwNDAwLCAweDA0NDAwLCAweDgwMDAwLCAweDEyNDAwLCAweDQ2MDAwICB9LAoJCS5ub19tc3AzNHh4ICAgID0gMSwKCQkucGxsICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICA9IFRVTkVSX0xHX1BBTF9GTSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICA9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX000OTAwXSA9IHsKCQkvKiBT6XJnaW8gRm9ydGllciA8c2VyZ2lvZm9ydGllckB5YWhvby5jb20uYnI+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWxWaWV3IFBsYXlUViBNUEVHMiBQVi1NNDkwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDNmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMHgyMSwgMHgyMCwgMHgyNCwgMHgyYywgMHgyOSwgMHgyOSB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1lNRUNfVFZGXzU1MzNNRiwKCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVk0NDBdICA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDQ0MCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAoJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4OGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQVNPVU5EX1NLWUVZRV0gPSB7CgkJLm5hbWUJCT0gIkFzb3VuZCBTa3lleWUgUENUViIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMiwgMCwgMCwgMCwgMSB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDIsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1NBQlJFTlRfVFZGTV0gPSB7CgkJLm5hbWUJCT0gIlNhYnJlbnQgVFYtRk0gKGJ0dHYgdmVyc2lvbikiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxMDgwMDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDEwMDAwMCwgMTAwMDAyLCAxMDAwMDIsIDEwMDAwMCB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9UTkZfNTMzNU1GLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCS8qIC0tLS0gY2FyZCAweDhmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0hBVVBQQVVHRV9JTVBBQ1RWQ0JdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgSW1wYWN0VkNCIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCQkubXV4c2VsCQk9IHsgMCwgMSwgMywgMiB9LCAvKiBDb21wb3NpdGUgMC0zICovCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01BQ0hUVl9NQUdJQ1RWXSA9IHsKCQkvKiBKdWxpYW4gQ2FsYWJ5IDxqdWxpYW4uY2FsYWJ5QGdtYWlsLmNvbT4KCQkgKiBTbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvcmlnaW5hbCBNYWNoVFYgZGVmaW5pdGlvbiAoMHg2MCkKCgkJICogRklYTUU6IFJlZ1NweSBzYXlzIGdwaW9tYXNrIHNob3VsZCBiZSAiMHgwMDFjODAwZiIsIGJ1dCBpdAoJCSAqIHN0dWZmcyB1cCByZW1vdGUgY2hpcC4gQnVnIGlzIGEgcGluIG9uIHRoZSBqYWVjcyBpcyBub3Qgc2V0CgkJICogcHJvcGVybHkgKG1ldGhpbmtzKSBjYXVzaW5nIG5vIGtleXVwIGJpdHMgYmVpbmcgc2V0ICovCgoJCS5uYW1lICAgICAgICAgICA9ICJNYWdpY1RWIiwgLyogcmVicmFuZGVkIE1hY2hUViAqLwoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQgfSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ180MDA5RlI1X1BBTCwKCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJ0dHZfbnVtX3R2Y2FyZHMgPSBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcyk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XTsKCi8qCiAqIGlkZW50aWZ5IGNhcmQKICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaWRjYXJkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGludCBncGlvYml0czsKCWludCBpLHR5cGU7Cgl1bnNpZ25lZCBzaG9ydCB0bXA7CgoJLyogcmVhZCBQQ0kgc3Vic3lzdGVtIElEICovCglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmdG1wKTsKCWJ0di0+Y2FyZGlkID0gdG1wIDw8IDE2OwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgfD0gdG1wOwoKCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKCQkvKiBsb29rIGZvciB0aGUgY2FyZCAqLwoJCWZvciAodHlwZSA9IC0xLCBpID0gMDsgY2FyZHNbaV0uaWQgIT0gMDsgaSsrKQoJCQlpZiAoY2FyZHNbaV0uaWQgID09IGJ0di0+Y2FyZGlkKQoJCQkJdHlwZSA9IGk7CgoJCWlmICh0eXBlICE9IC0xKSB7CgkJCS8qIGZvdW5kIGl0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgIgoJCQkgICAgICAgIlBDSSBzdWJzeXN0ZW0gSUQgaXMgJTA0eDolMDR4XG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGNhcmRzW3R5cGVdLm5hbWUsY2FyZHNbdHlwZV0uY2FyZG5yLAoJCQkgICAgICAgYnR2LT5jYXJkaWQgJiAweGZmZmYsCgkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKCQkJYnR2LT5jLnR5cGUgPSBjYXJkc1t0eXBlXS5jYXJkbnI7CgkJfSBlbHNlIHsKCQkJLyogNDA0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogc3Vic3lzdGVtOiAlMDR4OiUwNHggKFVOS05PV04pXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLCBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlwcmludGsoS0VSTl9ERUJVRyAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUgYW5kICIKCQkJICAgICAgICJ0aGUgY29ycmVjdCBjYXJkPSBpbnNtb2Qgb3B0aW9uIHRvIHZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbVxuIik7CgkJfQoJfQoKCS8qIGxldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgYXV0b2RldGVjdGVkIHR5cGUgKi8KCWlmIChjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzKQoJCWJ0di0+Yy50eXBlPWNhcmRbYnR2LT5jLm5yXTsKCgkvKiBwcmludCB3aGljaCBjYXJkIGNvbmZpZyB3ZSBhcmUgdXNpbmcgKi8KCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdXNpbmc6ICVzIFtjYXJkPSVkLCVzXVxuIixidHYtPmMubnIsCgkgICAgICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSwKCSAgICAgICBjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzCgkgICAgICAgPyAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CgoJLyogb3ZlcndyaXRlIGdwaW8gc3R1ZmYgPz8gKi8KCWlmIChVTlNFVCA9PSBhdWRpb2FsbCAmJiBVTlNFVCA9PSBhdWRpb211eFswXSkKCQlyZXR1cm47CgoJaWYgKFVOU0VUICE9IGF1ZGlvbXV4WzBdKSB7CgkJZ3Bpb2JpdHMgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSA9IGF1ZGlvbXV4W2ldOwoJCQlncGlvYml0cyB8PSBhdWRpb211eFtpXTsKCQl9Cgl9IGVsc2UgewoJCWdwaW9iaXRzID0gYXVkaW9hbGw7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9hbGw7CgkJfQoJfQoJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayA9IChVTlNFVCAhPSBncGlvbWFzaykgPyBncGlvbWFzayA6IGdwaW9iaXRzOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKCSAgICAgICBidHYtPmMubnIsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0pOwoJfQoJcHJpbnRrKCJcbiIpOwp9CgovKgogKiAobW9zdCkgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGdvZXMgaGVyZQogKi8KCi8qIFNvbWUgTW9kdWxhciBUZWNobm9sb2d5IGNhcmRzIGhhdmUgYW4gZWVwcm9tLCBidXQgbm8gc3Vic3lzdGVtIElEICovCnN0YXRpYyB2b2lkIGlkZW50aWZ5X2J5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl0pCnsKCWludCB0eXBlID0gLTE7CgoJaWYgKDAgPT0gc3RybmNtcChlZXByb21fZGF0YSwiR0VUIE1NMjB4UENUViIsMTMpKQoJCXR5cGUgPSBCVFRWX0JPQVJEX01PRFRFQ18yMDU7CgllbHNlIGlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGErMjAsIlBpY29sbyIsNykpCgkJdHlwZSA9IEJUVFZfQk9BUkRfRVVSRVNZU19QSUNPTE87CgllbHNlIGlmIChlZXByb21fZGF0YVswXSA9PSAweDg0ICYmIGVlcHJvbV9kYXRhWzJdPT0gMCkKCQl0eXBlID0gQlRUVl9CT0FSRF9IQVVQUEFVR0U7IC8qIG9sZCBidDg0OCAqLwoKCWlmICgtMSAhPSB0eXBlKSB7CgkJYnR2LT5jLnR5cGUgPSB0eXBlOwoJCXByaW50aygiYnR0diVkOiBkZXRlY3RlZCBieSBlZXByb206ICVzIFtjYXJkPSVkXVxuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKCX0KfQoKc3RhdGljIHZvaWQgZmx5dmlkZW9fZ3BpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZ3BpbyxoYXNfcmVtb3RlLGhhc19yYWRpbyxpc19jYXB0dXJlX29ubHksaXNfbHI5MCxoYXNfdGRhOTgyMF90ZGE5ODIxOwoJaW50IHR1bmVyPS0xLHR0eXBlOwoKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDApOwoJdWRlbGF5KDgpOyAgLyogd2l0aG91dCB0aGlzIHdlIHdvdWxkIHNlZSB0aGUgMHgxODAwIG1hc2sgKi8KCWdwaW8gPSBncGlvX3JlYWQoKTsKCS8qIEZJWE1FOiBtdXN0IHJlc3RvcmUgT1VSX0VOID8/PyAqLwoKCS8qIGFsbCBjYXJkcyBwcm92aWRlIEdQSU8gaW5mbywgc29tZSBoYXZlIGFuIGFkZGl0aW9uYWwgZWVwcm9tCgkgKiBMUjUwOiBHUElPIGNvZGluZyBjYW4gYmUgZm91bmQgbG93ZXIgcmlnaHQgQ1AxIC4uIENQOQoJICogICAgICAgQ1A5PUdQSU8yMyAuLiBDUDE9R1BJTzE1OyB3aGVuIE9QRU4sIHRoZSBjb3JyZXNwb25kaW5nIEdQSU8gcmVhZHMgMS4KCSAqICAgICAgIEdQSU8xNC0xMjogbi5jLgoJICogTFI5MDogR1A5PUdQSU8yMyAuLiBHUDE9R1BJTzE1IChyaWdodCBhYm92ZSB0aGUgYnQ4NzgpCgoJICogbG93ZXN0IDMgYnl0ZXMgYXJlIHJlbW90ZSBjb250cm9sIGNvZGVzIChubyBoYW5kc2hha2UgbmVlZGVkKQoJICogeHh4RkZGOiBObyByZW1vdGUgY29udHJvbCBjaGlwIHNvbGRlcmVkCgkgKiB4eHhGMDAoTFIyNi9MUjUwKSwgeHh4RkUwKExSOTApOiBSZW1vdGUgY29udHJvbCBjaGlwIChMVkEwMDEgb3IgQ0Y0NSkgc29sZGVyZWQKCSAqIE5vdGU6IFNvbWUgYml0cyBhcmUgQXVkaW9fTWFzayAhCgkgKi8KCXR0eXBlPShncGlvJjB4MGYwMDAwKT4+MTY7Cglzd2l0Y2godHR5cGUpIHsKCWNhc2UgMHgwOiB0dW5lcj0yOyAvKiBOVFNDLCBlLmcuIFRQSThOU1IxMVAgKi8KCQlicmVhazsKCWNhc2UgMHgyOiB0dW5lcj0zOTsvKiBMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1INzAxUCAqLwoJCWJyZWFrOwoJY2FzZSAweDQ6IHR1bmVyPTU7IC8qIFBoaWxpcHMgUEFMIFRQSThQU0IwMlAsIFRQSThQU0IxMlAsIFRQSThQU0IxMkQgb3IgRkkxMjE2LCBGTTEyMTYgKi8KCQlicmVhazsKCWNhc2UgMHg2OiB0dW5lcj0zNzsvKiBMRyBQQUwgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUc3MDJQICovCgkJYnJlYWs7CgkJY2FzZSAweEM6IHR1bmVyPTM7IC8qIFBoaWxpcHMgU0VDQU0oK1BBTCkgRlExMjE2TUUgb3IgRkkxMjE2TUYgKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlb19ncGlvOiB1bmtub3duIHR1bmVyIHR5cGUuXG4iLCBidHYtPmMubnIpOwoJfQoKCWhhc19yZW1vdGUgICAgICAgICAgPSAgIGdwaW8gJiAweDgwMDAwMDsKCWhhc19yYWRpbwkgICAgPSAgIGdwaW8gJiAweDQwMDAwMDsKCS8qICAgdW5rbm93biAgICAgICAgICAgICAgICAgICAweDIwMDAwMDsKCSAqICAgdW5rbm93bjIgICAgICAgICAgICAgICAgICAweDEwMDAwMDsgKi8KCWlzX2NhcHR1cmVfb25seSAgICAgPSAhKGdwaW8gJiAweDAwODAwMCk7IC8qIEdQSU8xNSAqLwoJaGFzX3RkYTk4MjBfdGRhOTgyMSA9ICEoZ3BpbyAmIDB4MDA0MDAwKTsKCWlzX2xyOTAgICAgICAgICAgICAgPSAhKGdwaW8gJiAweDAwMjAwMCk7IC8qIGVsc2UgTFIyNi9MUjUwIChMUjM4L0xSNTEgZi4gY2FwdHVyZSBvbmx5KSAqLwoJLyoKCSAqIGdwaW8gJiAweDAwMTAwMCAgICBvdXRwdXQgYml0IGZvciBhdWRpbyByb3V0aW5nICovCgoJaWYoaXNfY2FwdHVyZV9vbmx5KQoJCXR1bmVyPTQ7IC8qIE5vIHR1bmVyIHByZXNlbnQgKi8KCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCgkgICAgICAgYnR2LT5jLm5yLCBoYXNfcmFkaW8/ICJ5ZXMiOiJubyAiLCBoYXNfcmVtb3RlPyAieWVzIjoibm8gIiwgdHVuZXIsIGdwaW8pOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyAgTFI5MD0lcyB0ZGE5ODIxL3RkYTk4MjA9JXMgY2FwdHVyZV9vbmx5PSVzXG4iLAoJCWJ0di0+Yy5uciwgaXNfbHI5MD8ieWVzIjoibm8gIiwgaGFzX3RkYTk4MjBfdGRhOTgyMT8ieWVzIjoibm8gIiwKCQlpc19jYXB0dXJlX29ubHk/InllcyI6Im5vICIpOwoKCWlmKHR1bmVyIT0gLTEpIC8qIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoICovCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXI7CglidHYtPmhhc19yYWRpbyA9IGhhc19yYWRpbzsKCgkvKiBMUjkwIEF1ZGlvIFJvdXRpbmcgaXMgZG9uZSBieSAyIGhlZjQwNTIsIHNvIEF1ZGlvX01hc2sgaGFzIDQgYml0czogMHgwMDFjODAKCSAqIExSMjYvTFI1MCBvbmx5IGhhcyAxIGhlZjQwNTIsIEF1ZGlvX01hc2sgMHgwMDBjMDAKCSAqIEF1ZGlvIG9wdGlvbnM6IGZyb20gdHVuZXIsIGZyb20gdGRhOTgyMS90ZGE5ODIxKG1vbm8sc3RlcmVvLHNhcCksIGZyb20gdGRhOTg3NCwgZXh0LiwgbXV0ZSAqLwoJaWYoaGFzX3RkYTk4MjBfdGRhOTgyMSkgYnR2LT5hdWRpb19ob29rID0gbHQ5NDE1X2F1ZGlvOwoJLyogdG9kbzogaWYoaGFzX3RkYTk4NzQpIGJ0di0+YXVkaW9faG9vayA9IGZ2MjAwMHNfYXVkaW87ICovCn0KCnN0YXRpYyBpbnQgbWlyb190dW5lcm1hcFtdID0geyAwLDYsMiwzLCAgIDQsNSw2LDAsICAzLDAsNCw1LCAgNSwyLDE2LDEsCgkJCSAgICAgICAxNCwyLDE3LDEsIDQsMSw0LDMsICAxLDIsMTYsMSwgNCw0LDQsNCB9OwpzdGF0aWMgaW50IG1pcm9fZm10dW5lcltdICA9IHsgMCwwLDAsMCwgICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDEsCgkJCSAgICAgICAxLDEsMSwxLCAgIDEsMSwxLDAsICAwLDAsMCwwLCAgMCwxLDAsMCB9OwoKc3RhdGljIHZvaWQgbWlyb19waW5uYWNsZV9ncGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBpZCxtc3AsZ3BpbzsKCWNoYXIgKmluZm87CgoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7CglncGlvID0gZ3Bpb19yZWFkKCk7CglpZCAgID0gKChncGlvPj4xMCkgJiA2MykgLTE7Cgltc3AgID0gYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4Iik7CglpZiAoaWQgPCAzMikgewoJCWJ0di0+dHVuZXJfdHlwZSA9IG1pcm9fdHVuZXJtYXBbaWRdOwoJCWlmICgwID09IChncGlvICYgMHgyMCkpIHsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlpZiAoIW1pcm9fZm10dW5lcltpZF0pIHsKCQkJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCQkJCWJ0di0+bWJveF93ZSAgICA9ICgxPDw2KTsKCQkJCWJ0di0+bWJveF9tb3N0ICA9ICgxPDw3KTsKCQkJCWJ0di0+bWJveF9jbGsgICA9ICgxPDw4KTsKCQkJCWJ0di0+bWJveF9kYXRhICA9ICgxPDw5KTsKCQkJCWJ0di0+bWJveF9tYXNrICA9ICgxPDw2KXwoMTw8Nyl8KDE8PDgpfCgxPDw5KTsKCQkJfQoJCX0gZWxzZSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQl9CgkJaWYgKC0xICE9IG1zcCkgewoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9NSVJPKQoJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX01JUk9QUk87CgkJCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX0JPQVJEX1BJTk5BQ0xFKQoJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX1BJTk5BQ0xFUFJPOwoJCX0KCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJidHR2JWQ6IG1pcm86IGlkPSVkIHR1bmVyPSVkIHJhZGlvPSVzIHN0ZXJlbz0lc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCgkJICAgICAgICFidHYtPmhhc19yYWRpbyA/ICJubyIgOgoJCSAgICAgICAoYnR2LT5oYXNfbWF0Y2hib3ggPyAibWF0Y2hib3giIDogImZtdHVuZXIiKSwKCQkgICAgICAgKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOwoJfSBlbHNlIHsKCQkvKiBuZXcgY2FyZHMgd2l0aCBtaWNyb3R1bmUgdHVuZXIgKi8KCQlpZCA9IDYzIC0gaWQ7CgkJYnR2LT5oYXNfcmFkaW8gPSAwOwoJCXN3aXRjaCAoaWQpIHsKCQljYXNlIDE6CgkJCWluZm8gPSAiUEFMIC8gbW9ubyI7CgkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19JTlRFUkNBUlJJRVI7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJaW5mbyA9ICJQQUwrU0VDQU0gLyBzdGVyZW8iOwoJCQlidHYtPmhhc19yYWRpbyA9IDE7CgkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19RU1M7CgkJCWJyZWFrOwoJCWNhc2UgMzoKCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUVNTOwoJCQlicmVhazsKCQljYXNlIDQ6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gbW9ubyI7CgkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19RU1M7CgkJCWJyZWFrOwoJCWNhc2UgNToKCQkJaW5mbyA9ICJOVFNDIC8gbW9ubyI7CgkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19JTlRFUkNBUlJJRVI7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKCQkJYnR2LT50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X0lOVEVSQ0FSUklFUjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlpbmZvID0gIlBBTCAvIHN0ZXJlbyI7CgkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19JTlRFUkNBUlJJRVI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8gPSAib29wczogdW5rbm93biBjYXJkIjsKCQkJYnJlYWs7CgkJfQoJCWlmICgtMSAhPSBtc3ApCgkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9QSU5OQUNMRVBSTzsKCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBpZCwgaW5mbywgYnR2LT5oYXNfcmFkaW8gPyAieWVzIiA6ICJubyIpOwoJCWJ0di0+dHVuZXJfdHlwZSA9IFRVTkVSX01UMjAzMjsKCX0KfQoKLyogR1BJTzIxICAgTDogQnVmZmVyIGFrdGl2LCBIOiBCdWZmZXIgaW5ha3RpdiAqLwojZGVmaW5lIExNMTg4Ml9TWU5DX0RSSVZFICAgICAweDIwMDAwMEwKCnN0YXRpYyB2b2lkIGluaXRfaWRzX2VhZ2xlKHN0cnVjdCBidHR2ICpidHYpCnsKCWdwaW9faW5vdXQoMHhmZmZmZmYsMHhGRkZGMzcpOwoJZ3Bpb193cml0ZSgweDIwMDAyMCk7CgoJLyogZmxhc2ggc3Ryb2JlIGludmVydGVyID8hICovCglncGlvX3dyaXRlKDB4MjAwMDI0KTsKCgkvKiBzd2l0Y2ggc3luYyBkcml2ZSBvZmYgKi8KCWdwaW9fYml0cyhMTTE4ODJfU1lOQ19EUklWRSxMTTE4ODJfU1lOQ19EUklWRSk7CgoJLyogc2V0IEJUODQ4IG11eGVsIHRvIDIgKi8KCWJ0YW9yKCgyKTw8NSwgfigyPDw1KSwgQlQ4NDhfSUZPUk0pOwp9CgovKiBNdXhzZWwgaGVscGVyIGZvciB0aGUgSURTIEVhZ2xlLgogKiB0aGUgZWFnbGVzIGRvZXMgbm90IHVzZSB0aGUgc3RhbmRhcmQgbXV4c2VsLWJpdHMgYnV0CiAqIGhhcyBpdHMgb3duIG11bHRpcGxleGVyICovCnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWJ0YW9yKCgyKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwoJZ3Bpb19iaXRzKDMsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxbaW5wdXQmN10pOwoKICAgICAgIC8qIGNvbXBvc2l0ZSAqLwogICAgICAgLyogc2V0IGNocm9tYSBBREMgdG8gc2xlZXAgKi8KICAgICAgIGJ0b3IoQlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7CiAgICAgICAvKiBzZXQgdG8gY29tcG9zaXRlIHZpZGVvICovCiAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKCiAgICAgICAvKiBzd2l0Y2ggc3luYyBkcml2ZSBvZmYgKi8KICAgICAgIGdwaW9fYml0cyhMTTE4ODJfU1lOQ19EUklWRSxMTTE4ODJfU1lOQ19EUklWRSk7Cn0KCnN0YXRpYyB2b2lkIGd2YzExMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gezB4MzAsIDB4MDEsIDB4MTIsIDB4MjN9OwoJZ3Bpb193cml0ZShtYXNrc1tpbnB1dCU0XSk7Cn0KCi8qIExNTEJUNHggaW5pdGlhbGl6YXRpb24gLSB0byBhbGxvdyBhY2Nlc3MgdG8gR1BJTyBiaXRzIGZvciBzZW5zb3JzIGlucHV0IGFuZAogICBhbGFybXMgb3V0cHV0CgogICBHUElPYml0ICAgIHwgMTAgfCA5IHwgOCB8IDcgfCA2IHwgNSB8IDQgfCAzIHwgMiB8IDEgfCAwIHwKICAgYXNzaWdubWVudCB8IFRJIHwgTzN8SU54fCBPMnwgTzF8SU40fElOM3xJTjJ8SU4xfCAgIHwgICB8CgogICBJTiAtIHNlbnNvciBpbnB1dHMsIElOeCAtIHNlbnNvciBpbnB1dHMgYW5kIFRJIFhPUmVkIHRvZ2V0aGVyCiAgIE8xLE8yLE8zIC0gYWxhcm0gb3V0cHV0cyAocmVsYXlzKQoKICAgT1VUIEVOQUJMRSAgIDEgICAgMSAgIDAgIC4gMSAgMSAgIDAgICAwIC4gMCAgIDAgICAwICAgIDAgICA9IDB4NkMwCgoqLwoKc3RhdGljIHZvaWQgaW5pdF9sbWxidDR4KHN0cnVjdCBidHR2ICpidHYpCnsKCXByaW50ayhLRVJOX0RFQlVHICJMTUxCVDR4IGluaXRcbiIpOwoJYnR3cml0ZSgweDAwMDAwMCwgQlQ4NDhfR1BJT19SRUdfSU5QKTsKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDB4MDAwNkMwKTsKCWdwaW9fd3JpdGUoMHgwMDAwMDApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgODsKCWdwaW9faW5vdXQoIDB4ZiwgMHhmICk7CglncGlvX2JpdHMoIDB4ZiwgaW5tdXggKTsKfQoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA0OwoJZ3Bpb19pbm91dCggMzw8OSwgMzw8OSApOwoJZ3Bpb19iaXRzKCAzPDw5LCBpbm11eDw8OSApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgYnR0dl9yZXNldF9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKgoJICogQlQ4NzhBIGhhcyBhIGF1ZGlvLXJlc2V0IHJlZ2lzdGVyLgoJICogMS4gVGhpcyByZWdpc3RlciBpcyBhbiBhdWRpbyByZXNldCBmdW5jdGlvbiBidXQgaXQgaXMgaW4KCSAqICAgIGZ1bmN0aW9uLTAgKHZpZGVvIGNhcHR1cmUpIGFkZHJlc3Mgc3BhY2UuCgkgKiAyLiBJdCBpcyBlbm91Z2ggdG8gZG8gdGhpcyBvbmNlIHBlciBwb3dlci11cCBvZiB0aGUgY2FyZC4KCSAqIDMuIFRoZXJlIGlzIGEgdHlwbyBpbiB0aGUgQ29uZXhhbnQgZG9jIC0tIGl0IGlzIG5vdCBhdAoJICogICAgMHg1QiwgYnV0IGF0IDB4MDU4LiAoQiBpcyBhbiBvZGQtbnVtYmVyLCBvYnZpb3VzbHkgYSB0eXBvISkuCgkgKiAtLS8vU2hyaWt1bWFyIDAzMDYwOQoJICovCglpZiAoYnR2LT5pZCAhPSA4NzgpCgkJcmV0dXJuOwoKCWlmIChidHR2X2RlYnVnKQoJCXByaW50aygiYnR0diVkOiBCVDg3OEEgQVJFU0VUXG4iLGJ0di0+Yy5ucik7CglidHdyaXRlKCgxPDw3KSwgMHgwNTgpOwoJdWRlbGF5KDEwKTsKCWJ0d3JpdGUoICAgICAwLCAweDA1OCk7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgb25lIC0tIGJlZm9yZSByZWdpc3RlcmluZyBpMmMgYnVzICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMShzdHJ1Y3QgYnR0diAqYnR2KQp7Cglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFOgoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3ODoKCQlib290X21zcDM0eHgoYnR2LDUpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNOgoJCWJvb3RfbXNwMzR4eChidHYsMjApOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0FWRVJNRURJQTk4OgoJCWJvb3RfbXNwMzR4eChidHYsMTEpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRVBWUjoKCQlwdnJfYm9vdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1RXSU5IQU5fRFNUOgoJY2FzZSBCVFRWX0JPQVJEX0FWRFZCVF83NzE6CgljYXNlIEJUVFZfQk9BUkRfUElOTkFDTEVTQVQ6CgkJYnR2LT51c2VfaTJjX2h3ID0gMTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9BRExJTktfUlRWMjQ6CgkJaW5pdF9SVFYyNCggYnR2ICk7CgkJYnJlYWs7CgoJfQoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19kdmIpCgkJYnR0dl9yZXNldF9hdWRpbyhidHYpOwp9CgovKiBpbml0aWFsaXphdGlvbiBwYXJ0IHR3byAtLSBhZnRlciByZWdpc3RlcmluZyBpMmMgYnVzICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMihzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgdGRhOTg4NzsKCWludCBhZGRyPUFERFJfVU5TRVQ7CgoJYnR2LT50dW5lcl90eXBlID0gLTE7CgoJaWYgKEJUVFZfQk9BUkRfVU5LTk9XTiA9PSBidHYtPmMudHlwZSkgewoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQlpZGVudGlmeV9ieV9lZXByb20oYnR2LGVlcHJvbV9kYXRhKTsKCX0KCglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfQk9BUkRfTUlSTzoKCWNhc2UgQlRUVl9CT0FSRF9NSVJPUFJPOgoJY2FzZSBCVFRWX0JPQVJEX1BJTk5BQ0xFOgoJY2FzZSBCVFRWX0JPQVJEX1BJTk5BQ0xFUFJPOgoJCS8qIG1pcm8vcGlubmFjbGUgKi8KCQltaXJvX3Bpbm5hY2xlX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9GTFlWSURFT185ODoKCWNhc2UgQlRUVl9CT0FSRF9NQVhJOgoJY2FzZSBCVFRWX0JPQVJEX0xJRkVfRkxZS0lUOgoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPOgoJY2FzZSBCVFRWX0JPQVJEX1RZUEhPT05fVFZJRVc6CgljYXNlIEJUVFZfQk9BUkRfQ0hST05PU19WUzI6CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU9fOThGTToKCWNhc2UgQlRUVl9CT0FSRF9GTFlWSURFTzIwMDA6CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU85OEVaOgoJY2FzZSBCVFRWX0JPQVJEX0NPTkZFUkVOQ0VUVjoKCWNhc2UgQlRUVl9CT0FSRF9MSUZFVEVDXzk0MTU6CgkJZmx5dmlkZW9fZ3BpbyhidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRToKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0U4Nzg6CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFUFZSOgoJCS8qIHBpY2sgdXAgc29tZSBjb25maWcgaW5mb3MgZnJvbSB0aGUgZWVwcm9tICovCgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWhhdXBwYXVnZV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9BVkVSTUVESUE5ODoKCWNhc2UgQlRUVl9CT0FSRF9BVlBIT05FOTg6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWF2ZXJtZWRpYV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9QWEMyMDA6CgkJaW5pdF9QWEMyMDAoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUDoKCQlwaWNvbG9fdGV0cmFfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1ZIWDoKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJCWJ0di0+bWJveF93ZSAgICAgID0gMHgyMDsKCQlidHYtPm1ib3hfbW9zdCAgICA9IDA7CgkJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJCWJ0di0+bWJveF9kYXRhICAgID0gMHgxMDsKCQlidHYtPm1ib3hfbWFzayAgICA9IDB4Mzg7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVk9CSVNfQk9PU1RBUjoKCWNhc2UgQlRUVl9CT0FSRF9URVJSQVRWOgoJCXRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MToKCQlpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDAyMTQ0ZikgewoJCQlidHYtPmhhc19yYWRpbz0xOwoJCQlwcmludGsoImJ0dHYlZDogcmFkaW8gZGV0ZWN0ZWQgYnkgc3Vic3lzdGVtIGlkIChDUEgwNXgpXG4iLGJ0di0+Yy5ucik7CgkJfQoJCWJyZWFrOwogICAgICAgY2FzZSBCVFRWX0JPQVJEX1NUQjI6CgkJaWYgKGJ0di0+Y2FyZGlkID09IDB4MzA2MDEyMWEpIHsKCQkJLyogRml4IHVwIGVudHJ5IGZvciAzREZYIFZvb2Rvb1RWIDEwMCwKCQkJICAgd2hpY2ggaXMgYW4gT0VNIFNUQiBjYXJkIHZhcmlhbnQuICovCgkJCWJ0di0+aGFzX3JhZGlvPTA7CgkJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9URU1JQ19OVFNDOwoJCX0KCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkxeDA6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMXgwXzg0ODoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkxMDFfODQ4OgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTF4MToKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkxeDFfU1ZJRDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyeHg6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMngwX1NWSUQ6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMngwOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTUwMDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVk1NDA6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMjAwMDoKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJb3NwcmV5X2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0lEU19FQUdMRToKCQlpbml0X2lkc19lYWdsZShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX01PRFRFQ18yMDU6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCW1vZHRlY19lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9MTUxCVDQ6CgkJaW5pdF9sbWxidDR4KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVElCRVRfQ1MxNjoKCQl0aWJldENTMTZfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0tPRElDT01fNDQwMFI6CgkJa29kaWNvbTQ0MDByX2luaXQoYnR2KTsKCQlicmVhazsKCX0KCgkvKiBwbGwgY29uZmlndXJhdGlvbiAqLwoJaWYgKCEoYnR2LT5pZD09ODQ4ICYmIGJ0di0+cmV2aXNpb249PTB4MTEpKSB7CgkJLyogZGVmYXVsdHMgZnJvbSBjYXJkIGxpc3QgKi8KCQlpZiAoUExMXzI4ID09IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ucGxsKSB7CgkJCWJ0di0+cGxsLnBsbF9pZnJlcT0yODYzNjM2MzsKCQkJYnR2LT5wbGwucGxsX2NyeXN0YWw9QlQ4NDhfSUZPUk1fWFQwOwoJCX0KCQlpZiAoUExMXzM1ID09IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ucGxsKSB7CgkJCWJ0di0+cGxsLnBsbF9pZnJlcT0zNTQ2ODk1MDsKCQkJYnR2LT5wbGwucGxsX2NyeXN0YWw9QlQ4NDhfSUZPUk1fWFQxOwoJCX0KCQkvKiBpbnNtb2Qgb3B0aW9ucyBjYW4gb3ZlcnJpZGUgKi8KCQlzd2l0Y2ggKHBsbFtidHYtPmMubnJdKSB7CgkJY2FzZSAwOiAvKiBub25lICovCgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gMDsKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CgkJCWJyZWFrOwoJCWNhc2UgMTogLyogMjggTUh6ICovCgkJY2FzZSAyODoKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAyODYzNjM2MzsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMDsKCQkJYnJlYWs7CgkJY2FzZSAyOiAvKiAzNSBNSHogKi8KCQljYXNlIDM1OgoJCQlidHYtPnBsbC5wbGxfaWZyZXEgICA9IDM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQxOwoJCQlicmVhazsKCQl9Cgl9CglidHYtPnBsbC5wbGxfY3VycmVudCA9IC0xOwoKCS8qIHR1bmVyIGNvbmZpZ3VyYXRpb24gKGZyb20gY2FyZCBsaXN0IC8gYXV0b2RldGVjdCAvIGluc21vZCBvcHRpb24pICovCglpZiAoQUREUl9VTlNFVCAhPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX2FkZHIpCgkJYWRkciA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfYWRkcjsKCglpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQoJCWlmKFVOU0VUID09IGJ0di0+dHVuZXJfdHlwZSkKCQkJYnR2LT50dW5lcl90eXBlID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlOwoJaWYgKFVOU0VUICE9IHR1bmVyW2J0di0+Yy5ucl0pCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXJbYnR2LT5jLm5yXTsKCXByaW50aygiYnR0diVkOiB1c2luZyB0dW5lcj0lZFxuIixidHYtPmMubnIsYnR2LT50dW5lcl90eXBlKTsKCglpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKSB7CgkJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKCgkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOwoJCXR1bl9zZXR1cC50eXBlID0gYnR2LT50dW5lcl90eXBlOwoJCXR1bl9zZXR1cC5hZGRyID0gYWRkcjsKCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7Cgl9CgoJaWYgKGJ0di0+dGRhOTg4N19jb25mKSB7CgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVERBOTg4N19TRVRfQ09ORklHLAoJCQkJCQkJJmJ0di0+dGRhOTg4N19jb25mKTsKCX0KCglidHYtPnN2aHMgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnN2aHM7CglpZiAoc3Zoc1tidHYtPmMubnJdICE9IFVOU0VUKQoJCWJ0di0+c3ZocyA9IHN2aHNbYnR2LT5jLm5yXTsKCWlmIChyZW1vdGVbYnR2LT5jLm5yXSAhPSBVTlNFVCkKCQlidHYtPmhhc19yZW1vdGUgPSByZW1vdGVbYnR2LT5jLm5yXTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfcmFkaW8pCgkJYnR2LT5oYXNfcmFkaW89MTsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yZW1vdGUpCgkJYnR2LT5oYXNfcmVtb3RlPTE7CglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fZ3Bpb2lycSkKCQlidHYtPmdwaW9pcnE9MTsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2spCgkJYnR2LT5hdWRpb19ob29rPWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vazsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5kaWdpdGFsX21vZGUgPT0gRElHSVRBTF9NT0RFX0NBTUVSQSkgewoJCS8qIGRldGVjdCBCdDgzMiBjaGlwIGZvciBxdWFydHpzaWdodCBkaWdpdGFsIGNhbWVyYSAqLwoJCWlmICgoYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0JUODMyX0FMVDEsICJCdDgzMiIpID49MCkgfHwKCQkgICAgKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQyLCAiQnQ4MzIiKSA+PTApKQoJCQlib290X2J0ODMyKGJ0dik7Cgl9CgoJaWYgKCFhdXRvbG9hZCkKCQlyZXR1cm47CgoJLyogdHJ5IHRvIGRldGVjdCBhdWRpby9mYWRlciBjaGlwcyAqLwoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX21zcDM0eHggJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMCwgIk1TUDM0eHgiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tc3AzNHh4X2FsdCAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwX0FMVCwgIk1TUDM0eHggKGFsdGVybmF0ZSBhZGRyZXNzKSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgibXNwMzQwMCIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE5ODc1ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4NzUsICJUREE5ODc1IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODc1Iik7CgoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3RkYTc0MzIgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBNzQzMiwgIlREQTc0MzIiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoInRkYTc0MzIiKTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uZWVkc190dmF1ZGlvKQoJCXJlcXVlc3RfbW9kdWxlKCJ0dmF1ZGlvIik7CgoJLyogdHVuZXIgbW9kdWxlcyAqLwoJdGRhOTg4NyA9IDA7CglpZiAoYnR2LT50ZGE5ODg3X2NvbmYpCgkJdGRhOTg4NyA9IDE7CglpZiAoMCA9PSB0ZGE5ODg3ICYmIDAgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4ODcsICJUREE5ODg3IikgPj0wKQoJCXRkYTk4ODcgPSAxOwoJLyogSHlicmlkIERWQiBjYXJkLCBET0VTIGhhdmUgYSB0ZGE5ODg3ICovCglpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSkKCQl0ZGE5ODg3ID0gMTsKCWlmKChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMpIHx8CgkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMykgfHwKCSAgIChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyNTZfSUgzKSB8fAoJICAgIHRkYTk4ODcpCgkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCgkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpZiggc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiVGVtaWMgNDA2NiBGWTUiLDE0KSA9PTApIHsKCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSTsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIkFscHMgVFNCQjUiLDEwKSA9PTApIHsKCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfQUxQU19UU0JCNV9QQUxfSTsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlBoaWxpcHMgRk0xMjQ2IiwxNCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1BISUxJUFNfTlRTQzsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgewoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFVua25vd24gVHVuZXJTdHJpbmc6ICVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0KfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IGhhdXBwYXVnZV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RydWN0IHR2ZWVwcm9tIHR2OwoKCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coJmJ0di0+aTJjX2NsaWVudCwgJnR2LCBlZXByb21fZGF0YSk7CglidHYtPnR1bmVyX3R5cGUgPSB0di50dW5lcl90eXBlOwoJYnR2LT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOwoKCXByaW50aygiYnR0diVkOiBIYXVwcGF1Z2UgZWVwcm9tIGluZGljYXRlcyBtb2RlbCMlZFxuIiwKCQlidHYtPmMubnIsIHR2Lm1vZGVsKTsKCgkvKgoJICogU29tZSBvZiB0aGUgODc4IGJvYXJkcyBoYXZlIGR1cGxpY2F0ZSBQQ0kgSURzLiBTd2l0Y2ggdGhlIGJvYXJkCgkgKiB0eXBlIGJhc2VkIG9uIG1vZGVsICMuCgkgKi8KCWlmKHR2Lm1vZGVsID09IDY0OTAwKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFN3aXRjaGluZyBib2FyZCB0eXBlIGZyb20gJXMgdG8gJXNcbiIsCgkJCWJ0di0+Yy5uciwKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLAoJCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9IQVVQUEFVR0VfSU1QQUNUVkNCXS5uYW1lKTsKCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfSEFVUFBBVUdFX0lNUEFDVFZDQjsKCX0KfQoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZnJlcTsKCglidHYtPmhhc19yYWRpbyAgICA9IDE7CglidHYtPmhhc19tYXRjaGJveCA9IDE7CglidHYtPm1ib3hfd2UgICAgICA9IDB4MTA7CglidHYtPm1ib3hfbW9zdCAgICA9IDB4MjA7CglidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CglidHYtPm1ib3hfZGF0YSAgICA9IDB4MDQ7CglidHYtPm1ib3hfbWFzayAgICA9IDB4M2M7CgoJYnR2LT5tYm94X2lvdyAgICAgPSAxIDw8ICA4OwoJYnR2LT5tYm94X2lvciAgICAgPSAxIDw8ICA5OwoJYnR2LT5tYm94X2NzZWwgICAgPSAxIDw8IDEwOwoKCWZyZXE9ODgwMDAvNjIuNTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCglpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kLlxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJfSBlbHNlIHsKCQlidHYtPmhhc19yYWRpbyAgICA9IDA7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAwOwoJfQoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogbWluaW1hbCBib290c3RyYXAgZm9yIHRoZSBXaW5UVi9QVlIgLS0gdXBsb2FkIGFsdGVyYSBmaXJtd2FyZS4KICoKICogVGhlIGhjd2FtYy5yYmYgZmlybXdhcmUgZmlsZSBpcyBvbiB0aGUgSGF1cHBhdWdlIGRyaXZlciBDRC4gIEhhdmUKICogYSBsb29rIGF0IFB2ci9wdnI0NXh4eC5FWEUgKHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSwgY2FuIGJlCiAqIHVucGFja2VkIHdpdGggdW56aXApLgogKi8KI2RlZmluZSBQVlJfR1BJT19ERUxBWQkJMTAKCiNkZWZpbmUgQlRUVl9BTFRfREFUQQkJMHgwMDAwMDEKI2RlZmluZSBCVFRWX0FMVF9EQ0xLCQkweDEwMDAwMAojZGVmaW5lIEJUVFZfQUxUX05DT05GSUcJMHg4MDAwMDAKCnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9hbHRlcmFfbG9hZChzdHJ1Y3QgYnR0diAqYnR2LCB1OCAqbWljcm8sIHUzMiBtaWNyb2xlbikKewoJdTMyIG47Cgl1OCBiaXRzOwoJaW50IGk7CgoJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglncGlvX3dyaXRlKEJUVFZfQUxUX05DT05GSUcpOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglmb3IgKG4gPSAwOyBuIDwgbWljcm9sZW47IG4rKykgewoJCWJpdHMgPSBtaWNyb1tuXTsKCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgewoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQkJaWYgKGJpdHMgJiAweDAxKQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CgkJCWVsc2UKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLDApOwoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCQkJYml0cyA+Pj0gMTsKCQl9Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJLyogYmVnaW4gQWx0ZXJhIGluaXQgbG9vcCAoTm90IG5lY2Vzc2FyeSxidXQgZG9lc24ndCBodXJ0KSAqLwoJZm9yIChpID0gMCA7IGkgPCAzMCA7IGkrKykgewoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dikKewoJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKCWludCByYzsKCglyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiaGN3YW1jLnJiZiIsICZidHYtPmMucGNpLT5kZXYpOwoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAoJCSAgICAgICBidHYtPmMubnIpOwoJCXJldHVybiByYzsKCX0KCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogYWx0ZXJhIGZpcm13YXJlIHVwbG9hZCAlc1xuIiwKCSAgICAgICBidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOwoJcmV0dXJuIHJjOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBzb21lIG9zcHJleSBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgaW50IGkgPSAwOwogICAgICAgdW5zaWduZWQgY2hhciAqZWUgPSBlZXByb21fZGF0YTsKICAgICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsID0gMDsKCiAgICAgICBpZiAoYnR2LT5jLnR5cGUgPT0gMCkgewoJICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KCSAgICAgICBpZiAoKGVlWzBdPT0nTScpICYmIChlZVsxXT09J00nKSAmJiAoZWVbMl09PSdBJykgJiYgKGVlWzNdPT0nQycpKSB7CgkJICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwoJCSAgICAgICBmb3IgKGkgPTA7IGk8MjE7IGkrKykKCQkJICAgICAgIGNoZWNrc3VtICs9IGVlW2ldOwoJCSAgICAgICBpZiAoY2hlY2tzdW0gIT0gZWVbMjFdKQoJCQkgICAgICAgcmV0dXJuOwoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgwXzg0ODsKCQkgICAgICAgZm9yIChpID0gMTI7IGkgPCAyMTsgaSsrKQoJCQkgICAgICAgc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CgkgICAgICAgfQogICAgICAgfSBlbHNlIHsKCSAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOwoJICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwoKCSAgICAgICBmb3IoOyBvZmZzZXQgPCA4KjE2OyBvZmZzZXQgKz0gMTYpIHsKCQkgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOwoJCSAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCgkJICAgICAgIGZvcihpID0gMDsgaTwxNDsgaSsrKSBjaGVja3N1bSArPSBlZVtpK29mZnNldF07CgkJCSAgICAgICBjaGVja3N1bSA9IH5jaGVja3N1bTsgIC8qIG5vIGlkZWEgd2h5ICovCgkJCSAgICAgICBpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgoJCQkJICAgKChjaGVja3N1bSAmIDB4MEZGKSA9PSBlZVtvZmZzZXQrMTVdKSkgewoJCQkgICAgICAgYnJlYWs7CgkJICAgICAgIH0KCSAgICAgICB9CgoJICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKCQkgICAgICAgcmV0dXJuOwoKCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKCgkgICAgICAgc3dpdGNoKHR5cGUpIHsKCgkgICAgICAgLyogODQ4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMDQ6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAwNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTEwMV84NDg7CgkJICAgICAgIGJyZWFrOwoKCSAgICAgICAvKiA4NzggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAxMjoKCSAgICAgICBjYXNlIDB4MDAxMzoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTF4MDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTQ6CgkgICAgICAgY2FzZSAweDAwMTU6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDE7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE2OgoJICAgICAgIGNhc2UgMHgwMDE3OgoJICAgICAgIGNhc2UgMHgwMDIwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSUQ7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE4OgoJICAgICAgIGNhc2UgMHgwMDE5OgoJICAgICAgIGNhc2UgMHgwMDFFOgoJICAgICAgIGNhc2UgMHgwMDFGOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMnh4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxQToKCSAgICAgICBjYXNlIDB4MDAxQjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTJ4MF9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA0MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTUwMDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNTA6CgkgICAgICAgY2FzZSAweDAwNTY6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVk1NDA7CgkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDYwOgoJICAgICAgIGNhc2UgMHgwMDcwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMngwOwoJCSAgICAgICAvKiBlbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzICovCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewoJVFVORVJfUEhJTElQU19OVFNDLCAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUJHKi8sCglUVU5FUl9QSElMSVBTX1BBTCwgICBUVU5FUl9QSElMSVBTX1BBTCAvKiBQQUwtSSovLAoJVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCglUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1NFQ0FNLAoJVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19QQUwsCglUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMyB9OwoKc3RhdGljIGludCB0dW5lcl8xX3RhYmxlW10gPSB7CglUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvKiBUVU5FUl9URU1JQ19TRUNBTSAqLwoJVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfUEFMfTsKCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0dW5lcl9tYWtlLHR1bmVyX3R2X2ZtLHR1bmVyX2Zvcm1hdCx0dW5lcj0wOwoKCXR1bmVyX21ha2UgICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4Nyk7Cgl0dW5lcl90dl9mbSAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDE4KSA+PiAzOwoJdHVuZXJfZm9ybWF0ICAgID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHhmMCkgPj4gNDsKCWJ0di0+aGFzX3JlbW90ZSA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4MDEpOwoKCWlmICh0dW5lcl9tYWtlID09IDAgfHwgdHVuZXJfbWFrZSA9PSAyKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTB4MGEpCgkJCXR1bmVyID0gdHVuZXJfMF90YWJsZVt0dW5lcl9mb3JtYXRdOwoJaWYgKHR1bmVyX21ha2UgPT0gMSkKCQlpZih0dW5lcl9mb3JtYXQgPD05KQoJCQl0dW5lciA9IHR1bmVyXzFfdGFibGVbdHVuZXJfZm9ybWF0XTsKCglpZiAodHVuZXJfbWFrZSA9PSA0KQoJCWlmKHR1bmVyX2Zvcm1hdCA9PSAweDA5KQoJCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8qIFRBUEMtRzcwMlAgKi8KCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCgkJYnR2LT5jLm5yLGVlcHJvbV9kYXRhWzB4NDFdLGVlcHJvbV9kYXRhWzB4NDJdKTsKCWlmKHR1bmVyKSB7CgkJYnR2LT50dW5lcl90eXBlPXR1bmVyOwoJCXByaW50aygiJWQiLHR1bmVyKTsKCX0gZWxzZQoJCXByaW50aygiVW5rbm93biB0eXBlIik7CglwcmludGsoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKCSAgICAgICB0dW5lcl90dl9mbSAgICAgPyAieWVzIiA6ICJubyIsCgkgICAgICAgYnR2LT5oYXNfcmVtb3RlID8gInllcyIgOiAibm8iKTsKfQoKLyogdXNlZCBvbiBWb29kb28gVFYvRk0gKFZvb2RvbyAyMDApLCBTMCB3aXJlZCB0byAweDEwMDAwICovCnZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pCnsKCS8qIGZpeCB1cCBvdXIgY2FyZCBlbnRyeSAqLwoJaWYobm9ybT09VklERU9fTU9ERV9OVFNDKSB7CgkJYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTU3ZmZmOwoJCWJ0dHZfdHZjYXJkc1tCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk1N2ZmZjsKCQlkcHJpbnRrKCJidHR2X3RkYTk4ODBfc2V0bm9ybSB0byBOVFNDXG4iKTsKCX0KCWVsc2UgewoJCWJ0dHZfdHZjYXJkc1tCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk0N2ZmZjsKCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NDdmZmY7CgkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gUEFMXG4iKTsKCX0KCS8qIHNldCBHUElPIGFjY29yZGluZyAqLwoJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssCgkJICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2J0di0+YXVkaW9dKTsKfQoKCi8qCiAqIHJlc2V0L2VuYWJsZSB0aGUgTVNQIG9uIHNvbWUgSGF1cHBhdWdlIGNhcmRzCiAqIFRoYW5rcyB0byBLecO2c3RpIE3DpGxra2kgKGttYWxra2lAY2MuaHV0LmZpKSEKICoKICogSGF1cHBhdWdlOiAgcGluICA1CiAqIFZvb2RvbzogICAgIHBpbiAyMAogKi8Kc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKQp7CglpbnQgbWFzayA9ICgxIDw8IHBpbik7CgoJZ3Bpb19pbm91dChtYXNrLG1hc2spOwoJZ3Bpb19iaXRzKG1hc2ssMCk7Cgl1ZGVsYXkoMjUwMCk7CglncGlvX2JpdHMobWFzayxtYXNrKTsKCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIm1zcDM0eHgiKTsKCWlmIChidHR2X3ZlcmJvc2UpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgoJCSAgICAgICAiaW5pdCBbJWRdXG4iLCBidHYtPmMubnIsIHBpbik7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpCnsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogIEltYWdlbmF0aW9uIEwtTW9kZWwgUFhDMjAwIEZyYW1lZ3JhYmJlciAqLwovKiAgVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgcHJvY2VkdXJlIGFzCiAqICB1c2VkIGJ5IEFsZXNzYW5kcm8gUnViaW5pIGluIGhpcyBweGMyMDAKICogIGRyaXZlciwgYnV0IHVzaW5nIEJUVFYgZnVuY3Rpb25zICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RhdGljIGludCB2YWxzW10gX19kZXZpbml0ZGF0YSA9IHsgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwZCwgMHgwZCwKCQkJCQkgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKCQkJCQkgICAgMHgwMCB9OwoJdW5zaWduZWQgaW50IGk7CglpbnQgdG1wOwoJdTMyIHZhbDsKCgkvKiBJbml0aWFsaXNlIEdQSU8tY29ubmV2dGVkIHN0dWZmICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAoMTw8MTMpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMyk7CglncGlvX3dyaXRlKDE8PDEzKTsKCS8qIEdQSU8gaW5wdXRzIGFyZSBwdWxsZWQgdXAsIHNvIG5vIG5lZWQgdG8gZHJpdmUKCSAqIHJlc2V0IHBpbiBhbnkgbG9uZ2VyICovCglncGlvX2JpdHMoMHhmZmZmZmYsIDApOwoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJweGMyMDAiKTsKCgkvKiAgd2UgY291bGQvc2hvdWxkIHRyeSBhbmQgcmVzZXQvY29udHJvbCB0aGUgQUQgcG90cz8gYnV0CgkgICAgcmlnaHQgbm93ICB3ZSBzaW1wbHkgIHR1cm5lZCBvZmYgdGhlIGNydXNoaW5nLiAgV2l0aG91dAoJICAgIHRoaXMgdGhlIEFHQyBkcmlmdHMgZHJpZnRzCgkgICAgcmVtZW1iZXIgdGhlIEVOIGlzIHJldmVyc2UgbG9naWMgLS0+CgkgICAgc2V0dGluZyBCVDg0OF9BRENfQUdDX0VOIGRpc2FibGUgdGhlIEFHQwoJICAgIHRib3VsdEBlZWNzLmxlaGlnaC5lZHUKCSovCgoJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKCgkvKglJbml0aWFsaXNlIE1BWDUxNyBEQUMgKi8KCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CglidHR2X0kyQ1dyaXRlKGJ0diwweDVFLDAsMHg4MCwxKTsKCgkvKglJbml0aWFsaXNlIDEyQzUwOCBQSUMgKi8KCS8qCVRoZSBJMkNXcml0ZSBhbmQgSTJDUmVhZCBjb21tbWFuZHMgYXJlIGFjdHVhbGx5IHRvIHRoZQoJICoJc2FtZSBjaGlwcyAtIGJ1dCB0aGUgUi9XIGJpdCBpcyBpbmNsdWRlZCBpbiB0aGUgYWRkcmVzcwoJICoJYXJndW1lbnQgc28gdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudCAqLwoKCglwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CgoJLyogRmlyc3Qgb2YgYWxsLCBlbmFibGUgdGhlIGNsb2NrIGxpbmUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgUFhDMjAwLUYgKi8KCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOwoJdmFsIHw9IEJUODQ4X0dQSU9fRE1BX0NUTF9HUENMS01PREU7CglidHdyaXRlKHZhbCwgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKCgkvKiBUaGVuLCBwdXNoIHRvIDAgdGhlIHJlc2V0IHBpbiBsb25nIGVub3VnaCB0byByZXNldCB0aGUgKgoJICogZGV2aWNlIHNhbWUgYXMgYWJvdmUgZm9yIHRoZSByZXNldCBsaW5lLCBidXQgbm90IHRoZSBzYW1lCgkgKiB2YWx1ZSBzZW50IHRvIHRoZSBHUElPLWNvbm5lY3RlZCBzdHVmZgoJICogd2hpY2ggb25lIGlzIHRoZSBnb29kIG9uZT8gKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsKDE8PDIpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMTApOwoJZ3Bpb193cml0ZSgxPDwyKTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxzKTsgaSsrKSB7CgkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwoJCWlmICh0bXAgIT0gLTEpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTwoJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAoJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKCQl9Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiUFhDMjAwIEluaXRpYWxpc2VkLlxuIik7Cn0KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoKICogIFRoZSBBZGxpbmsgUlRWLTI0IChha2EgQW5nZWxvKSBoYXMgc29tZSBzcGVjaWFsIGluaXRpYWxpc2F0aW9uIHRvIHVubG9jawogKiAgaXQuIFRoaXMgYXBwYXJlbnRseSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBmb3IgZWFjaCA4NzggY2hpcDoKICoKICogIDEpIHdyaXRlIDB4MDBDM0ZFRkYgdG8gdGhlIEdQSU9fT1VUX0VOIHJlZ2lzdGVyCiAqCiAqICAyKSAgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIDB4MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSAweDBFCiAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQogKiAgICAgIC0gaWYgKCBkYXRhPj4xOCAmIDB4MDEgIT0gMCkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAxICkKICogICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCBzdG9wLgogKgogKiAgMykgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSB3cml0ZSAweDQ0MDAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSB3cml0ZSAweDQ0MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIHdyaXRlIDB4MEUKICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCiAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYmIDB4MDEgIT0gMCApCiAqICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZC4KICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnN0YXRpYyB2b2lkCmluaXRfUlRWMjQgKHN0cnVjdCBidHR2ICpidHYpCnsKCXVpbnQzMl90IGRhdGFSZWFkID0gMDsKCWxvbmcgd2F0Y2hkb2dfdmFsdWUgPSAweDBFOwoKCXByaW50ayAoS0VSTl9JTkZPCgkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBpbiBwcm9ncmVzcyAuLi5cbiIsCgkJYnR2LT5jLm5yKTsKCglidHdyaXRlICgweDAwYzNmZWZmLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYnR3cml0ZSAoMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxKTsKCWJ0d3JpdGUgKDB4MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMTApOwoJYnR3cml0ZSAoMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoKCWRhdGFSZWFkID0gYnRyZWFkIChCVDg0OF9HUElPX0RBVEEpOwoKCWlmICgoKChkYXRhUmVhZCA+PiAxOCkgJiAweDAxKSAhPSAwKSB8fCAoKChkYXRhUmVhZCA+PiAxOSkgJiAweDAxKSAhPSAxKSkgewoJCXByaW50ayAoS0VSTl9JTkZPCgkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMSkgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAoJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKCX0KCglidHdyaXRlICgweDQ0MDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMTApOwoJYnR3cml0ZSAoMHg0NDEwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJYnR3cml0ZSAod2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CgoJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDApKSB7CgkJcHJpbnRrIChLRVJOX0lORk8KCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigyKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCgkJCWJ0di0+Yy5uciwgZGF0YVJlYWQpOwoKCQlyZXR1cm47Cgl9CgoJcHJpbnRrIChLRVJOX0lORk8KCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlLlxuIiwgYnR2LT5jLm5yKTsKfQoKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBNaXJvIFBybyByYWRpbyBzdHVmZiAtLSB0aGUgdGVhNTc1NyBpcyBjb25uZWN0ZWQgdG8gc29tZSBHUElPIHBvcnRzICAgICAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTkgQ3NhYmEgSGFsYXN6IDxxZ2VoYWxpQHVuaS1taXNrb2xjLmh1PgogKiBUaGlzIGNvZGUgaXMgcGxhY2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoKICogQnJ1dGFsbHkgaGFja2VkIGJ5IERhbiBTaGVyaWRhbiA8ZGFuLnNoZXJpZGFuQGNvbnRhY3Qub3JnLnVrPiBkanM1MiA4LzMvMDAKICovCgpzdGF0aWMgdm9pZCBidXNfbG93KHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsMCk7Cgl1ZGVsYXkoNSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKCQl1ZGVsYXkoNSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGJ1c19oaWdoKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsYml0KTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIGludCBidXNfaW4oc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7CgoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KCXJldHVybiBncGlvX3JlYWQoKSAmIChiaXQpOwp9CgovKiBURUE1NzU3IHJlZ2lzdGVyIGJpdHMgKi8KI2RlZmluZSBURUFfRlJFUQkJMDoxNAojZGVmaW5lIFRFQV9CVUZGRVIJCTE1OjE1CgojZGVmaW5lIFRFQV9TSUdOQUxfU1RSRU5HVEgJMTY6MTcKCiNkZWZpbmUgVEVBX1BPUlQxCQkxODoxOAojZGVmaW5lIFRFQV9QT1JUMAkJMTk6MTkKCiNkZWZpbmUgVEVBX0JBTkQJCTIwOjIxCiNkZWZpbmUgVEVBX0JBTkRfRk0JCTAKI2RlZmluZSBURUFfQkFORF9NVwkJMQojZGVmaW5lIFRFQV9CQU5EX0xXCQkyCiNkZWZpbmUgVEVBX0JBTkRfU1cJCTMKCiNkZWZpbmUgVEVBX01PTk8JCTIyOjIyCiNkZWZpbmUgVEVBX0FMTE9XX1NURVJFTwkwCiNkZWZpbmUgVEVBX0ZPUkNFX01PTk8JCTEKCiNkZWZpbmUgVEVBX1NFQVJDSF9ESVJFQ1RJT04JMjM6MjMKI2RlZmluZSBURUFfU0VBUkNIX0RPV04JCTAKI2RlZmluZSBURUFfU0VBUkNIX1VQCQkxCgojZGVmaW5lIFRFQV9TVEFUVVMJCTI0OjI0CiNkZWZpbmUgVEVBX1NUQVRVU19UVU5FRAkwCiNkZWZpbmUgVEVBX1NUQVRVU19TRUFSQ0hJTkcJMQoKLyogTG93LWxldmVsIHN0dWZmICovCnN0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKCWludCB2YWx1ZSA9IDA7CglpbnQgaTsKCgkvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlYTU3NTcgcmVhZCIpOwoKCWJ1c19sb3coYnR2LGJ0di0+bWJveF93ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCgl1ZGVsYXkoMTApOwoJdGltZW91dD0gamlmZmllcyArIEhaOwoKCS8qIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QgKi8KCXdoaWxlIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKCQlzY2hlZHVsZSgpOwoJaWYgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiB0ZWE1NzU3OiByZWFkIHRpbWVvdXRcbiIsYnR2LT5jLm5yKTsKCQlyZXR1cm4gLTE7Cgl9CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiIsYnR2LT5jLm5yKTsKCWZvcihpID0gMDsgaSA8IDI0OyBpKyspCgl7CgkJdWRlbGF5KDUpOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoNSk7CgkJZHByaW50aygiJWMiLChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nVCc6Jy0nKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl2YWx1ZSA8PD0gMTsKCQl2YWx1ZSB8PSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgPT0gMCk/MDoxOyAgLyogTVNCIGZpcnN0ICovCgkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7Cgl9CglkcHJpbnRrKCJcbmJ0dHYlZDogdGVhNTc1NzogcmVhZCAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCXJldHVybiB2YWx1ZTsKfQoKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSkKewoJaW50IGk7CglpbnQgcmVnID0gdmFsdWU7CgoJZ3Bpb19pbm91dChidHYtPm1ib3hfbWFzaywgYnR2LT5tYm94X2NsayB8IGJ0di0+bWJveF93ZSB8IGJ0di0+bWJveF9kYXRhKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyB3cml0ZSIpOwoKCWRwcmludGsoImJ0dHYlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfd2UpOwoJZm9yKGkgPSAwOyBpIDwgMjU7IGkrKykKCXsKCQlpZiAocmVnICYgMHgxMDAwMDAwKQoJCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2RhdGEpOwoJCWVsc2UKCQkJYnVzX2xvdyhidHYsYnR2LT5tYm94X2RhdGEpOwoJCXJlZyA8PD0gMTsKCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2Nsayk7CgkJdWRlbGF5KDEwKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJfQoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsgIC8qIHVubXV0ZSAhISEgKi8KCXJldHVybiAwOwp9Cgp2b2lkIHRlYTU3NTdfc2V0X2ZyZXEoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgc2hvcnQgZnJlcSkKewoJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogYWRkIDEwLjdNSHogKHNlZSBkb2NzKSAqLwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogd2ludmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CgkvKiBQVDIyNTRBIHByb2dyYW1taW5nIEpvbiBUb21icywgam9uQGd0ZS5lc2kudXMuZXMgKi8KCWludCBiaXRzX291dCwgbG9vcHMsIHZvbCwgZGF0YTsKCglpZiAoIXNldCkgewoJCS8qIEZpeGVkIGJ5IExlYW5kcm8gTHVjYXJlbGxhIDxsdWNhQGxpbnV4bWVuZG96YS5vcmcuYXIgKDA3LzMxLzAxKSAqLwoJCXYtPmZsYWdzIHw9IFZJREVPX0FVRElPX1ZPTFVNRTsKCQlyZXR1cm47Cgl9CgoJLyogMzIgbGV2ZWxzIGxvZ2FyaXRobWljICovCgl2b2wgPSAzMiAtICgodi0+dm9sdW1lPj4xMSkpOwoJLyogdW5pdHMgKi8KCWJpdHNfb3V0ID0gKFBUMjI1NF9EQlNfSU5fMj4+KHZvbCU1KSk7CgkvKiB0ZW5zICovCgliaXRzX291dCB8PSAoUFQyMjU0X0RCU19JTl8xMD4+KHZvbC81KSk7CgliaXRzX291dCB8PSBQVDIyNTRfTF9DSEFOTkVMIHwgUFQyMjU0X1JfQ0hBTk5FTDsKCWRhdGEgPSBncGlvX3JlYWQoKTsKCWRhdGEgJj0gfihXSU5WSUVXX1BUMjI1NF9DTEt8IFdJTlZJRVdfUFQyMjU0X0RBVEF8CgkJICBXSU5WSUVXX1BUMjI1NF9TVFJPQkUpOwoJZm9yIChsb29wcyA9IDE3OyBsb29wcyA+PSAwIDsgbG9vcHMtLSkgewoJCWlmIChiaXRzX291dCAmICgxPDxsb29wcykpCgkJCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X0RBVEE7CgkJZWxzZQoJCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWdwaW9fd3JpdGUoZGF0YSk7CgkJdWRlbGF5KDUpOwoJCWRhdGEgfD0gV0lOVklFV19QVDIyNTRfQ0xLOwoJCWdwaW9fd3JpdGUoZGF0YSk7CgkJdWRlbGF5KDUpOwoJCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJfQoJZGF0YSB8PSAgV0lOVklFV19QVDIyNTRfU1RST0JFOwoJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCWdwaW9fd3JpdGUoZGF0YSk7Cgl1ZGVsYXkoMTApOwoJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfU1RST0JFOwoJZ3Bpb193cml0ZShkYXRhKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbW9uby9zdGVyZW8gY29udHJvbCBmb3IgdmFyaW91cyBjYXJkcyAod2hpY2ggZG9uJ3QgdXNlIGkyYyBjaGlwcyBidXQgICAgKi8KLyogY29ubmVjdCBzb21ldGhpbmcgdG8gdGhlIEdQSU8gcGlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkCmd2YmN0djNwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDMwMCwgMHgzMDApOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCgkJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MzAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDIwMDsKLyoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKICoJCQljb24gPSAweDEwMDsgKi8KCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxICB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgpzdGF0aWMgdm9pZApndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCwgY29uOwoKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwoKCXZhbCA9IGdwaW9fcmVhZCgpOwoJaWYgKHNldCkgewoJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpIHsKCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgewoJCQkJLyogTEFORzEgKyBMQU5HMiAqLwoJCQkJY29uID0gMHgxMDA7CgkJCX0KCQkJZWxzZSB7CgkJCQkvKiBMQU5HMiAqLwoJCQkJY29uID0gMHgzMDA7CgkJCX0KCQl9CgkJaWYgKGNvbiAhPSAodmFsICYgMHgzMDApKSB7CgkJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImd2YmN0djVwY2kiKTsKCQl9Cgl9IGVsc2UgewoJCXN3aXRjaCAodmFsICYgMHg3MCkgewoJCSAgY2FzZSAweDEwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4MzA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NTA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMTsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NjA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU87CgkJCWJyZWFrOwoJCSAgY2FzZSAweDcwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQkJYnJlYWs7CgkJICBkZWZhdWx0OgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJfQoJfQp9CgovKgogKiBNYXJpbyBNZWRpbmEgTnVzc2JhdW0gPG1lZGlzb2Z0QGFsb2hhYmJzLm9yZy5teD4KICogIEkgZGlzY292ZXIgdGhhdCBvbiBCVDg0OF9HUElPX0RBVEEgYWRkcmVzcyBhIGJ5dGUgMHhjY2UgZW5hYmxlIHN0ZXJlbywKICogIDB4ZGRlIGVuYWJsZXMgbW9ubyBhbmQgMHhjY2QgZW5hYmxlcyBzYXAKICoKICogUGV0ciBWYW5kcm92ZWMgPFZBTkRST1ZFQHZjLmN2dXQuY3o+CiAqICBQLlMuOiBBdCBsZWFzdCBtYXNrIGluIGxpbmUgYWJvdmUgaXMgd3JvbmcgLSBHUElPIHBpbnMgMywyIHNlbGVjdAogKiAgaW5wdXQvb3V0cHV0IHNvdW5kIGNvbm5lY3Rpb24sIHNvIGJvdGggbXVzdCBiZSBzZXQgZm9yIG91dHB1dCBtb2RlLgogKgogKiBMb29rcyBsaWtlIGl0J3MgbmVlZGVkIG9ubHkgZm9yIHRoZSAidHZwaG9uZSIsIHRoZSAidHZwaG9uZSA5OCIKICogaGFuZGxlcyB0aGlzIHdpdGggYSB0ZGE5ODQwCiAqCiAqLwpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCWludCB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLwoJCQl2YWwgPSAweDAyOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQl2YWwgPSAweDAxOwoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMTsKCQlyZXR1cm47Cgl9Cn0KCnN0YXRpYyB2b2lkCmF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgIC8qIFNURVJFTyAqLwoJCQl2YWwgPSAweDAyOwoJCWJ0YW9yKHZhbCwgfjB4MDMsIEJUODQ4X0dQSU9fREFUQSk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiYXZlcm1lZGlhIik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIExpZmV0ZWMgOTQxNSBoYW5kbGluZyAqLwpzdGF0aWMgdm9pZApsdDk0MTVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoZ3Bpb19yZWFkKCkgJiAweDQwMDApIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQlyZXR1cm47Cgl9CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAvKiBBMiBTQVAgKi8KCQkJdmFsID0gMHgwMDgwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSAvKiBBMiBzdGVyZW8gKi8KCQkJdmFsID0gMHgwODgwOwoJCWlmICgodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKSB8fAoJCSAgICAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pKQoJCQl2YWwgPSAwOwoJCWdwaW9fYml0cygweDA4ODAsIHZhbCk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibHQ5NDE1Iik7Cgl9IGVsc2UgewoJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdpdGggdGhpcyBjYXJkIDotKCAqLwoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4ICovCnN0YXRpYyB2b2lkCnRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDE4MDAwMCwweDE4MDAwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgwODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MTgwMDAwOwoJCWdwaW9fYml0cygweDE4MDAwMCwgY29uKTsKCQlpZiAoYnR0dl9ncGlvKQoJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZXJyYXR2Iik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCS8qYnRvciAoMHhjMzIwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsqLwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkJLyogTW9ubyAqLwoJCQl2YWwgPSAweDQyMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQkvKiBTQVAgKi8KCQkJdmFsID0gMHg0MTAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCS8qIFN0ZXJlbyAqLwoJCQl2YWwgPSAweDAyMDAwMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDQzMDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmZhc3QyMDAwIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgUHJvbGluayBQVi1CVDg3OFArOUIgKFBpeGVsVmlldyBQbGF5VFYgUHJvIEZNK05JQ0FNCiAqIHJldmlzaW9uIDlCIGhhcyBvbi1ib2FyZCBUREE5ODc0QSBzb3VuZCBkZWNvZGVyKS4KICoKICogTm90ZTogVGhlcmUgYXJlIGNhcmQgdmFyaWFudHMgd2l0aG91dCB0ZGE5ODc0YS4gRm9yY2luZyB0aGUgInN0ZXJlbyBzb3VuZCByb3V0ZSIKICogICAgICAgd2lsbCBtdXRlIHRoaXMgY2FyZHMuCiAqLwpzdGF0aWMgdm9pZApwdmJ0ODc4cDliX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDA7CgoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewoJCQl2YWwgPSAweDAxOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDAyOwoJCX0KCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJwdmJ0ODc4cDliIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIEZseVZpZGVvIDIwMDBTICh3aXRoIHRkYTk4NzQgZGVjb2RlcikKICogYmFzZWQgb24gcHZidDg3OHA5Yl9hdWRpbygpIC0gdGhpcyBpcyBub3QgdGVzdGVkLCBwbGVhc2UgZml4ISEhCiAqLwpzdGF0aWMgdm9pZApmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDB4ZmZmZjsKCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKCQkJdmFsID0gMHgwMDAwOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDEwODA7IC8qLWRrLT8/PzogMHgwODgwLCAweDAwODAsIDB4MTgwMCAuLi4gKi8KCQl9CgkJaWYgKHZhbCAhPSAweGZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MTgwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImZ2MjAwMHMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogc291bmQgY29udHJvbCBmb3IgQ2Fub3B1cyBXaW5EVlIgUENJCiAqIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+CiAqLwpzdGF0aWMgdm9pZAp3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKCQkJdmFsID0gMHgwNDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJdmFsID0gMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQl2YWwgPSAweDEwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJdmFsID0gMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDE0MDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmR2ciIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIEFELVRWSzUwMwogKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4KICovCnN0YXRpYyB2b2lkCmFkdHZrNTAzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDB4ZmZmZmZmOwoKCS8qIGJ0YW9yKDB4MWUwMDAwLCB+MHgxZTAwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsgKi8KCglpZiAoc2V0KSB7CgkJLyogYnRvcigqKiosIEJUODQ4X0dQSU9fT1VUX0VOKTsgKi8KCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDAxODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MDAwMDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQoJCQljb24gPSAweDAwMDYwMDAwOwoJCWlmIChjb24gIT0gMHhmZmZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MWUwMDAwLGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCAiYWR0dms1MDMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyogUmVtb3RlVmlzaW9uIE1YIChydjYwNSkgbXV4c2VsIGhlbHBlciBbTWlndWVsIEZyZWl0YXNdCiAqCiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcnY2MDUgZG9uJ3QgdXNlIGEgbm9ybWFsIG11bHRpcGxleCwgYnV0IGEgY3Jvc3Nwb2ludAogKiBzd2l0Y2ggaW5zdGVhZCAoQ0QyMk0zNDk0RSkuIFRoaXMgSUMgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNvbm5lY3Rpb25zCiAqIGJldHdlZW4gWG4gKGlucHV0KSBhbmQgWW4gKG91dHB1dCkgcGlucy4gV2UgbmVlZCB0byBjbGVhciBhbnkgZXhpc3RpbmcKICogY29ubmVjdGlvbiBwcmlvciB0byBlc3RhYmxpc2ggYSBuZXcgb25lLCBwdWxzaW5nIHRoZSBTVFJPQkUgcGluLgogKgogKiBUaGUgYm9hcmQgaGFyZHdpcmUgWTAgKHhwb2ludCkgdG8gTVVYMSBhbmQgTVVYT1VUIHRvIFlpbi4KICogR1BJTyBwaW5zIGFyZSB3aXJlZCBhczoKICogIEdQSU9bMDozXSAtIEFYWzA6M10gKHhwb2ludCkgLSBQMVswOjNdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bNDo2XSAtIEFZWzA6Ml0gKHhwb2ludCkgLSBQMVs0OjZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bN10gICAtIERBVEEgKHhwb2ludCkgICAgLSBQMVs3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzhdICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNV0gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s5XSAgIC0gUkVTRVQgKHhwb2ludCkgICAtIFAzWzZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bMTBdICAtIFNUUk9CRSAoeHBvaW50KSAgLSBQM1s3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElOVFIgICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNF0gKG1pY3JvY29udHJvbGVyKQogKgogKiBUaGUgbWljcm9jb250cm9sZXIgaXMgYSA4MEMzMiBsaWtlLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY2hhbmdlIHhwb2ludAogKiBjb25maWd1cmF0aW9uIGVpdGhlciBkaXJlY3RseSAoYXMgd2UgYXJlIGRvaW5nKSBvciB1c2luZyB0aGUgbWljcm9jb250cm9sZXIKICogd2hpY2ggaXMgYWxzbyB3aXJlZCB0byBJMkMgaW50ZXJmYWNlLiBJIGhhdmUgbm8gZnVydGhlciBpbmZvIG9uIHRoZQogKiBtaWNyb2NvbnRyb2xlciBmZWF0dXJlcywgb25lIHdvdWxkIG5lZWQgdG8gZGlzYXNzZW1ibHkgdGhlIGZpcm13YXJlLgogKiBub3RlOiB0aGUgdmVuZG9yIHJlZnVzZWQgdG8gZ2l2ZSBhbnkgaW5mb3JtYXRpb24gb24gdGhpcyBwcm9kdWN0LCBhbGwKICogICAgICAgdGhhdCBzdHVmZiB3YXMgZm91bmQgdXNpbmcgYSBtdWx0aW1ldGVyISA6KQogKi8Kc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogcmVzZXQgYWxsIGNvbmVjdGlvbnMgKi8KCWdwaW9fYml0cygweDIwMCwweDIwMCk7CgltZGVsYXkoMSk7CglncGlvX2JpdHMoMHgyMDAsMHgwMDApOwoJbWRlbGF5KDEpOwoKCS8qIGNyZWF0ZSBhIG5ldyBjb25lY3Rpb24gKi8KCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CglncGlvX2JpdHMoMHg0ODAsMHg0ODApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4NDgwLDB4MDgwKTsKCW1kZWxheSgxKTsKfQoKLyogVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IG11eHNlbCBoZWxwZXIgW0NocmlzIEZhbm5pbmddCiAqCiAqIFRoZSBDUzE2IChhdmFpbGFibGUgb24gZUJheSBjaGVhcCkgaXMgYSBQQ0kgYm9hcmQgd2l0aCBmb3VyIEZ1c2lvbgogKiA4NzhBIGNoaXBzLCBhIFBDSSBicmlkZ2UsIGFuIEF0bWVsIG1pY3JvY29udHJvbGxlciwgZm91ciBzeW5jIHNlcGVyYXRvcgogKiBjaGlwcywgdGVuIGVpZ2h0IGlucHV0IGFuYWxvZyBtdWx0aXBsZXhvcnMsIGEgbm90IGNoaXAgYW5kIGEgZmV3CiAqIG90aGVyIGNvbXBvbmVudHMuCiAqCiAqIDE2IGlucHV0cyBvbiBhIHNlY29uZGFyeSBicmFja2V0IGFyZSBwcm92aWRlZCBhbmQgY2FuIGJlIHNlbGVjdGVkCiAqIGZyb20gZWFjaCBvZiB0aGUgZm91ciBjYXB0dXJlIGNoaXBzLiAgVHdvIG9mIHRoZSBlaWdodCBpbnB1dAogKiBtdWx0aXBsZXhvcnMgYXJlIHVzZWQgdG8gc2VsZWN0IGZyb20gYW55IG9mIHRoZSAxNiBpbnB1dCBzaWduYWxzLgogKgogKiBVbnN1cHBvcnRlZCBoYXJkd2FyZSBjYXBhYmlsaXRpZXM6CiAqICAuIEEgdmlkZW8gb3V0cHV0IG1vbml0b3Igb24gdGhlIHNlY29uZGFyeSBicmFja2V0IGNhbiBiZSBzZWxlY3RlZCBmcm9tCiAqICAgIG9uZSBvZiB0aGUgODc4QSBjaGlwcy4KICogIC4gQW5vdGhlciBwYXNzdGhyb3VnaCBidXQgSSBoYXZlbid0IHNwZW50IGFueSB0aW1lIGludmVzdGlnYXRpbmcgaXQuCiAqICAuIERpZ2l0YWwgSS9PIChsb2dpYyBsZXZlbCBjb25uZWN0ZWQgdG8gR1BJTykgaXMgYXZhaWxhYmxlIGZyb20gYW4KICogICAgb25ib2FyZCBoZWFkZXIuCiAqCiAqIFRoZSBvbiBjaGlwIGlucHV0IG11eCBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAyLgogKiBHUElPWzE2OjE5XSAtIFZpZGVvIGlucHV0IHNlbGVjdGlvbgogKiBHUElPWzA6M10gICAtIFZpZGVvIG91dHB1dCBtb25pdG9yIHNlbGVjdCAob25seSBhdmFpbGFibGUgZnJvbSBvbmUgODc4QSkKICogR1BJT1s/Oj9dICAgLSBEaWdpdGFsIEkvTy4KICoKICogVGhlcmUgaXMgYW4gQVRNRUwgbWljcm9jb250cm9sbGVyIHdpdGggYW4gODAzMSBjb3JlIG9uIGJvYXJkLiAgSSBoYXZlIG5vdAogKiBkZXRlcm1pbmVkIHdoYXQgZnVuY3Rpb24gKGlmIGFueSkgaXQgcHJvdmlkZXMuICBXaXRoIHRoZSBtaWNyb2NvbnRyb2xsZXIKICogYW5kIHN5bmMgc2VwZXJhdG9yIGNoaXBzIGEgZ3Vlc3MgaXMgdGhhdCBpdCBtaWdodCBoYXZlIHRvIGRvIHdpdGggdmlkZW8KICogc3dpdGNoaW5nIGFuZCBtYXliZSBzb21lIGRpZ2l0YWwgSS9PLgogKi8Kc3RhdGljIHZvaWQgdGliZXRDUzE2X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHZpZGVvIG11eCAqLwoJZ3Bpb19iaXRzKDB4MGYwMDAwLCBpbnB1dCA8PCAxNik7Cn0KCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCS8qIGVuYWJsZSBncGlvIGJpdHMsIG1hc2sgb2J0YWluZWQgdmlhIGJ0U3B5ICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAweDBmN2ZmZik7CglncGlvX3dyaXRlKDB4MGY3ZmZmKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdGhlIEtvZGljb20tNDQwMHIgZ2V0IGEgbGl0dGxlIG1pbmQtdHdpc3RpbmcuCiAqIFRoZXJlIGlzIGEgIm1hc3RlciIgY29udHJvbGxlciBhbmQgdGhyZWUgInNsYXZlIiBjb250cm9sbGVycywgdG9nZXRoZXIKICogYW4gYW5hbG9nIHN3aXRjaCB3aGljaCBjb25uZWN0cyBhbnkgb2YgMTYgY2FtZXJhcyB0byBhbnkgb2YgdGhlIEJUODdBJ3MuCiAqIFRoZSBhbmFsb2cgc3dpdGNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlICJtYXN0ZXIiLCBidXQgdGhlIGRldGVjdGlvbiBvcmRlcgogKiBvZiB0aGUgZm91ciBCVDg3OEEgY2hpcHMgaXMgaW4gYW4gb3JkZXIgd2hpY2ggSSBqdXN0IGRvbid0IHVuZGVyc3RhbmQuCiAqIFRoZSAibWFzdGVyIiBpcyBhY3R1YWxseSB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgdG8gYmUgZGV0ZWN0ZWQuICBUaGUKICogbG9naWMgb24gdGhlIGJvYXJkIHVzZXMgbG9naWNhbCBudW1iZXJzIGZvciB0aGUgNCBjb250cm9sZXJzLCBidXQKICogdGhvc2UgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZS4gIFdoZW4gd29ya2luZwogKiB3aXRoIHRoZSBhbmFsb2cgc3dpdGNoLCB3ZSBuZWVkIHRvICJtYXAiIGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZQogKiBvdmVyIHRvIHRoZSBib2FyZCdzIGxvZ2ljYWwgY29udHJvbGxlciBudW1iZXIuICBUaGlzIG1hcHBpbmcgc2VxdWVuY2UKICogaXMgezMsIDAsIDIsIDF9LCBpLmUuIHRoZSBmaXJzdCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkIGlzIGxvZ2ljYWwKICogdW5pdCAzLCB0aGUgc2Vjb25kICh3aGljaCBpcyB0aGUgbWFzdGVyKSBpcyBsb2dpY2FsIHVuaXQgMCwgZXRjLgogKiBXZSBuZWVkIHRvIG1haW50YWluIHRoZSBzdGF0dXMgb2YgdGhlIGFuYWxvZyBzd2l0Y2ggKHdoaWNoIG9mIHRoZSAxNgogKiBjYW1lcmFzIGlzIGNvbm5lY3RlZCB0byB3aGljaCBvZiB0aGUgNCBjb250cm9sbGVycykuICBSYXRoZXIgdGhhbgogKiBhZGQgdG8gdGhlIGJ0dHYgc3RydWN0dXJlIGZvciB0aGlzLCB3ZSB1c2UgdGhlIGRhdGEgcmVzZXJ2ZWQgZm9yCiAqIHRoZSBtYm94ICh1bnVzZWQgZm9yIHRoaXMgY2FyZCB0eXBlKS4KICovCgovKgogKiBGaXJzdCBhIHJvdXRpbmUgdG8gc2V0IHRoZSBhbmFsb2cgc3dpdGNoLCB3aGljaCBjb250cm9scyB3aGljaCBjYW1lcmEKICogaXMgcm91dGVkIHRvIHdoaWNoIGNvbnRyb2xsZXIuICBUaGUgc3dpdGNoIGNvbXByaXNlcyBhbiBYLWFkZHJlc3MKICogKGdwaW8gYml0cyAwLTMsIHJlcHJlc2VudGluZyB0aGUgY2FtZXJhLCByYW5naW5nIGZyb20gMC0xNSksIGFuZCBhCiAqIFktYWRkcmVzcyAoZ3BpbyBiaXRzIDQtNiwgcmVwcmVzZW50aW5nIHRoZSBjb250cm9sbGVyLCByYW5naW5nIGZyb20gMC0zKS4KICogQSBkYXRhIHZhbHVlIChncGlvIGJpdCA3KSBvZiAnMScgZW5hYmxlcyB0aGUgc3dpdGNoLCBhbmQgJzAnIGRpc2FibGVzCiAqIHRoZSBzd2l0Y2guICBBIFNUUk9CRSBiaXQgKGdwaW8gYml0IDgpIGxhdGNoZXMgdGhlIGRhdGEgdmFsdWUgaW50byB0aGUKICogc3BlY2lmaWVkIGFkZHJlc3MuICBUaGUgaWRlYSBpcyB0byBzZXQgdGhlIGFkZHJlc3MgYW5kIGRhdGEsIHRoZW4gYnJpbmcKICogU1RST0JFIGhpZ2gsIGFuZCBmaW5hbGx5IGJyaW5nIFNUUk9CRSBiYWNrIHRvIGxvdy4KICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl93cml0ZShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciB4YWRkciwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeWFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGEpIHsKCXVuc2lnbmVkIGludCB1ZGF0YTsKCgl1ZGF0YSA9IChkYXRhIDw8IDcpIHwgKCh5YWRkciYzKSA8PCA0KSB8ICh4YWRkciYweGYpOwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiB3cml0ZSBBRERSIGFuZCBEQVQgKi8KCWdwaW9fYml0cygweDFmZiwgdWRhdGEgfCAoMSA8PCA4KSk7CS8qIHN0cm9iZSBoaWdoICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhKTsJCS8qIHN0cm9iZSBsb3cgKi8KfQoKLyoKICogTmV4dCB0aGUgbXV4IHNlbGVjdC4gIEJvdGggdGhlICJtYXN0ZXIiIGFuZCAic2xhdmUiICdjYXJkcycgKGNvbnRyb2xsZXJzKQogKiB1c2UgdGhpcyByb3V0aW5lLiAgVGhlIHJvdXRpbmUgZmluZHMgdGhlICJtYXN0ZXIiIGZvciB0aGUgY2FyZCwgbWFwcwogKiB0aGUgY29udHJvbGxlciBudW1iZXIgZnJvbSB0aGUgZGV0ZWN0ZWQgcG9zaXRpb24gb3ZlciB0byB0aGUgbG9naWNhbAogKiBudW1iZXIsIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0byB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIGhvdXNla2VlcHMKICogdGhlIGxvY2FsIGNvcHkgb2YgdGhlIHN3aXRjaCBpbmZvcm1hdGlvbi4gIFRoZSBwYXJhbWV0ZXIgJ2lucHV0JyBpcyB0aGUKICogcmVxdWVzdGVkIGNhbWVyYSBudW1iZXIgKDAgLSAxNSkuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJY2hhciAqc3dfc3RhdHVzOwoJaW50IHhhZGRyLCB5YWRkcjsKCXN0cnVjdCBidHR2ICptY3RscjsKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hcFs0XSA9IHszLCAwLCAyLCAxfTsKCgltY3RsciA9IG1hc3RlcltidHYtPmMubnJdOwoJaWYgKG1jdGxyID09IE5VTEwpIHsJLyogaWdub3JlIGlmIG1hc3RlciBub3QgeWV0IGRldGVjdGVkICovCgkJcmV0dXJuOwoJfQoJeWFkZHIgPSAoYnR2LT5jLm5yIC0gbWN0bHItPmMubnIgKyAxKSAmIDM7IC8qIHRoZSAnJicgaXMgZm9yIHNhZmV0eSAqLwoJeWFkZHIgPSBtYXBbeWFkZHJdOwoJc3dfc3RhdHVzID0gKGNoYXIgKikoJm1jdGxyLT5tYm94X3dlKTsKCXhhZGRyID0gaW5wdXQgJiAweGY7CgkvKiBDaGVjayBpZiB0aGUgY29udHJvbGxlci9jYW1lcmEgcGFpciBoYXMgY2hhbmdlZCwgZWxzZSBpZ25vcmUgKi8KCWlmIChzd19zdGF0dXNbeWFkZHJdICE9IHhhZGRyKQoJewoJCS8qICJvcGVuIiB0aGUgb2xkIHN3aXRjaCwgImNsb3NlIiB0aGUgbmV3IG9uZSwgc2F2ZSB0aGUgbmV3ICovCgkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCBzd19zdGF0dXNbeWFkZHJdLCB5YWRkciwgMCk7CgkJc3dfc3RhdHVzW3lhZGRyXSA9IHhhZGRyOwoJCWtvZGljb200NDAwcl93cml0ZShtY3RsciwgeGFkZHIsIHlhZGRyLCAxKTsKCX0KfQoKLyoKICogRHVyaW5nIGluaXRpYWxpc2F0aW9uLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBhbmFsb2cgc3dpdGNoLiAgV2UKICogYWxzbyBwcmVzZXQgdGhlIHN3aXRjaCB0byBtYXAgdGhlIDQgY29ubmVjdG9ycyBvbiB0aGUgY2FyZCB0byB0aGUKICogKnVzZXIncyogKHNlZSBhYm92ZSBkZXNjcmlwdGlvbiBvZiBrb2RpY29tNDQwMHJfbXV4c2VsKSBjaGFubmVscwogKiAwIHRocm91Z2ggMwogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJY2hhciAqc3dfc3RhdHVzID0gKGNoYXIgKikoJmJ0di0+bWJveF93ZSk7CglpbnQgaXg7CgoJZ3Bpb19pbm91dCgweDAwMDNmZiwgMHgwMDAzZmYpOwoJZ3Bpb193cml0ZSgxIDw8IDkpOwkvKiByZXNldCBNVVggKi8KCWdwaW9fd3JpdGUoMCk7CgkvKiBQcmVzZXQgY2FtZXJhIDAgdG8gdGhlIDQgY29udHJvbGxlcnMgKi8KCWZvciAoaXg9MDsgaXg8NDsgaXgrKykgewoJCXN3X3N0YXR1c1tpeF0gPSBpeDsKCQlrb2RpY29tNDQwMHJfd3JpdGUoYnR2LCBpeCwgaXgsIDEpOwoJfQoJLyoKCSAqIFNpbmNlIHRoaXMgaXMgdGhlICJtYXN0ZXIiLCB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKCSAqIG90aGVyIHRocmVlIGNvbnRyb2xsZXIgY2hpcHMnIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlCgkgKiBmb3IgbGF0ZXIgdXNlIGluIHRoZSBtdXhzZWwgcm91dGluZS4KCSAqLwoJaWYgKChidHYtPmMubnI8MSkgfHwgKGJ0di0+Yy5ucj5CVFRWX01BWC0zKSkKCSAgICByZXR1cm47CgltYXN0ZXJbYnR2LT5jLm5yLTFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucl0gICA9IGJ0djsKCW1hc3RlcltidHYtPmMubnIrMV0gPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzJdID0gYnR2Owp9CgovKiBUaGUgR3JhbmR0ZWMgWC1HdWFyZCBmcmFtZWdyYWJiZXIgY2FyZCB1c2VzIHR3byBEdWFsIDQtY2hhbm5lbAogKiB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCiAqIG11bHRpcGxleGVycyBhcmUgY29udHJvbGxlZCBieSB0aGUgbG93ZXIgOCBHUElPIHBpbnMgb2YgdGhlCiAqIGJ0ODc4LiBUaGUgbXVsdGlwbGV4ZXJzIHByb2JhYmx5IFBlcmljb20gUEk1VjMzMVEgb3Igc2ltaWxhci4KCiAqIHh4eDAgaXMgcGluIHh4eCBvZiBtdWx0aXBsZXhlciBVNSwKICogeXl5MSBpcyBwaW4geXl5IG9mIG11bHRpcGxleGVyIFUyCiAqLwojZGVmaW5lIEVOQTAgICAgMHgwMQojZGVmaW5lIEVOQjAgICAgMHgwMgojZGVmaW5lIEVOQTEgICAgMHgwNAojZGVmaW5lIEVOQjEgICAgMHgwOAoKI2RlZmluZSBJTjEwICAgIDB4MTAKI2RlZmluZSBJTjAwICAgIDB4MjAKI2RlZmluZSBJTjExICAgIDB4NDAKI2RlZmluZSBJTjAxICAgIDB4ODAKCnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7CgkJRU5CMCwgRU5CMHxJTjAwLCBFTkIwfElOMTAsIEVOQjB8SU4wMHxJTjEwLAoJCUVOQTAsIEVOQTB8SU4wMCwgRU5BMHxJTjEwLCBFTkEwfElOMDB8SU4xMCwKCQlFTkIxLCBFTkIxfElOMDEsIEVOQjF8SU4xMSwgRU5CMXxJTjAxfElOMTEsCgkJRU5BMSwgRU5BMXxJTjAxLCBFTkExfElOMTEsIEVOQTF8SU4wMXxJTjExLAoJfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlMTZdKTsKfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKlRoaXMgaXMgdGhlIHZpZGVvIGlucHV0IHJlZGlyZWN0aW9uIGZvbmN0aW9uYWxpdHkgOiBJIERJRCBOT1QgVVNFRCBJVC4gKi8KCWJ0d3JpdGUgKDB4MDg8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE5XSBbPT0+IDQwNTMgQitDXSBzZXQgdG8gMSAqLwoJYnR3cml0ZSAoMHgwNDw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMThdIFs9PT4gNDA1MyBBXSAgc2V0IHRvIDEqLwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwgKHN0cnVjdCBidHR2KiBidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoKCWRwcmludGsgKEtFUk5fREVCVUcgImJ0dHYlZCA6IHBpY29sb190ZXRyYV9tdXhzZWwgPT4gIGlucHV0ID0gJWRcbiIsYnR2LT5jLm5yLGlucHV0KTsKCS8qSnVzdCBzZXQgdGhlIHJpZ2h0IHBhdGggaW4gdGhlIGFuYWxvZyBtdWx0aXBsZXhlcnMgOiBjaGFubmVsIDEgLT4gNCA9PT4gQW5hbG9nIE11eCA9PT4gTVVYMCovCgkvKkdQSU9bMjBdJkdQSU9bMjFdIHVzZWQgdG8gY2hvb3NlIHRoZSByaWdodCBpbnB1dCovCglidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKCn0KCi8qCiAqIGl2YzEyMF9tdXhzZWwgW0FkZGVkIGJ5IEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT5dCiAqCiAqIFRoZSBJVkMxMjBHIHNlY3VyaXR5IGNhcmQgaGFzIDQgaTJjIGNvbnRyb2xsZWQgVERBODU0MCBtYXRyaXgKICogc3dpY2hlcnMgdG8gcHJvdmlkZSAxNiBjaGFubmVscyB0byBNVVgwLiBUaGUgVERBODU0MCdzIGhhdmUKICogNCBpbmRlcGVkYW50IG91dHB1dHMgYW5kIGFzIHN1Y2ggdGhlIElWQzEyMEcgYWxzbyBoYXMgdGhlCiAqIG9wdGlvbmFsICJNb25pdG9yIE91dCIgYnVzLiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSBsb29raW5nCiAqIGF0IG9uZSBpbnB1dCB3aGlsZSB0aGUgbW9uaXRvciBpcyBsb29raW5nIGF0IGFub3RoZXIuCiAqCiAqIFNpbmNlIEkndmUgY291bGRuJ3QgYmUgYm90aGVyZWQgZmlndXJpbmcgb3V0IGhvdyB0byBhZGQgYW4KICogaW5kZXBlbmRhbnQgbXV4c2VsIGZvciB0aGUgbW9uaXRvciBidXMsIEkndmUganVzdCBzZXQgaXQgdG8KICogd2hhdGV2ZXIgdGhlIGNhcmQgaXMgbG9va2luZyBhdC4KICoKICogIE9VVDAgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gTVVYMCAgICAgICAgICgweDAzKQogKiAgT1VUMSBvZiB0aGUgVERBODU0MCdzIGlzIGNvbm5lY3RlZCB0byAiTW9uaXRvciBPdXQiICAgICAgICAoMHgwQykKICoKICogIFREQTg1NDBfQUxUMyBJTjAtMyA9IENoYW5uZWwgMTMgLSAxNiAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNCBJTjAtMyA9IENoYW5uZWwgMSAtIDQgICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNSBJTjAtMyA9IENoYW5uZWwgNSAtIDggICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNiBJTjAtMyA9IENoYW5uZWwgOSAtIDEyICAgICAgICAgICAgICAgICgweDAzKQogKgogKi8KCi8qIEFsbCA3IHBvc3NpYmxlIHN1Yi1pZHMgZm9yIHRoZSBUREE4NTQwIE1hdHJpeCBTd2l0Y2hlciAqLwojZGVmaW5lIEkyQ19UREE4NTQwICAgICAgICAweDkwCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMSAgIDB4OTIKI2RlZmluZSBJMkNfVERBODU0MF9BTFQyICAgMHg5NAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDMgICAweDk2CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNCAgIDB4OTgKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ1ICAgMHg5YQojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDYgICAweDljCgpzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogU2ltcGxlIG1hdGhzICovCglpbnQga2V5ID0gaW5wdXQgJSA0OwoJaW50IG1hdHJpeCA9IGlucHV0IC8gNDsKCglkcHJpbnRrKCJidHR2JWQ6IGl2YzEyMF9tdXhzZWw6IElucHV0IC0gJTAyZCB8IFREQSAtICUwMmQgfCBJbiAtICUwMmRcbiIsCgkJYnR2LT5jLm5yLCBpbnB1dCwgbWF0cml4LCBrZXkpOwoKCS8qIEhhbmRsZXMgdGhlIGlucHV0IHNlbGVjdGlvbiBvbiB0aGUgVERBODU0MCdzICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CgoJLyogSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncyAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAweDAzIDogMHgwMCksIDEpOyAgLyogMTMgLSAxNiAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAweDAzIDogMHgwMCksIDEpOyAgLyogMS00ICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiA1LTggKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDIpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDktMTIgKi8KCgkvKiBTZWxlY3RzIE1VWDAgZm9yIGlucHV0IG9uIHRoZSA4NzggKi8KCWJ0YW9yKCgwKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwp9CgoKLyogUFhDMjAwIG11eHNlbCBoZWxwZXIKICogbHVrZUBzeXNlbmcuYW51LmVkdS5hdQogKiBhbm90aGVyIHRyYW5zcGxhbnQKICogZnJvbSBBbGVzc2FuZHJvIFJ1YmluaSAocnViaW5pQGxpbnV4Lml0KQogKgogKiBUaGVyZSBhcmUgNCBraW5kcyBvZiBjYXJkczoKICogUFhDMjAwTCB3aGljaCBpcyBidDg0OAogKiBQWEMyMDBGIHdoaWNoIGlzIGJ0ODQ4IHdpdGggUElDIGNvbnRyb2xsaW5nIG11eAogKiBQWEMyMDBBTCB3aGljaCBpcyBidDg3OAogKiBQWEMyMDBBRiB3aGljaCBpcyBidDg3OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICovCiNkZWZpbmUgUFhfQ0ZHX1BYQzIwMEYgMHgwMQojZGVmaW5lIFBYX0ZMQUdfUFhDMjAwQSAgMHgwMDAwMTAwMCAvKiBhIHB4YzIwMEEgaXMgYnQtODc4IGJhc2VkICovCiNkZWZpbmUgUFhfSTJDX1BJQyAgICAgICAweDBmCiNkZWZpbmUgUFhfUFhDMjAwQV9DQVJESUQgMHgyMDBhMTI5NQojZGVmaW5lIFBYX0kyQ19DTURfQ0ZHICAgMHgwMAoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWludCByYzsKCWxvbmcgbXV4OwoJaW50IGJpdG1hc2s7Cgl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKCgkvKiBSZWFkIFBJQyBjb25maWcgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBQWEMyMDBGICovCgkvKiBQWF9JMkNfQ01EX0NGRyovCglidWZbMF09MDsKCWJ1ZlsxXT0wOwoJcmM9YnR0dl9JMkNXcml0ZShidHYsKFBYX0kyQ19QSUM8PDEpLGJ1ZlswXSxidWZbMV0sMSk7CglpZiAocmMpIHsKCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogcGljIGNmZyB3cml0ZSBmYWlsZWQ6JWRcbiIsIGJ0di0+Yy5ucixyYyk7CgkgIC8qIG5vdCBQWEMgPyBkbyBub3RoaW5nICovCgkgIHJldHVybjsKCX0KCglyYz1idHR2X0kyQ1JlYWQoYnR2LChQWF9JMkNfUElDPDwxKSxOVUxMKTsKCWlmICghKHJjICYgUFhfQ0ZHX1BYQzIwMEYpKSB7CgkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IG5vdCBQWEMyMDBGIHJjOiVkIFxuIiwgYnR2LT5jLm5yLHJjKTsKCSAgcmV0dXJuOwoJfQoKCgkvKiBUaGUgbXVsdGlwbGV4ZXIgaW4gdGhlIDIwMEYgaXMgaGFuZGxlZCBieSB0aGUgR1BJTyBwb3J0ICovCgkvKiBnZXQgY29ycmVjdCBtYXBwaW5nIGJldHdlZW4gaW5wdXRzICAqLwoJLyogIG11eCA9IGJ0dHZfdHZjYXJkc1tidHYtPnR5cGVdLm11eHNlbFtpbnB1dF0gJiAzOyAqLwoJLyogKiogbm90IG5lZWRlZCE/ICAgKi8KCW11eCA9IGlucHV0OwoKCS8qIG1ha2Ugc3VyZSBvdXRwdXQgcGlucyBhcmUgZW5hYmxlZCAqLwoJLyogYml0bWFzaz0weDMwZjsgKi8KCWJpdG1hc2s9MHgzMDI7CgkvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBQWEMyMDBBICovCglpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpICB7CgkgICBiaXRtYXNrIF49IDB4MTgwOyAvKiB1c2UgNyBhbmQgOSwgbm90IDggYW5kIDkgKi8KCSAgIGJpdG1hc2sgfD0gNzw8NDsgLyogdGhlIERBQyAqLwoJfQoJYnR3cml0ZShiaXRtYXNrLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYml0bWFzayA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOwoJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKQoJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgyODApIHwgKChtdXggJiAyKSA8PCA4KSB8ICgobXV4ICYgMSkgPDwgNyk7CgllbHNlIC8qIG9sZGVyIGRldmljZSAqLwoJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgzMDApIHwgKChtdXggJiAzKSA8PCA4KTsKCWJ0d3JpdGUoYml0bWFzayxCVDg0OF9HUElPX0RBVEEpOwoKCS8qCgkgKiBXYXMgInRvIGJlIHNhZmUsIHNldCB0aGUgYnQ4NDggdG8gaW5wdXQgMCIKCSAqIEFjdHVhbGx5LCBzaW5jZSBpdCdzIG9rIGF0IGxvYWQgdGltZSwgYmV0dGVyIG5vdCBtZXNzaW5nCgkgKiB3aXRoIHRoZXNlIGJpdHMgKG9uIFBYQzIwMEFGIHlvdSBuZWVkIHRvIHNldCBtdXggMiBoZXJlKQoJICoKCSAqIG5lZWRlZCBiZWNhdXNlIGJ0dHYtZHJpdmVyIHNldHMgbXV4IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KCSAqLwoJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKQoJICBidGFvcigyPDw1LCB+QlQ4NDhfSUZPUk1fTVVYU0VMLCBCVDg0OF9JRk9STSk7CgllbHNlIC8qIG9sZGVyIGRldmljZSAqLwoJICBidGFuZCh+QlQ4NDhfSUZPUk1fTVVYU0VMLEJUODQ4X0lGT1JNKTsKCglwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBzZXR0aW5nIGlucHV0IGNoYW5uZWwgdG86JWRcbiIsIGJ0di0+Yy5uciwoaW50KW11eCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1vdGhlcmJvYXJkIGNoaXBzZXQgc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgp2b2lkIF9fZGV2aW5pdCBidHR2X2NoZWNrX2NoaXBzZXQodm9pZCkKewoJaW50IHBjaXBjaV9mYWlsID0gMDsKCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwoKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX0ZBSUwpCgkJcGNpcGNpX2ZhaWwgPSAxOwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiAoUENJUENJX1RSSVRPTnxQQ0lQQ0lfTkFUT01BfFBDSVBDSV9WSUFFVEJGKSkKCQl0cml0b24xID0gMTsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1ZTRlgpCgkJdnNmeCA9IDE7CiNpZmRlZiBQQ0lQQ0lfQUxJTUFHSUsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX0FMSU1BR0lLKQoJCWxhdGVuY3kgPSAweDBBOwojZW5kaWYKCgoJLyogcHJpbnQgd2FybmluZ3MgYWJvdXQgYW55IHF1aXJrcyBmb3VuZCAqLwoJaWYgKHRyaXRvbjEpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgRVRCRiBlbmFibGVkLlxuIik7CglpZiAodnNmeCkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBWU0ZYIGVuYWJsZWQuXG4iKTsKCWlmIChwY2lwY2lfZmFpbCkgewoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGJ0dHYgYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgIgoJCQkJCQkJInRvZ2V0aGVyLlxuIik7CgkJaWYgKCFub19vdmVybGF5KSB7CgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IG92ZXJsYXkgd2lsbCBiZSBkaXNhYmxlZC5cbiIpOwoJCQlub19vdmVybGF5ID0gMTsKCQl9IGVsc2UgewoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBvdmVybGF5IGZvcmNlZC4gVXNlIHRoaXMgIgoJCQkJCQkib3B0aW9uIGF0IHlvdXIgb3duIHJpc2suXG4iKTsKCQl9Cgl9CglpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLGxhdGVuY3kpOwoJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSwgZGV2KSkpIHsKCQl1bnNpZ25lZCBjaGFyIGI7CgkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUzLCAmYik7CgkJaWYgKGJ0dHZfZGVidWcpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlOiA4MjQ0MUZYIE5hdG9tYSwgIgoJCQkgICAgICAgImJ1ZmNvbj0weCUwMnhcbiIsYik7Cgl9Cn0KCmludCBfX2RldmluaXQgYnR0dl9oYW5kbGVfY2hpcHNldChzdHJ1Y3QgYnR0diAqYnR2KQp7Cgl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CgoJaWYgKCF0cml0b24xICYmICF2c2Z4ICYmIFVOU0VUID09IGxhdGVuY3kpCgkJcmV0dXJuIDA7CgoJaWYgKGJ0dHZfdmVyYm9zZSkgewoJCWlmICh0cml0b24xKQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIEVUQkYgKDQzMEZYL1ZQMyBjb21wYXRpYmlsdHkpXG4iLGJ0di0+Yy5ucik7CgkJaWYgKHZzZnggJiYgYnR2LT5pZCA+PSA4NzgpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZW5hYmxpbmcgVlNGWFxuIixidHYtPmMubnIpOwoJCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGxhdGVuY3kpOwoJfQoKCWlmIChidHYtPmlkIDwgODc4KSB7CgkJLyogYnQ4NDggKG1pcyl1c2VzIGEgYml0IGluIHRoZSBpcnEgbWFzayBmb3IgZXRiZiAqLwoJCWlmICh0cml0b24xKQoJCQlidHYtPnRyaXRvbjEgPSBCVDg0OF9JTlRfRVRCRjsKCX0gZWxzZSB7CgkJLyogYnQ4NzggaGFzIGEgYml0IGluIHRoZSBwY2kgY29uZmlnIHNwYWNlIGZvciBpdCAqLwoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIEJUODc4X0RFVkNUUkwsICZjb21tYW5kKTsKCQlpZiAodHJpdG9uMSkKCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9UQkZYOwoJCWlmICh2c2Z4KQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1ZTRlg7CgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIEJUODc4X0RFVkNUUkwsIGNvbW1hbmQpOwoJfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIFBDSV9MQVRFTkNZX1RJTUVSLCBsYXRlbmN5KTsKCXJldHVybiAwOwp9CgoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=