LyoKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSAiYnR0dnAuaCIKCi8qIGZ3ZCBkZWNsICovCnN0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKc3RhdGljIHZvaWQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGluaXRfUlRWMjQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAoJCQkJICAgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIHRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCB3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyBpbnQgdGVhNTc1N193cml0ZShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgdmFsdWUpOwpzdGF0aWMgdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSk7CnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpOwoKLyogY29uZmlnIHZhcmlhYmxlcyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IHRyaXRvbjE9MDsKc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4PTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwppbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAwOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGxpc3Qgb2YgY2FyZCBJRHMgZm9yIGJ0ODc4KyBjYXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgc3RydWN0IENBUkQgewoJdW5zaWduZWQgaWQ7CglpbnQgY2FyZG5yOwoJY2hhciAqbmFtZTsKfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IDB4MTNlYjAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKCXsgMHgzOTAwMDA3MCwgQlRUVl9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWLUQiIH0sCgl7IDB4NDUwMDAwNzAsIEJUVFZfSEFVUFBBVUdFUFZSLCAgIkhhdXBwYXVnZSBXaW5UVi9QVlIiIH0sCgl7IDB4ZmYwMDAwNzAsIEJUVFZfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCgl7IDB4ZmYwMTAwNzAsIEJUVFZfT1NQUkVZMngwX1NWSUQsIk9zcHJleS0yMDAiIH0sCgl7IDB4ZmYwMjAwNzAsIEJUVFZfT1NQUkVZNTAwLCAgICAgIk9zcHJleS01MDAiIH0sCgl7IDB4ZmYwMzAwNzAsIEJUVFZfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAoJeyAweGZmMDQwMDcwLCBCVFRWX09TUFJFWTU0MCwgICAgICJPc3ByZXktNTQwIiB9LAoKCXsgMHgwMDAxMTAwMiwgQlRUVl9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKCXsgMHgwMDAzMTAwMiwgQlRUVl9BVElfVFZXT05ERVJWRSwiQVRJIFRWIFdvbmRlci9WRSIgfSwKCgl7IDB4NjYwNjEwN2QsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDY2MDcxMDdkLCBCVFRWX1dJTkZBU1RWQzEwMCwgICJMZWFkdGVrIFdpbkZhc3QgVkMgMTAwIiB9LAoJeyAweDY2MDkxMDdkLCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFRWIDIwMDAgWFAiIH0sCgl7IDB4MjYzNjEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4MjY0NTEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCiAJeyAweDQwMjAxMGZjLCBCVFRWX0dWQkNUVjNQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjMvUENJIiB9LAoJeyAweDQwNTAxMGZjLCBCVFRWX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAoJeyAweDQwNzAxMGZjLCBCVFRWX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAogCXsgMHhkMDE4MTBmYywgQlRUVl9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCgl7IDB4MDAxMjExYmQsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgkvKiBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uICovCgl7IDB4MTIwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCXsgMHhmZjAwYmQxMSwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJLyogdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4gKi8KCXsgMHhmZjEyMTFiZCwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCgl7IDB4MzAwMDEyMWEsIEJUVFZfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgyNjM3MTBiNCwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDMwNjAxMjFhLCBCVFRWX1NUQjIsCSAgIjNEZnggVm9vZG9vVFYgMTAwLyBTVEIgT0VNIiB9LAoKCXsgMHgzMDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCgl7IDB4YTAwNTE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkNQSDA2WCBUVmlldzk5LUNhcmQiIH0sCgl7IDB4MzAwMjE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDV4IiB9LAoJeyAweDMwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKCXsgMHg1MDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiQXNrZXkgQ1BIMDUwIiB9LAoJeyAweDMwMDAxNGZmLCBCVFRWX01BR0lDVFZJRVcwNjEsICJUVmlldyA5OSAoQ1BIMDYxKSIgfSwKCXsgMHgzMDAyMTRmZiwgQlRUVl9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKCgl7IDB4MDAwMTE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwMjE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDAwMzE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwNDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDMwMDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKCgl7IDB4MTExNzE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE5MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBJKSIgfSwKCXsgMHgxMTFhMTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgSSkiIH0sCgoJeyAweDExMjMxNTNiLCBCVFRWX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCgl7IDB4MTEyNzE1M2IsIEJUVFZfVEVSUkFUViwgICAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMDUpIiAgICB9LAoJLyogY2xhc2hlcyB3aXRoIEZseVZpZGVvCgkgKnsgMHgxODUyMTg1MiwgQlRUVl9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LCAqLwoJeyAweDExMzQxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKCXsgMHgxMTM1MTUzYiwgQlRUVl9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvKiBMUjEwMiAqLwoJeyAweDUwMTgxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8qID8/ICovCgl7IDB4ZmYzYjE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLyogPz8gKi8KCgl7IDB4NDAwMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwYTE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwZDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDEwMTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTYxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgoJeyAweDE0MzBhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0EiIH0sCgl7IDB4MTQzMWFhMDAsIEJUVFZfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQiIgfSwKCXsgMHgxNDMyYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAoJeyAweDE0MzNhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0QiIH0sCgl7IDB4MTQzM2FhMDMsIEJUVFZfUFYxNDMsICAgICAgICAgIlNlY3VyaXR5IEV5ZXMiIH0sCgoJeyAweDE0NjBhYTAwLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMSIgfSwKCXsgMHgxNDYxYWEwMSwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTIiIH0sCgl7IDB4MTQ2MmFhMDIsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAoJeyAweDE0NjNhYTAzLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtNCIgfSwKCgl7IDB4MTQ2NGFhMDQsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAoJeyAweDE0NjVhYTA1LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMiIgfSwKCXsgMHgxNDY2YWEwNiwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTMiIH0sCgl7IDB4MTQ2N2FhMDcsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAoKCXsgMHhhMTMyZmYwMCwgQlRUVl9JVkMxMDAsICAgICAgICAiSVZDLTEwMCIgIH0sCgl7IDB4YTE1NTAwMDAsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAxLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMiwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDMsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMTAwLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMSwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDIsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAzLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTgyZmYwMCwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAyLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA1LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDcsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA4LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBiLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBlLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgoJeyAweDQxNDI0MzQ0LCBCVFRWX0dSQU5EVEVDLCAgICAgICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIiB9LAoJeyAweDAxMDIwMzA0LCBCVFRWX1hHVUFSRCwgICAgICAgICJHcmFuZHRlYyBHcmFuZCBYLUd1YXJkIiB9LAoKCXsgMHgxODUwMTg1MSwgQlRUVl9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4YTA1MDE4NTEsIEJUVFZfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweDE4NTExODUxLCBCVFRWX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAoJeyAweDE4NTIxODUyLCBCVFRWX1RZUEhPT05fVFZJRVcsICJGbHlWaWRlbyA5OEZNIChMUjUwKS8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIgfSwKCXsgMHg0MWEwYTA1MSwgQlRUVl9GTFlWSURFT185OEZNLCAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCBSZXYgUSIgfSwKCXsgMHgxODUwMWY3ZiwgQlRUVl9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCgogICAgCXsgMHgwMTAxMTVjYiwgQlRUVl9HTVYxLCAgICAgICAgICAiQUcgR01WMSIgfSwKCXsgMHgwMTAxMTRjNywgQlRUVl9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCgoJeyAweDEwYjQyNjM2LCBCVFRWX0hBVVBQQVVHRTg3OCwgICJTVEIgPz8/IiB9LAoJeyAweDIxN2Q2NjA2LCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHhmZmY2ZjZmZiwgQlRUVl9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4MDMxMTYwMDAsIEJUVFZfU0VOU09SQVkzMTEsICAgIlNlbnNvcmF5IDMxMSIgfSwKCXsgMHgwMDc5MGUxMSwgQlRUVl9XSU5EVlIsICAgICAgICAiQ2Fub3B1cyBXaW5EVlIgUENJIiB9LAoJeyAweGEwZmNhMWEwLCBCVFRWX1pPTFRSSVgsICAgICAgICJGYWNlIHRvIEZhY2UgVHZtYXgiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4ODJiMmFhNmEsIEJUVFZfU0lNVVNfR1ZDMTEwMCwgIlNJTVVTIEdWQzExMDAiIH0sCgl7IDB4MTQ2Y2FhMGMsIEJUVFZfUFY5NTEsICAgICAgICAgIml0dW5lciBzcGVjdHJhOCIgfSwKIAl7IDB4MjAwYTEyOTUsIEJUVFZfUFhDMjAwLCAgICAgICAgIkltYWdlTmF0aW9uIFBYQzIwMEEiIH0sCgoJeyAweDQwMTExNTU0LCBCVFRWX1BWX0JUODc4UF85QiwgICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVCIgfSwKCXsgMHgxN2RlMGEwMSwgQlRUVl9LV09STEQsICAgICAgICAiTWVjZXIgVFYvRk0vVmlkZW8gVHVuZXIiIH0sCgoJeyAweDAxMDUxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzEiIH0sCgl7IDB4MDEwNjE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMiIgfSwKCXsgMHgwMTA3MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAoJeyAweDAxMDgxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzQiIH0sCgoJeyAweDE1NDA5NTExLCBCVFRWX0FDT1JQX1k4NzhGLCAiQWNvcnAgWTg3OEYiIH0sCgoJLyogbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgoJICogeyAweGEwZmNhMDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LCAqLwoKCS8qIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikgKi8KCXsgMHgwMTAxMDA3MSwgQlRUVl9ORUJVTEFfRElHSVRWLCAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIgfSwKCXsgMHgwNzYxMTQ2MSwgQlRUVl9BVkRWQlRfNzYxLCAgICAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiIH0sCgl7IDB4MDAxYzExYmQsIEJUVFZfUElOTkFDTEVTQVQsICAgIlBpbm5hY2xlIFBDVFYgU2F0IiB9LAoJeyAweDAwMjYxMWJkLCBCVFRWX1RXSU5IQU5fRFNULCAgICJQaW5uYWNsZSBQQ1RWIFNBVCBDSSIgfSwKCXsgMHgwMDAxMTgyMiwgQlRUVl9UV0lOSEFOX0RTVCwgICAiVHdpbmhhbiBWaXNpb25QbHVzIERWQiIgfSwKCXsgMHhmYzAwMjcwZiwgQlRUVl9UV0lOSEFOX0RTVCwgICAiQ2hhaW5UZWNoIGRpZ2l0b3AgRFNULTEwMDAgRFZCLVMiIH0sCgl7IDB4MDc3MTE0NjEsIEJUVFZfQVZEVkJUXzc3MSwgICAgIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAoJeyAweGRiMTAxOGFjLCBCVFRWX0RWSUNPX0RWQlRfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKCXsgMHhkNTAwMThhYywgQlRUVl9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CnsKLyogLS0tLSBjYXJkIDB4MDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIiAqKiogVU5LTk9XTi9HRU5FUklDICoqKiAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIlNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkudHVuZXJfdHlwZQk9IDQsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIkRpYW1vbmQgRFRWMjAwMCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgM30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmdwaW9tYXNrCT0gMHgwZiwKCS5hdWRpb211eAk9IHsgMHgwYywgMHgwNCwgMHgwOCwgMHgwNCwgMH0sCgkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIk1BVFJJWC1WaXNpb24gTVYtRGVsdGEiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKLyogLS0tLSBjYXJkIDB4MDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGMwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHhjMDAsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJJTVMvSVhtaWNybyBUdXJib1RWIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAxLCAyLCAzLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViBwcm8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MzAxNGYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBRFMgVGVjaG5vbG9naWVzIENoYW5uZWwgU3VyZmVyIFRWIChidDg0OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gNCwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5tc3AzNHh4X2FsdCAgICA9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJBaW1zbGFiIFZpZGVvIEhpZ2h3YXkgWHRyZW1lIChWSFgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHswICwgMCwgMSAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKLyogLS0tLSBjYXJkIDB4MTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBsYXlUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS8qIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PiAqLwoJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDgzMDBmOCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAoJLmF1ZGlvbXV4CT0geyAweDRmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwN30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmF1ZGlvX2hvb2sJPSB3aW52aWV3X2F1ZGlvLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLm5hbWUJCT0gIkFWRUMgSW50ZXJjYXB0dXJlIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHg4ZGZmMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkNFSSBSYWZmbGVzIENhcmQiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIEx1Y2t5IFN0YXIgSW1hZ2UgV29ybGQgQ29uZmVyZW5jZVRWIExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMiwgIC8qIHR1bmVyLCBsaW5lIGluICovCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhjMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MCwgMSwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWLCBidDg3OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMywgLTEgfSwKCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCQjVfUEFMX0ksCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKLyogLS0tLSBjYXJkIDB4MTggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkFza2V5IENQSDA1WC8wNlggKGJ0ODc4KSBbbWFueSB2ZW5kb3JzXSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhlMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4YzAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFYrIFZlcnNpb24gMS4wIChCdDg0OCkvIFRlcnJhIFRWYWx1ZSBWZXJzaW9uIDEuMC8gVm9iaXMgVFYtQm9vc3RhciIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgxZjBmZmYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAsIDB4NDAwMDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5hdWRpb19ob29rICAgICA9IHRlcnJhdHZfYXVkaW8sCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSBXaW5DYW0gbmV3ZXIgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gNywKCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OC8gTUFYSSBUViBWaWRlbyBQQ0kyIExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMiwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDFjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWKyBWZXJzaW9uIDEuMSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDFmMGZmZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmF1ZGlvX2hvb2sJPSB0ZXJyYXR2X2F1ZGlvLAoJLyogR1BJTyB3aXJpbmc6CglFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCglncGlvMDA6IGkyYy1zZGEKCWdwaW8wMTogaTJjLXNjbAoJZ3BpbzAyOiBvbTU2MTAtZGF0YQoJZ3BpbzAzOiBvbTU2MTAtY2xrCglncGlvMDQ6IG9tNTYxMC13cmUKCWdwaW8wNTogb201NjEwLXN0ZXJlbwoJZ3BpbzA2OiByZHM2NTg4LWRhdm4KCWdwaW8wNzogUGluIDcgbi5jLgoJZ3BpbzA4OiBuSU9XCglncGlvMDkrMTA6IG5JT1IsIG5TRUwgPz8gKGJ0ODc4KQoJCWdwaW8wOTogbklPUiAoYnQ4NDgpCgkJZ3BpbzEwOiBuU0VMIChidDg0OCkKCVNvdW5kIFJvdXRpbmc6CglncGlvMTY6IHUyLUEwICgxc3QgNDA1MmJ0KQoJZ3BpbzE3OiB1Mi1BMQoJZ3BpbzE4OiB1Mi1uRU4KCWdwaW8xOTogdTQtQTAgKDJuZCA0MDUyKQoJZ3BpbzIwOiB1NC1BMQoJCXU0LW5FTiAtIEdORAoJQnRzcHk6CgkJMDAwMDAgOiBDZHJvbSAoaW50ZXJuYWwgYXVkaW8gaW5wdXQpCgkJMTAwMDAgOiBleHQuIFZpZGVvIGF1ZGlvIGlucHV0CgkJMjAwMDAgOiBUViBNb25vCgkJYTAwMDAgOiBUViBNb25vLzIKCTFhMDAwMCA6IFRWIFN0ZXJlbwoJCTMwMDAwIDogUmFkaW8KCQk0MDAwMCA6IE11dGUKKi8KCn0sewoJLyogSmFubmlrIEZyaXRzY2ggPGphbm5pa0B0ZWNoZmFrLnVuaS1iaWVsZWZlbGQuZGU+ICovCgkubmFtZQkJPSAiSW1hZ2VuYXRpb24gUFhDMjAwIiwKCS52aWRlb19pbnB1dHMJPSA1LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAxLCAvKiB3YXM6IDQgKi8KCS5ncGlvbWFzawk9IDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCgkuYXVkaW9tdXgJPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkubXV4c2VsX2hvb2sgICAgPSBQWEMyMDBfbXV4c2VsLAoKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLCAgLyogMHg4ZGZlMDAgKi8KCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJGb3JtYWMgaVByb1RWLCBGb3JtYWMgUHJvVFYgSSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAxLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDIwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJJbnRlbCBDcmVhdGUgYW5kIFNoYXJlIFBDSS8gU21hcnQgVmlkZW8gUmVjb3JkZXIgSUlJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSA0LAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWYWx1ZSBWZXJzaW9uIEJ0ODc4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgMjAwMC8gV2luRmFzdCAyMDAwIFhQIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8qIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IgKi8KCS8qIEFsZXhhbmRlciBWYXJha2luIDxhdmFyYWtpbkBob3RtYWlsLmNvbT4gW3N0ZXJlbyB2ZXJzaW9uXSAqLwoJLmdwaW9tYXNrCT0gMHhiMzMwMDAsCgkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKCQlncGlvMjMgLS0gaGVmNDA1MjpuRW5hYmxlICgweDgwMDAwMCkKCQlncGlvMTIgLS0gaGVmNDA1MjpBMQoJCWdwaW8xMyAtLSBoZWY0MDUyOkEwCgkweDAwMDA6IGV4dGVybmFsIGF1ZGlvCgkweDEwMDA6IEZNCgkweDIwMDA6IFRWCgkweDMwMDA6IG4uYy4KCU5vdGU6IFRoZXJlIGV4aXN0cyBhbm90aGVyIHZhcmlhbnQgIldpbmZhc3QgMjAwMCIgd2l0aCB0diBzdGVyZW8gIT8KCU5vdGU6IGVlcHJvbSBvbmx5IGNvbnRhaW5zIEZGIGFuZCBwY2kgc3Vic3lzdGVtIGlkIDEwN2Q6NjYwNgoJKi8KCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLmhhc19yYWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IDUsIC8qIGRlZmF1bHQgZm9yIG5vdywgZ3BpbyByZWFkcyBCRkZGMDYgZm9yIFBhbCBiZytkayAqLwoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmF1ZGlvX2hvb2sJPSB3aW5mYXN0MjAwMF9hdWRpbywKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAgLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDI0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAgLyBUeXBob29uIFRWaWV3IFRWL0ZNIFR1bmVyIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDMsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgkubmFtZQkJPSAiUHJvbGluayBQaXhlbFZpZXcgUGxheVRWIHBybyIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhmZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkuYXVkaW9tdXgJPSB7IDB4MjEsIDB4MjAsIDB4MjQsIDB4MmMsIDB4MjksIDB4MjkgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkubmFtZQkJPSAiQXNrZXkgQ1BIMDZYIFRWaWV3OTkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4NTUxZTAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4CT0geyAweDU1MTQwMCwgMHg1NTEyMDAsIDAsIDAsIDB4NTUxYzAwLCAweDU1MTIwMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lCQk9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpby9SYXZlIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAzMDAwRiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMiwgMHhkMDAwMSwgMCwgMCwgMX0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKLyogLS0tLSBjYXJkIDB4MjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQgKGJ0ODc4KSwgM0RmeCBWb29kb29UViAxMDAiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDQsIDAsIDIsIDMsIDF9LAoJLm5vX21zcDM0eHgJPSAxLAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLmhhc19yYWRpbyAgICAgID0gMSwKfSx7CgkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUgOTgiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gNCwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgNCwgMTEsIDcsIDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmhhc19yYWRpbwk9IDEsCgkuYXVkaW9faG9vawk9IGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJQcm9WaWRlbyBQVjk1MSIsIC8qIHBpYzE2YzU0ICovCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMCwgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkubmFtZQkJPSAiTGl0dGxlIE9uQWlyIFRWIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGUwMGIsCgkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsweGZmOWZmNiwgMHhmZjlmZjYsIDB4ZmYxZmY3LCAwLCAweGZmM2ZmY30sCgkubm9fbXNwMzR4eAk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDJjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJTaWdtYSBUVklJLUZNIiwKCS52aWRlb19pbnB1dHMJPSAyLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMywKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezEsIDEsIDAsIDIsIDN9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfTk9ORSwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIk1BVFJJWC1WaXNpb24gTVYtRGVsdGEgMiIsCgkudmlkZW9faW5wdXRzCT0gNSwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMywKCS5ncGlvbWFzawk9IDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCgkuYXVkaW9tdXgJPSB7MCB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJab2x0cml4IEdlbmllIFRWL0ZNIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGJjZjAzZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHhiYzgwM2YsIDB4YmM5MDNmLCAweGJjYjAzZiwgMCwgMHhiY2IwM2Z9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDIxLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lCQk9ICJUZXJyYXRlYyBUVi9SYWRpbysiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4NzAwMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAsIDB4NDAwMDAsIDB4MjAwMDAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzM1LAoJLnR1bmVyX3R5cGUJPSAxLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmhhc19yYWRpbwk9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4MzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkFza2V5IENQSDAzeC8gRHluYWxpbmsgTWFnaWMgVFZpZXciLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezIsMCwwLDAsMX0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIklPREFUQSBHVi1CQ1RWMy9QQ0kiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MDEwZjAwLAoJLm11eHNlbAkJPSB7MiwgMywgMCwgMH0sCgkuYXVkaW9tdXgJPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfQUxQU19UU0hDNl9OVFNDLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmF1ZGlvX2hvb2sJPSBndmJjdHYzcGNpX2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJQcm9saW5rIFBWLUJUODc4UCs0RSAvIFBpeGVsVmlldyBQbGF5VFYgUEFLIC8gTGVuY28gTVhUVi05NTc4IENQIiwKCS52aWRlb19pbnB1dHMJPSA1LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAweEFBMDAwMCwKCS5tdXhzZWwJCT0geyAyLDMsMSwxLC0xIH0sCgkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAwLCAweDgwMDAwLCAweDgwMDAwLCAweGE4MDAwLCAweDQ2MDAwICB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMX0ksCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuaGFzX3JlbW90ZQk9IDEsCgkvKiBHUElPIHdpcmluZzogKGRpZmZlcmVudCBmcm9tIFJldi40QyAhKQoJCUdQSU8xNzogVTQuQTAgKGZpcnN0IGhlZjQwNTJidCkKCQlHUElPMTk6IFU0LkExCgkJR1BJTzIwOiBVNS5BMSAoc2Vjb25kIGhlZjQwNTJidCkKCQlHUElPMjE6IFU0Lm5FTgoJCUdQSU8yMjogQlQ4MzIgUmVzZXQgTGluZQoJCUdQSU8yMzogQTUsQTAsIFU1LG5FTgoJTm90ZTogQXQgaTJjPTB4OGEgaXMgYSBCdDgzMiBjaGlwLCB3aGljaCBjaGFuZ2VzIHRvIDB4ODggYWZ0ZXIgYmVpbmcgcmVzZXQgdmlhIEdQSU8yMgoJKi8KfSx7CgkubmFtZSAgICAgICAgICAgPSAiRWFnbGUgV2lyZWxlc3MgQ2Fwcmljb3JuMiAoYnQ4NzhBKSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEgLyogVFVORVJfQUxQU19UTURIMl9OVFNDICovLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERhdmlkIEjkcmRlbWFuIDxkYXZpZEAyZ2VuLmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAweGQwMDAxLCAwLCAwLCAxMH0sCgkJCS8qIHNvdW5kIHBhdGggKDUgc291cmNlcyk6CgkJCU1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKCQkJCTA9IGV4dC4gQXVkaW8gSU4KCQkJCTE9IGZyb20gTVVYMgoJCQkJMj0gTW9ubyBUViBzb3VuZCBmcm9tIFR1bmVyCgkJCQkzPSBub3QgY29ubmVjdGVkCgkJCU1VWDIgKG1hc2sgMHgzMDAwMCk6CgkJCQkwLDIsMz0gZnJvbSBNU1AzNHh4CgkJCQkxPSBGTSBzdGVyZW8gUmFkaW8gZnJvbSBUdW5lciAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS8qIENsYWFzIExhbmdiZWhuIDxjbGFhc0BiaWdmb290LmNvbT4sCglTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLwoJLm5hbWUJCT0gIlR5cGhvb24gVFZpZXcgUkRTICsgRk0gU3RlcmVvIC8gS05DMSBUViBTdGF0aW9uIFJEUyIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxYywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCWluIGRlLmNvbXAub3MudW5peC5saW51eC5oYXJkd2FyZToKCQlvcHRpb25zIGJ0dHYgY2FyZD0wIHBsbD0xIHJhZGlvPTEgZ3Bpb21hc2s9MHgxOGUwCgkJYXVkaW9tdXg9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCW9wdGlvbnMgdHVuZXIgdHlwZT01ICovCgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMCAvRmx5VmlkZW8gQTIvIExpZmV0ZWMgTFQgOTQxNSBUViBbTFI5MF0iLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MThlMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MThlMCB9LAoJCS8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKCQkJMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCgkJCTB4MDA4MDogVHVuZXIgQTIgU0FQIChzZWNvbmQgYXVkaW8gcHJvZ3JhbSA9IFp3ZWlrYW5hbHRvbikKCQkJMHgwODgwOiBUdW5lciBBMiBzdGVyZW8gKi8KCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJb2xkIEVhc3kgVFYgQlQ4NDggdmVyc2lvbiAobW9kZWwgQ1BIMDMxKSAqLwoJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHhGLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMCwgMTB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKLyogLS0tLSBjYXJkIDB4MzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogR29yZG9uIEhleWRvbiA8Z2poZXlkb25AYmlnZm9vdC5jb20gKCc5OCkgKi8KCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MTgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSA1LAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS8qIFRoaXMgaXMgdGhlIHVsdGltYXRlIGNoZWFwbyBjYXB0dXJlIGNhcmQKCSoganVzdCBhIEJUODQ4QSBvbiBhIHNtYWxsIFBDQiEKCSogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjICdHcmFuZCBWaWRlbyBDYXB0dXJlJyAoQnQ4NDgpIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjAvIFBob2ViZSBUViBNYXN0ZXIgT25seSAoTm8gRk0pIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDgwMCwgMHg0MDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ180MDM2Rlk1X05UU0MsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLwoJLm5hbWUJCT0gIkFza2V5IENQSDAzeCBUViBDYXB0dXJlciIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsMCwwLDAsMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAwLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDNjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4gKi8KCS5uYW1lICAgICAgICAgICA9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0xMDBQQ1RWIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAyLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDExLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMSwgOH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLyogQWRyaWFuIENveCA8YWRyaWFuQGh1bWJvbGR0LmNvLnVrICovCgkubmFtZQkgICAgICAgID0gIkFHIEVsZWN0cm9uaWNzIEdNVjEiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIJICAgICAgICA9IC0xLAoJLnN2aHMJICAgICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAweEYsCgkubXV4c2VsCSAgICAgICAgPSB7IDIsIDJ9LAoJLmF1ZGlvbXV4ICAgICAgID0geyB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsCSAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQoJc3BlY2lhbCB0aGFua3MgdG8gSW5mb3JtYXRpY2EgTWllcmVzIGZvciBwcm92aWRpbmcgdGhlIGNhcmQgKi8KCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjEvIEJFU1RCVVkgRWFzeSBUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMiwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDEsIDAsIDQsIDQsIDl9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBMdWthcyBHZWJhdWVyIDxnZWJ5QHZvbG55LmN6PiAqLwoJLm5hbWUJCT0gIkFUSSBUVi1Xb25kZXIiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZjAzZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkuYXVkaW9tdXgJPSB7IDB4YmZmZSwgMCwgMHhiZmZmLCAwLCAweGJmZmV9LAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDQwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCgkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciBWRSIsCgkudmlkZW9faW5wdXRzCT0gMiwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDEsCgkubXV4c2VsCQk9IHsgMiwgMywgMCwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDAsIDEsIDAsIDB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS8qIERlZUpheSA8ZGVlamF5QHdlc3RlbDkwMC5uZXQgKDIwMDBTKSAqLwoJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzawk9IDB4MThlMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCQkJLyogUmFkaW8gY2hhbmdlZCBmcm9tIDFlODAgdG8gMHg4MDAgdG8gbWFrZQoJCQlGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCgkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4MDAsIDB4MTA4MCB9LAoJLmF1ZGlvX2hvb2sJPSBmdjIwMDBzX2F1ZGlvLAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDUsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDB4NTAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS8qIFRBTkFLQSBLZWkgPHBlZzAwNjI1QG5pZnR5LmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjQvUENJIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAxMGYwMCwKCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQywKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5hdWRpb19ob29rICAgICA9IGd2YmN0djNwY2lfYXVkaW8sCn0sewoKLyogLS0tLSBjYXJkIDB4NDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIjNEZnggVm9vZG9vVFYgRk0gKEV1cm8pLCBWb29kb29UViAyMDAgKFVTQSkiLAoJLyogdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKCSogc291bmQgcHJvYmxlbXMgd2l0aCB0aGlzIGNhcmQuICovCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAoJLyogMHgxMDAwMDA6IDE9TVNQIGVuYWJsZWQgKDA9ZGlzYWJsZSBhZ2FpbikKCSogMHgwMTAwMDA6IENvbm5lY3RlZCB0byAiUzAiIG9uIHRkYTk4ODAgKDA9UGFsL0JHLCAxPU5UU0MpICovCgkuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCgkvKiB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbwoJKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciAqLwoJLm11eHNlbCAgICAgICAgID0geyAyLCAzICwwICwxfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5wbGwJCT0gUExMXzI4LAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLyogUGhpbGlwIEJsdW5kZWxsIDxwYkBuZXh1cy5jby51az4gKi8KCS5uYW1lICAgICAgICAgICA9ICJBY3RpdmUgSW1hZ2luZyBBSU1NUyIsCgkudmlkZW9faW5wdXRzICAgPSAxLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkubXV4c2VsICAgICAgICAgPSB7IDIgfSwKCS5ncGlvbWFzayAgICAgICA9IDAKfSx7CgkvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKyAoUmV2LjRDLDhFKSIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gNCwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMTUsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAxMSwgNywgMTMsIDB9LCAvKiBUViBhbmQgUmFkaW8gd2l0aCBzYW1lIEdQSU8gISAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDI1LAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmhhc19yZW1vdGUgICAgID0gMSwKCS8qIEdQSU8gd2lyaW5nOgoJCUdQSU8wOiBVNC5BMCAoaGVmNDA1MmJ0KQoJCUdQSU8xOiBVNC5BMQoJCUdQSU8yOiBVNC5BMSAoc2Vjb25kIGhlZjQwNTJidCkKCQlHUElPMzogVTQubkVOLCBVNS5BMCwgQTUubkVOCgkJR1BJTzgtMTU6IHZyZDg2NmIgPwoJKi8KfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThFWiAoY2FwdHVyZSBvbmx5KSBMUjUxIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sIC8qIEFWMSwgQVYyLCBTVkhTLCBDVmlkIGFkYXB0ZXIgb24gU1ZIUyAqLwoJLnBsbAkJPSBQTExfMjgsCgkubm9fbXNwMzR4eAk9IDEsCgkudHVuZXJfdHlwZQk9IFVOU0VULAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCi8qIC0tLS0gY2FyZCAweDQ4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+ICovCgkubmFtZQkJPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKzlCIChQbGF5VFYgUHJvIHJldi45QiBGTStOSUNBTSkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4M2YsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJLmF1ZGlvbXV4CT0geyAweDAxLCAweDAwLCAweDAzLCAweDAzLCAweDA5LCAweDAyIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDUsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuYXVkaW9faG9vawk9IHB2YnQ4NzhwOWJfYXVkaW8sIC8qIE5vdGU6IG5vdCBhbGwgY2FyZHMgaGF2ZSBzdGVyZW8gKi8KCS5oYXNfcmFkaW8JPSAxLCAgLyogTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHJhZGlvICovCgkuaGFzX3JlbW90ZSAgICAgPSAxLAoJLyogR1BJTyB3aXJpbmc6CgkJR1BJTzA6IEEwIGhlZjQwNTIKCQlHUElPMTogQTEgaGVmNDA1MgoJCUdQSU8zOiBuRU4gaGVmNDA1MgoJCUdQSU84LTE1OiB2cmQ4NjZiCgkJR1BJTzIwLDIyLDIzOiBSMzAsUjI5LFIyOAoJKi8KfSx7CgkvKiBDbGF5IEt1bnogPGNrdW56QG1haWwuYXJjLm5hc2EuZ292PiAqLwoJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwoJLm5hbWUgICAgICAgICAgID0gIlNlbnNvcmF5IDMxMSIsCgkudmlkZW9faW5wdXRzICAgPSA1LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gNCwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlJlbW90ZVZpc2lvbiBNWCAoUlY2MDUpIiwKCS52aWRlb19pbnB1dHMgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwN2ZmLAoJLm11eHNlbCAgICAgICAgID0geyAweDMzLCAweDEzLCAweDIzLCAweDQzLCAweGYzLCAweDczLCAweGUzLCAweDAzLAoJCQkweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm11eHNlbF9ob29rICAgID0gcnY2MDVfbXV4c2VsLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMiwKCS50dW5lcgkJPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MUM4MDBGLCAgLyogQml0MC0yOiBBdWRpbyBzZWxlY3QsIDgtMTI6cmVtb3RlIGNvbnRyb2wgMTQ6cmVtb3RlIHZhbGlkIDE1OnJlbW90ZSByZXNldCAqLwoJLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxLCB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCA0IH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkucGxsCQk9IFBMTF8yOCwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCi8qIC0tLS0gY2FyZCAweDRjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+ICovCgkubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDE0MDAwNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAzLCA0LCAwIH0sCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCn0sewoJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjIE11bHRpIENhcHR1cmUgQ2FyZCAoQnQ4NzgpIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiSmV0d2F5IFRWL0NhcHR1cmUgSlctVFY4NzgtRkJLLCBLd29ybGQgS1ctVFY4NzhSRiIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMywKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LCAgIC8qIFR1bmVyLCBTVmlkLCBTVkhTLCBTVmlkIHRvIFNWSFMgY29ubmVjdG9yICovCgkuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvKiBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKCQkJCQkqIFRoaXMgY2FyZCBsYWNrcyBleHRlcm5hbCBBdWRpbyBJbiwgc28gd2UgbXV0ZSBpdCBvbiBFeHQuICYgSW50LgoJCQkJCSogVGhlIFBDQiBjYW4gdGFrZSBhIHNieDE2Mzcvc2J4MTY3Mywgd2lyaW5nIHVua25vd24uCgkJCQkJKiBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KCQkJCQkqIGF1ZGlvbXV4PTE6IGxvd2VyIHZvbHVtZSwgMiszOiBtdXRlCgkJCQkJKiBidHdpbmNhcCB1c2VzIDB4ODAwMDAvMHg4MDAwMwoJCQkJCSovCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDUsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkvKiBTYW1zdW5nIFRDUEE5MDk1UEMyN0EgKEJHK0RLKSwgcGhpbGlwcyBjb21wYXRpYmxlLCB3L0ZNLCBzdGVyZW8gYW5kCglyYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuICovCgkuaGFzX3JhZGlvCT0gMSwKCS8qIEdQSU8gSW5mbzoKCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKCQlHUElPMjogICAgIEhFRjQwNTIgbkVOQUJMRQoJCUdQSU8zLTc6ICAgbi5jLgoJCUdQSU84LTEzOiAgSVJEQzM1NyBkYXRhMC01IChkYXRhNiBuLmMuID8pIFtjaGlwIG5vdCBwcmVzZW50IG9uIG15IGNhcmRdCgkJR1BJTzE0LDE1OiA/PwoJCUdQSU8xNi0yMTogbi5jLgoJCUdQSU8yMiwyMzogPz8KCQk/PyAgICAgICA6IG10dThiNTZlcCBtaWNyb2NvbnRyb2xsZXIgZm9yIElSIChHUElPIHdpcmluZyB1bmtub3duKSovCn0sewoJLyogQXJ0aHVyIFRldHpsYWZmLURlYXMsIERTUCBEZXNpZ24gTHRkIDxzb2Z0d2FyZUBkc3BkZXNpZ24uY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoKCS8qIC0tLS0gY2FyZCAweDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDEsIDF9LAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoKCS5ncGlvbWFzayAgICAgICA9IDcsCgkuYXVkaW9tdXggICAgICAgPSB7N30sCn0sewoJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi1CQ1RWNS9QQ0kiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MGYwZjgwLAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezB4MDMwMDAwLCAweDAxMDAwMCwgMCwgMCwgMHgwMjAwMDAsIDB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmF1ZGlvX2hvb2sgICAgID0gZ3ZiY3R2NXBjaV9hdWRpbywKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDAvMTUwICg4NzgpIiwgLyogMHgxKDJ8MyktNDVDNi1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gNCwgICAgICAgICAgICAgICAgICAvKiBpZC1pbnB1dHMtY2xvY2sgKi8KCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDMsCgkubXV4c2VsICAgICAgICAgPSB7IDMsIDIsIDAsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODQ4KSIsIC8qIDB4MDQtNTRDMC1DMSAmIG9sZGVyIGJvYXJkcyAqLwoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDIsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMSAoODQ4KSIsIC8qIDB4MDUtNDBDMC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDMsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSIsICAgICAgIC8qIDB4MSg0fDUpLTAwMDQtQzQgKi8KCS52aWRlb19pbnB1dHMgICA9IDEsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIHcvIHN2aWQiLCAgLyogMHgoMTZ8MTd8MjApLTAwQzQtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yMDEvMjUwLzI1MSIsICAvKiAweDEoOHw5fEV8RiktMDAwNC1DNCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMSwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLm11eHNlbCAgICAgICAgID0geyAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFVOU0VULAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yNTAiLCAgIC8qIDB4MShBfEIpLTAwQzQtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFVOU0VULAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjEwLzIyMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVU5TRVQsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1MDAiLCAgIC8qIDUwMCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTQwIiwgICAvKiA1NDAgKi8KCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NUMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAwIiwgIC8qIDIwMDAgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFVOU0VULAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLCAgICAgIC8qIG11c3QgYXZvaWQsIGNvbmZsaWN0cyB3aXRoIHRoZSBidDg2MCAqLwp9LHsKCS8qIE0gRyBCZXJiZXJpY2ggPGJlcmJlcmljQGZvcndpc3MudW5pLXBhc3NhdS5kZT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJRFMgRWFnbGUiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCgkubXV4c2VsX2hvb2sgICAgPSBlYWdsZV9tdXhzZWwsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDEsCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDEgfSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMn0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIkZvcm1hYyBQcm9UViBJSSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDMsCgkuZ3Bpb21hc2sgICAgICAgPSAyLAoJLyogVFYsIENvbXAxLCBDb21wb3NpdGUgb3ZlciBTVklEIGNvbiwgU1ZJRCAqLwoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMiwgMiwgMCwgMCwgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLmhhc19yYWRpbyAgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAovKiBzb3VuZCByb3V0aW5nOgoJR1BJTz0weDAwLDB4MDEsMHgwMzogbXV0ZSAoPykKCTB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCglUaGUgY2FyZCBoYXMgb25ib2FyZCBhdWRpbyBjb25uZWN0b3JzIGxhYmVsZWQgImNkcm9tIiBhbmQgImJvYXJkIiwKCW5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCglDYXJkIGxhY2tzOiBleHRlcm5hbCBhdWRpbyBpbiwgcGNpIHN1YnN5c3RlbSBpZC4KKi8KfSx7CgoJLyogLS0tLSBjYXJkIDB4NjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDcsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAzLCA0fSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSA1LAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLnBsbCAgICAgICAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8iLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFVOU0VULAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS8qIEx1YyBWYW4gSG9leWxhbmR0IDxsdWNAZS1tYWdpYy5iZT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE1MCIsIC8qIDB4NGYgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4gKi8KCS8qIFRoaXMgY2FyZCBsYWNrcyBzdWJzeXN0ZW0gSUQgKi8KCS5uYW1lICAgICAgICAgICA9ICJBRC1UVks1MDMiLCAvKiAweDYzICovCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMDFlODAwNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJLyogICAgICAgICAgICAgICAgICBUdW5lciwgUmFkaW8sIGV4dGVybmFsLCBpbnRlcm5hbCwgb2ZmLCAgb24gKi8KCS5hdWRpb211eCAgICAgICA9IHsgMHgwOCwgIDB4MGYsICAweDBhLCAgICAgMHgwOCwgICAgIDB4MGYsIDB4MDggfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gMiwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5hdWRpb19ob29rCT0gYWR0dms1MDNfYXVkaW8sCn0sewoKCS8qIC0tLS0gY2FyZCAweDY0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBTdGVyZW8iLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gNSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS8qIE5vdGVzOgoJLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAoJLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCgktIEF1ZGlvIFJvdXRpbmc6CgkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQoJCWV4dGVybmFsIGxpbmUgaW46IHVua25vd24KCS0gT3RoZXIgY2hpcHM6IGVtNzhwMTU2ZWxwIEAgMHg5NiAocHJvYmFibHkgSVIgcmVtb3RlIGNvbnRyb2wpCgkJaGVmNDA1MyAoaW5zdGVhZCA0MDUyKSBmb3IgdW5rbm93biBmdW5jdGlvbgoJKi8KfSx7CgkubmFtZSAgICAgICAgICAgPSAiUGFjZSBUViAmIFJhZGlvIENhcmQiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sIC8qIFR1bmVyLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IgKi8KCS5ncGlvbWFzayAgICAgICA9IDAsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IDEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuaGFzX3JhZGlvICAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLyogQnQ4NzgsIEJ0ODMyLCBGSTEyNDYgdHVuZXI7IG5vIHBjaSBzdWJzeXN0ZW0gaWQKCW9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAoJUmFkaW8gbXVzdCBiZSBkZWNvZGVkIGJ5IG1zcDM0MTBkIChub3Qgcm91dGVkIHRocm91Z2gpKi8KCS8qCgkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAgdG9kbyEKCSovCn0sewoJLyogQ2hyaXMgV2lsbGluZyA8Y2hyaXNAdmlzbGFiLnVzeWQuZWR1LmF1PiAqLwoJLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAoJLnZpZGVvX2lucHV0cyAgID0gMSwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAweGRmLAoJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoJLm5hbWUgICAgICAgICAgID0gIkdyYW5kIFgtR3VhcmQgLyBUcnVzdCA4MTRQQ0kiLAoJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IDQsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuZ3Bpb21hc2syICAgICAgPSAweGZmLAoJLm11eHNlbCAgICAgICAgID0geyAyLDIsMiwyLCAzLDMsMywzLCAxLDEsMSwxLCAwLDAsMCwwIH0sCgkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg2OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIsCgkudmlkZW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAp9LHsKCS8qIEpvcmdlIEJvbmNvbXB0ZSAtIERUSTIgPGpvcmdlQGR0aTIubmV0PiAqLwoJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTQzIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBNLktsYWhyQHBoeXRlYy5kZSAqLwoJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgTWluaURJTiAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkuc3ZocyAgICAgICAgICAgPSAzLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBDb21iaSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkuc3ZocyAgICAgICAgICAgPSAzLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgTWluaURJTiAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMgICA9IDEwLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gOSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwoJCQkJdmlhIHRoZSB1cHBlciBuaWJibGUgb2YgbXV4c2VsLiBoZXJlOiB1c2VkIGZvcgoJCQkJeHRlcm5hbCB2aWRlby1tdXggKi8KCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMCB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgQ29tYmkgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSAxMCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS5zdmhzICAgICAgICAgICA9IDksCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCXh0ZXJuYWwgdmlkZW8tbXV4ICovCgkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDEgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTAwIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMHhkZiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAp9LHsKCS8qIElWQy0xMjBHIC0gQWxhbiBHYXJmaWVsZCA8YWxhbkBmcm9tb3JiaXQuY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIklWQy0xMjBHIiwKCS52aWRlb19pbnB1dHMgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwgICAgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS50dW5lciAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5zdmhzICAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHN2aHMgKi8KCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLm11eHNlbCAgICAgICAgID0geyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAoJCQkweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwIH0sCgkubXV4c2VsX2hvb2sgICAgPSBpdmMxMjBfbXV4c2VsLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg3MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAicGNIRFRWIEhELTIwMDAgVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0FUU0MsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuaGFzX2R2YiAgICAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUd2luaGFuIERTVCArIGNsb25lcyIsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkubm9fdmlkZW8gICAgICAgPSAxLAoJLmhhc19kdmIgICAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiV2luZmFzdCBWQzEwMCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgM30sIC8qIFZpZCBJbiwgU1ZpZCBJbiwgVmlkIG92ZXIgU1ZpZCBpbiBjb25uZWN0b3IgKi8KCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiVGVwcHJvIFRFVi01NjAvSW50ZXJWaXNpb24gSVYtNTYwIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAzLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMH0sCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkucGxsICAgICAgICAgICAgPSBQTExfMzUsCn0sewoKCS8qIC0tLS0gY2FyZCAweDc0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJTSU1VUyBHVkMxMTAwIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyfSwKCS5ncGlvbWFzayAgICAgICA9IDB4M0YsCgkubXV4c2VsX2hvb2sgICAgPSBndmMxMTAwX211eHNlbCwKfSx7CgkvKiBDYXJsb3MgU2lsdmEgcjNwZWtAcjNwZWsuaG9tZWxpbnV4Lm9yZyB8fCBjYXJkIDB4NzUgKi8KCS5uYW1lICAgICAgICAgICA9ICJOR1MgTkdTVFYrIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezAsIDAsIDAsIDAsIDB4MDAwMDAzLCAwfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkvKiBodHRwOi8vbGludXhtZWRpYWxhYnMuY29tICovCgkubmFtZSAgICAgICAgICAgPSAiTE1MQlQ0IiwKCS52aWRlb19pbnB1dHMgICA9IDQsIC8qIElOMSxJTjIsSU4zLElONCAqLwoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBIZWxtcm9vcyBIYXJyaSA8aGFycmkuaGVsbXJvb3NAcHAuaW5ldC5maT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJUZWtyYW0gTTIwNSBQUk8iLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ncGlvbWFzayAgICAgICA9IDB4NjgsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDY4LCAweDY4LCAweDYxLCAweDYxLCAweDAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoKCS8qIC0tLS0gY2FyZCAweDc4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEphdmllciBDZW5kYW4gQXJlcyA8amNlbmRhbkBseWNvcy5lcz4gKi8KCS8qIGJ0ODc4IFRWICsgRk0gd2l0aG91dCBzdWJzeXN0ZW0gSUQgKi8KCS5uYW1lICAgICAgICAgICA9ICJDb25jZXB0cm9uaWMgQ09OVFZGTWkiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDMgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5oYXNfcmVtb3RlICAgICA9IDEsCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS8qRXJpYyBERUJJRUYgPGRlYmllZkB0ZWxlbXNhLmNvbT4qLwoJLypFVVJFU1lTIFBpY29sbyBUZXRyYSA6IDQgQ29uZXhhbnQgRnVzaW9uIDg3OEEsIG5vIGF1ZGlvLCB2aWRlbyBpbnB1dCBzZXQgd2l0aCBhbmFsb2cgbXVsdGlwbGV4ZXJzIEdQSU8gY29udHJvbGVkKi8KCS8qIGFkZHMgcGljb2xvX3RldHJhX211eHNlbCgpLCBwaWNvbG9fdGV0cmFfaW5pdCgpLCB0aGUgZm9sb3dpbmcgZGVjbGFyYXRpb24gc3RydWN1cmUsIGFuZCAjZGVmaW5lIEJUVFZfUElDT0xPX1RFVFJBX0NISVAqLwoJLyoweDc5IGluIGJ0dHYuaCovCgkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8gVGV0cmEiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5ncGlvbWFzazIgICAgICA9IDB4M0M8PDE2LC8qU2V0IHRoZSBHUElPWzE4XS0+R1BJT1syMV0gYXMgb3V0cHV0IHBpbi49PT4gZHJpdmUgdGhlIHZpZGVvIGlucHV0cyB0aHJvdWdoIGFuYWxvZyBtdWx0aXBsZXhlcnMqLwoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0gezIsMiwyLDJ9LC8qODc4QSBpbnB1dCBpcyBhbHdheXMgTVVYMCwgc2VlIGFib3ZlLiovCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubXV4c2VsX2hvb2sgICAgPSBwaWNvbG9fdGV0cmFfbXV4c2VsLC8qUmVxdWlyZWQgYXMgaXQgZG9lc24ndCBmb2xsb3cgdGhlIGNsYXNzaWMgaW5wdXQgc2VsZWN0aW9uIHBvbGljeSovCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBTcGlyaXQgVFYgVHVuZXIgZnJvbSBodHRwOi8vc3Bpcml0bW9kZW1zLmNvbS5hdSAqLwoJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlNwaXJpdCBUViBUdW5lciIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAp9LHsKCS8qIFdvbGZyYW0gSm9vc3QgPHdvam9AZnJva2FzY2h3ZWkuZGU+ICovCgkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5zdmhzICAgICAgICAgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5tdXhzZWwgICAgICAgICA9IHsgMyAsIDMgfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkvKiAtLS0tIGNhcmQgMHg3YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBNYXR0IEplc3NvbiA8ZHZiQGplc3Nvbi5lY2xpcHNlLmNvLnVrPiAqLwoJLyogQmFzZWQgb24gdGhlIE5lYnVsYSBjYXJkIGRhdGEgLSBhZGRlZCByZW1vdGUgYW5kIG5ldyBjYXJkIG51bWJlciAtIEJUVFZfQVZEVkJUXzc2MSwgc2VlIGFsc28gaXIta2JkLWdwaW8uYyAqLwoJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDIsIDB9LCAvKiBDb21wMCwgUy1WaWRlbywgPywgPyAqLwoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuaGFzX2R2YiAgICAgICAgPSAxLAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNRIiwKCS52aWRlb19pbnB1dHMgICAgID0gMTYsCgkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkudHVuZXIgICAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCgkJCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTUV9tdXhzZWwsCgkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAoJLm5vX21zcDM0eHggICAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgICA9IC0xLAoJLnR1bmVyX2FkZHIJICA9IEFERFJfVU5TRVQsCn0sewoJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNMQyIsCgkudmlkZW9faW5wdXRzICAgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkudHVuZXIgICAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIgfSwKCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTTENfbXV4c2VsLAoJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKCS50dW5lcl9hZGRyCSAgPSBBRERSX1VOU0VULAp9LHsKCS8qIEJUVFZfQVBBQ19WSUVXQ09NUCAqLwoJLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwoJLyogYnQ4NzggVFYgKyBGTSAweDAwMDAwMDAwIHN1YnN5c3RlbSBJRCAqLwoJLm5hbWUgICAgICAgICAgID0gIkFQQUMgVmlld2NvbXAgODc4KEFNQVgpIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5oYXNfcmVtb3RlICAgICA9IDEsICAgLyogbWluaXJlbW90ZSB3b3Jrcywgc2VlIGlyLWtiZC1ncGlvLmMgKi8KCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCn0sewoKCS8qIC0tLS0gY2FyZCAweDgwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCgkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX3ZpZGVvICAgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKfSx7CgkvKiBTdGV2ZW4gPHBob3RvbjM4QHBjaG9tZS5jb20udHc+ICovCgkubmFtZSAgICAgICAgICAgPSAiVi1HZWFyIE15VkNEIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDNmLAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzF9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLmhhc19yYWRpbyAgICAgID0gMCwKfSx7CgkvKiBSaWNrIEMgPGNyeXB0ZHJhZ29vbkBnbWFpbC5jb20+ICovCgkubmFtZSAgICAgICAgICAgPSAiU3VwZXIgVFYgVHVuZXIiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMHgwMDAwMDEsMCwwLCAwfSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS8qIENocmlzIEZhbm5pbmcgPHZpZGVvNGxpbnV4QGhheWRvbi5uZXQ+ICovCgkubmFtZSAgICAgICAgICAgPSAiVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IiwKCS52aWRlb19pbnB1dHMgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfSwKCS5wbGwJCT0gUExMXzI4LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMgk9IDEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5tdXhzZWxfaG9vayAgICA9IHRpYmV0Q1MxNl9tdXhzZWwsCn0sCnsKCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwoJLyoKCSogTm90ZSB0aGF0LCBiZWNhdXNlIG9mIHRoZSBjYXJkJ3Mgd2lyaW5nLCB0aGUgIm1hc3RlciIKCSogQlQ4NzhBIGNoaXAgKGkuZS4gdGhlIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaAoJKiBhbmQgbXVzdCB1c2UgdGhpcyBjYXJkIHR5cGUpIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlCgkqIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSBjYXJkIHR5cGUgMHg4NSwgd2hvc2UgZGVzY3JpcHRpb24KCSogZm9sbG93cyB0aGlzIG9uZS4gIFRoZXJlIGlzIGEgRUVQUk9NIG9uIHRoZSBjYXJkICh3aGljaCBpcwoJKiBjb25uZWN0ZWQgdG8gdGhlIEkyQyBvZiBvbmUgb2YgdGhvc2Ugb3RoZXIgY2hpcHMpLCBidXQgaXMKCSogbm90IGN1cnJlbnRseSBoYW5kbGVkLiAgVGhlcmUgaXMgYWxzbyBhIGZhY2lsaXR5IGZvciBhCgkqICJtb25pdG9yIiwgd2hpY2ggaXMgYWxzbyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgoJKi8KCS5uYW1lICAgICAgICAgICA9ICJLb2RpY29tIDQ0MDBSIChtYXN0ZXIpIiwKCS52aWRlb19pbnB1dHMJPSAxNiwKCS5hdWRpb19pbnB1dHMJPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5zdmhzCQk9IC0xLAoJLyogR1BJTyBiaXRzIDAtOSB1c2VkIGZvciBhbmFsb2cgc3dpdGNoOgoJKiAgIDAwIC0gMDM6CWNhbWVyYSBzZWxlY3RvcgoJKiAgIDA0IC0gMDY6CWNoYW5uZWwgKGNvbnRyb2xsZXIpIHNlbGVjdG9yCgkqICAgMDc6CWRhdGEgKDEtPm9uLCAwLT5vZmYpCgkqICAgMDg6CXN0cm9iZQoJKiAgIDA5OglyZXNldAoJKiBiaXQgMTYgaXMgaW5wdXQgZnJvbSBzeW5jIHNlcGFyYXRvciBmb3IgdGhlIGNoYW5uZWwKCSovCgkuZ3Bpb21hc2sJPSAweDAwMDNmZiwKCS5ub19ncGlvaXJxICAgICA9IDEsCgkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJLnBsbAkJPSBQTExfMjgsCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhNzQzMgk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkubXV4c2VsX2hvb2sJPSBrb2RpY29tNDQwMHJfbXV4c2VsLAp9LAp7CgkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCS8qIE5vdGUgdGhhdCwgZm9yIHJlYXNvbnMgdW5rbm93biwgdGhlICJtYXN0ZXIiIEJUODc4QSBjaGlwIChpLmUuIHRoZQoJKiBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBtdXN0IHVzZSB0aGUgY2FyZCB0eXBlKQoJKiBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZSBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgdGhpcyBjYXJkCgkqIHR5cGUKCSovCgkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAoc2xhdmUpIiwKCS52aWRlb19pbnB1dHMJPSAxNiwKCS5hdWRpb19pbnB1dHMJPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHgwMTAwMDAsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAoJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCS5wbGwJCT0gUExMXzI4LAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTc0MzIJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKfSwKewoJLyogLS0tLSBjYXJkIDB4ODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBNaWNoYWVsIEhlbnNvbiA8bWhlbnNvbkBjbGFyaXR5dmkuY29tPiAqLwoJLyogQWRsaW5rIFJUVjI0IHdpdGggc3BlY2lhbCB1bmxvY2sgY29kZXMgKi8KCS5uYW1lICAgICAgICAgICA9ICJBZGxpbmsgUlRWMjQiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSwKewoJLyogLS0tLSBjYXJkIDB4ODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBNaWNoYWVsIEtydWZreSA8bWtydWZreUBtMWsubmV0PiAqLwoJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiwKCS50dW5lciAgICAgICAgICA9IDAsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19URFZTX0gwNjJGLAoJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEgfSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDBlMDAwMDcsCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDA0MDAwMDUsIDAsIDB4MDAwMDAwMDEsIDAsIDB4MDBjMDAwMDcsIDAgfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkvKiAtLS0tIGNhcmQgMHg4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4gKi8KCS5uYW1lCQk9ICJBY29ycCBZODc4RiIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfWU1FQ19UVkY2NlQ1X0JfREZGLAoJLnR1bmVyX2FkZHIJPSAweGMxID4+MSwKCS5oYXNfcmFkaW8JPSAxLAp9fTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnR0dl9udW1fdHZjYXJkcyA9IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdOwoKLyoKICogaWRlbnRpZnkgY2FyZAogKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pZGNhcmQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgaW50IGdwaW9iaXRzOwoJaW50IGksdHlwZTsKCXVuc2lnbmVkIHNob3J0IHRtcDsKCgkvKiByZWFkIFBDSSBzdWJzeXN0ZW0gSUQgKi8KCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgPSB0bXAgPDwgMTY7CglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRtcCk7CglidHYtPmNhcmRpZCB8PSB0bXA7CgoJaWYgKDAgIT0gYnR2LT5jYXJkaWQgJiYgMHhmZmZmZmZmZiAhPSBidHYtPmNhcmRpZCkgewoJCS8qIGxvb2sgZm9yIHRoZSBjYXJkICovCgkJZm9yICh0eXBlID0gLTEsIGkgPSAwOyBjYXJkc1tpXS5pZCAhPSAwOyBpKyspCgkJCWlmIChjYXJkc1tpXS5pZCAgPT0gYnR2LT5jYXJkaWQpCgkJCQl0eXBlID0gaTsKCgkJaWYgKHR5cGUgIT0gLTEpIHsKCQkJLyogZm91bmQgaXQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBkZXRlY3RlZDogJXMgW2NhcmQ9JWRdLCAiCgkJCSAgICAgICAiUENJIHN1YnN5c3RlbSBJRCBpcyAlMDR4OiUwNHhcbiIsCgkJCSAgICAgICBidHYtPmMubnIsY2FyZHNbdHlwZV0ubmFtZSxjYXJkc1t0eXBlXS5jYXJkbnIsCgkJCSAgICAgICBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlidHYtPmMudHlwZSA9IGNhcmRzW3R5cGVdLmNhcmRucjsKCQl9IGVsc2UgewoJCQkvKiA0MDQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCAoVU5LTk9XTilcbiIsCgkJCSAgICAgICBidHYtPmMubnIsIGJ0di0+Y2FyZGlkICYgMHhmZmZmLAoJCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CgkJCXByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSBhbmQgIgoJCQkgICAgICAgInRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8ga3JheGVsQGJ5dGVzZXgub3JnXG4iKTsKCQl9Cgl9CgoJLyogbGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBhdXRvZGV0ZWN0ZWQgdHlwZSAqLwoJaWYgKGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMpCgkJYnR2LT5jLnR5cGU9Y2FyZFtidHYtPmMubnJdOwoKCS8qIHByaW50IHdoaWNoIGNhcmQgY29uZmlnIHdlIGFyZSB1c2luZyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLGJ0di0+Yy5uciwKCSAgICAgICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlLAoJICAgICAgIGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMKCSAgICAgICA/ICJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKCgkvKiBvdmVyd3JpdGUgZ3BpbyBzdHVmZiA/PyAqLwoJaWYgKFVOU0VUID09IGF1ZGlvYWxsICYmIFVOU0VUID09IGF1ZGlvbXV4WzBdKQoJCXJldHVybjsKCglpZiAoVU5TRVQgIT0gYXVkaW9tdXhbMF0pIHsKCQlncGlvYml0cyA9IDA7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9tdXhbaV07CgkJCWdwaW9iaXRzIHw9IGF1ZGlvbXV4W2ldOwoJCX0KCX0gZWxzZSB7CgkJZ3Bpb2JpdHMgPSBhdWRpb2FsbDsKCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0gPSBhdWRpb2FsbDsKCQl9Cgl9CglidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrID0gKFVOU0VUICE9IGdwaW9tYXNrKSA/IGdwaW9tYXNrIDogZ3Bpb2JpdHM7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGdwaW8gY29uZmlnIG92ZXJyaWRlOiBtYXNrPTB4JXgsIG11eD0iLAoJICAgICAgIGJ0di0+Yy5ucixidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrKTsKCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQlwcmludGsoIiVzMHgleCIsIGkgPyAiLCIgOiAiIiwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSk7Cgl9CglwcmludGsoIlxuIik7Cn0KCi8qCiAqIChtb3N0KSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbnMgZ29lcyBoZXJlCiAqLwoKLyogU29tZSBNb2R1bGFyIFRlY2hub2xvZ3kgY2FyZHMgaGF2ZSBhbiBlZXByb20sIGJ1dCBubyBzdWJzeXN0ZW0gSUQgKi8Kdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdKQp7CglpbnQgdHlwZSA9IC0xOwoKCWlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGEsIkdFVCBNTTIweFBDVFYiLDEzKSkKCQl0eXBlID0gQlRUVl9NT0RURUNfMjA1OwoJZWxzZSBpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhKzIwLCJQaWNvbG8iLDcpKQoJCXR5cGUgPSBCVFRWX0VVUkVTWVNfUElDT0xPOwoJZWxzZSBpZiAoZWVwcm9tX2RhdGFbMF0gPT0gMHg4NCAmJiBlZXByb21fZGF0YVsyXT09IDApCiAgICAgICAgICAgICAgICB0eXBlID0gQlRUVl9IQVVQUEFVR0U7IC8qIG9sZCBidDg0OCAqLwoKCWlmICgtMSAhPSB0eXBlKSB7CgkJYnR2LT5jLnR5cGUgPSB0eXBlOwoJCXByaW50aygiYnR0diVkOiBkZXRlY3RlZCBieSBlZXByb206ICVzIFtjYXJkPSVkXVxuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKCX0KfQoKc3RhdGljIHZvaWQgZmx5dmlkZW9fZ3BpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZ3BpbyxoYXNfcmVtb3RlLGhhc19yYWRpbyxpc19jYXB0dXJlX29ubHksaXNfbHI5MCxoYXNfdGRhOTgyMF90ZGE5ODIxOwoJaW50IHR1bmVyPS0xLHR0eXBlOwoKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDApOwoJdWRlbGF5KDgpOyAgLyogd2l0aG91dCB0aGlzIHdlIHdvdWxkIHNlZSB0aGUgMHgxODAwIG1hc2sgKi8KCWdwaW8gPSBncGlvX3JlYWQoKTsKCS8qIEZJWE1FOiBtdXN0IHJlc3RvcmUgT1VSX0VOID8/PyAqLwoKCS8qIGFsbCBjYXJkcyBwcm92aWRlIEdQSU8gaW5mbywgc29tZSBoYXZlIGFuIGFkZGl0aW9uYWwgZWVwcm9tCgkgKiBMUjUwOiBHUElPIGNvZGluZyBjYW4gYmUgZm91bmQgbG93ZXIgcmlnaHQgQ1AxIC4uIENQOQoJICogICAgICAgQ1A5PUdQSU8yMyAuLiBDUDE9R1BJTzE1OyB3aGVuIE9QRU4sIHRoZSBjb3JyZXNwb25kaW5nIEdQSU8gcmVhZHMgMS4KCSAqICAgICAgIEdQSU8xNC0xMjogbi5jLgoJICogTFI5MDogR1A5PUdQSU8yMyAuLiBHUDE9R1BJTzE1IChyaWdodCBhYm92ZSB0aGUgYnQ4NzgpCgoJICogbG93ZXN0IDMgYnl0ZXMgYXJlIHJlbW90ZSBjb250cm9sIGNvZGVzIChubyBoYW5kc2hha2UgbmVlZGVkKQoJICogeHh4RkZGOiBObyByZW1vdGUgY29udHJvbCBjaGlwIHNvbGRlcmVkCgkgKiB4eHhGMDAoTFIyNi9MUjUwKSwgeHh4RkUwKExSOTApOiBSZW1vdGUgY29udHJvbCBjaGlwIChMVkEwMDEgb3IgQ0Y0NSkgc29sZGVyZWQKCSAqIE5vdGU6IFNvbWUgYml0cyBhcmUgQXVkaW9fTWFzayAhCgkgKi8KCXR0eXBlPShncGlvJjB4MGYwMDAwKT4+MTY7Cglzd2l0Y2godHR5cGUpIHsKCWNhc2UgMHgwOiB0dW5lcj0yOyAvKiBOVFNDLCBlLmcuIFRQSThOU1IxMVAgKi8KCQlicmVhazsKICAgICAgICBjYXNlIDB4MjogdHVuZXI9Mzk7LyogTEcgTlRTQyAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtSDcwMVAgKi8KCQlicmVhazsKCWNhc2UgMHg0OiB0dW5lcj01OyAvKiBQaGlsaXBzIFBBTCBUUEk4UFNCMDJQLCBUUEk4UFNCMTJQLCBUUEk4UFNCMTJEIG9yIEZJMTIxNiwgRk0xMjE2ICovCgkJYnJlYWs7CgljYXNlIDB4NjogdHVuZXI9Mzc7LyogTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUCAqLwoJCWJyZWFrOwoJCWNhc2UgMHhDOiB0dW5lcj0zOyAvKiBQaGlsaXBzIFNFQ0FNKCtQQUwpIEZRMTIxNk1FIG9yIEZJMTIxNk1GICovCgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW9fZ3BpbzogdW5rbm93biB0dW5lciB0eXBlLlxuIiwgYnR2LT5jLm5yKTsKCX0KCgloYXNfcmVtb3RlICAgICAgICAgID0gICBncGlvICYgMHg4MDAwMDA7CgloYXNfcmFkaW8JICAgID0gICBncGlvICYgMHg0MDAwMDA7CgkvKiAgIHVua25vd24gICAgICAgICAgICAgICAgICAgMHgyMDAwMDA7CgkgKiAgIHVua25vd24yICAgICAgICAgICAgICAgICAgMHgxMDAwMDA7ICovCiAgICAgICAgaXNfY2FwdHVyZV9vbmx5ICAgICA9ICEoZ3BpbyAmIDB4MDA4MDAwKTsgLyogR1BJTzE1ICovCgloYXNfdGRhOTgyMF90ZGE5ODIxID0gIShncGlvICYgMHgwMDQwMDApOwoJaXNfbHI5MCAgICAgICAgICAgICA9ICEoZ3BpbyAmIDB4MDAyMDAwKTsgLyogZWxzZSBMUjI2L0xSNTAgKExSMzgvTFI1MSBmLiBjYXB0dXJlIG9ubHkpICovCgkvKgoJICogZ3BpbyAmIDB4MDAxMDAwICAgIG91dHB1dCBiaXQgZm9yIGF1ZGlvIHJvdXRpbmcgKi8KCglpZihpc19jYXB0dXJlX29ubHkpCgkJdHVuZXI9NDsgLyogTm8gdHVuZXIgcHJlc2VudCAqLwoKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gUmFkaW89JXMgUmVtb3RlQ29udHJvbD0lcyBUdW5lcj0lZCBncGlvPTB4JTA2eFxuIiwKCSAgICAgICBidHYtPmMubnIsIGhhc19yYWRpbz8gInllcyI6Im5vICIsIGhhc19yZW1vdGU/ICJ5ZXMiOiJubyAiLCB0dW5lciwgZ3Bpbyk7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvICBMUjkwPSVzIHRkYTk4MjEvdGRhOTgyMD0lcyBjYXB0dXJlX29ubHk9JXNcbiIsCgkJYnR2LT5jLm5yLCBpc19scjkwPyJ5ZXMiOiJubyAiLCBoYXNfdGRhOTgyMF90ZGE5ODIxPyJ5ZXMiOiJubyAiLAoJCWlzX2NhcHR1cmVfb25seT8ieWVzIjoibm8gIik7CgoJaWYodHVuZXIhPSAtMSkgLyogb25seSBzZXQgaWYga25vd24gdHVuZXIgYXV0b2RldGVjdGVkLCBlbHNlIGxldCBpbnNtb2Qgb3B0aW9uIHRocm91Z2ggKi8KCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcjsKCWJ0di0+aGFzX3JhZGlvID0gaGFzX3JhZGlvOwoKCS8qIExSOTAgQXVkaW8gUm91dGluZyBpcyBkb25lIGJ5IDIgaGVmNDA1Miwgc28gQXVkaW9fTWFzayBoYXMgNCBiaXRzOiAweDAwMWM4MAoJICogTFIyNi9MUjUwIG9ubHkgaGFzIDEgaGVmNDA1MiwgQXVkaW9fTWFzayAweDAwMGMwMAoJICogQXVkaW8gb3B0aW9uczogZnJvbSB0dW5lciwgZnJvbSB0ZGE5ODIxL3RkYTk4MjEobW9ubyxzdGVyZW8sc2FwKSwgZnJvbSB0ZGE5ODc0LCBleHQuLCBtdXRlICovCglpZihoYXNfdGRhOTgyMF90ZGE5ODIxKSBidHYtPmF1ZGlvX2hvb2sgPSBsdDk0MTVfYXVkaW87CgkvKiB0b2RvOiBpZihoYXNfdGRhOTg3NCkgYnR2LT5hdWRpb19ob29rID0gZnYyMDAwc19hdWRpbzsgKi8KfQoKc3RhdGljIGludCBtaXJvX3R1bmVybWFwW10gPSB7IDAsNiwyLDMsICAgNCw1LDYsMCwgIDMsMCw0LDUsICA1LDIsMTYsMSwKCQkJICAgICAgIDE0LDIsMTcsMSwgNCwxLDQsMywgIDEsMiwxNiwxLCA0LDQsNCw0IH07CnN0YXRpYyBpbnQgbWlyb19mbXR1bmVyW10gID0geyAwLDAsMCwwLCAgIDAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMSwKCQkJICAgICAgIDEsMSwxLDEsICAgMSwxLDEsMCwgIDAsMCwwLDAsICAwLDEsMCwwIH07CgpzdGF0aWMgdm9pZCBtaXJvX3Bpbm5hY2xlX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGlkLG1zcCxncGlvOwoJY2hhciAqaW5mbzsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKICAgICAgICBncGlvID0gZ3Bpb19yZWFkKCk7CglpZCAgID0gKChncGlvPj4xMCkgJiA2MykgLTE7Cgltc3AgID0gYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4Iik7CglpZiAoaWQgPCAzMikgewoJCWJ0di0+dHVuZXJfdHlwZSA9IG1pcm9fdHVuZXJtYXBbaWRdOwoJCWlmICgwID09IChncGlvICYgMHgyMCkpIHsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlpZiAoIW1pcm9fZm10dW5lcltpZF0pIHsKCQkJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCQkJCWJ0di0+bWJveF93ZSAgICA9ICgxPDw2KTsKCQkJCWJ0di0+bWJveF9tb3N0ICA9ICgxPDw3KTsKCQkJCWJ0di0+bWJveF9jbGsgICA9ICgxPDw4KTsKCQkJCWJ0di0+bWJveF9kYXRhICA9ICgxPDw5KTsKCQkJCWJ0di0+bWJveF9tYXNrICA9ICgxPDw2KXwoMTw8Nyl8KDE8PDgpfCgxPDw5KTsKCQkJfQoJCX0gZWxzZSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQl9CgkJaWYgKC0xICE9IG1zcCkgewoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9NSVJPKQoJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX01JUk9QUk87CgkJCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX1BJTk5BQ0xFKQoJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX1BJTk5BQ0xFUFJPOwoJCX0KCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJidHR2JWQ6IG1pcm86IGlkPSVkIHR1bmVyPSVkIHJhZGlvPSVzIHN0ZXJlbz0lc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCgkJICAgICAgICFidHYtPmhhc19yYWRpbyA/ICJubyIgOgoJCSAgICAgICAoYnR2LT5oYXNfbWF0Y2hib3ggPyAibWF0Y2hib3giIDogImZtdHVuZXIiKSwKCQkgICAgICAgKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOwoJfSBlbHNlIHsKCQkvKiBuZXcgY2FyZHMgd2l0aCBtaWNyb3R1bmUgdHVuZXIgKi8KCQlpZCA9IDYzIC0gaWQ7CgkJYnR2LT5oYXNfcmFkaW8gPSAwOwoJCXN3aXRjaCAoaWQpIHsKCQljYXNlIDE6CgkJCWluZm8gPSAiUEFMIC8gbW9ubyI7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJaW5mbyA9ICJQQUwrU0VDQU0gLyBzdGVyZW8iOwoJCQlidHYtPmhhc19yYWRpbyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgMzoKCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlicmVhazsKCQljYXNlIDQ6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gbW9ubyI7CgkJCWJyZWFrOwoJCWNhc2UgNToKCQkJaW5mbyA9ICJOVFNDIC8gbW9ubyI7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlpbmZvID0gIlBBTCAvIHN0ZXJlbyI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8gPSAib29wczogdW5rbm93biBjYXJkIjsKCQkJYnJlYWs7CgkJfQoJCWlmICgtMSAhPSBtc3ApCgkJCWJ0di0+Yy50eXBlID0gQlRUVl9QSU5OQUNMRVBSTzsKCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBpZCwgaW5mbywgYnR2LT5oYXNfcmFkaW8gPyAieWVzIiA6ICJubyIpOwoJCWJ0di0+dHVuZXJfdHlwZSAgPSAzMzsKCQlidHYtPnBpbm5hY2xlX2lkID0gaWQ7Cgl9Cn0KCi8qIEdQSU8yMSAgIEw6IEJ1ZmZlciBha3RpdiwgSDogQnVmZmVyIGluYWt0aXYgKi8KI2RlZmluZSBMTTE4ODJfU1lOQ19EUklWRSAgICAgMHgyMDAwMDBMCgpzdGF0aWMgdm9pZCBpbml0X2lkc19lYWdsZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglncGlvX2lub3V0KDB4ZmZmZmZmLDB4RkZGRjM3KTsKCWdwaW9fd3JpdGUoMHgyMDAwMjApOwoKCS8qIGZsYXNoIHN0cm9iZSBpbnZlcnRlciA/ISAqLwoJZ3Bpb193cml0ZSgweDIwMDAyNCk7CgoJLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCglncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwoKCS8qIHNldCBCVDg0OCBtdXhlbCB0byAyICovCglidGFvcigoMik8PDUsIH4oMjw8NSksIEJUODQ4X0lGT1JNKTsKfQoKLyogTXV4c2VsIGhlbHBlciBmb3IgdGhlIElEUyBFYWdsZS4KICogdGhlIGVhZ2xlcyBkb2VzIG5vdCB1c2UgdGhlIHN0YW5kYXJkIG11eHNlbC1iaXRzIGJ1dAogKiBoYXMgaXRzIG93biBtdWx0aXBsZXhlciAqLwpzdGF0aWMgdm9pZCBlYWdsZV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglidGFvcigoMik8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKCWdwaW9fYml0cygzLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXV4c2VsW2lucHV0JjddKTsKCiAgICAgICAvKiBjb21wb3NpdGUgKi8KICAgICAgIC8qIHNldCBjaHJvbWEgQURDIHRvIHNsZWVwICovCiAgICAgICBidG9yKEJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOwogICAgICAgLyogc2V0IHRvIGNvbXBvc2l0ZSB2aWRlbyAqLwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CgogICAgICAgLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCiAgICAgICBncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwp9CgpzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7MHgzMCwgMHgwMSwgMHgxMiwgMHgyM307CglncGlvX3dyaXRlKG1hc2tzW2lucHV0JTRdKTsKfQoKLyogTE1MQlQ0eCBpbml0aWFsaXphdGlvbiAtIHRvIGFsbG93IGFjY2VzcyB0byBHUElPIGJpdHMgZm9yIHNlbnNvcnMgaW5wdXQgYW5kCiAgIGFsYXJtcyBvdXRwdXQKCiAgIEdQSU9iaXQgICAgfCAxMCB8IDkgfCA4IHwgNyB8IDYgfCA1IHwgNCB8IDMgfCAyIHwgMSB8IDAgfAogICBhc3NpZ25tZW50IHwgVEkgfCBPM3xJTnh8IE8yfCBPMXxJTjR8SU4zfElOMnxJTjF8ICAgfCAgIHwKCiAgIElOIC0gc2Vuc29yIGlucHV0cywgSU54IC0gc2Vuc29yIGlucHV0cyBhbmQgVEkgWE9SZWQgdG9nZXRoZXIKICAgTzEsTzIsTzMgLSBhbGFybSBvdXRwdXRzIChyZWxheXMpCgogICBPVVQgRU5BQkxFICAgMSAgICAxICAgMCAgLiAxICAxICAgMCAgIDAgLiAwICAgMCAgIDAgICAgMCAgID0gMHg2QzAKCiovCgpzdGF0aWMgdm9pZCBpbml0X2xtbGJ0NHgoc3RydWN0IGJ0dHYgKmJ0dikKewoJcHJpbnRrKEtFUk5fREVCVUcgIkxNTEJUNHggaW5pdFxuIik7CglidHdyaXRlKDB4MDAwMDAwLCBCVDg0OF9HUElPX1JFR19JTlApOwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwMDA2QzApOwoJZ3Bpb193cml0ZSgweDAwMDAwMCk7Cn0KCnN0YXRpYyB2b2lkIHNpZ21hU1FfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA4OwoJZ3Bpb19pbm91dCggMHhmLCAweGYgKTsKCWdwaW9fYml0cyggMHhmLCBpbm11eCApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNMQ19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7Cgl1bnNpZ25lZCBpbnQgaW5tdXggPSBpbnB1dCAlIDQ7CglncGlvX2lub3V0KCAzPDw5LCAzPDw5ICk7CglncGlvX2JpdHMoIDM8PDksIGlubXV4PDw5ICk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBidHR2X3Jlc2V0X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCS8qCgkgKiBCVDg3OEEgaGFzIGEgYXVkaW8tcmVzZXQgcmVnaXN0ZXIuCgkgKiAxLiBUaGlzIHJlZ2lzdGVyIGlzIGFuIGF1ZGlvIHJlc2V0IGZ1bmN0aW9uIGJ1dCBpdCBpcyBpbgoJICogICAgZnVuY3Rpb24tMCAodmlkZW8gY2FwdHVyZSkgYWRkcmVzcyBzcGFjZS4KCSAqIDIuIEl0IGlzIGVub3VnaCB0byBkbyB0aGlzIG9uY2UgcGVyIHBvd2VyLXVwIG9mIHRoZSBjYXJkLgoJICogMy4gVGhlcmUgaXMgYSB0eXBvIGluIHRoZSBDb25leGFudCBkb2MgLS0gaXQgaXMgbm90IGF0CgkgKiAgICAweDVCLCBidXQgYXQgMHgwNTguIChCIGlzIGFuIG9kZC1udW1iZXIsIG9idmlvdXNseSBhIHR5cG8hKS4KCSAqIC0tLy9TaHJpa3VtYXIgMDMwNjA5CgkgKi8KCWlmIChidHYtPmlkICE9IDg3OCkKCQlyZXR1cm47CgoJaWYgKGJ0dHZfZGVidWcpCgkJcHJpbnRrKCJidHR2JWQ6IEJUODc4QSBBUkVTRVRcbiIsYnR2LT5jLm5yKTsKCWJ0d3JpdGUoKDE8PDcpLCAweDA1OCk7Cgl1ZGVsYXkoMTApOwoJYnR3cml0ZSggICAgIDAsIDB4MDU4KTsKfQoKLyogaW5pdGlhbGl6YXRpb24gcGFydCBvbmUgLS0gYmVmb3JlIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQxKHN0cnVjdCBidHR2ICpidHYpCnsKCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKCWNhc2UgQlRUVl9IQVVQUEFVR0U6CgljYXNlIEJUVFZfSEFVUFBBVUdFODc4OgogICAgICAgICAgICAgICAgYm9vdF9tc3AzNHh4KGJ0diw1KTsKCQlicmVhazsKCWNhc2UgQlRUVl9WT09ET09UVl9GTToKICAgICAgICAgICAgICAgIGJvb3RfbXNwMzR4eChidHYsMjApOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0FWRVJNRURJQTk4OgoJCWJvb3RfbXNwMzR4eChidHYsMTEpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0hBVVBQQVVHRVBWUjoKCQlwdnJfYm9vdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1RXSU5IQU5fRFNUOgoJY2FzZSBCVFRWX0FWRFZCVF83NzE6CgkJYnR2LT51c2VfaTJjX2h3ID0gMTsKCQlicmVhazsKICAgICAgICBjYXNlIEJUVFZfQURMSU5LX1JUVjI0OgogICAgICAgICAgICAgICAgaW5pdF9SVFYyNCggYnR2ICk7CiAgICAgICAgICAgICAgICBicmVhazsKCgl9CglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKCQlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgdHdvIC0tIGFmdGVyIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQyKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0ZGE5ODg3OwoJaW50IGFkZHI9QUREUl9VTlNFVDsKCiAgICAgICAgYnR2LT50dW5lcl90eXBlID0gLTE7CgoJaWYgKEJUVFZfVU5LTk9XTiA9PSBidHYtPmMudHlwZSkgewoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQlpZGVudGlmeV9ieV9lZXByb20oYnR2LGVlcHJvbV9kYXRhKTsKCX0KCglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfTUlSTzoKCWNhc2UgQlRUVl9NSVJPUFJPOgoJY2FzZSBCVFRWX1BJTk5BQ0xFOgoJY2FzZSBCVFRWX1BJTk5BQ0xFUFJPOgoJCS8qIG1pcm8vcGlubmFjbGUgKi8KCQltaXJvX3Bpbm5hY2xlX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9GTFlWSURFT185ODoKCWNhc2UgQlRUVl9NQVhJOgoJY2FzZSBCVFRWX0xJRkVfRkxZS0lUOgoJY2FzZSBCVFRWX0ZMWVZJREVPOgoJY2FzZSBCVFRWX1RZUEhPT05fVFZJRVc6CgljYXNlIEJUVFZfQ0hST05PU19WUzI6CgljYXNlIEJUVFZfRkxZVklERU9fOThGTToKCWNhc2UgQlRUVl9GTFlWSURFTzIwMDA6CgljYXNlIEJUVFZfRkxZVklERU85OEVaOgoJY2FzZSBCVFRWX0NPTkZFUkVOQ0VUVjoKCWNhc2UgQlRUVl9MSUZFVEVDXzk0MTU6CgkJZmx5dmlkZW9fZ3BpbyhidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0hBVVBQQVVHRToKCWNhc2UgQlRUVl9IQVVQUEFVR0U4Nzg6CgljYXNlIEJUVFZfSEFVUFBBVUdFUFZSOgoJCS8qIHBpY2sgdXAgc29tZSBjb25maWcgaW5mb3MgZnJvbSB0aGUgZWVwcm9tICovCgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwogICAgICAgICAgICAgICAgaGF1cHBhdWdlX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0FWRVJNRURJQTk4OgoJY2FzZSBCVFRWX0FWUEhPTkU5ODoKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJYXZlcm1lZGlhX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1BYQzIwMDoKCQlpbml0X1BYQzIwMChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1BJQ09MT19URVRSQV9DSElQOgoJCXBpY29sb190ZXRyYV9pbml0KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfVkhYOgoJCWJ0di0+aGFzX3JhZGlvICAgID0gMTsKCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJYnR2LT5tYm94X3dlICAgICAgPSAweDIwOwoJCWJ0di0+bWJveF9tb3N0ICAgID0gMDsKCQlidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CgkJYnR2LT5tYm94X2RhdGEgICAgPSAweDEwOwoJCWJ0di0+bWJveF9tYXNrICAgID0gMHgzODsKCQlicmVhazsKCWNhc2UgQlRUVl9WT0JJU19CT09TVEFSOgoJY2FzZSBCVFRWX1RFUlJBVFY6CgkJdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9NQUdJQ1RWSUVXMDYxOgoJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwMDIxNDRmKSB7CgkJCWJ0di0+aGFzX3JhZGlvPTE7CgkJCXByaW50aygiYnR0diVkOiByYWRpbyBkZXRlY3RlZCBieSBzdWJzeXN0ZW0gaWQgKENQSDA1eClcbiIsYnR2LT5jLm5yKTsKCQl9CgkJYnJlYWs7CiAgICAgICBjYXNlIEJUVFZfU1RCMjoKICAgICAgICAgICAgICAgIGlmIChidHYtPmNhcmRpZCA9PSAweDMwNjAxMjFhKSB7CgkJCS8qIEZpeCB1cCBlbnRyeSBmb3IgM0RGWCBWb29kb29UViAxMDAsCgkJCSAgIHdoaWNoIGlzIGFuIE9FTSBTVEIgY2FyZCB2YXJpYW50LiAqLwoJCQlidHYtPmhhc19yYWRpbz0wOwoJCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfVEVNSUNfTlRTQzsKCQl9CgkJYnJlYWs7CgljYXNlIEJUVFZfT1NQUkVZMXgwOgoJY2FzZSBCVFRWX09TUFJFWTF4MF84NDg6CgljYXNlIEJUVFZfT1NQUkVZMTAxXzg0ODoKCWNhc2UgQlRUVl9PU1BSRVkxeDE6CgljYXNlIEJUVFZfT1NQUkVZMXgxX1NWSUQ6CgljYXNlIEJUVFZfT1NQUkVZMnh4OgoJY2FzZSBCVFRWX09TUFJFWTJ4MF9TVklEOgoJY2FzZSBCVFRWX09TUFJFWTJ4MDoKCWNhc2UgQlRUVl9PU1BSRVk1MDA6CgljYXNlIEJUVFZfT1NQUkVZNTQwOgoJY2FzZSBCVFRWX09TUFJFWTIwMDA6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwogICAgICAgICAgICAgICAgb3NwcmV5X2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0lEU19FQUdMRToKCQlpbml0X2lkc19lYWdsZShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX01PRFRFQ18yMDU6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCW1vZHRlY19lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9MTUxCVDQ6CgkJaW5pdF9sbWxidDR4KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfVElCRVRfQ1MxNjoKCQl0aWJldENTMTZfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0tPRElDT01fNDQwMFI6CgkJa29kaWNvbTQ0MDByX2luaXQoYnR2KTsKCQlicmVhazsKCX0KCgkvKiBwbGwgY29uZmlndXJhdGlvbiAqLwogICAgICAgIGlmICghKGJ0di0+aWQ9PTg0OCAmJiBidHYtPnJldmlzaW9uPT0weDExKSkgewoJCS8qIGRlZmF1bHRzIGZyb20gY2FyZCBsaXN0ICovCgkJaWYgKFBMTF8yOCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgewoJCQlidHYtPnBsbC5wbGxfaWZyZXE9Mjg2MzYzNjM7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMDsKCQl9CgkJaWYgKFBMTF8zNSA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgewoJCQlidHYtPnBsbC5wbGxfaWZyZXE9MzU0Njg5NTA7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMTsKCQl9CgkJLyogaW5zbW9kIG9wdGlvbnMgY2FuIG92ZXJyaWRlICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsbFtidHYtPmMubnJdKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIG5vbmUgKi8KCQkJYnR2LT5wbGwucGxsX2NyeXN0YWwgPSAwOwoJCQlidHYtPnBsbC5wbGxfaWZyZXEgICA9IDA7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIDI4IE1IeiAqLwoJCWNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9pZnJlcSAgID0gMjg2MzYzNjM7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2NyeXN0YWwgPSBCVDg0OF9JRk9STV9YVDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOiAvKiAzNSBNSHogKi8KCQljYXNlIDM1OgogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfaWZyZXEgICA9IDM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQxOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CglidHYtPnBsbC5wbGxfY3VycmVudCA9IC0xOwoKCS8qIHR1bmVyIGNvbmZpZ3VyYXRpb24gKGZyb20gY2FyZCBsaXN0IC8gYXV0b2RldGVjdCAvIGluc21vZCBvcHRpb24pICovCglpZiAoQUREUl9VTlNFVCAhPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX2FkZHIpCgkJYWRkciA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfYWRkcjsKCglpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQoJCWlmKFVOU0VUID09IGJ0di0+dHVuZXJfdHlwZSkKICAgICAgICAJICAgICAgIAlidHYtPnR1bmVyX3R5cGUgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGU7CglpZiAoVU5TRVQgIT0gdHVuZXJbYnR2LT5jLm5yXSkKCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwoJcHJpbnRrKCJidHR2JWQ6IHVzaW5nIHR1bmVyPSVkXG4iLGJ0di0+Yy5ucixidHYtPnR1bmVyX3R5cGUpOwoJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQVVEQ19DT05GSUdfUElOTkFDTEUsCgkJCQkgICAgICAmYnR2LT5waW5uYWNsZV9pZCk7CglpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKSB7CgkgICAgICAgIHN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CgoJICAgICAgICB0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOwoJCXR1bl9zZXR1cC50eXBlID0gYnR2LT50dW5lcl90eXBlOwoJCXR1bl9zZXR1cC5hZGRyID0gYWRkcjsKCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7Cgl9CgoJYnR2LT5zdmhzID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5zdmhzOwoJaWYgKHN2aHNbYnR2LT5jLm5yXSAhPSBVTlNFVCkKCQlidHYtPnN2aHMgPSBzdmhzW2J0di0+Yy5ucl07CglpZiAocmVtb3RlW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5oYXNfcmVtb3RlID0gcmVtb3RlW2J0di0+Yy5ucl07CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JhZGlvKQoJCWJ0di0+aGFzX3JhZGlvPTE7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfcmVtb3RlKQoJCWJ0di0+aGFzX3JlbW90ZT0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fZ3Bpb2lycSkKCQlidHYtPmdwaW9pcnE9MDsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2spCgkJYnR2LT5hdWRpb19ob29rPWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vazsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5kaWdpdGFsX21vZGUgPT0gRElHSVRBTF9NT0RFX0NBTUVSQSkgewoJCS8qIGRldGVjdCBCdDgzMiBjaGlwIGZvciBxdWFydHpzaWdodCBkaWdpdGFsIGNhbWVyYSAqLwoJCWlmICgoYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0JUODMyX0FMVDEsICJCdDgzMiIpID49MCkgfHwKCQkgICAgKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQyLCAiQnQ4MzIiKSA+PTApKQoJCQlib290X2J0ODMyKGJ0dik7Cgl9CgoJaWYgKCFhdXRvbG9hZCkKCQlyZXR1cm47CgoJLyogdHJ5IHRvIGRldGVjdCBhdWRpby9mYWRlciBjaGlwcyAqLwoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX21zcDM0eHggJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMCwgIk1TUDM0eHgiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tc3AzNHh4X2FsdCAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwX0FMVCwgIk1TUDM0eHggKGFsdGVybmF0ZSBhZGRyZXNzKSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgibXNwMzQwMCIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE5ODc1ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4NzUsICJUREE5ODc1IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODc1Iik7CgoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3RkYTc0MzIgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBNzQzMiwgIlREQTc0MzIiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoInRkYTc0MzIiKTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uZWVkc190dmF1ZGlvKQoJCXJlcXVlc3RfbW9kdWxlKCJ0dmF1ZGlvIik7CgoJLyogdHVuZXIgbW9kdWxlcyAqLwoJdGRhOTg4NyA9IDA7CglpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkKCQl0ZGE5ODg3ID0gMTsKCWlmICgwID09IHRkYTk4ODcgJiYgMCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19kdmIgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBOTg4NywgIlREQTk4ODciKSA+PTApCgkJdGRhOTg4NyA9IDE7CglpZigoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszKSB8fAoJICAgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMpIHx8CgkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMykgfHwKCSAgICB0ZGE5ODg3KQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODg3Iik7CglpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKQoJCXJlcXVlc3RfbW9kdWxlKCJ0dW5lciIpOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIG1vZHRlY19lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewoJaWYoIHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlRlbWljIDQwNjYgRlk1IiwxNCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0k7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJBbHBzIFRTQkI1IiwxMCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX0FMUFNfVFNCQjVfUEFMX0k7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJQaGlsaXBzIEZNMTI0NiIsMTQpID09MCkgewogICAgICAgICAgICAgICAgYnR2LT50dW5lcl90eXBlPVRVTkVSX1BISUxJUFNfTlRTQzsKICAgICAgICAgICAgICAgIHByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIHsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCXN0cnVjdCB0dmVlcHJvbSB0djsKCgl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZidHYtPmkyY19jbGllbnQsICZ0diwgZWVwcm9tX2RhdGEpOwoJYnR2LT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKCWJ0di0+aGFzX3JhZGlvICA9IHR2Lmhhc19yYWRpbzsKfQoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZnJlcTsKCglidHYtPmhhc19yYWRpbyAgICA9IDE7CglidHYtPmhhc19tYXRjaGJveCA9IDE7CglidHYtPm1ib3hfd2UgICAgICA9IDB4MTA7CglidHYtPm1ib3hfbW9zdCAgICA9IDB4MjA7CglidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CglidHYtPm1ib3hfZGF0YSAgICA9IDB4MDQ7CglidHYtPm1ib3hfbWFzayAgICA9IDB4M2M7CgoJYnR2LT5tYm94X2lvdyAgICAgPSAxIDw8ICA4OwoJYnR2LT5tYm94X2lvciAgICAgPSAxIDw8ICA5OwoJYnR2LT5tYm94X2NzZWwgICAgPSAxIDw8IDEwOwoKCWZyZXE9ODgwMDAvNjIuNTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCglpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kLlxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJfSBlbHNlIHsKCQlidHYtPmhhc19yYWRpbyAgICA9IDA7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAwOwoJfQoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogbWluaW1hbCBib290c3RyYXAgZm9yIHRoZSBXaW5UVi9QVlIgLS0gdXBsb2FkIGFsdGVyYSBmaXJtd2FyZS4KICoKICogVGhlIGhjd2FtYy5yYmYgZmlybXdhcmUgZmlsZSBpcyBvbiB0aGUgSGF1cHBhdWdlIGRyaXZlciBDRC4gIEhhdmUKICogYSBsb29rIGF0IFB2ci9wdnI0NXh4eC5FWEUgKHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSwgY2FuIGJlCiAqIHVucGFja2VkIHdpdGggdW56aXApLgogKi8KI2RlZmluZSBQVlJfR1BJT19ERUxBWQkJMTAKCiNkZWZpbmUgQlRUVl9BTFRfREFUQQkJMHgwMDAwMDEKI2RlZmluZSBCVFRWX0FMVF9EQ0xLCQkweDEwMDAwMAojZGVmaW5lIEJUVFZfQUxUX05DT05GSUcJMHg4MDAwMDAKCnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9hbHRlcmFfbG9hZChzdHJ1Y3QgYnR0diAqYnR2LCB1OCAqbWljcm8sIHUzMiBtaWNyb2xlbikKewoJdTMyIG47CiAgCXU4IGJpdHM7CglpbnQgaTsKCglncGlvX2lub3V0KDB4ZmZmZmZmLEJUVFZfQUxUX0RBVEF8QlRUVl9BTFRfRENMS3xCVFRWX0FMVF9OQ09ORklHKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOwoKCWdwaW9fd3JpdGUoQlRUVl9BTFRfTkNPTkZJRyk7Cgl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOwoKCWZvciAobiA9IDA7IG4gPCBtaWNyb2xlbjsgbisrKSB7CgkJYml0cyA9IG1pY3JvW25dOwoJCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKysgKSB7CgkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCQlpZiAoYml0cyAmIDB4MDEpCgkJCQlncGlvX2JpdHMoQlRUVl9BTFRfREFUQSxCVFRWX0FMVF9EQVRBKTsKCQkJZWxzZQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsMCk7CgkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJCQliaXRzID4+PSAxOwoJCX0KCX0KCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCgkvKiBiZWdpbiBBbHRlcmEgaW5pdCBsb29wIChOb3QgbmVjZXNzYXJ5LGJ1dCBkb2Vzbid0IGh1cnQpICovCglmb3IgKGkgPSAwIDsgaSA8IDMwIDsgaSsrKSB7CgkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CgkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssQlRUVl9BTFRfRENMSyk7Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYm9vdChzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKCWludCByYzsKCglyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiaGN3YW1jLnJiZiIsICZidHYtPmMucGNpLT5kZXYpOwoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAoJCSAgICAgICBidHYtPmMubnIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJjOwogICAgICAgIH0KCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogYWx0ZXJhIGZpcm13YXJlIHVwbG9hZCAlc1xuIiwKCSAgICAgICBidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKICAgICAgICByZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKCXJldHVybiByYzsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogc29tZSBvc3ByZXkgc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKICAgICAgIGludCBpID0gMDsKICAgICAgIHVuc2lnbmVkIGNoYXIgKmVlID0gZWVwcm9tX2RhdGE7CiAgICAgICB1bnNpZ25lZCBsb25nIHNlcmlhbCA9IDA7CgogICAgICAgaWYgKGJ0di0+Yy50eXBlID09IDApIHsKICAgICAgICAgICAgICAgLyogdGhpcyBtaWdodCBiZSBhbiBhbnRpcXVlLi4uIGNoZWNrIGZvciBNTUFDIGxhYmVsIGluIGVlcHJvbSAqLwogICAgICAgICAgICAgICBpZiAoKGVlWzBdPT0nTScpICYmIChlZVsxXT09J00nKSAmJiAoZWVbMl09PSdBJykgJiYgKGVlWzNdPT0nQycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0wOyBpPDIxOyBpKyspCgkJCSAgICAgICBjaGVja3N1bSArPSBlZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tzdW0gIT0gZWVbMjFdKQoJCQkgICAgICAgcmV0dXJuOwoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgwXzg0ODsKCQkgICAgICAgZm9yIChpID0gMTI7IGkgPCAyMTsgaSsrKQoJCQkgICAgICAgc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CiAgICAgICAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CgkgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZTsKICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDQqMTY7CgogICAgICAgICAgICAgICBmb3IoOyBvZmZzZXQgPCA4KjE2OyBvZmZzZXQgKz0gMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgLyogdmVyaWZ5IHRoZSBjaGVja3N1bSAqLwogICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaTwxNDsgaSsrKSBjaGVja3N1bSArPSBlZVtpK29mZnNldF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSA9IH5jaGVja3N1bTsgIC8qIG5vIGlkZWEgd2h5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hlY2tzdW0gJiAweDBGRikgPT0gZWVbb2Zmc2V0KzE1XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSA4KjE2KQoJCSAgICAgICByZXR1cm47CgoJICAgICAgIC8qIGZvdW5kIGEgdmFsaWQgZGVzY3JpcHRvciAqLwoJICAgICAgIHR5cGUgPSAoZWVbb2Zmc2V0KzRdPDw4KSB8IChlZVtvZmZzZXQrNV0pOwoKCSAgICAgICBzd2l0Y2godHlwZSkgewoKCSAgICAgICAvKiA4NDggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAwNDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDA1OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMTAxXzg0ODsKCQkgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAvKiA4NzggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAxMjoKCSAgICAgICBjYXNlIDB4MDAxMzoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTQ6CgkgICAgICAgY2FzZSAweDAwMTU6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDE7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE2OgoJICAgICAgIGNhc2UgMHgwMDE3OgoJICAgICAgIGNhc2UgMHgwMDIwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxX1NWSUQ7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE4OgoJICAgICAgIGNhc2UgMHgwMDE5OgoJICAgICAgIGNhc2UgMHgwMDFFOgoJICAgICAgIGNhc2UgMHgwMDFGOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMnh4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxQToKCSAgICAgICBjYXNlIDB4MDAxQjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MF9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA0MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTUwMDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNTA6CgkgICAgICAgY2FzZSAweDAwNTY6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVk1NDA7CgkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDYwOgoJICAgICAgIGNhc2UgMHgwMDcwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMngwOwoJCSAgICAgICAvKiBlbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzICovCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1BISUxJUFNfTlRTQywgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1CRyovLAogICAgICAgIFRVTkVSX1BISUxJUFNfUEFMLCAgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1JKi8sCiAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCiAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19TRUNBTSwKICAgICAgICBUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1BBTCwKCVRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH07CgpzdGF0aWMgaW50IHR1bmVyXzFfdGFibGVbXSA9IHsKICAgICAgICBUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCiAgICAgICAgVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfNDAxMkZZNSwgLyogVFVORVJfVEVNSUNfU0VDQU0gKi8KICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ19QQUx9OwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGF2ZXJtZWRpYV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgIGludCB0dW5lcl9tYWtlLHR1bmVyX3R2X2ZtLHR1bmVyX2Zvcm1hdCx0dW5lcj0wOwoKCXR1bmVyX21ha2UgICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4Nyk7CiAgICAgICAgdHVuZXJfdHZfZm0gICAgID0gKGVlcHJvbV9kYXRhWzB4NDFdICYgMHgxOCkgPj4gMzsKICAgICAgICB0dW5lcl9mb3JtYXQgICAgPSAoZWVwcm9tX2RhdGFbMHg0Ml0gJiAweGYwKSA+PiA0OwoJYnR2LT5oYXNfcmVtb3RlID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHgwMSk7CgoJaWYgKHR1bmVyX21ha2UgPT0gMCB8fCB0dW5lcl9tYWtlID09IDIpCgkJaWYodHVuZXJfZm9ybWF0IDw9MHgwYSkKCQkJdHVuZXIgPSB0dW5lcl8wX3RhYmxlW3R1bmVyX2Zvcm1hdF07CglpZiAodHVuZXJfbWFrZSA9PSAxKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTkpCgkJCXR1bmVyID0gdHVuZXJfMV90YWJsZVt0dW5lcl9mb3JtYXRdOwoKCWlmICh0dW5lcl9tYWtlID09IDQpCgkJaWYodHVuZXJfZm9ybWF0ID09IDB4MDkpCgkJCXR1bmVyID0gVFVORVJfTEdfTlRTQ19ORVdfVEFQQzsgLyogVEFQQy1HNzAyUCAqLwoKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogQXZlcm1lZGlhIGVlcHJvbVsweCUwMnglMDJ4XTogdHVuZXI9IiwKCQlidHYtPmMubnIsZWVwcm9tX2RhdGFbMHg0MV0sZWVwcm9tX2RhdGFbMHg0Ml0pOwoJaWYodHVuZXIpIHsKCQlidHYtPnR1bmVyX3R5cGU9dHVuZXI7CgkJcHJpbnRrKCIlZCIsdHVuZXIpOwoJfSBlbHNlCgkJcHJpbnRrKCJVbmtub3duIHR5cGUiKTsKCXByaW50aygiIHJhZGlvOiVzIHJlbW90ZSBjb250cm9sOiVzXG4iLAoJICAgICAgIHR1bmVyX3R2X2ZtICAgICA/ICJ5ZXMiIDogIm5vIiwKCSAgICAgICBidHYtPmhhc19yZW1vdGUgPyAieWVzIiA6ICJubyIpOwp9CgovKiB1c2VkIG9uIFZvb2RvbyBUVi9GTSAoVm9vZG9vIDIwMCksIFMwIHdpcmVkIHRvIDB4MTAwMDAgKi8Kdm9pZCBidHR2X3RkYTk4ODBfc2V0bm9ybShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbm9ybSkKewoJLyogZml4IHVwIG91ciBjYXJkIGVudHJ5ICovCglpZihub3JtPT1WSURFT19NT0RFX05UU0MpIHsKCQlidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbMF09MHg5NTdmZmY7CgkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzRdPTB4OTU3ZmZmOwoJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIE5UU0NcbiIpOwoJfQoJZWxzZSB7CgkgICAgICAgIGJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk0N2ZmZjsKICAgICAgICAgICAgICAgIGJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk0N2ZmZjsKCQlkcHJpbnRrKCJidHR2X3RkYTk4ODBfc2V0bm9ybSB0byBQQUxcbiIpOwoJfQoJLyogc2V0IEdQSU8gYWNjb3JkaW5nICovCglncGlvX2JpdHMoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzaywKCQkgIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbYnR2LT5hdWRpb10pOwp9CgoKLyoKICogcmVzZXQvZW5hYmxlIHRoZSBNU1Agb24gc29tZSBIYXVwcGF1Z2UgY2FyZHMKICogVGhhbmtzIHRvIEt59nN0aSBN5Gxra2kgKGttYWxra2lAY2MuaHV0LmZpKSEKICoKICogSGF1cHBhdWdlOiAgcGluICA1CiAqIFZvb2RvbzogICAgIHBpbiAyMAogKi8Kc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKQp7CglpbnQgbWFzayA9ICgxIDw8IHBpbik7CgoJZ3Bpb19pbm91dChtYXNrLG1hc2spOwoJZ3Bpb19iaXRzKG1hc2ssMCk7CiAgICAgICAgdWRlbGF5KDI1MDApOwoJZ3Bpb19iaXRzKG1hc2ssbWFzayk7CgoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJtc3AzNHh4Iik7CglpZiAoYnR0dl92ZXJib3NlKQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogSGF1cHBhdWdlL1Zvb2RvbyBtc3AzNHh4OiByZXNldCBsaW5lICIKCQkgICAgICAgImluaXQgWyVkXVxuIiwgYnR2LT5jLm5yLCBwaW4pOwp9CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KQp7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICBJbWFnZW5hdGlvbiBMLU1vZGVsIFBYQzIwMCBGcmFtZWdyYWJiZXIgKi8KLyogIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIHByb2NlZHVyZSBhcwogKiAgdXNlZCBieSBBbGVzc2FuZHJvIFJ1YmluaSBpbiBoaXMgcHhjMjAwCiAqICBkcml2ZXIsIGJ1dCB1c2luZyBCVFRWIGZ1bmN0aW9ucyAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfUFhDMjAwKHN0cnVjdCBidHR2ICpidHYpCnsKCXN0YXRpYyBpbnQgdmFsc1tdIF9fZGV2aW5pdGRhdGEgPSB7IDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGQsIDB4MGQsCgkJCQkJICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCgkJCQkJICAgIDB4MDAgfTsKCXVuc2lnbmVkIGludCBpOwoJaW50IHRtcDsKCXUzMiB2YWw7CgoJLyogSW5pdGlhbGlzZSBHUElPLWNvbm5ldnRlZCBzdHVmZiAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgKDE8PDEzKSk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KDMpOwoJZ3Bpb193cml0ZSgxPDwxMyk7CgkvKiBHUElPIGlucHV0cyBhcmUgcHVsbGVkIHVwLCBzbyBubyBuZWVkIHRvIGRyaXZlCgkgKiByZXNldCBwaW4gYW55IGxvbmdlciAqLwoJZ3Bpb19iaXRzKDB4ZmZmZmZmLCAwKTsKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwicHhjMjAwIik7CgoJLyogIHdlIGNvdWxkL3Nob3VsZCB0cnkgYW5kIHJlc2V0L2NvbnRyb2wgdGhlIEFEIHBvdHM/IGJ1dAoJICAgIHJpZ2h0IG5vdyAgd2Ugc2ltcGx5ICB0dXJuZWQgb2ZmIHRoZSBjcnVzaGluZy4gIFdpdGhvdXQKCSAgICB0aGlzIHRoZSBBR0MgZHJpZnRzIGRyaWZ0cwoJICAgIHJlbWVtYmVyIHRoZSBFTiBpcyByZXZlcnNlIGxvZ2ljIC0tPgoJICAgIHNldHRpbmcgQlQ4NDhfQURDX0FHQ19FTiBkaXNhYmxlIHRoZSBBR0MKCSAgICB0Ym91bHRAZWVjcy5sZWhpZ2guZWR1CgkqLwoKCWJ0d3JpdGUoQlQ4NDhfQURDX1JFU0VSVkVEfEJUODQ4X0FEQ19BR0NfRU4sIEJUODQ4X0FEQyk7CgoJLyoJSW5pdGlhbGlzZSBNQVg1MTcgREFDICovCglwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIERBQyByZWZlcmVuY2Ugdm9sdGFnZSBsZXZlbCAuLi5cbiIpOwoJYnR0dl9JMkNXcml0ZShidHYsMHg1RSwwLDB4ODAsMSk7CgoJLyoJSW5pdGlhbGlzZSAxMkM1MDggUElDICovCgkvKglUaGUgSTJDV3JpdGUgYW5kIEkyQ1JlYWQgY29tbW1hbmRzIGFyZSBhY3R1YWxseSB0byB0aGUKCSAqCXNhbWUgY2hpcHMgLSBidXQgdGhlIFIvVyBiaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGFkZHJlc3MKCSAqCWFyZ3VtZW50IHNvIHRoZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgKi8KCgoJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGlzaW5nIDEyQzUwOCBQSUMgY2hpcCAuLi5cbiIpOwoKCS8qIEZpcnN0IG9mIGFsbCwgZW5hYmxlIHRoZSBjbG9jayBsaW5lLiBUaGlzIGlzIHVzZWQgaW4gdGhlIFBYQzIwMC1GICovCgl2YWwgPSBidHJlYWQoQlQ4NDhfR1BJT19ETUFfQ1RMKTsKCXZhbCB8PSBCVDg0OF9HUElPX0RNQV9DVExfR1BDTEtNT0RFOwoJYnR3cml0ZSh2YWwsIEJUODQ4X0dQSU9fRE1BX0NUTCk7CgoJLyogVGhlbiwgcHVzaCB0byAwIHRoZSByZXNldCBwaW4gbG9uZyBlbm91Z2ggdG8gcmVzZXQgdGhlICoKCSAqIGRldmljZSBzYW1lIGFzIGFib3ZlIGZvciB0aGUgcmVzZXQgbGluZSwgYnV0IG5vdCB0aGUgc2FtZQoJICogdmFsdWUgc2VudCB0byB0aGUgR1BJTy1jb25uZWN0ZWQgc3R1ZmYKCSAqIHdoaWNoIG9uZSBpcyB0aGUgZ29vZCBvbmU/ICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCgxPDwyKSk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KDEwKTsKCWdwaW9fd3JpdGUoMTw8Mik7CgogICAgICAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbHMpOyBpKyspIHsKCQl0bXA9YnR0dl9JMkNXcml0ZShidHYsMHgxRSwwLHZhbHNbaV0sMSk7CgkJaWYgKHRtcCAhPSAtMSkgewoJCQlwcmludGsoS0VSTl9JTkZPCgkJCSAgICAgICAiSTJDIFdyaXRlKCUyLjJ4KSA9ICVpXG5JMkMgUmVhZCAoKSA9ICUyLjJ4XG5cbiIsCgkJCSAgICAgICB2YWxzW2ldLHRtcCxidHR2X0kyQ1JlYWQoYnR2LDB4MUYsTlVMTCkpOwoJCX0KCX0KCglwcmludGsoS0VSTl9JTkZPICJQWEMyMDAgSW5pdGlhbGlzZWQuXG4iKTsKfQoKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKgogKiAgVGhlIEFkbGluayBSVFYtMjQgKGFrYSBBbmdlbG8pIGhhcyBzb21lIHNwZWNpYWwgaW5pdGlhbGlzYXRpb24gdG8gdW5sb2NrCiAqICBpdC4gVGhpcyBhcHBhcmVudGx5IGludm9sdmVzIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGZvciBlYWNoIDg3OCBjaGlwOgogKgogKiAgMSkgd3JpdGUgMHgwMEMzRkVGRiB0byB0aGUgR1BJT19PVVRfRU4gcmVnaXN0ZXIKICoKICogIDIpICB3cml0ZSB0byBHUElPX0RBVEEKICogICAgICAtIDB4MEUKICogICAgICAtIHNsZWVwIDFtcwogKiAgICAgIC0gMHgxMCArIDB4MEUKICogICAgICAtIHNsZWVwIDEwbXMKICogICAgICAtIDB4MEUKICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCiAqICAgICAgLSBpZiAoIGRhdGE+PjE4ICYgMHgwMSAhPSAwKSB8fCAoIGJ1Zj4+MTkgJiAweDAxICE9IDEgKQogKiAgICAgICAgICAgICAgICAgZXJyb3IuIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIHN0b3AuCiAqCiAqICAzKSB3cml0ZSB0byBHUElPX0RBVEEKICogICAgICAtIHdyaXRlIDB4NDQwMCArIDB4MEUKICogICAgICAtIHNsZWVwIDEwbXMKICogICAgICAtIHdyaXRlIDB4NDQxMCArIDB4MEUKICogICAgICAtIHNsZWVwIDFtcwogKiAgICAgIC0gd3JpdGUgMHgwRQogKiAgICAgcmVhZCBmcm9tIEdQSU9fREFUQSBpbnRvIGJ1ZiAodWludF8zMikKICogICAgICAtIGlmICggYnVmPj4xOCAmIDB4MDEgKSB8fCAoIGJ1Zj4+MTkgJiYgMHgwMSAhPSAwICkKICogICAgICAgICAgICAgICAgZXJyb3IuIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkLgogKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8Kdm9pZAppbml0X1JUVjI0IChzdHJ1Y3QgYnR0diAqYnR2KQp7Cgl1aW50MzJfdCBkYXRhUmVhZCA9IDA7Cglsb25nIHdhdGNoZG9nX3ZhbHVlID0gMHgwRTsKCglwcmludGsgKEtFUk5fSU5GTwoJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gaW4gcHJvZ3Jlc3MgLi4uXG4iLAoJCWJ0di0+Yy5ucik7CgoJYnR3cml0ZSAoMHgwMGMzZmVmZiwgQlQ4NDhfR1BJT19PVVRfRU4pOwoKCWJ0d3JpdGUgKDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglidHdyaXRlICgweDEwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEwKTsKCWJ0d3JpdGUgKDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCglkYXRhUmVhZCA9IGJ0cmVhZCAoQlQ4NDhfR1BJT19EQVRBKTsKCglpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMSkpIHsKCQlwcmludGsgKEtFUk5fSU5GTwoJCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uKDEpIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIChyZWFkICVkKVxuIiwKCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7Cgl9CgoJYnR3cml0ZSAoMHg0NDAwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEwKTsKCWJ0d3JpdGUgKDB4NDQxMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxKTsKCWJ0d3JpdGUgKHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxKTsKCWRhdGFSZWFkID0gYnRyZWFkIChCVDg0OF9HUElPX0RBVEEpOwoKCWlmICgoKChkYXRhUmVhZCA+PiAxOCkgJiAweDAxKSAhPSAwKSB8fCAoKChkYXRhUmVhZCA+PiAxOSkgJiAweDAxKSAhPSAwKSkgewoJCXByaW50ayAoS0VSTl9JTkZPCgkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMikgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAoJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKCgkJcmV0dXJuOwoJfQoKCXByaW50ayAoS0VSTl9JTkZPCgkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBjb21wbGV0ZS5cbiIsIGJ0di0+Yy5ucik7Cn0KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogTWlybyBQcm8gcmFkaW8gc3R1ZmYgLS0gdGhlIHRlYTU3NTcgaXMgY29ubmVjdGVkIHRvIHNvbWUgR1BJTyBwb3J0cyAgICAgKi8KLyoKICogQ29weXJpZ2h0IChjKSAxOTk5IENzYWJhIEhhbGFzeiA8cWdlaGFsaUB1bmktbWlza29sYy5odT4KICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCiAqIEJydXRhbGx5IGhhY2tlZCBieSBEYW4gU2hlcmlkYW4gPGRhbi5zaGVyaWRhbkBjb250YWN0Lm9yZy51az4gZGpzNTIgOC8zLzAwCiAqLwoKc3RhdGljIHZvaWQgYnVzX2xvdyhzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgYml0KQp7CglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCglncGlvX2JpdHMoYml0LDApOwoJdWRlbGF5KDUpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQp9CgpzdGF0aWMgdm9pZCBidXNfaGlnaChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgYml0KQp7CglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCglncGlvX2JpdHMoYml0LGJpdCk7Cgl1ZGVsYXkoNSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKCQl1ZGVsYXkoNSk7Cgl9Cn0KCnN0YXRpYyBpbnQgYnVzX2luKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKCQl1ZGVsYXkoNSk7Cgl9CglyZXR1cm4gZ3Bpb19yZWFkKCkgJiAoYml0KTsKfQoKLyogVEVBNTc1NyByZWdpc3RlciBiaXRzICovCiNkZWZpbmUgVEVBX0ZSRVEJCTA6MTQKI2RlZmluZSBURUFfQlVGRkVSCQkxNToxNQoKI2RlZmluZSBURUFfU0lHTkFMX1NUUkVOR1RICTE2OjE3CgojZGVmaW5lIFRFQV9QT1JUMQkJMTg6MTgKI2RlZmluZSBURUFfUE9SVDAJCTE5OjE5CgojZGVmaW5lIFRFQV9CQU5ECQkyMDoyMQojZGVmaW5lIFRFQV9CQU5EX0ZNCQkwCiNkZWZpbmUgVEVBX0JBTkRfTVcJCTEKI2RlZmluZSBURUFfQkFORF9MVwkJMgojZGVmaW5lIFRFQV9CQU5EX1NXCQkzCgojZGVmaW5lIFRFQV9NT05PCQkyMjoyMgojZGVmaW5lIFRFQV9BTExPV19TVEVSRU8JMAojZGVmaW5lIFRFQV9GT1JDRV9NT05PCQkxCgojZGVmaW5lIFRFQV9TRUFSQ0hfRElSRUNUSU9OCTIzOjIzCiNkZWZpbmUgVEVBX1NFQVJDSF9ET1dOCQkwCiNkZWZpbmUgVEVBX1NFQVJDSF9VUAkJMQoKI2RlZmluZSBURUFfU1RBVFVTCQkyNDoyNAojZGVmaW5lIFRFQV9TVEFUVVNfVFVORUQJMAojZGVmaW5lIFRFQV9TVEFUVVNfU0VBUkNISU5HCTEKCi8qIExvdy1sZXZlbCBzdHVmZiAqLwpzdGF0aWMgaW50IHRlYTU3NTdfcmVhZChzdHJ1Y3QgYnR0diAqYnR2KQp7Cgl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CglpbnQgdmFsdWUgPSAwOwoJaW50IGk7CgoJLyogYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAqLwoJZ3Bpb19pbm91dChidHYtPm1ib3hfbWFzaywgYnR2LT5tYm94X2NsayB8IGJ0di0+bWJveF93ZSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZWE1NzU3IHJlYWQiKTsKCglidXNfbG93KGJ0dixidHYtPm1ib3hfd2UpOwoJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CgoJdWRlbGF5KDEwKTsKCXRpbWVvdXQ9IGppZmZpZXMgKyBIWjsKCgkvKiB3YWl0IGZvciBEQVRBIGxpbmUgdG8gZ28gbG93OyBlcnJvciBpZiBpdCBkb2Vzbid0ICovCgl3aGlsZSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCgkJc2NoZWR1bGUoKTsKCWlmIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogdGVhNTc1NzogcmVhZCB0aW1lb3V0XG4iLGJ0di0+Yy5ucik7CgkJcmV0dXJuIC0xOwoJfQoKCWRwcmludGsoImJ0dHYlZDogdGVhNTc1NzoiLGJ0di0+Yy5ucik7Cglmb3IoaSA9IDA7IGkgPCAyNDsgaSsrKQoJewoJCXVkZWxheSg1KTsKCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2Nsayk7CgkJdWRlbGF5KDUpOwoJCWRwcmludGsoIiVjIiwoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1QnOictJyk7CgkJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CgkJdmFsdWUgPDw9IDE7CgkJdmFsdWUgfD0gKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpID09IDApPzA6MTsgIC8qIE1TQiBmaXJzdCAqLwoJCWRwcmludGsoIiVjIiwgKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydTJzonTScpOwoJfQoJZHByaW50aygiXG5idHR2JWQ6IHRlYTU3NTc6IHJlYWQgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CglyZXR1cm4gdmFsdWU7Cn0KCnN0YXRpYyBpbnQgdGVhNTc1N193cml0ZShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgdmFsdWUpCnsKCWludCBpOwoJaW50IHJlZyA9IHZhbHVlOwoKCWdwaW9faW5vdXQoYnR2LT5tYm94X21hc2ssIGJ0di0+bWJveF9jbGsgfCBidHYtPm1ib3hfd2UgfCBidHYtPm1ib3hfZGF0YSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlYTU3NTcgd3JpdGUiKTsKCglkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IHdyaXRlIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOwoJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CglidXNfaGlnaChidHYsYnR2LT5tYm94X3dlKTsKCWZvcihpID0gMDsgaSA8IDI1OyBpKyspCgl7CgkJaWYgKHJlZyAmIDB4MTAwMDAwMCkKCQkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9kYXRhKTsKCQllbHNlCgkJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9kYXRhKTsKCQlyZWcgPDw9IDE7CgkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSgxMCk7CgkJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CgkJdWRlbGF5KDEwKTsKCX0KCWJ1c19sb3coYnR2LGJ0di0+bWJveF93ZSk7ICAvKiB1bm11dGUgISEhICovCglyZXR1cm4gMDsKfQoKdm9pZCB0ZWE1NzU3X3NldF9mcmVxKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIHNob3J0IGZyZXEpCnsKCWRwcmludGsoInRlYTU3NTdfc2V0X2ZyZXEgJWRcbiIsZnJlcSk7Cgl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8qIGFkZCAxMC43TUh6IChzZWUgZG9jcykgKi8KfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHdpbnZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgp2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CgkvKiBQVDIyNTRBIHByb2dyYW1taW5nIEpvbiBUb21icywgam9uQGd0ZS5lc2kudXMuZXMgKi8KCWludCBiaXRzX291dCwgbG9vcHMsIHZvbCwgZGF0YTsKCglpZiAoIXNldCkgewoJCS8qIEZpeGVkIGJ5IExlYW5kcm8gTHVjYXJlbGxhIDxsdWNhQGxpbnV4bWVuZG96YS5vcmcuYXIgKDA3LzMxLzAxKSAqLwoJCXYtPmZsYWdzIHw9IFZJREVPX0FVRElPX1ZPTFVNRTsKCQlyZXR1cm47Cgl9CgoJLyogMzIgbGV2ZWxzIGxvZ2FyaXRobWljICovCgl2b2wgPSAzMiAtICgodi0+dm9sdW1lPj4xMSkpOwoJLyogdW5pdHMgKi8KCWJpdHNfb3V0ID0gKFBUMjI1NF9EQlNfSU5fMj4+KHZvbCU1KSk7CgkvKiB0ZW5zICovCgliaXRzX291dCB8PSAoUFQyMjU0X0RCU19JTl8xMD4+KHZvbC81KSk7CgliaXRzX291dCB8PSBQVDIyNTRfTF9DSEFOTkVMIHwgUFQyMjU0X1JfQ0hBTk5FTDsKCWRhdGEgPSBncGlvX3JlYWQoKTsKCWRhdGEgJj0gfihXSU5WSUVXX1BUMjI1NF9DTEt8IFdJTlZJRVdfUFQyMjU0X0RBVEF8CgkJICBXSU5WSUVXX1BUMjI1NF9TVFJPQkUpOwoJZm9yIChsb29wcyA9IDE3OyBsb29wcyA+PSAwIDsgbG9vcHMtLSkgewoJCWlmIChiaXRzX291dCAmICgxPDxsb29wcykpCgkJCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X0RBVEE7CgkJZWxzZQoJCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWdwaW9fd3JpdGUoZGF0YSk7CgkJdWRlbGF5KDUpOwoJCWRhdGEgfD0gV0lOVklFV19QVDIyNTRfQ0xLOwoJCWdwaW9fd3JpdGUoZGF0YSk7CgkJdWRlbGF5KDUpOwoJCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJfQoJZGF0YSB8PSAgV0lOVklFV19QVDIyNTRfU1RST0JFOwoJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCWdwaW9fd3JpdGUoZGF0YSk7Cgl1ZGVsYXkoMTApOwoJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfU1RST0JFOwoJZ3Bpb193cml0ZShkYXRhKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbW9uby9zdGVyZW8gY29udHJvbCBmb3IgdmFyaW91cyBjYXJkcyAod2hpY2ggZG9uJ3QgdXNlIGkyYyBjaGlwcyBidXQgICAgKi8KLyogY29ubmVjdCBzb21ldGhpbmcgdG8gdGhlIEdQSU8gcGlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkCmd2YmN0djNwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDMwMCwgMHgzMDApOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCgkJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MzAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDIwMDsKLyoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKICoJCQljb24gPSAweDEwMDsgKi8KCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxICB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgpzdGF0aWMgdm9pZApndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCwgY29uOwoKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwoKCXZhbCA9IGdwaW9fcmVhZCgpOwoJaWYgKHNldCkgewoJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpIHsKCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgewoJCQkJLyogTEFORzEgKyBMQU5HMiAqLwoJCQkJY29uID0gMHgxMDA7CgkJCX0KCQkJZWxzZSB7CgkJCQkvKiBMQU5HMiAqLwoJCQkJY29uID0gMHgzMDA7CgkJCX0KCQl9CgkJaWYgKGNvbiAhPSAodmFsICYgMHgzMDApKSB7CgkJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImd2YmN0djVwY2kiKTsKCQl9Cgl9IGVsc2UgewoJCXN3aXRjaCAodmFsICYgMHg3MCkgewoJCSAgY2FzZSAweDEwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4MzA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NTA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMTsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NjA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU87CgkJCWJyZWFrOwoJCSAgY2FzZSAweDcwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQkJYnJlYWs7CgkJICBkZWZhdWx0OgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJfQoJfQp9CgovKgogKiBNYXJpbyBNZWRpbmEgTnVzc2JhdW0gPG1lZGlzb2Z0QGFsb2hhYmJzLm9yZy5teD4KICogIEkgZGlzY292ZXIgdGhhdCBvbiBCVDg0OF9HUElPX0RBVEEgYWRkcmVzcyBhIGJ5dGUgMHhjY2UgZW5hYmxlIHN0ZXJlbywKICogIDB4ZGRlIGVuYWJsZXMgbW9ubyBhbmQgMHhjY2QgZW5hYmxlcyBzYXAKICoKICogUGV0ciBWYW5kcm92ZWMgPFZBTkRST1ZFQHZjLmN2dXQuY3o+CiAqICBQLlMuOiBBdCBsZWFzdCBtYXNrIGluIGxpbmUgYWJvdmUgaXMgd3JvbmcgLSBHUElPIHBpbnMgMywyIHNlbGVjdAogKiAgaW5wdXQvb3V0cHV0IHNvdW5kIGNvbm5lY3Rpb24sIHNvIGJvdGggbXVzdCBiZSBzZXQgZm9yIG91dHB1dCBtb2RlLgogKgogKiBMb29rcyBsaWtlIGl0J3MgbmVlZGVkIG9ubHkgZm9yIHRoZSAidHZwaG9uZSIsIHRoZSAidHZwaG9uZSA5OCIKICogaGFuZGxlcyB0aGlzIHdpdGggYSB0ZGE5ODQwCiAqCiAqLwpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCWludCB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLwoJCQl2YWwgPSAweDAyOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQl2YWwgPSAweDAxOwoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMTsKCQlyZXR1cm47Cgl9Cn0KCnN0YXRpYyB2b2lkCmF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgIC8qIFNURVJFTyAqLwoJCQl2YWwgPSAweDAyOwoJCWJ0YW9yKHZhbCwgfjB4MDMsIEJUODQ4X0dQSU9fREFUQSk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiYXZlcm1lZGlhIik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIExpZmV0ZWMgOTQxNSBoYW5kbGluZyAqLwpzdGF0aWMgdm9pZApsdDk0MTVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CiAgICAgICAgaW50IHZhbCA9IDA7CgogICAgICAgIGlmIChncGlvX3JlYWQoKSAmIDB4NDAwMCkgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05POwoJCXJldHVybjsKCX0KCiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgIC8qIEEyIFNBUCAqLwogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDAwODA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pIC8qIEEyIHN0ZXJlbyAqLwogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA4ODA7CiAgICAgICAgICAgICAgICBpZiAoKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgfHwKCQkgICAgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKSkKCQkJdmFsID0gMDsKCQlncGlvX2JpdHMoMHgwODgwLCB2YWwpOwogICAgICAgICAgICAgICAgaWYgKGJ0dHZfZ3BpbykKICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibHQ5NDE1Iik7CiAgICAgICAgfSBlbHNlIHsKCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3aXRoIHRoaXMgY2FyZCA6LSggKi8KICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9Cn0KCi8qIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4ICovCnN0YXRpYyB2b2lkCnRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDE4MDAwMCwweDE4MDAwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgwODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MTgwMDAwOwoJCWdwaW9fYml0cygweDE4MDAwMCwgY29uKTsKCQlpZiAoYnR0dl9ncGlvKQoJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZXJyYXR2Iik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCS8qYnRvciAoMHhjMzIwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsqLwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkJLyogTW9ubyAqLwoJCQl2YWwgPSAweDQyMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQkvKiBTQVAgKi8KCQkJdmFsID0gMHg0MTAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCS8qIFN0ZXJlbyAqLwoJCQl2YWwgPSAweDAyMDAwMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDQzMDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmZhc3QyMDAwIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgUHJvbGluayBQVi1CVDg3OFArOUIgKFBpeGVsVmlldyBQbGF5VFYgUHJvIEZNK05JQ0FNCiAqIHJldmlzaW9uIDlCIGhhcyBvbi1ib2FyZCBUREE5ODc0QSBzb3VuZCBkZWNvZGVyKS4KICoKICogTm90ZTogVGhlcmUgYXJlIGNhcmQgdmFyaWFudHMgd2l0aG91dCB0ZGE5ODc0YS4gRm9yY2luZyB0aGUgInN0ZXJlbyBzb3VuZCByb3V0ZSIKICogICAgICAgd2lsbCBtdXRlIHRoaXMgY2FyZHMuCiAqLwpzdGF0aWMgdm9pZApwdmJ0ODc4cDliX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDA7CgoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewoJCQl2YWwgPSAweDAxOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDAyOwoJCX0KCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJwdmJ0ODc4cDliIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIEZseVZpZGVvIDIwMDBTICh3aXRoIHRkYTk4NzQgZGVjb2RlcikKICogYmFzZWQgb24gcHZidDg3OHA5Yl9hdWRpbygpIC0gdGhpcyBpcyBub3QgdGVzdGVkLCBwbGVhc2UgZml4ISEhCiAqLwpzdGF0aWMgdm9pZApmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDB4ZmZmZjsKCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKCQkJdmFsID0gMHgwMDAwOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDEwODA7IC8qLWRrLT8/PzogMHgwODgwLCAweDAwODAsIDB4MTgwMCAuLi4gKi8KCQl9CgkJaWYgKHZhbCAhPSAweGZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MTgwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImZ2MjAwMHMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogc291bmQgY29udHJvbCBmb3IgQ2Fub3B1cyBXaW5EVlIgUENJCiAqIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+CiAqLwpzdGF0aWMgdm9pZAp3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CiAgICAgICAgdW5zaWduZWQgbG9uZyB2YWwgPSAwOwoKICAgICAgICBpZiAoc2V0KSB7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDB4MDQwMDAwOwogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDB4MTAwMDAwOwogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICAgICAgICBpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDE0MDAwMCwgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0dHZfZ3BpbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ3aW5kdnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAogICAgICAgICAgICAgICAgICAgICAgICAgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CiAgICAgICAgfQp9CgovKgogKiBzb3VuZCBjb250cm9sIGZvciBBRC1UVks1MDMKICogSGlyb3NoaSBUYWtla2F3YSA8c2lhbkBiaWcub3IuanA+CiAqLwpzdGF0aWMgdm9pZAphZHR2azUwM19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCBjb24gPSAweGZmZmZmZjsKCgkvKiBidGFvcigweDFlMDAwMCwgfjB4MWUwMDAwLCBCVDg0OF9HUElPX09VVF9FTik7ICovCgoJaWYgKHNldCkgewoJCS8qIGJ0b3IoKioqLCBCVDg0OF9HUElPX09VVF9FTik7ICovCgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJY29uID0gMHgwMDAwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDAwMTgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKCQkJY29uID0gMHgwMDA2MDAwMDsKCQlpZiAoY29uICE9IDB4ZmZmZmZmKSB7CgkJCWdwaW9fYml0cygweDFlMDAwMCxjb24pOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwgImFkdHZrNTAzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qIFJlbW90ZVZpc2lvbiBNWCAocnY2MDUpIG11eHNlbCBoZWxwZXIgW01pZ3VlbCBGcmVpdGFzXQogKgogKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJ2NjA1IGRvbid0IHVzZSBhIG5vcm1hbCBtdWx0aXBsZXgsIGJ1dCBhIGNyb3NzcG9pbnQKICogc3dpdGNoIGluc3RlYWQgKENEMjJNMzQ5NEUpLiBUaGlzIElDIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjb25uZWN0aW9ucwogKiBiZXR3ZWVuIFhuIChpbnB1dCkgYW5kIFluIChvdXRwdXQpIHBpbnMuIFdlIG5lZWQgdG8gY2xlYXIgYW55IGV4aXN0aW5nCiAqIGNvbm5lY3Rpb24gcHJpb3IgdG8gZXN0YWJsaXNoIGEgbmV3IG9uZSwgcHVsc2luZyB0aGUgU1RST0JFIHBpbi4KICoKICogVGhlIGJvYXJkIGhhcmR3aXJlIFkwICh4cG9pbnQpIHRvIE1VWDEgYW5kIE1VWE9VVCB0byBZaW4uCiAqIEdQSU8gcGlucyBhcmUgd2lyZWQgYXM6CiAqICBHUElPWzA6M10gLSBBWFswOjNdICh4cG9pbnQpIC0gUDFbMDozXSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzQ6Nl0gLSBBWVswOjJdICh4cG9pbnQpIC0gUDFbNDo2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzddICAgLSBEQVRBICh4cG9pbnQpICAgIC0gUDFbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s4XSAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzVdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bOV0gICAtIFJFU0VUICh4cG9pbnQpICAgLSBQM1s2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzEwXSAgLSBTVFJPQkUgKHhwb2ludCkgIC0gUDNbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJTlRSICAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzRdIChtaWNyb2NvbnRyb2xlcikKICoKICogVGhlIG1pY3JvY29udHJvbGVyIGlzIGEgODBDMzIgbGlrZS4gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB4cG9pbnQKICogY29uZmlndXJhdGlvbiBlaXRoZXIgZGlyZWN0bHkgKGFzIHdlIGFyZSBkb2luZykgb3IgdXNpbmcgdGhlIG1pY3JvY29udHJvbGVyCiAqIHdoaWNoIGlzIGFsc28gd2lyZWQgdG8gSTJDIGludGVyZmFjZS4gSSBoYXZlIG5vIGZ1cnRoZXIgaW5mbyBvbiB0aGUKICogbWljcm9jb250cm9sZXIgZmVhdHVyZXMsIG9uZSB3b3VsZCBuZWVkIHRvIGRpc2Fzc2VtYmx5IHRoZSBmaXJtd2FyZS4KICogbm90ZTogdGhlIHZlbmRvciByZWZ1c2VkIHRvIGdpdmUgYW55IGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvZHVjdCwgYWxsCiAqICAgICAgIHRoYXQgc3R1ZmYgd2FzIGZvdW5kIHVzaW5nIGEgbXVsdGltZXRlciEgOikKICovCnN0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHJlc2V0IGFsbCBjb25lY3Rpb25zICovCglncGlvX2JpdHMoMHgyMDAsMHgyMDApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4MjAwLDB4MDAwKTsKCW1kZWxheSgxKTsKCgkvKiBjcmVhdGUgYSBuZXcgY29uZWN0aW9uICovCglncGlvX2JpdHMoMHg0ODAsMHgwODApOwoJZ3Bpb19iaXRzKDB4NDgwLDB4NDgwKTsKCW1kZWxheSgxKTsKCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CgltZGVsYXkoMSk7Cn0KCi8qIFRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiBtdXhzZWwgaGVscGVyIFtDaHJpcyBGYW5uaW5nXQogKgogKiBUaGUgQ1MxNiAoYXZhaWxhYmxlIG9uIGVCYXkgY2hlYXApIGlzIGEgUENJIGJvYXJkIHdpdGggZm91ciBGdXNpb24KICogODc4QSBjaGlwcywgYSBQQ0kgYnJpZGdlLCBhbiBBdG1lbCBtaWNyb2NvbnRyb2xsZXIsIGZvdXIgc3luYyBzZXBlcmF0b3IKICogY2hpcHMsIHRlbiBlaWdodCBpbnB1dCBhbmFsb2cgbXVsdGlwbGV4b3JzLCBhIG5vdCBjaGlwIGFuZCBhIGZldwogKiBvdGhlciBjb21wb25lbnRzLgogKgogKiAxNiBpbnB1dHMgb24gYSBzZWNvbmRhcnkgYnJhY2tldCBhcmUgcHJvdmlkZWQgYW5kIGNhbiBiZSBzZWxlY3RlZAogKiBmcm9tIGVhY2ggb2YgdGhlIGZvdXIgY2FwdHVyZSBjaGlwcy4gIFR3byBvZiB0aGUgZWlnaHQgaW5wdXQKICogbXVsdGlwbGV4b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBmcm9tIGFueSBvZiB0aGUgMTYgaW5wdXQgc2lnbmFscy4KICoKICogVW5zdXBwb3J0ZWQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzOgogKiAgLiBBIHZpZGVvIG91dHB1dCBtb25pdG9yIG9uIHRoZSBzZWNvbmRhcnkgYnJhY2tldCBjYW4gYmUgc2VsZWN0ZWQgZnJvbQogKiAgICBvbmUgb2YgdGhlIDg3OEEgY2hpcHMuCiAqICAuIEFub3RoZXIgcGFzc3Rocm91Z2ggYnV0IEkgaGF2ZW4ndCBzcGVudCBhbnkgdGltZSBpbnZlc3RpZ2F0aW5nIGl0LgogKiAgLiBEaWdpdGFsIEkvTyAobG9naWMgbGV2ZWwgY29ubmVjdGVkIHRvIEdQSU8pIGlzIGF2YWlsYWJsZSBmcm9tIGFuCiAqICAgIG9uYm9hcmQgaGVhZGVyLgogKgogKiBUaGUgb24gY2hpcCBpbnB1dCBtdXggc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMi4KICogR1BJT1sxNjoxOV0gLSBWaWRlbyBpbnB1dCBzZWxlY3Rpb24KICogR1BJT1swOjNdICAgLSBWaWRlbyBvdXRwdXQgbW9uaXRvciBzZWxlY3QgKG9ubHkgYXZhaWxhYmxlIGZyb20gb25lIDg3OEEpCiAqIEdQSU9bPzo/XSAgIC0gRGlnaXRhbCBJL08uCiAqCiAqIFRoZXJlIGlzIGFuIEFUTUVMIG1pY3JvY29udHJvbGxlciB3aXRoIGFuIDgwMzEgY29yZSBvbiBib2FyZC4gIEkgaGF2ZSBub3QKICogZGV0ZXJtaW5lZCB3aGF0IGZ1bmN0aW9uIChpZiBhbnkpIGl0IHByb3ZpZGVzLiAgV2l0aCB0aGUgbWljcm9jb250cm9sbGVyCiAqIGFuZCBzeW5jIHNlcGVyYXRvciBjaGlwcyBhIGd1ZXNzIGlzIHRoYXQgaXQgbWlnaHQgaGF2ZSB0byBkbyB3aXRoIHZpZGVvCiAqIHN3aXRjaGluZyBhbmQgbWF5YmUgc29tZSBkaWdpdGFsIEkvTy4KICovCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvKiB2aWRlbyBtdXggKi8KCWdwaW9fYml0cygweDBmMDAwMCwgaW5wdXQgPDwgMTYpOwp9CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKiBlbmFibGUgZ3BpbyBiaXRzLCBtYXNrIG9idGFpbmVkIHZpYSBidFNweSAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwZjdmZmYpOwoJZ3Bpb193cml0ZSgweDBmN2ZmZik7Cn0KCi8qCiAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZm9yIHRoZSBLb2RpY29tLTQ0MDByIGdldCBhIGxpdHRsZSBtaW5kLXR3aXN0aW5nLgogKiBUaGVyZSBpcyBhICJtYXN0ZXIiIGNvbnRyb2xsZXIgYW5kIHRocmVlICJzbGF2ZSIgY29udHJvbGxlcnMsIHRvZ2V0aGVyCiAqIGFuIGFuYWxvZyBzd2l0Y2ggd2hpY2ggY29ubmVjdHMgYW55IG9mIDE2IGNhbWVyYXMgdG8gYW55IG9mIHRoZSBCVDg3QSdzLgogKiBUaGUgYW5hbG9nIHN3aXRjaCBpcyBjb250cm9sbGVkIGJ5IHRoZSAibWFzdGVyIiwgYnV0IHRoZSBkZXRlY3Rpb24gb3JkZXIKICogb2YgdGhlIGZvdXIgQlQ4NzhBIGNoaXBzIGlzIGluIGFuIG9yZGVyIHdoaWNoIEkganVzdCBkb24ndCB1bmRlcnN0YW5kLgogKiBUaGUgIm1hc3RlciIgaXMgYWN0dWFsbHkgdGhlIHNlY29uZCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkLiAgVGhlCiAqIGxvZ2ljIG9uIHRoZSBib2FyZCB1c2VzIGxvZ2ljYWwgbnVtYmVycyBmb3IgdGhlIDQgY29udHJvbGVycywgYnV0CiAqIHRob3NlIG51bWJlcnMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UuICBXaGVuIHdvcmtpbmcKICogd2l0aCB0aGUgYW5hbG9nIHN3aXRjaCwgd2UgbmVlZCB0byAibWFwIiBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UKICogb3ZlciB0byB0aGUgYm9hcmQncyBsb2dpY2FsIGNvbnRyb2xsZXIgbnVtYmVyLiAgVGhpcyBtYXBwaW5nIHNlcXVlbmNlCiAqIGlzIHszLCAwLCAyLCAxfSwgaS5lLiB0aGUgZmlyc3QgY29udHJvbGxlciB0byBiZSBkZXRlY3RlZCBpcyBsb2dpY2FsCiAqIHVuaXQgMywgdGhlIHNlY29uZCAod2hpY2ggaXMgdGhlIG1hc3RlcikgaXMgbG9naWNhbCB1bml0IDAsIGV0Yy4KICogV2UgbmVlZCB0byBtYWludGFpbiB0aGUgc3RhdHVzIG9mIHRoZSBhbmFsb2cgc3dpdGNoICh3aGljaCBvZiB0aGUgMTYKICogY2FtZXJhcyBpcyBjb25uZWN0ZWQgdG8gd2hpY2ggb2YgdGhlIDQgY29udHJvbGxlcnMpLiAgUmF0aGVyIHRoYW4KICogYWRkIHRvIHRoZSBidHR2IHN0cnVjdHVyZSBmb3IgdGhpcywgd2UgdXNlIHRoZSBkYXRhIHJlc2VydmVkIGZvcgogKiB0aGUgbWJveCAodW51c2VkIGZvciB0aGlzIGNhcmQgdHlwZSkuCiAqLwoKLyoKICogRmlyc3QgYSByb3V0aW5lIHRvIHNldCB0aGUgYW5hbG9nIHN3aXRjaCwgd2hpY2ggY29udHJvbHMgd2hpY2ggY2FtZXJhCiAqIGlzIHJvdXRlZCB0byB3aGljaCBjb250cm9sbGVyLiAgVGhlIHN3aXRjaCBjb21wcmlzZXMgYW4gWC1hZGRyZXNzCiAqIChncGlvIGJpdHMgMC0zLCByZXByZXNlbnRpbmcgdGhlIGNhbWVyYSwgcmFuZ2luZyBmcm9tIDAtMTUpLCBhbmQgYQogKiBZLWFkZHJlc3MgKGdwaW8gYml0cyA0LTYsIHJlcHJlc2VudGluZyB0aGUgY29udHJvbGxlciwgcmFuZ2luZyBmcm9tIDAtMykuCiAqIEEgZGF0YSB2YWx1ZSAoZ3BpbyBiaXQgNykgb2YgJzEnIGVuYWJsZXMgdGhlIHN3aXRjaCwgYW5kICcwJyBkaXNhYmxlcwogKiB0aGUgc3dpdGNoLiAgQSBTVFJPQkUgYml0IChncGlvIGJpdCA4KSBsYXRjaGVzIHRoZSBkYXRhIHZhbHVlIGludG8gdGhlCiAqIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhlIGlkZWEgaXMgdG8gc2V0IHRoZSBhZGRyZXNzIGFuZCBkYXRhLCB0aGVuIGJyaW5nCiAqIFNUUk9CRSBoaWdoLCBhbmQgZmluYWxseSBicmluZyBTVFJPQkUgYmFjayB0byBsb3cuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeGFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHlhZGRyLAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBkYXRhKSB7Cgl1bnNpZ25lZCBpbnQgdWRhdGE7CgoJdWRhdGEgPSAoZGF0YSA8PCA3KSB8ICgoeWFkZHImMykgPDwgNCkgfCAoeGFkZHImMHhmKTsKCWdwaW9fYml0cygweDFmZiwgdWRhdGEpOwkJLyogd3JpdGUgQUREUiBhbmQgREFUICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhIHwgKDEgPDwgOCkpOwkvKiBzdHJvYmUgaGlnaCAqLwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiBzdHJvYmUgbG93ICovCn0KCi8qCiAqIE5leHQgdGhlIG11eCBzZWxlY3QuICBCb3RoIHRoZSAibWFzdGVyIiBhbmQgInNsYXZlIiAnY2FyZHMnIChjb250cm9sbGVycykKICogdXNlIHRoaXMgcm91dGluZS4gIFRoZSByb3V0aW5lIGZpbmRzIHRoZSAibWFzdGVyIiBmb3IgdGhlIGNhcmQsIG1hcHMKICogdGhlIGNvbnRyb2xsZXIgbnVtYmVyIGZyb20gdGhlIGRldGVjdGVkIHBvc2l0aW9uIG92ZXIgdG8gdGhlIGxvZ2ljYWwKICogbnVtYmVyLCB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdG8gdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBob3VzZWtlZXBzCiAqIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBzd2l0Y2ggaW5mb3JtYXRpb24uICBUaGUgcGFyYW1ldGVyICdpbnB1dCcgaXMgdGhlCiAqIHJlcXVlc3RlZCBjYW1lcmEgbnVtYmVyICgwIC0gMTUpLgogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWNoYXIgKnN3X3N0YXR1czsKCWludCB4YWRkciwgeWFkZHI7CglzdHJ1Y3QgYnR0diAqbWN0bHI7CglzdGF0aWMgdW5zaWduZWQgY2hhciBtYXBbNF0gPSB7MywgMCwgMiwgMX07CgoJbWN0bHIgPSBtYXN0ZXJbYnR2LT5jLm5yXTsKCWlmIChtY3RsciA9PSBOVUxMKSB7CS8qIGlnbm9yZSBpZiBtYXN0ZXIgbm90IHlldCBkZXRlY3RlZCAqLwoJCXJldHVybjsKCX0KCXlhZGRyID0gKGJ0di0+Yy5uciAtIG1jdGxyLT5jLm5yICsgMSkgJiAzOyAvKiB0aGUgJyYnIGlzIGZvciBzYWZldHkgKi8KCXlhZGRyID0gbWFwW3lhZGRyXTsKCXN3X3N0YXR1cyA9IChjaGFyICopKCZtY3Rsci0+bWJveF93ZSk7Cgl4YWRkciA9IGlucHV0ICYgMHhmOwoJLyogQ2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIvY2FtZXJhIHBhaXIgaGFzIGNoYW5nZWQsIGVsc2UgaWdub3JlICovCglpZiAoc3dfc3RhdHVzW3lhZGRyXSAhPSB4YWRkcikKCXsKCQkvKiAib3BlbiIgdGhlIG9sZCBzd2l0Y2gsICJjbG9zZSIgdGhlIG5ldyBvbmUsIHNhdmUgdGhlIG5ldyAqLwoJCWtvZGljb200NDAwcl93cml0ZShtY3Rsciwgc3dfc3RhdHVzW3lhZGRyXSwgeWFkZHIsIDApOwoJCXN3X3N0YXR1c1t5YWRkcl0gPSB4YWRkcjsKCQlrb2RpY29tNDQwMHJfd3JpdGUobWN0bHIsIHhhZGRyLCB5YWRkciwgMSk7Cgl9Cn0KCi8qCiAqIER1cmluZyBpbml0aWFsaXNhdGlvbiwgd2UgbmVlZCB0byByZXNldCB0aGUgYW5hbG9nIHN3aXRjaC4gIFdlCiAqIGFsc28gcHJlc2V0IHRoZSBzd2l0Y2ggdG8gbWFwIHRoZSA0IGNvbm5lY3RvcnMgb24gdGhlIGNhcmQgdG8gdGhlCiAqICp1c2VyJ3MqIChzZWUgYWJvdmUgZGVzY3JpcHRpb24gb2Yga29kaWNvbTQ0MDByX211eHNlbCkgY2hhbm5lbHMKICogMCB0aHJvdWdoIDMKICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCWNoYXIgKnN3X3N0YXR1cyA9IChjaGFyICopKCZidHYtPm1ib3hfd2UpOwoJaW50IGl4OwoKCWdwaW9faW5vdXQoMHgwMDAzZmYsIDB4MDAwM2ZmKTsKCWdwaW9fd3JpdGUoMSA8PCA5KTsJLyogcmVzZXQgTVVYICovCglncGlvX3dyaXRlKDApOwoJLyogUHJlc2V0IGNhbWVyYSAwIHRvIHRoZSA0IGNvbnRyb2xsZXJzICovCglmb3IgKGl4PTA7IGl4PDQ7IGl4KyspIHsKCQlzd19zdGF0dXNbaXhdID0gaXg7CgkJa29kaWNvbTQ0MDByX3dyaXRlKGJ0diwgaXgsIGl4LCAxKTsKCX0KCS8qCgkgKiBTaW5jZSB0aGlzIGlzIHRoZSAibWFzdGVyIiwgd2UgbmVlZCB0byBzZXQgdXAgdGhlCgkgKiBvdGhlciB0aHJlZSBjb250cm9sbGVyIGNoaXBzJyBwb2ludGVycyB0byB0aGlzIHN0cnVjdHVyZQoJICogZm9yIGxhdGVyIHVzZSBpbiB0aGUgbXV4c2VsIHJvdXRpbmUuCgkgKi8KCWlmICgoYnR2LT5jLm5yPDEpIHx8IChidHYtPmMubnI+QlRUVl9NQVgtMykpCgkgICAgcmV0dXJuOwoJbWFzdGVyW2J0di0+Yy5uci0xXSA9IGJ0djsKCW1hc3RlcltidHYtPmMubnJdICAgPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucisyXSA9IGJ0djsKfQoKLyogVGhlIEdyYW5kdGVjIFgtR3VhcmQgZnJhbWVncmFiYmVyIGNhcmQgdXNlcyB0d28gRHVhbCA0LWNoYW5uZWwKICogdmlkZW8gbXVsdGlwbGV4ZXJzIHRvIHByb3ZpZGUgdXAgdG8gMTYgdmlkZW8gaW5wdXRzLiBUaGVzZQogKiBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQogKiBidDg3OC4gVGhlIG11bHRpcGxleGVycyBwcm9iYWJseSBQZXJpY29tIFBJNVYzMzFRIG9yIHNpbWlsYXIuCgogKiB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCiAqIHl5eTEgaXMgcGluIHl5eSBvZiBtdWx0aXBsZXhlciBVMgogKi8KI2RlZmluZSBFTkEwICAgIDB4MDEKI2RlZmluZSBFTkIwICAgIDB4MDIKI2RlZmluZSBFTkExICAgIDB4MDQKI2RlZmluZSBFTkIxICAgIDB4MDgKCiNkZWZpbmUgSU4xMCAgICAweDEwCiNkZWZpbmUgSU4wMCAgICAweDIwCiNkZWZpbmUgSU4xMSAgICAweDQwCiNkZWZpbmUgSU4wMSAgICAweDgwCgpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gewogICAgICAgICAgICAgICAgRU5CMCwgRU5CMHxJTjAwLCBFTkIwfElOMTAsIEVOQjB8SU4wMHxJTjEwLAogICAgICAgICAgICAgICAgRU5BMCwgRU5BMHxJTjAwLCBFTkEwfElOMTAsIEVOQTB8SU4wMHxJTjEwLAogICAgICAgICAgICAgICAgRU5CMSwgRU5CMXxJTjAxLCBFTkIxfElOMTEsIEVOQjF8SU4wMXxJTjExLAogICAgICAgICAgICAgICAgRU5BMSwgRU5BMXxJTjAxLCBFTkExfElOMTEsIEVOQTF8SU4wMXxJTjExLAoJfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlMTZdKTsKfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKlRoaXMgaXMgdGhlIHZpZGVvIGlucHV0IHJlZGlyZWN0aW9uIGZvbmN0aW9uYWxpdHkgOiBJIERJRCBOT1QgVVNFRCBJVC4gKi8KCWJ0d3JpdGUgKDB4MDg8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE5XSBbPT0+IDQwNTMgQitDXSBzZXQgdG8gMSAqLwoJYnR3cml0ZSAoMHgwNDw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMThdIFs9PT4gNDA1MyBBXSAgc2V0IHRvIDEqLwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwgKHN0cnVjdCBidHR2KiBidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoKCWRwcmludGsgKEtFUk5fREVCVUcgImJ0dHYlZCA6IHBpY29sb190ZXRyYV9tdXhzZWwgPT4gIGlucHV0ID0gJWRcbiIsYnR2LT5jLm5yLGlucHV0KTsKCS8qSnVzdCBzZXQgdGhlIHJpZ2h0IHBhdGggaW4gdGhlIGFuYWxvZyBtdWx0aXBsZXhlcnMgOiBjaGFubmVsIDEgLT4gNCA9PT4gQW5hbG9nIE11eCA9PT4gTVVYMCovCgkvKkdQSU9bMjBdJkdQSU9bMjFdIHVzZWQgdG8gY2hvb3NlIHRoZSByaWdodCBpbnB1dCovCglidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKCn0KCi8qCiAqIGl2YzEyMF9tdXhzZWwgW0FkZGVkIGJ5IEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT5dCiAqCiAqIFRoZSBJVkMxMjBHIHNlY3VyaXR5IGNhcmQgaGFzIDQgaTJjIGNvbnRyb2xsZWQgVERBODU0MCBtYXRyaXgKICogc3dpY2hlcnMgdG8gcHJvdmlkZSAxNiBjaGFubmVscyB0byBNVVgwLiBUaGUgVERBODU0MCdzIGhhdmUKICogNCBpbmRlcGVkYW50IG91dHB1dHMgYW5kIGFzIHN1Y2ggdGhlIElWQzEyMEcgYWxzbyBoYXMgdGhlCiAqIG9wdGlvbmFsICJNb25pdG9yIE91dCIgYnVzLiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSBsb29raW5nCiAqIGF0IG9uZSBpbnB1dCB3aGlsZSB0aGUgbW9uaXRvciBpcyBsb29raW5nIGF0IGFub3RoZXIuCiAqCiAqIFNpbmNlIEkndmUgY291bGRuJ3QgYmUgYm90aGVyZWQgZmlndXJpbmcgb3V0IGhvdyB0byBhZGQgYW4KICogaW5kZXBlbmRhbnQgbXV4c2VsIGZvciB0aGUgbW9uaXRvciBidXMsIEkndmUganVzdCBzZXQgaXQgdG8KICogd2hhdGV2ZXIgdGhlIGNhcmQgaXMgbG9va2luZyBhdC4KICoKICogIE9VVDAgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gTVVYMCAgICAgICAgICgweDAzKQogKiAgT1VUMSBvZiB0aGUgVERBODU0MCdzIGlzIGNvbm5lY3RlZCB0byAiTW9uaXRvciBPdXQiICAgICAgICAoMHgwQykKICoKICogIFREQTg1NDBfQUxUMyBJTjAtMyA9IENoYW5uZWwgMTMgLSAxNiAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNCBJTjAtMyA9IENoYW5uZWwgMSAtIDQgICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNSBJTjAtMyA9IENoYW5uZWwgNSAtIDggICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNiBJTjAtMyA9IENoYW5uZWwgOSAtIDEyICAgICAgICAgICAgICAgICgweDAzKQogKgogKi8KCi8qIEFsbCA3IHBvc3NpYmxlIHN1Yi1pZHMgZm9yIHRoZSBUREE4NTQwIE1hdHJpeCBTd2l0Y2hlciAqLwojZGVmaW5lIEkyQ19UREE4NTQwICAgICAgICAweDkwCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMSAgIDB4OTIKI2RlZmluZSBJMkNfVERBODU0MF9BTFQyICAgMHg5NAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDMgICAweDk2CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNCAgIDB4OTgKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ1ICAgMHg5YQojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDYgICAweDljCgpzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogU2ltcGxlIG1hdGhzICovCglpbnQga2V5ID0gaW5wdXQgJSA0OwoJaW50IG1hdHJpeCA9IGlucHV0IC8gNDsKCglkcHJpbnRrKCJidHR2JWQ6IGl2YzEyMF9tdXhzZWw6IElucHV0IC0gJTAyZCB8IFREQSAtICUwMmQgfCBJbiAtICUwMmRcbiIsCgkJYnR2LT5jLm5yLCBpbnB1dCwgbWF0cml4LCBrZXkpOwoKCS8qIEhhbmRsZXMgdGhlIGlucHV0IHNlbGVjdGlvbiBvbiB0aGUgVERBODU0MCdzICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CgoJLyogSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncyAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAweDAzIDogMHgwMCksIDEpOyAgLyogMTMgLSAxNiAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAweDAzIDogMHgwMCksIDEpOyAgLyogMS00ICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiA1LTggKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDIpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDktMTIgKi8KCgkvKiBTZWxlY3RzIE1VWDAgZm9yIGlucHV0IG9uIHRoZSA4NzggKi8KCWJ0YW9yKCgwKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwp9CgoKLyogUFhDMjAwIG11eHNlbCBoZWxwZXIKICogbHVrZUBzeXNlbmcuYW51LmVkdS5hdQogKiBhbm90aGVyIHRyYW5zcGxhbnQKICogZnJvbSBBbGVzc2FuZHJvIFJ1YmluaSAocnViaW5pQGxpbnV4Lml0KQogKgogKiBUaGVyZSBhcmUgNCBraW5kcyBvZiBjYXJkczoKICogUFhDMjAwTCB3aGljaCBpcyBidDg0OAogKiBQWEMyMDBGIHdoaWNoIGlzIGJ0ODQ4IHdpdGggUElDIGNvbnRyb2xsaW5nIG11eAogKiBQWEMyMDBBTCB3aGljaCBpcyBidDg3OAogKiBQWEMyMDBBRiB3aGljaCBpcyBidDg3OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICovCiNkZWZpbmUgUFhfQ0ZHX1BYQzIwMEYgMHgwMQojZGVmaW5lIFBYX0ZMQUdfUFhDMjAwQSAgMHgwMDAwMTAwMCAvKiBhIHB4YzIwMEEgaXMgYnQtODc4IGJhc2VkICovCiNkZWZpbmUgUFhfSTJDX1BJQyAgICAgICAweDBmCiNkZWZpbmUgUFhfUFhDMjAwQV9DQVJESUQgMHgyMDBhMTI5NQojZGVmaW5lIFBYX0kyQ19DTURfQ0ZHICAgMHgwMAoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKICAgICAgICBpbnQgcmM7Cglsb25nIG11eDsKCWludCBiaXRtYXNrOwogICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdOwoKCS8qIFJlYWQgUElDIGNvbmZpZyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIFBYQzIwMEYgKi8KCS8qIFBYX0kyQ19DTURfQ0ZHKi8KCWJ1ZlswXT0wOwoJYnVmWzFdPTA7CglyYz1idHR2X0kyQ1dyaXRlKGJ0diwoUFhfSTJDX1BJQzw8MSksYnVmWzBdLGJ1ZlsxXSwxKTsKCWlmIChyYykgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBwaWMgY2ZnIHdyaXRlIGZhaWxlZDolZFxuIiwgYnR2LT5jLm5yLHJjKTsKCSAgLyogbm90IFBYQyA/IGRvIG5vdGhpbmcgKi8KCSAgcmV0dXJuOwoJfQoKCXJjPWJ0dHZfSTJDUmVhZChidHYsKFBYX0kyQ19QSUM8PDEpLE5VTEwpOwoJaWYgKCEocmMgJiBQWF9DRkdfUFhDMjAwRikpIHsKCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogbm90IFBYQzIwMEYgcmM6JWQgXG4iLCBidHYtPmMubnIscmMpOwoJICByZXR1cm47Cgl9CgoKCS8qIFRoZSBtdWx0aXBsZXhlciBpbiB0aGUgMjAwRiBpcyBoYW5kbGVkIGJ5IHRoZSBHUElPIHBvcnQgKi8KCS8qIGdldCBjb3JyZWN0IG1hcHBpbmcgYmV0d2VlbiBpbnB1dHMgICovCgkvKiAgbXV4ID0gYnR0dl90dmNhcmRzW2J0di0+dHlwZV0ubXV4c2VsW2lucHV0XSAmIDM7ICovCgkvKiAqKiBub3QgbmVlZGVkIT8gICAqLwoJbXV4ID0gaW5wdXQ7CgoJLyogbWFrZSBzdXJlIG91dHB1dCBwaW5zIGFyZSBlbmFibGVkICovCgkvKiBiaXRtYXNrPTB4MzBmOyAqLwoJYml0bWFzaz0weDMwMjsKCS8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIFBYQzIwMEEgKi8KIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpICB7CgkgICBiaXRtYXNrIF49IDB4MTgwOyAvKiB1c2UgNyBhbmQgOSwgbm90IDggYW5kIDkgKi8KCSAgIGJpdG1hc2sgfD0gNzw8NDsgLyogdGhlIERBQyAqLwoJfQoJYnR3cml0ZShiaXRtYXNrLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYml0bWFzayA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MjgwKSB8ICgobXV4ICYgMikgPDwgOCkgfCAoKG11eCAmIDEpIDw8IDcpOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MzAwKSB8ICgobXV4ICYgMykgPDwgOCk7CglidHdyaXRlKGJpdG1hc2ssQlQ4NDhfR1BJT19EQVRBKTsKCgkvKgoJICogV2FzICJ0byBiZSBzYWZlLCBzZXQgdGhlIGJ0ODQ4IHRvIGlucHV0IDAiCgkgKiBBY3R1YWxseSwgc2luY2UgaXQncyBvayBhdCBsb2FkIHRpbWUsIGJldHRlciBub3QgbWVzc2luZwoJICogd2l0aCB0aGVzZSBiaXRzIChvbiBQWEMyMDBBRiB5b3UgbmVlZCB0byBzZXQgbXV4IDIgaGVyZSkKCSAqCgkgKiBuZWVkZWQgYmVjYXVzZSBidHR2LWRyaXZlciBzZXRzIG11eCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCgkgKi8KIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpCgkgIGJ0YW9yKDI8PDUsIH5CVDg0OF9JRk9STV9NVVhTRUwsIEJUODQ4X0lGT1JNKTsKCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCgkgIGJ0YW5kKH5CVDg0OF9JRk9STV9NVVhTRUwsQlQ4NDhfSUZPUk0pOwoKCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLChpbnQpbXV4KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbW90aGVyYm9hcmQgY2hpcHNldCBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnZvaWQgX19kZXZpbml0IGJ0dHZfY2hlY2tfY2hpcHNldCh2b2lkKQp7CglpbnQgcGNpcGNpX2ZhaWwgPSAwOwoJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CgoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfRkFJTCkKCQlwY2lwY2lfZmFpbCA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIChQQ0lQQ0lfVFJJVE9OfFBDSVBDSV9OQVRPTUF8UENJUENJX1ZJQUVUQkYpKQoJCXRyaXRvbjEgPSAxOwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVlNGWCkKCQl2c2Z4ID0gMTsKI2lmZGVmIFBDSVBDSV9BTElNQUdJSwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfQUxJTUFHSUspCgkJbGF0ZW5jeSA9IDB4MEE7CiNlbmRpZgoKCgkvKiBwcmludCB3YXJuaW5ncyBhYm91dCBhbnkgcXVpcmtzIGZvdW5kICovCglpZiAodHJpdG9uMSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKCWlmICh2c2Z4KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIG5lZWRzIFZTRlggZW5hYmxlZC5cbiIpOwoJaWYgKHBjaXBjaV9mYWlsKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogQlQ4NDggYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgdG9nZXRoZXIuXG4iKTsKCQlpZiAoIW5vX292ZXJsYXkpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogb3ZlcmxheSB3aWxsIGJlIGRpc2FibGVkLlxuIik7CgkJCW5vX292ZXJsYXkgPSAxOwoJCX0gZWxzZSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IG92ZXJsYXkgZm9yY2VkLiBVc2UgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzay5cbiIpOwoJCX0KCX0KCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IHBjaSBsYXRlbmN5IGZpeHVwIFslZF1cbiIsbGF0ZW5jeSk7CgoJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEsIGRldikpKSB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CgkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUzLCAmYik7CgkJaWYgKGJ0dHZfZGVidWcpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlOiA4MjQ0MUZYIE5hdG9tYSwgIgoJCQkgICAgICAgImJ1ZmNvbj0weCUwMnhcbiIsYik7Cgl9Cn0KCmludCBfX2RldmluaXQgYnR0dl9oYW5kbGVfY2hpcHNldChzdHJ1Y3QgYnR0diAqYnR2KQp7CiAJdW5zaWduZWQgY2hhciBjb21tYW5kOwoKCWlmICghdHJpdG9uMSAmJiAhdnNmeCAmJiBVTlNFVCA9PSBsYXRlbmN5KQoJCXJldHVybiAwOwoKCWlmIChidHR2X3ZlcmJvc2UpIHsKCQlpZiAodHJpdG9uMSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBFVEJGICg0MzBGWC9WUDMgY29tcGF0aWJpbHR5KVxuIixidHYtPmMubnIpOwoJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIFZTRlhcbiIsYnR2LT5jLm5yKTsKCQlpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKCX0KCglpZiAoYnR2LT5pZCA8IDg3OCkgewoJCS8qIGJ0ODQ4IChtaXMpdXNlcyBhIGJpdCBpbiB0aGUgaXJxIG1hc2sgZm9yIGV0YmYgKi8KCQlpZiAodHJpdG9uMSkKCQkJYnR2LT50cml0b24xID0gQlQ4NDhfSU5UX0VUQkY7Cgl9IGVsc2UgewoJCS8qIGJ0ODc4IGhhcyBhIGJpdCBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSBmb3IgaXQgKi8KICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIEJUODc4X0RFVkNUUkwsICZjb21tYW5kKTsKCQlpZiAodHJpdG9uMSkKCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9UQkZYOwoJCWlmICh2c2Z4KQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1ZTRlg7CiAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgQlQ4NzhfREVWQ1RSTCwgY29tbWFuZCk7CiAgICAgICAgfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIFBDSV9MQVRFTkNZX1RJTUVSLCBsYXRlbmN5KTsKCXJldHVybiAwOwp9CgoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=