LyoKICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS40OSAyMDA1LzA2LzEwIDE3OjIwOjI0IG1jaGVoYWIgRXhwICQKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSAiYnR0dnAuaCIKI2lmIDAgLyogbm90IHdvcmtpbmcgeWV0ICovCiNpbmNsdWRlICJidDgzMi5oIgojZW5kaWYKCi8qIGZ3ZCBkZWNsICovCnN0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKc3RhdGljIHZvaWQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGluaXRfUlRWMjQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAoJCQkJICAgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIHRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCB3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyBpbnQgdGVhNTc1N193cml0ZShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgdmFsdWUpOwpzdGF0aWMgdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSk7CnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpOwoKLyogY29uZmlnIHZhcmlhYmxlcyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IHRyaXRvbjE9MDsKc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4PTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IG5vX292ZXJsYXk9LTE7CgpzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRbQlRUVl9NQVhdICAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHBsbFtCVFRWX01BWF0gICAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHR1bmVyW0JUVFZfTUFYXSAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHN2aHNbQlRUVl9NQVhdICAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHJlbW90ZVtCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgc3RydWN0IGJ0dHYgICptYXN0ZXJbQlRUVl9NQVhdID0geyBbIDAgLi4uIChCVFRWX01BWC0xKSBdID0gTlVMTCB9OwojaWZkZWYgTU9EVUxFCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAxOwojZWxzZQpzdGF0aWMgdW5zaWduZWQgaW50IGF1dG9sb2FkID0gMDsKI2VuZGlmCnN0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb21hc2sgPSBVTlNFVDsKc3RhdGljIHVuc2lnbmVkIGludCBhdWRpb2FsbCA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvbXV4WzVdID0geyBbIDAgLi4uIDQgXSA9IFVOU0VUIH07CgovKiBpbnNtb2Qgb3B0aW9ucyAqLwptb2R1bGVfcGFyYW0odHJpdG9uMSwgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKHZzZngsICAgICAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShub19vdmVybGF5LCBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0obGF0ZW5jeSwgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGdwaW9tYXNrLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdWRpb2FsbCwgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oYXV0b2xvYWQsICAgaW50LCAwNDQ0KTsKCm1vZHVsZV9wYXJhbV9hcnJheShjYXJkLCAgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHBsbCwgICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkodHVuZXIsICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShzdmhzLCAgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHJlbW90ZSwgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkoYXVkaW9tdXgsIGludCwgTlVMTCwgMDQ0NCk7CgpNT0RVTEVfUEFSTV9ERVNDKHRyaXRvbjEsInNldCBFVEJGIHBjaSBjb25maWcgYml0ICIKCQkgIltlbmFibGUgYnVnIGNvbXBhdGliaWxpdHkgZm9yIHRyaXRvbjEgKyBvdGhlcnNdIik7Ck1PRFVMRV9QQVJNX0RFU0ModnNmeCwic2V0IFZTRlggcGNpIGNvbmZpZyBiaXQgIgoJCSAiW3lldCBhbm90aGVyIGNoaXBzZXQgZmxhdyB3b3JrYXJvdW5kXSIpOwpNT0RVTEVfUEFSTV9ERVNDKGxhdGVuY3ksInBjaSBsYXRlbmN5IHRpbWVyIik7Ck1PRFVMRV9QQVJNX0RFU0MoY2FyZCwic3BlY2lmeSBUVi9ncmFiYmVyIGNhcmQgbW9kZWwsIHNlZSBDQVJETElTVCBmaWxlIGZvciBhIGxpc3QiKTsKTU9EVUxFX1BBUk1fREVTQyhwbGwsInNwZWNpZnkgaW5zdGFsbGVkIGNyeXN0YWwgKDA9bm9uZSwgMjg9MjggTUh6LCAzNT0zNSBNSHopIik7Ck1PRFVMRV9QQVJNX0RFU0ModHVuZXIsInNwZWNpZnkgaW5zdGFsbGVkIHR1bmVyIHR5cGUiKTsKTU9EVUxFX1BBUk1fREVTQyhhdXRvbG9hZCwiYXV0b21hdGljYWxseSBsb2FkIGkyYyBtb2R1bGVzIGxpa2UgdHVuZXIubywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBsaXN0IG9mIGNhcmQgSURzIGZvciBidDg3OCsgY2FyZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHN0cnVjdCBDQVJEIHsKCXVuc2lnbmVkIGlkOwoJaW50IGNhcmRucjsKCWNoYXIgKm5hbWU7Cn0gY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewoJeyAweDEzZWIwMDcwLCBCVFRWX0hBVVBQQVVHRTg3OCwgICJIYXVwcGF1Z2UgV2luVFYiIH0sCgl7IDB4MzkwMDAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UVi1EIiB9LAoJeyAweDQ1MDAwMDcwLCBCVFRWX0hBVVBQQVVHRVBWUiwgICJIYXVwcGF1Z2UgV2luVFYvUFZSIiB9LAoJeyAweGZmMDAwMDcwLCBCVFRWX09TUFJFWTF4MCwgICAgICJPc3ByZXktMTAwIiB9LAoJeyAweGZmMDEwMDcwLCBCVFRWX09TUFJFWTJ4MF9TVklELCJPc3ByZXktMjAwIiB9LAoJeyAweGZmMDIwMDcwLCBCVFRWX09TUFJFWTUwMCwgICAgICJPc3ByZXktNTAwIiB9LAoJeyAweGZmMDMwMDcwLCBCVFRWX09TUFJFWTIwMDAsICAgICJPc3ByZXktMjAwMCIgfSwKCXsgMHhmZjA0MDA3MCwgQlRUVl9PU1BSRVk1NDAsICAgICAiT3NwcmV5LTU0MCIgfSwKCgl7IDB4MDAwMTEwMDIsIEJUVFZfQVRJX1RWV09OREVSLCAgIkFUSSBUViBXb25kZXIiIH0sCgl7IDB4MDAwMzEwMDIsIEJUVFZfQVRJX1RWV09OREVSVkUsIkFUSSBUViBXb25kZXIvVkUiIH0sCgoJeyAweDY2MDYxMDdkLCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHg2NjA3MTA3ZCwgQlRUVl9XSU5GQVNUVkMxMDAsICAiTGVhZHRlayBXaW5GYXN0IFZDIDEwMCIgfSwKCXsgMHg2NjA5MTA3ZCwgQlRUVl9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBUViAyMDAwIFhQIiB9LAoJeyAweDI2MzYxMGI0LCBCVFRWX1NUQjIsICAgICAgICAgICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IiB9LAoJeyAweDI2NDUxMGI0LCBCVFRWX1NUQjIsICAgICAgICAgICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IiB9LAogCXsgMHg0MDIwMTBmYywgQlRUVl9HVkJDVFYzUENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFYzL1BDSSIgfSwKCXsgMHg0MDUwMTBmYywgQlRUVl9HVkJDVFY0UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY0L1BDSSIgfSwKCXsgMHg0MDcwMTBmYywgQlRUVl9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKIAl7IDB4ZDAxODEwZmMsIEJUVFZfR1ZCQ1RWNVBDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWNS9QQ0kiIH0sCgoJeyAweDAwMTIxMWJkLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIiB9LAoJLy8gc29tZSBjYXJkcyBzaGlwIHdpdGggYnl0ZXN3YXBwZWQgSURzIC4uLgoJeyAweDEyMDBiZDExLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIFtic3dhcF0iIH0sCgl7IDB4ZmYwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCS8vIHRoaXMgc2VlbXMgdG8gaGFwcGVuIGFzIHdlbGwgLi4uCgl7IDB4ZmYxMjExYmQsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgoJeyAweDMwMDAxMjFhLCBCVFRWX1ZPT0RPT1RWX0ZNLCAgICIzRGZ4IFZvb2Rvb1RWIEZNLyBWb29kb29UViAyMDAiIH0sCgl7IDB4MjYzNzEwYjQsIEJUVFZfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgzMDYwMTIxYSwgQlRUVl9TVEIyLAkgICIzRGZ4IFZvb2Rvb1RWIDEwMC8gU1RCIE9FTSIgfSwKCgl7IDB4MzAwMDE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDZ4IiB9LAoJeyAweGEwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJDUEgwNlggVFZpZXc5OS1DYXJkIiB9LAoJeyAweDMwMDIxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA1eCIgfSwKCXsgMHgzMDA1MTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNjEvMDZMIChUMS9MQykiIH0sCgl7IDB4NTAwMDE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIkFza2V5IENQSDA1MCIgfSwKCXsgMHgzMDAwMTRmZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiVFZpZXcgOTkgKENQSDA2MSkiIH0sCgl7IDB4MzAwMjE0ZmYsIEJUVFZfUEhPRUJFX1RWTUFTLCAgIlBob2ViZSBUViBNYXN0ZXIgKENQSDA2MCkiIH0sCgoJeyAweDAwMDExNDYxLCBCVFRWX0FWUEhPTkU5OCwgICAgICJBVmVyTWVkaWEgVFZQaG9uZTk4IiB9LAoJeyAweDAwMDIxNDYxLCBCVFRWX0FWRVJNRURJQTk4LCAgICJBVmVybWVkaWEgVFZDYXB0dXJlIDk4IiB9LAoJeyAweDAwMDMxNDYxLCBCVFRWX0FWUEhPTkU5OCwgICAgICJBVmVyTWVkaWEgVFZQaG9uZTk4IiB9LAoJeyAweDAwMDQxNDYxLCBCVFRWX0FWRVJNRURJQTk4LCAgICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiB9LAoJeyAweDAzMDAxNDYxLCBCVFRWX0FWRVJNRURJQTk4LCAgICJWRE9NQVRFIFRWIFRVTkVSIENBUkQiIH0sCgoJeyAweDExMTcxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKFBoaWxpcHMgUEFMIEIvRykiIH0sCgl7IDB4MTExODE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoVGVtaWMgUEFMIEIvRykiIH0sCgl7IDB4MTExOTE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgSSkiIH0sCgl7IDB4MTExYTE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoVGVtaWMgUEFMIEkpIiB9LAoKCXsgMHgxMTIzMTUzYiwgQlRUVl9URVJSQVRWUkFESU8sICAiVGVycmF0ZWMgVFYgUmFkaW8rIiB9LAoJeyAweDExMjcxNTNiLCBCVFRWX1RFUlJBVFYsICAgICAgICJUZXJyYXRlYyBUVisgKFYxLjA1KSIgICAgfSwKCS8vIGNsYXNoZXMgd2l0aCBGbHlWaWRlbwoJLy97IDB4MTg1MjE4NTIsIEJUVFZfVEVSUkFUViwgICAgICJUZXJyYXRlYyBUVisgKFYxLjEwKSIgICAgfSwKCXsgMHgxMTM0MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChMUjEwMikiIH0sCgl7IDB4MTEzNTE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLy8gTFIxMDIKCXsgMHg1MDE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIiB9LCAgICAgICAvLyA/PwoJeyAweGZmM2IxNTNiLCBCVFRWX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8vID8/CgoJeyAweDQwMDAxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIiB9LAoJeyAweDQwMGExNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIiB9LAoJeyAweDQwMGQxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgl7IDB4NDAxMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDE2MTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoKCXsgMHgxNDMwYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNBIiB9LAoJeyAweDE0MzFhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0IiIH0sCgl7IDB4MTQzMmFhMDAsIEJUVFZfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQyIgfSwKCXsgMHgxNDMzYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNEIiB9LAoJeyAweDE0MzNhYTAzLCBCVFRWX1BWMTQzLCAgICAgICAgICJTZWN1cml0eSBFeWVzIiB9LAoKCXsgMHgxNDYwYWEwMCwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTEiIH0sCgl7IDB4MTQ2MWFhMDEsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0yIiB9LAoJeyAweDE0NjJhYTAyLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMyIgfSwKCXsgMHgxNDYzYWEwMywgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTQiIH0sCgoJeyAweDE0NjRhYTA0LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMSIgfSwKCXsgMHgxNDY1YWEwNSwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTIiIH0sCgl7IDB4MTQ2NmFhMDYsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0zIiB9LAoJeyAweDE0NjdhYTA3LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItNCIgfSwKCgl7IDB4YTEzMmZmMDAsIEJUVFZfSVZDMTAwLCAgICAgICAgIklWQy0xMDAiICB9LAoJeyAweGExNTUwMDAwLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMSwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDIsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAzLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDEwMCwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDEsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAyLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMywgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE4MmZmMDAsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAxLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDMsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA0LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDYsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA3LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOCwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDksIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBhLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGMsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBkLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGYsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoKCXsgMHg0MTQyNDM0NCwgQlRUVl9HUkFORFRFQywgICAgICAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSIgfSwKCXsgMHgwMTAyMDMwNCwgQlRUVl9YR1VBUkQsICAgICAgICAiR3JhbmR0ZWMgR3JhbmQgWC1HdWFyZCIgfSwKCgl7IDB4MTg1MDE4NTEsIEJUVFZfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweGEwNTAxODUxLCBCVFRWX0NIUk9OT1NfVlMyLCAgICJGbHlWaWRlbyA5OCAoTFI1MCkvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIgfSwKCXsgMHgxODUxMTg1MSwgQlRUVl9GTFlWSURFTzk4RVosICAiRmx5VmlkZW8gOThFWiAoTFI1MSkvIEN5YmVyTWFpbCBBViIgfSwKCXsgMHgxODUyMTg1MiwgQlRUVl9UWVBIT09OX1RWSUVXLCAiRmx5VmlkZW8gOThGTSAoTFI1MCkvIFR5cGhvb24gVFZpZXcgVFYvRk0gVHVuZXIiIH0sCgl7IDB4NDFhMGEwNTEsIEJUVFZfRkxZVklERU9fOThGTSwgIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAgUmV2IFEiIH0sCgl7IDB4MTg1MDFmN2YsIEJUVFZfRkxZVklERU9fOTgsICAgIkxpZmV2aWV3IEZseXZpZGVvIDk4IiB9LAoKICAgIAl7IDB4MDEwMTE1Y2IsIEJUVFZfR01WMSwgICAgICAgICAgIkFHIEdNVjEiIH0sCgl7IDB4MDEwMTE0YzcsIEJUVFZfTU9EVEVDXzIwNSwgICAgIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWIiB9LAoKCXsgMHgxMGI0MjYzNiwgQlRUVl9IQVVQUEFVR0U4NzgsICAiU1RCID8/PyIgfSwKCXsgMHgyMTdkNjYwNiwgQlRUVl9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4ZmZmNmY2ZmYsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDAzMTE2MDAwLCBCVFRWX1NFTlNPUkFZMzExLCAgICJTZW5zb3JheSAzMTEiIH0sCgl7IDB4MDA3OTBlMTEsIEJUVFZfV0lORFZSLCAgICAgICAgIkNhbm9wdXMgV2luRFZSIFBDSSIgfSwKCXsgMHhhMGZjYTFhMCwgQlRUVl9aT0xUUklYLCAgICAgICAiRmFjZSB0byBGYWNlIFR2bWF4IiB9LAoJeyAweDIwMDA3MDYzLCBCVFRWX1BDX0hEVFYsICAgICAgICJwY0hEVFYgSEQtMjAwMCBUViJ9LAoJeyAweDgyYjJhYTZhLCBCVFRWX1NJTVVTX0dWQzExMDAsICJTSU1VUyBHVkMxMTAwIiB9LAoJeyAweDE0NmNhYTBjLCBCVFRWX1BWOTUxLCAgICAgICAgICJpdHVuZXIgc3BlY3RyYTgiIH0sCiAJeyAweDIwMGExMjk1LCBCVFRWX1BYQzIwMCwgICAgICAgICJJbWFnZU5hdGlvbiBQWEMyMDBBIiB9LAoKCXsgMHg0MDExMTU1NCwgQlRUVl9QVl9CVDg3OFBfOUIsICAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQiIH0sCgl7IDB4MTdkZTBhMDEsIEJUVFZfS1dPUkxELCAgICAgICAgIk1lY2VyIFRWL0ZNL1ZpZGVvIFR1bmVyIiB9LAoKCXsgMHgwMTA1MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMxIiB9LAoJeyAweDAxMDYxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzIiIH0sCgl7IDB4MDEwNzE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMyIgfSwKCXsgMHgwMTA4MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICM0IiB9LAoKCS8vIGxpa2VseSBicm9rZW4sIHZlbmRvciBpZCBkb2Vzbid0IG1hdGNoIHRoZSBvdGhlciBtYWdpYyB2aWV3cyAuLi4KCS8veyAweGEwZmNhMDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LAoKCS8vIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikKCXsgMHgwMTAxMDA3MSwgQlRUVl9ORUJVTEFfRElHSVRWLCAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIgfSwKCXsgMHgwNzYxMTQ2MSwgQlRUVl9BVkRWQlRfNzYxLCAgICAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiIH0sCgl7IDB4MDAxYzExYmQsIEJUVFZfUElOTkFDTEVTQVQsICAgIlBpbm5hY2xlIFBDVFYgU2F0IiB9LAoJeyAweDAwMjYxMWJkLCBCVFRWX1RXSU5IQU5fRFNULCAgICJQaW5uYWNsZSBQQ1RWIFNBVCBDSSIgfSwKCXsgMHgwMDAxMTgyMiwgQlRUVl9UV0lOSEFOX0RTVCwgICAiVHdpbmhhbiBWaXNpb25QbHVzIERWQiIgfSwKCXsgMHhmYzAwMjcwZiwgQlRUVl9UV0lOSEFOX0RTVCwgICAiQ2hhaW5UZWNoIGRpZ2l0b3AgRFNULTEwMDAgRFZCLVMiIH0sCgl7IDB4MDc3MTE0NjEsIEJUVFZfQVZEVkJUXzc3MSwgICAgIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAoJeyAweGRiMTAxOGFjLCBCVFRWX0RWSUNPX0RWQlRfTElURSwgICAgIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKCgl7IDAsIC0xLCBOVUxMIH0KfTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGFycmF5IHdpdGggZGVzY3JpcHRpb24gZm9yIGJ0ODQ4IC8gYnQ4NzggdHYvZ3JhYmJlciBjYXJkcyAgICAgICAgICAgICAgICovCgpzdHJ1Y3QgdHZjYXJkIGJ0dHZfdHZjYXJkc1tdID0gewp7Ci8qIC0tLS0gY2FyZCAweDAwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICIgKioqIFVOS05PV04vR0VORVJJQyAqKiogIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJNSVJPIFBDVFYiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAyLCAwLCAwLCAwLCAxMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODQ4KSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gNywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJTVEIsIEdhdGV3YXkgUC9OIDYwMDA2OTkgKGJ0ODQ4KSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gNywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkubm9fbXNwMzR4eAk9IDEsCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCi8qIC0tLS0gY2FyZCAweDA0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJJbnRlbCBDcmVhdGUgYW5kIFNoYXJlIFBDSS8gU21hcnQgVmlkZW8gUmVjb3JkZXIgSUlJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSA0LAp9LHsKCS5uYW1lCQk9ICJEaWFtb25kIERUVjIwMDAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDMsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXgJPSB7IDAsIDEsIDAsIDEsIDN9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5ncGlvbWFzawk9IDB4MGYsCgkuYXVkaW9tdXgJPSB7IDB4MGMsIDB4MDQsIDB4MDgsIDB4MDQsIDB9LAoJLyogICAgICAgICAgICAgICAgMHgwNCBmb3Igc29tZSBjYXJkcyA/PyAqLwoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIiwKCS52aWRlb19pbnB1dHMJPSA1LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwfSwKCS5hdWRpb211eAk9IHswIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDA4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSAoQnQ4NDgpIExSMjYgLyBNQVhJIFRWIFZpZGVvIFBDSTIgTFIyNiIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhjMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4YzAwLCAweDgwMCwgMHg0MDAsIDB4YzAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiSU1TL0lYbWljcm8gVHVyYm9UViIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMSwgMSwgMiwgMywgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAp9LHsKCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwZiwgLyogb2xkOiA3ICovCgkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJNSVJPIFBDVFYgcHJvIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDMwMTRmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDIwMDAxLDB4MTAwMDEsIDAsIDAsMTB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgwYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiQURTIFRlY2hub2xvZ2llcyBDaGFubmVsIFN1cmZlciBUViAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDQsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkubXNwMzR4eF9hbHQgICAgPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmF1ZGlvX2hvb2sgICAgID0gYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbywKfSx7CgkubmFtZQkJPSAiQWltc2xhYiBWaWRlbyBIaWdod2F5IFh0cmVtZSAoVkhYKSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gNywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMiwgMSwgMywgNH0sIC8qIG9sZDogeyAwLCAxLCAyLCAzLCA0fSAqLwoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJab2x0cml4IFRWLU1heCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MCAsIDAsIDEgLCAwLCAxMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDEwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQbGF5VFYgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCiNpZiAwCgkvLyBvbGQKCS5hdWRpb211eAk9IHsgMHgwMWMwMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKI2Vsc2UKCS8vIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PgoJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAojZW5kaWYKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGVhZHRlayBXaW5WaWV3IDYwMSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHg4MzAwZjgsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwwfSwKCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDd9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5hdWRpb19ob29rCT0gd2ludmlld19hdWRpbywKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS5uYW1lCQk9ICJBVkVDIEludGVyY2FwdHVyZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAyLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezEsIDAsIDAsIDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gSUkgRVogL0ZseUtpdCBMUjM4IEJ0ODQ4IChjYXB0dXJlIG9ubHkpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDB4OGRmZjAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDE0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJDRUkgUmFmZmxlcyBDYXJkIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDMsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4LyBMdWNreSBTdGFyIEltYWdlIFdvcmxkIENvbmZlcmVuY2VUViBMUjUwIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDIsICAvLyB0dW5lciwgbGluZSBpbgoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKfSx7CgkubmFtZQkJPSAiQXNrZXkgQ1BIMDUwLyBQaG9lYmUgVHYgTWFzdGVyICsgRk0iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4YzAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezAsIDEsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViwgYnQ4NzgiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gLTEsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIC0xIH0sCiAgICAgICAgLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMCwgMCwgMCB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUxQU19UU0JCNV9QQUxfSSwKfSx7CgovKiAtLS0tIGNhcmQgMHgxOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiQXNrZXkgQ1BIMDVYLzA2WCAoYnQ4NzgpIFttYW55IHZlbmRvcnNdIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHhjMDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjAgKEJ0ODQ4KS8gVGVycmEgVFZhbHVlIFZlcnNpb24gMS4wLyBWb2JpcyBUVi1Cb29zdGFyIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDFmMGZmZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMCwgMHg0MDAwMH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmF1ZGlvX2hvb2sgICAgID0gdGVycmF0dl9hdWRpbywKfSx7CgkubmFtZQkJPSAiSGF1cHBhdWdlIFdpbkNhbSBuZXdlciAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDAsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4LyBNQVhJIFRWIFZpZGVvIFBDSTIgTFI1MCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAyLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfU0VDQU0sCn0sewoKLyogLS0tLSBjYXJkIDB4MWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFYrIFZlcnNpb24gMS4xIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MWYwZmZmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAweDAwMDAwLCAweDQwMDAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vawk9IHRlcnJhdHZfYXVkaW8sCgkvKiBHUElPIHdpcmluZzoKICAgICAgICAgICAgICAgRXh0ZXJuYWwgMjAgcGluIGNvbm5lY3RvciAoZm9yIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGJvYXJkKQogICAgICAgICAgICAgICBncGlvMDA6IGkyYy1zZGEKICAgICAgICAgICAgICAgZ3BpbzAxOiBpMmMtc2NsCiAgICAgICAgICAgICAgIGdwaW8wMjogb201NjEwLWRhdGEKICAgICAgICAgICAgICAgZ3BpbzAzOiBvbTU2MTAtY2xrCiAgICAgICAgICAgICAgIGdwaW8wNDogb201NjEwLXdyZQogICAgICAgICAgICAgICBncGlvMDU6IG9tNTYxMC1zdGVyZW8KICAgICAgICAgICAgICAgZ3BpbzA2OiByZHM2NTg4LWRhdm4KICAgICAgICAgICAgICAgZ3BpbzA3OiBQaW4gNyBuLmMuCiAgICAgICAgICAgICAgIGdwaW8wODogbklPVwogICAgICAgICAgICAgICBncGlvMDkrMTA6IG5JT1IsIG5TRUwgPz8gKGJ0ODc4KQogICAgICAgICAgICAgICAgZ3BpbzA5OiBuSU9SIChidDg0OCkKICAgICAgICAgICAgICAgIGdwaW8xMDogblNFTCAoYnQ4NDgpCiAgICAgICAgICAgICAgU291bmQgUm91dGluZzoKICAgICAgICAgICAgICAgZ3BpbzE2OiB1Mi1BMCAoMXN0IDQwNTJidCkKICAgICAgICAgICAgICAgZ3BpbzE3OiB1Mi1BMQogICAgICAgICAgICAgICBncGlvMTg6IHUyLW5FTgogICAgICAgICAgICAgICBncGlvMTk6IHU0LUEwICgybmQgNDA1MikKICAgICAgICAgICAgICAgZ3BpbzIwOiB1NC1BMQogICAgICAgICAgICAgICAgICAgICAgIHU0LW5FTiAtIEdORAoJICAgIEJ0c3B5OgoJICAJMDAwMDAgOiBDZHJvbSAoaW50ZXJuYWwgYXVkaW8gaW5wdXQpCgkJMTAwMDAgOiBleHQuIFZpZGVvIGF1ZGlvIGlucHV0CgkJMjAwMDAgOiBUViBNb25vCgkJYTAwMDAgOiBUViBNb25vLzIKCSAgICAgICAxYTAwMDAgOiBUViBTdGVyZW8KCQkzMDAwMCA6IFJhZGlvCgkJNDAwMDAgOiBNdXRlCiAgICAgICAqLwoKfSx7CgkvKiBKYW5uaWsgRnJpdHNjaCA8amFubmlrQHRlY2hmYWsudW5pLWJpZWxlZmVsZC5kZT4gKi8KCS5uYW1lCQk9ICJJbWFnZW5hdGlvbiBQWEMyMDAiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDEsIC8qIHdhczogNCAqLwoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwfSwKCS5hdWRpb211eAk9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5tdXhzZWxfaG9vayAgICA9IFBYQzIwMF9tdXhzZWwsCgp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsICAvLzB4OGRmZTAwCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4MDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiRm9ybWFjIGlQcm9UViwgRm9ybWFjIFByb1RWIEkgKGJ0ODQ4KSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gMSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMSwgMCwgMCwgMCwgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKfSx7CgovKiAtLS0tIGNhcmQgMHgyMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiSW50ZWwgQ3JlYXRlIGFuZCBTaGFyZSBQQ0kvIFNtYXJ0IFZpZGVvIFJlY29yZGVyIElJSSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS50dW5lcl90eXBlCT0gNCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVmFsdWUgVmVyc2lvbiBCdDg3OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhmZmZmMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4NTAwLCAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKfSx7CgkubmFtZQkJPSAiTGVhZHRlayBXaW5GYXN0IDIwMDAvIFdpbkZhc3QgMjAwMCBYUCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDB9LCAvLyBUViwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCiNpZiAwCgkuZ3Bpb21hc2sJPSAweGMzMzAwMCwKCS5hdWRpb211eAk9IHsgMHg0MjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAojZWxzZQoJLyogQWxleGFuZGVyIFZhcmFraW4gPGF2YXJha2luQGhvdG1haWwuY29tPiBbc3RlcmVvIHZlcnNpb25dICovCgkuZ3Bpb21hc2sJPSAweGIzMzAwMCwKCS5hdWRpb211eAk9IHsgMHgxMjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAojZW5kaWYKCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKCQlncGlvMjMgLS0gaGVmNDA1MjpuRW5hYmxlICgweDgwMDAwMCkKCQlncGlvMTIgLS0gaGVmNDA1MjpBMQoJICAgICAgICBncGlvMTMgLS0gaGVmNDA1MjpBMAoJICAgIDB4MDAwMDogZXh0ZXJuYWwgYXVkaW8KCSAgICAweDEwMDA6IEZNCgkgICAgMHgyMDAwOiBUVgoJICAgIDB4MzAwMDogbi5jLgogICAgICAgICAgTm90ZTogVGhlcmUgZXhpc3RzIGFub3RoZXIgdmFyaWFudCAiV2luZmFzdCAyMDAwIiB3aXRoIHR2IHN0ZXJlbyAhPwoJICBOb3RlOiBlZXByb20gb25seSBjb250YWlucyBGRiBhbmQgcGNpIHN1YnN5c3RlbSBpZCAxMDdkOjY2MDYKCSAqLwoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnBsbAkJPSBQTExfMjgsCgkuaGFzX3JhZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gNSwgLy8gZGVmYXVsdCBmb3Igbm93LCBncGlvIHJlYWRzIEJGRkYwNiBmb3IgUGFsIGJnK2RrCgkuYXVkaW9faG9vawk9IHdpbmZhc3QyMDAwX2F1ZGlvLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCAvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4Rk0gTFI1MCAvIFR5cGhvb24gVFZpZXcgVFYvRk0gVHVuZXIiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsVmlldyBQbGF5VFYgcHJvIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCS5hdWRpb211eAk9IHsgMHgyMSwgMHgyMCwgMHgyNCwgMHgyYywgMHgyOSwgMHgyOSB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJBc2tleSBDUEgwNlggVFZpZXc5OSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHg1NTFlMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXgJPSB7IDB4NTUxNDAwLCAweDU1MTIwMCwgMCwgMCwgMHg1NTFjMDAsIDB4NTUxMjAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMSwKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvL1JhdmUiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAyLCAweGQwMDAxLCAwLCAwLCAxfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiU1RCIFRWIFBDSSBGTSwgR2F0ZXdheSBQL04gNjAwMDcwNCAoYnQ4NzgpLCAzRGZ4IFZvb2Rvb1RWIDEwMCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gNywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkubm9fbXNwMzR4eAk9IDEsCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSA5OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSA0LAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDEzLCA0LCAxMSwgNywgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkuaGFzX3JhZGlvCT0gMSwKCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCn0sewoJLm5hbWUJCT0gIlByb1ZpZGVvIFBWOTUxIiwgLyogcGljMTZjNTQgKi8KCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAxLAp9LHsKCS5uYW1lCQk9ICJMaXR0bGUgT25BaXIgVFYiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZTAwYiwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezB4ZmY5ZmY2LCAweGZmOWZmNiwgMHhmZjFmZjcsIDAsIDB4ZmYzZmZjfSwKCS5ub19tc3AzNHh4CT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlNpZ21hIFRWSUktRk0iLAoJLnZpZGVvX2lucHV0cwk9IDIsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gLTEsCgkuZ3Bpb21hc2sJPSAzLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MSwgMSwgMCwgMiwgM30sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF9OT05FLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTUFUUklYLVZpc2lvbiBNVi1EZWx0YSAyIiwKCS52aWRlb19pbnB1dHMJPSA1LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwfSwKCS5hdWRpb211eAk9IHswIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4YmNmMDNmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweGJjODAzZiwgMHhiYzkwM2YsIDB4YmNiMDNmLCAwLCAweGJjYjAzZn0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMjEsCn0sewoJLm5hbWUJCT0gIlRlcnJhdGVjIFRWL1JhZGlvKyIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHg3MDAwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMCwgMHg0MDAwMCwgMHgyMDAwMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMzUsCgkudHVuZXJfdHlwZQk9IDEsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgzMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiQXNrZXkgQ1BIMDN4LyBEeW5hbGluayBNYWdpYyBUVmlldyIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MiwwLDAsMCwxfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiSU9EQVRBIEdWLUJDVFYzL1BDSSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwMTBmMDAsCgkubXV4c2VsCQk9IHsyLCAzLCAwLCAwfSwKCS5hdWRpb211eAk9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9BTFBTX1RTSEM2X05UU0MsCgkuYXVkaW9faG9vawk9IGd2YmN0djNwY2lfYXVkaW8sCn0sewoJLm5hbWUJCT0gIlByb2xpbmsgUFYtQlQ4NzhQKzRFIC8gUGl4ZWxWaWV3IFBsYXlUViBQQUsgLyBMZW5jbyBNWFRWLTk1NzggQ1AiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMywKCS5ncGlvbWFzawk9IDB4QUEwMDAwLAoJLm11eHNlbAkJPSB7IDIsMywxLDEsLTEgfSwKCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDAsIDB4ODAwMDAsIDB4ODAwMDAsIDB4YTgwMDAsIDB4NDYwMDAgIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKCS5oYXNfcmVtb3RlCT0gMSwKCS8qIEdQSU8gd2lyaW5nOiAoZGlmZmVyZW50IGZyb20gUmV2LjRDICEpCgkJR1BJTzE3OiBVNC5BMCAoZmlyc3QgaGVmNDA1MmJ0KQoJCUdQSU8xOTogVTQuQTEKCQlHUElPMjA6IFU1LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCUdQSU8yMTogVTQubkVOCgkJR1BJTzIyOiBCVDgzMiBSZXNldCBMaW5lCgkJR1BJTzIzOiBBNSxBMCwgVTUsbkVOCgkgICBOb3RlOiBBdCBpMmM9MHg4YSBpcyBhIEJ0ODMyIGNoaXAsIHdoaWNoIGNoYW5nZXMgdG8gMHg4OCBhZnRlciBiZWluZyByZXNldCB2aWEgR1BJTzIyCgkgKi8KfSx7CgkubmFtZSAgICAgICAgICAgPSAiRWFnbGUgV2lyZWxlc3MgQ2Fwcmljb3JuMiAoYnQ4NzhBKSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEgLyogVFVORVJfQUxQU19UTURIMl9OVFNDICovLAp9LHsKCi8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERhdmlkIEjkcmRlbWFuIDxkYXZpZEAyZ2VuLmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAweGQwMDAxLCAwLCAwLCAxMH0sCgkJCS8qIHNvdW5kIHBhdGggKDUgc291cmNlcyk6CgkJCSAgIE1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKCQkJCTA9IGV4dC4gQXVkaW8gSU4KCQkJCTE9IGZyb20gTVVYMgoJCQkJMj0gTW9ubyBUViBzb3VuZCBmcm9tIFR1bmVyCgkJCQkzPSBub3QgY29ubmVjdGVkCgkJCSAgIE1VWDIgKG1hc2sgMHgzMDAwMCk6CgkJCQkwLDIsMz0gZnJvbSBNU1AzNHh4CgkJCQkxPSBGTSBzdGVyZW8gUmFkaW8gZnJvbSBUdW5lciAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIENsYWFzIExhbmdiZWhuIDxjbGFhc0BiaWdmb290LmNvbT4sCgkgICBTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLwoJLm5hbWUJCT0gIlR5cGhvb24gVFZpZXcgUkRTICsgRk0gU3RlcmVvIC8gS05DMSBUViBTdGF0aW9uIFJEUyIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxYywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCSAgIGluIGRlLmNvbXAub3MudW5peC5saW51eC5oYXJkd2FyZToKCQlvcHRpb25zIGJ0dHYgY2FyZD0wIHBsbD0xIHJhZGlvPTEgZ3Bpb21hc2s9MHgxOGUwCgkJYXVkaW9tdXg9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCW9wdGlvbnMgdHVuZXIgdHlwZT01ICovCgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMCAvRmx5VmlkZW8gQTIvIExpZmV0ZWMgTFQgOTQxNSBUViBbTFI5MF0iLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MThlMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MThlMCB9LAoJCSAgICAgICAvKiBGb3IgY2FyZHMgd2l0aCB0ZGE5ODIwL3RkYTk4MjE6CgkJCSAgMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCgkJCSAgMHgwMDgwOiBUdW5lciBBMiBTQVAgKHNlY29uZCBhdWRpbyBwcm9ncmFtID0gWndlaWthbmFsdG9uKQoJCQkgIDB4MDg4MDogVHVuZXIgQTIgc3RlcmVvICovCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KCSAgIG9sZCBFYXN5IFRWIEJUODQ4IHZlcnNpb24gKG1vZGVsIENQSDAzMSkgKi8KCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwMzEvIEJFU1RCVVkgRWFzeSBUViIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDM4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEdvcmRvbiBIZXlkb24gPGdqaGV5ZG9uQGJpZ2Zvb3QuY29tICgnOTgpICovCgkubmFtZSAgICAgICAgICAgPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThGTSBMUjUwIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAzLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDE4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gNSwKfSx7CgkvKiBUaGlzIGlzIHRoZSB1bHRpbWF0ZSBjaGVhcG8gY2FwdHVyZSBjYXJkCgkgKiBqdXN0IGEgQlQ4NDhBIG9uIGEgc21hbGwgUENCIQoJICogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjICdHcmFuZCBWaWRlbyBDYXB0dXJlJyAoQnQ4NDgpIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKICAgICAgICAvKiBEYW5pZWwgSGVycmluZ3RvbiA8ZGFuaWVsLmhlcnJpbmd0b25AaG9tZS5jb20+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MC8gUGhvZWJlIFRWIE1hc3RlciBPbmx5IChObyBGTSkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHhlMDAsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDgwMCwgMHg0MDAgfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ180MDM2Rlk1X05UU0MsCn0sewoJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLwoJLm5hbWUJCT0gIkFza2V5IENQSDAzeCBUViBDYXB0dXJlciIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMiwwLDAsMCwxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDAsCn0sewoKLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiAqLwoJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMTEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAxLCA4fSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCn0sewoJLyogQWRyaWFuIENveCA8YWRyaWFuQGh1bWJvbGR0LmNvLnVrICovCgkubmFtZQkgICAgICAgID0gIkFHIEVsZWN0cm9uaWNzIEdNVjEiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIJICAgICAgICA9IC0xLAoJLnN2aHMJICAgICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAweEYsCgkubXV4c2VsCSAgICAgICAgPSB7IDIsIDJ9LAoJLmF1ZGlvbXV4ICAgICAgID0geyB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsCSAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJICAgbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQoJICAgc3BlY2lhbCB0aGFua3MgdG8gSW5mb3JtYXRpY2EgTWllcmVzIGZvciBwcm92aWRpbmcgdGhlIGNhcmQgKi8KCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjEvIEJFU1RCVVkgRWFzeSBUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMiwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDEsIDAsIDQsIDQsIDl9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKfSx7CgkvKiBMdWthcyBHZWJhdWVyIDxnZWJ5QHZvbG55LmN6PiAqLwoJLm5hbWUJCT0gIkFUSSBUVi1Xb25kZXIiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZjAzZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkuYXVkaW9tdXgJPSB7IDB4YmZmZSwgMCwgMHhiZmZmLCAwLCAweGJmZmV9LAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDQwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCgkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciBWRSIsCgkudmlkZW9faW5wdXRzCT0gMiwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDEsCgkubXV4c2VsCQk9IHsgMiwgMywgMCwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDAsIDEsIDAsIDB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAp9LHsKCS8qIERlZUpheSA8ZGVlamF5QHdlc3RlbDkwMC5uZXQgKDIwMDBTKSAqLwoJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzawk9IDB4MThlMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCQkJLyogUmFkaW8gY2hhbmdlZCBmcm9tIDFlODAgdG8gMHg4MDAgdG8gbWFrZQoJCQkgICBGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCgkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4MDAsIDB4MTA4MCB9LAoJLmF1ZGlvX2hvb2sJPSBmdjIwMDBzX2F1ZGlvLAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDUsCn0sewoJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDB4NTAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS8qIFRBTkFLQSBLZWkgPHBlZzAwNjI1QG5pZnR5LmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjQvUENJIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAxMGYwMCwKCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQywKCS5hdWRpb19ob29rICAgICA9IGd2YmN0djNwY2lfYXVkaW8sCn0sewoKLyogLS0tLSBjYXJkIDB4NDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICIzRGZ4IFZvb2Rvb1RWIEZNIChFdXJvKSwgVm9vZG9vVFYgMjAwIChVU0EpIiwKCS8vIHRyeSAiaW5zbW9kIG1zcDM0MDAgc2ltcGxlPTAiIGlmIHlvdSBoYXZlCgkvLyBzb3VuZCBwcm9ibGVtcyB3aXRoIHRoaXMgY2FyZC4KICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDRmOGEwMCwKCS8vIDB4MTAwMDAwOiAxPU1TUCBlbmFibGVkICgwPWRpc2FibGUgYWdhaW4pCgkvLyAweDAxMDAwMDogQ29ubmVjdGVkIHRvICJTMCIgb24gdGRhOTg4MCAoMD1QYWwvQkcsIDE9TlRTQykKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCgkvLyB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbwoJLyogdHVuZXIsIENvbXBvc2l0LCBTVmlkLCBDb21wb3NpdC1vbi1TdmlkLWFkYXB0ZXIqLwogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMX0sCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAoJLnBsbAkJPSBQTExfMjgsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgkvKiBQaGlsaXAgQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPiAqLwoJLm5hbWUgICAgICAgICAgID0gIkFjdGl2ZSBJbWFnaW5nIEFJTU1TIiwKCS52aWRlb19pbnB1dHMgICA9IDEsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAoJLmdwaW9tYXNrICAgICAgID0gMAp9LHsKICAgICAgICAvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gNCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMTUsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDExLCA3LCAxMywgMH0sIC8vIFRWIGFuZCBSYWRpbyB3aXRoIHNhbWUgR1BJTyAhCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMjUsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAoJLyogR1BJTyB3aXJpbmc6CgkJR1BJTzA6IFU0LkEwIChoZWY0MDUyYnQpCgkJR1BJTzE6IFU0LkExCgkJR1BJTzI6IFU0LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCUdQSU8zOiBVNC5uRU4sIFU1LkEwLCBBNS5uRU4KCQlHUElPOC0xNTogdnJkODY2YiA/CgkgKi8KfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThFWiAoY2FwdHVyZSBvbmx5KSBMUjUxIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sIC8vIEFWMSwgQVYyLCBTVkhTLCBDVmlkIGFkYXB0ZXIgb24gU1ZIUwoJLnBsbAkJPSBQTExfMjgsCgkubm9fbXNwMzR4eAk9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4NDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4gKi8KCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVDg3OFArOUIgKFBsYXlUViBQcm8gcmV2LjlCIEZNK05JQ0FNKSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgzZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkuYXVkaW9tdXgJPSB7IDB4MDEsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDksIDB4MDIgfSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gNSwKCS5hdWRpb19ob29rCT0gcHZidDg3OHA5Yl9hdWRpbywgLy8gTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHN0ZXJlbwoJLmhhc19yYWRpbwk9IDEsICAvLyBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8KCS5oYXNfcmVtb3RlICAgICA9IDEsCgkvKiBHUElPIHdpcmluZzoKCQlHUElPMDogQTAgaGVmNDA1MgoJCUdQSU8xOiBBMSBoZWY0MDUyCgkJR1BJTzM6IG5FTiBoZWY0MDUyCgkJR1BJTzgtMTU6IHZyZDg2NmIKCQlHUElPMjAsMjIsMjM6IFIzMCxSMjksUjI4CgkgKi8KfSx7CgkvKiBDbGF5IEt1bnogPGNrdW56QG1haWwuYXJjLm5hc2EuZ292PiAqLwoJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwoJLm5hbWUgICAgICAgICAgID0gIlNlbnNvcmF5IDMxMSIsCgkudmlkZW9faW5wdXRzICAgPSA1LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gNCwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlJlbW90ZVZpc2lvbiBNWCAoUlY2MDUpIiwKCS52aWRlb19pbnB1dHMgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwN2ZmLAoJLm11eHNlbCAgICAgICAgID0geyAweDMzLCAweDEzLCAweDIzLCAweDQzLCAweGYzLCAweDczLCAweGUzLCAweDAzLAoJCQkgIDB4ZDMsIDB4YjMsIDB4YzMsIDB4NjMsIDB4OTMsIDB4NTMsIDB4ODMsIDB4YTMgfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkubXV4c2VsX2hvb2sgICAgPSBydjYwNV9tdXhzZWwsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAyLAoJLnR1bmVyCQk9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDFDODAwRiwgIC8vIEJpdDAtMjogQXVkaW8gc2VsZWN0LCA4LTEyOnJlbW90ZSBjb250cm9sIDE0OnJlbW90ZSB2YWxpZCAxNTpyZW1vdGUgcmVzZXQKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEsIH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCA0IH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5wbGwJCT0gUExMXzI4LAoJLmhhc19yYWRpbwk9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4NGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC8qIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkNhbm9wdXMgV2luRFZSIFBDSSAoQ09NUEFRIFByZXNhcmlvIDM1MjRKUCwgNTExMkpQKSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDE0MDAwNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQsIDAgfSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCiAgICAgICAgLmF1ZGlvX2hvb2sgICAgID0gd2luZHZyX2F1ZGlvLAp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSBDYXJkIChCdDg3OCkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDMsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDcsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLy8gVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvLyBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKCQkJCQkgIC8vIFRoaXMgY2FyZCBsYWNrcyBleHRlcm5hbCBBdWRpbyBJbiwgc28gd2UgbXV0ZSBpdCBvbiBFeHQuICYgSW50LgoJCQkJCSAgLy8gVGhlIFBDQiBjYW4gdGFrZSBhIHNieDE2Mzcvc2J4MTY3Mywgd2lyaW5nIHVua25vd24uCgkJCQkJICAvLyBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KCQkJCQkgIC8vIGF1ZGlvbXV4PTE6IGxvd2VyIHZvbHVtZSwgMiszOiBtdXRlCgkJCQkJICAvLyBidHdpbmNhcCB1c2VzIDB4ODAwMDAvMHg4MDAwMwogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwgLy8gU2Ftc3VuZyBUQ1BBOTA5NVBDMjdBIChCRytESyksIHBoaWxpcHMgY29tcGF0aWJsZSwgdy9GTSwgc3RlcmVvIGFuZAoJCQkgICAvLyByYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuCgkuaGFzX3JhZGlvCQk9IDEsCgkvKiBHUElPIEluZm86CgkJR1BJTzAsMTogICBIRUY0MDUyIEEwLEExCgkJR1BJTzI6ICAgICBIRUY0MDUyIG5FTkFCTEUKCQlHUElPMy03OiAgIG4uYy4KCQlHUElPOC0xMzogIElSREMzNTcgZGF0YTAtNSAoZGF0YTYgbi5jLiA/KSBbY2hpcCBub3QgcHJlc2VudCBvbiBteSBjYXJkXQoJCUdQSU8xNCwxNTogPz8KCQlHUElPMTYtMjE6IG4uYy4KCQlHUElPMjIsMjM6ID8/CgkJPz8gICAgICAgOiBtdHU4YjU2ZXAgbWljcm9jb250cm9sbGVyIGZvciBJUiAoR1BJTyB3aXJpbmcgdW5rbm93bikqLwp9LHsKICAgICAgICAvKiBBcnRodXIgVGV0emxhZmYtRGVhcywgRFNQIERlc2lnbiBMdGQgPHNvZnR3YXJlQGRzcGRlc2lnbi5jb20+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgogICAgICAgIC8qIC0tLS0gY2FyZCAweDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCgoJLmdwaW9tYXNrICAgICAgID0gNywKCS5hdWRpb211eCAgICAgICA9IHs3fSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY1L1BDSSIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwZjBmODAsCgkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7MHgwMzAwMDAsIDB4MDEwMDAwLCAwLCAwLCAweDAyMDAwMCwgMH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCgkuYXVkaW9faG9vayAgICAgPSBndmJjdHY1cGNpX2F1ZGlvLAoJLmhhc19yYWRpbyAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg3OCkiLCAvKiAweDEoMnwzKS00NUM2LUMxICovCgkudmlkZW9faW5wdXRzICAgPSA0LCAgICAgICAgICAgICAgICAgIC8qIGlkLWlucHV0cy1jbG9jayAqLwoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMywKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMiwgMCwgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDAvMTUwICg4NDgpIiwgLyogMHgwNC01NEMwLUMxICYgb2xkZXIgYm9hcmRzICovCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDU0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxICg4NDgpIiwgLyogMHgwNS00MEMwLUMxICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIiwgICAgICAgLyogMHgxKDR8NSktMDAwNC1DNCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMSwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLm11eHNlbCAgICAgICAgID0geyAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEgdy8gc3ZpZCIsICAvKiAweCgxNnwxN3wyMCktMDBDNC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzIwMS8yNTAvMjUxIiwgIC8qIDB4MSg4fDl8RXxGKS0wMDA0LUM0ICovCgkudmlkZW9faW5wdXRzICAgPSAxLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yNTAiLCAgIC8qIDB4MShBfEIpLTAwQzQtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAiLCAgIC8qIDB4MShBfEIpLTA0QzAtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDUwMCIsICAgLyogNTAwICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewogICAgICAgLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1NDAiLCAgIC8qIDU0MCAqLwogICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKI2lmIDAgLyogVE9ETyAuLi4gKi8KICAgICAgIC5zdmhzICAgICAgICAgICA9IE9TUFJFWTU0MF9TVklEX0FOQUxPRywKICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgICAgICAgW09TUFJFWTU0MF9DT01QX0FOQUxPR10gPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09TUFJFWTU0MF9TVklEX0FOQUxPR10gPSAzLCB9LAojZW5kaWYKICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAojaWYgMCAvKiBUT0RPIC4uLiAqLwogICAgICAgLm11eHNlbF9ob29rICAgID0gb3NwcmV5XzU0MF9tdXhzZWwsCiAgICAgICAucGljdHVyZV9ob29rICAgPSBvc3ByZXlfNTQwX3NldF9waWN0dXJlLAojZW5kaWYKfSx7CgoJLyogLS0tLSBjYXJkIDB4NUMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAwIiwgIC8qIDIwMDAgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwgICAgICAvKiBtdXN0IGF2b2lkLCBjb25mbGljdHMgd2l0aCB0aGUgYnQ4NjAgKi8KfSx7CgkvKiBNIEcgQmVyYmVyaWNoIDxiZXJiZXJpY0Bmb3J3aXNzLnVuaS1wYXNzYXUuZGU+ICovCgkubmFtZSAgICAgICAgICAgPSAiSURTIEVhZ2xlIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSwgMiwgMyB9LAoJLm11eHNlbF9ob29rICAgID0gZWFnbGVfbXV4c2VsLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgU2F0IiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAxLAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAxIH0sCgkubXV4c2VsICAgICAgICAgPSB7IDMsIDAsIDEsIDJ9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5ub19ncGlvaXJxICAgICA9IDEsCgkuaGFzX2R2YiAgICAgICAgPSAxLAp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRm9ybWFjIFByb1RWIElJIChidDg3OCkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDMsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMiwKCS8vIFRWLCBDb21wMSwgQ29tcG9zaXRlIG92ZXIgU1ZJRCBjb24sIFNWSUQKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMiwgMiwgMCwgMCwgMCB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCiAgICAgIC8qIHNvdW5kIHJvdXRpbmc6CiAgICAgICAgICAgR1BJTz0weDAwLDB4MDEsMHgwMzogbXV0ZSAoPykKICAgICAgICAgICAgICAweDAyOiBib3RoIFRWIGFuZCByYWRpbyAodHVuZXI6IEZNMTIxNi9JKQogICAgICAgICBUaGUgY2FyZCBoYXMgb25ib2FyZCBhdWRpbyBjb25uZWN0b3JzIGxhYmVsZWQgImNkcm9tIiBhbmQgImJvYXJkIiwKCSBub3Qgc29sZGVyZWQgaGVyZSwgdGhvdWdoIHVua25vd24gd2lyaW5nLgogICAgICAgICBDYXJkIGxhY2tzOiBleHRlcm5hbCBhdWRpbyBpbiwgcGNpIHN1YnN5c3RlbSBpZC4KICAgICAgICovCn0sewoKCS8qIC0tLS0gY2FyZCAweDYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJNYWNoVFYiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDcsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwKCS5wbGwgICAgICAgICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIkV1cmVzeXMgUGljb2xvIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMX0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoJLyogTHVjIFZhbiBIb2V5bGFuZHQgPGx1Y0BlLW1hZ2ljLmJlPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTUwIiwgLyogMHg0ZiAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIEhpcm9zaGkgVGFrZWthd2EgPHNpYW5AYmlnLm9yLmpwPiAqLwoJLyogVGhpcyBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRCAqLwoJLm5hbWUgICAgICAgICAgID0gIkFELVRWSzUwMyIsIC8qIDB4NjMgKi8KCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwMWU4MDA3LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkvKiAgICAgICAgICAgICAgICAgIFR1bmVyLCBSYWRpbywgZXh0ZXJuYWwsIGludGVybmFsLCBvZmYsICBvbiAqLwoJLmF1ZGlvbXV4ICAgICAgID0geyAweDA4LCAgMHgwZiwgIDB4MGEsICAgICAweDA4LCAgICAgMHgwZiwgMHgwOCB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAyLAoJLmF1ZGlvX2hvb2sJPSBhZHR2azUwM19hdWRpbywKfSx7CgoJLyogLS0tLSBjYXJkIDB4NjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBTdGVyZW8iLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IDUsCgkvKiBOb3RlczoKCSAgIC0gY2FyZCBsYWNrcyBzdWJzeXN0ZW0gSUQKCSAgIC0gc3RlcmVvIHZhcmlhbnQgdy8gZGF1Z2h0ZXIgYm9hcmQgd2l0aCB0ZGE5ODc0YSBAMHhiMAoJICAgLSBBdWRpbyBSb3V0aW5nOgoJCWFsd2F5cyBmcm9tIHRkYTk4NzQgaW5kZXBlbmRlbnQgb2YgR1BJTyAoPykKCQlleHRlcm5hbCBsaW5lIGluOiB1bmtub3duCgkgICAtIE90aGVyIGNoaXBzOiBlbTc4cDE1NmVscCBAIDB4OTYgKHByb2JhYmx5IElSIHJlbW90ZSBjb250cm9sKQoJICAgICAgICAgICAgICBoZWY0MDUzIChpbnN0ZWFkIDQwNTIpIGZvciB1bmtub3duIGZ1bmN0aW9uCgkqLwp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUGFjZSBUViAmIFJhZGlvIENhcmQiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwgLy8gVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvcgogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDAsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAogICAgICAgIC50dW5lcl90eXBlICAgICA9IDEsCiAgICAgICAgLmhhc19yYWRpbyAgICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLyogQnQ4NzgsIEJ0ODMyLCBGSTEyNDYgdHVuZXI7IG5vIHBjaSBzdWJzeXN0ZW0gaWQKICAgICAgICAgICBvbmx5IGludGVybmFsIGxpbmUgb3V0OiAoNHBpbiBoZWFkZXIpIFJHR0wKICAgICAgICAgICBSYWRpbyBtdXN0IGJlIGRlY29kZWQgYnkgbXNwMzQxMGQgKG5vdCByb3V0ZWQgdGhyb3VnaCkqLwogICAgICAgIC8vICAgICAgICAgLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwgLy8gdG9kbyEKfSx7CiAgICAgICAgLyogQ2hyaXMgV2lsbGluZyA8Y2hyaXNAdmlzbGFiLnVzeWQuZWR1LmF1PiAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJJVkMtMjAwIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAxLAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHhkZiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIgfSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoJLm5hbWUgICAgICAgICAgID0gIkdyYW5kIFgtR3VhcmQgLyBUcnVzdCA4MTRQQ0kiLAoJLnZpZGVvX2lucHV0cyAgID0gMTYsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IDQsCiAgICAgICAgLmdwaW9tYXNrMiAgICAgID0gMHhmZiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwyLDIsMiwgMywzLDMsMywgMSwxLDEsMSwgMCwwLDAsMCB9LAoJLm11eHNlbF9ob29rICAgID0geGd1YXJkX211eHNlbCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoKCS8qIC0tLS0gY2FyZCAweDY4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiwKCS52aWRlb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAp9LHsKCS8qIEpvcmdlIEJvbmNvbXB0ZSAtIERUSTIgPGpvcmdlQGR0aTIubmV0PiAqLwoJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTQzIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIE0uS2xhaHJAcGh5dGVjLmRlICovCgkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBNaW5pRElOIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS5zdmhzICAgICAgICAgICA9IDMsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIENvbWJpIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS5zdmhzICAgICAgICAgICA9IDMsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg2YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOSBNaW5pRElOIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMTAsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkuc3ZocyAgICAgICAgICAgPSA5LAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5ncGlvbWFzazIgICAgICA9IDB4MDMsIC8qIGdwaW9tYXNrMiBkZWZpbmVzIHRoZSBiaXRzIHVzZWQgdG8gc3dpdGNoIGF1ZGlvCgkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCgkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLwoJLm11eHNlbCAgICAgICAgID0geyAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDAxLCAweDAwIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOSBDb21iaSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMgICA9IDEwLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gOSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwoJCQkJICAgdmlhIHRoZSB1cHBlciBuaWJibGUgb2YgbXV4c2VsLiBoZXJlOiB1c2VkIGZvcgoJCQkJICAgeHRlcm5hbCB2aWRlby1tdXggKi8KCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJJVkMtMTAwIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHhkZiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoJLyogSVZDLTEyMEcgLSBBbGFuIEdhcmZpZWxkIDxhbGFuQGZyb21vcmJpdC5jb20+ICovCgkubmFtZSAgICAgICAgICAgPSAiSVZDLTEyMEciLAoJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkuYXVkaW9faW5wdXRzICAgPSAwLCAgICAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLnR1bmVyICAgICAgICAgID0gLTEsICAgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsICAgLyogY2FyZCBoYXMgbm8gc3ZocyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCgkJCSAgICAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwIH0sCgkubXV4c2VsX2hvb2sgICAgPSBpdmMxMjBfbXV4c2VsLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg3MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAicGNIRFRWIEhELTIwMDAgVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0FUU0MsCgkuaGFzX2R2YiAgICAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUd2luaGFuIERTVCArIGNsb25lcyIsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkubm9fdmlkZW8gICAgICAgPSAxLAoJLmhhc19kdmIgICAgICAgID0gMSwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIldpbmZhc3QgVkMxMDAiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8vIG5vIHR1bmVyCgkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDN9LCAvLyBWaWQgSW4sIFNWaWQgSW4sIFZpZCBvdmVyIFNWaWQgaW4gY29ubmVjdG9yCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDMsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAxLCAxLCAxLCAxLCAwfSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTSU1VUyBHVkMxMTAwIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMn0sCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgzRiwKCS5tdXhzZWxfaG9vayAgICA9IGd2YzExMDBfbXV4c2VsLAp9LHsKICAgICAgICAvKiBDYXJsb3MgU2lsdmEgcjNwZWtAcjNwZWsuaG9tZWxpbnV4Lm9yZyB8fCBjYXJkIDB4NzUgKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiTkdTIE5HU1RWKyIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHswLCAwLCAwLCAwLCAweDAwMDAwMywgMH0sCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAogICAgICAgIC5oYXNfcmVtb3RlICAgICA9IDEsCn0sewogICAgICAgIC8qIGh0dHA6Ly9saW51eG1lZGlhbGFicy5jb20gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiTE1MQlQ0IiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LCAvKiBJTjEsSU4yLElOMyxJTjQgKi8KICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCn0sewoJLyogSGVsbXJvb3MgSGFycmkgPGhhcnJpLmhlbG1yb29zQHBwLmluZXQuZmk+ICovCgkubmFtZSAgICAgICAgICAgPSAiVGVrcmFtIE0yMDUgUFJPIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkuZ3Bpb21hc2sgICAgICAgPSAweDY4LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMHg2OCwgMHg2OCwgMHg2MSwgMHg2MSwgMHgwMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg3OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBKYXZpZXIgQ2VuZGFuIEFyZXMgPGpjZW5kYW5AbHljb3MuZXM+ICovCgkvKiBidDg3OCBUViArIEZNIHdpdGhvdXQgc3Vic3lzdGVtIElEICovCgkubmFtZSAgICAgICAgICAgPSAiQ29uY2VwdHJvbmljIENPTlRWRk1pIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCAzIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAoJLmhhc19yYWRpbyAgICAgID0gMSwKfSx7CgkvKkVyaWMgREVCSUVGIDxkZWJpZWZAdGVsZW1zYS5jb20+Ki8KCS8qRVVSRVNZUyBQaWNvbG8gVGV0cmEgOiA0IENvbmV4YW50IEZ1c2lvbiA4NzhBLCBubyBhdWRpbywgdmlkZW8gaW5wdXQgc2V0IHdpdGggYW5hbG9nIG11bHRpcGxleGVycyBHUElPIGNvbnRyb2xlZCovCgkvKiBhZGRzIHBpY29sb190ZXRyYV9tdXhzZWwoKSwgcGljb2xvX3RldHJhX2luaXQoKSwgdGhlIGZvbG93aW5nIGRlY2xhcmF0aW9uIHN0cnVjdXJlLCBhbmQgI2RlZmluZSBCVFRWX1BJQ09MT19URVRSQV9DSElQKi8KCS8qMHg3OSBpbiBidHR2LmgqLwoJLm5hbWUgICAgICAgICAgID0gIkV1cmVzeXMgUGljb2xvIFRldHJhIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkuZ3Bpb21hc2syICAgICAgPSAweDNDPDwxNiwvKlNldCB0aGUgR1BJT1sxOF0tPkdQSU9bMjFdIGFzIG91dHB1dCBwaW4uPT0+IGRyaXZlIHRoZSB2aWRlbyBpbnB1dHMgdGhyb3VnaCBhbmFsb2cgbXVsdGlwbGV4ZXJzKi8KCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsyLDIsMiwyfSwvKjg3OEEgaW5wdXQgaXMgYWx3YXlzIE1VWDAsIHNlZSBhYm92ZS4qLwoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm11eHNlbF9ob29rICAgID0gcGljb2xvX3RldHJhX211eHNlbCwvKlJlcXVpcmVkIGFzIGl0IGRvZXNuJ3QgZm9sbG93IHRoZSBjbGFzc2ljIGlucHV0IHNlbGVjdGlvbiBwb2xpY3kqLwp9LHsKCS8qIFNwaXJpdCBUViBUdW5lciBmcm9tIGh0dHA6Ly9zcGlyaXRtb2RlbXMuY29tLmF1ICovCgkvKiBTdGFmZm9yZCBHb29kc2VsbCA8c3VyZ2VAZ29saWF0aC5ob21ldW5peC5vcmc+ICovCgkubmFtZSAgICAgICAgICAgPSAiU3Bpcml0IFRWIFR1bmVyIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwMDAwMDBmLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCn0sewoJLyogV29sZnJhbSBKb29zdCA8d29qb0Bmcm9rYXNjaHdlaS5kZT4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDIsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAzICwgMyB9LAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAuaGFzX2R2YiAgICAgICAgPSAxLAogICAgICAgIC5ub19ncGlvaXJxICAgICA9IDEsCiAgICAgICAgLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkvKiAtLS0tIGNhcmQgMHg3YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBNYXR0IEplc3NvbiA8ZHZiQGplc3Nvbi5lY2xpcHNlLmNvLnVrPiAqLwoJLyogQmFzZWQgb24gdGhlIE5lYnVsYSBjYXJkIGRhdGEgLSBhZGRlZCByZW1vdGUgYW5kIG5ldyBjYXJkIG51bWJlciAtIEJUVFZfQVZEVkJUXzc2MSwgc2VlIGFsc28gaXIta2JkLWdwaW8uYyAqLwoJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDIsIDB9LCAvKiBDb21wMCwgUy1WaWRlbywgPywgPyAqLwoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkuaGFzX2R2YiAgICAgICAgPSAxLAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNRIiwKCS52aWRlb19pbnB1dHMgICAgID0gMTYsCgkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkudHVuZXIgICAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCgkJCSAgICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTUV9tdXhzZWwsCgkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAoJLm5vX21zcDM0eHggICAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgICA9IC0xLAp9LHsKCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLwoJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TTEMiLAoJLnZpZGVvX2lucHV0cyAgICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgICAgPSAwLAoJLnR1bmVyICAgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgICA9IDB4MCwKCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyIH0sCgkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU0xDX211eHNlbCwKCS5hdWRpb211eCAgICAgICAgID0geyAwIH0sCgkubm9fbXNwMzR4eCAgICAgICA9IDEsCgkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICAgID0gLTEsCn0sewoJLyogQlRUVl9BUEFDX1ZJRVdDT01QICovCgkvKiBBdHRpbGEgS29uZG9yb3MgPGF0dGlsYS5rb25kb3Jvc0BjaGVsbG8uaHU+ICovCgkvKiBidDg3OCBUViArIEZNIDB4MDAwMDAwMDAgc3Vic3lzdGVtIElEICovCgkubmFtZSAgICAgICAgICAgPSAiQVBBQyBWaWV3Y29tcCA4NzgoQU1BWCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAweEZGLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMCwgMTB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yZW1vdGUgICAgID0gMSwgICAvKiBtaW5pcmVtb3RlIHdvcmtzLCBzZWUgaXIta2JkLWdwaW8uYyAqLwoJLmhhc19yYWRpbyAgICAgID0gMSwgICAvKiBub3QgZXZlcnkgY2FyZCBoYXMgcmFkaW8gKi8KfSx7CgoJLyogLS0tLSBjYXJkIDB4ODAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJEVklDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkubm9fdmlkZW8gICAgICAgPSAxLAoJLmhhc19kdmIgICAgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIFN0ZXZlbiA8cGhvdG9uMzhAcGNob21lLmNvbS50dz4gKi8KCS5uYW1lICAgICAgICAgICA9ICJWLUdlYXIgTXlWQ0QiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4M2YsCgkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7MHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMX0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCgkuaGFzX3JhZGlvICAgICAgPSAwLAoJLy8gLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkvKiBSaWNrIEMgPGNyeXB0ZHJhZ29vbkBnbWFpbC5jb20+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlN1cGVyIFRWIFR1bmVyIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMHgwMDAwMDEsMCwwLCAwfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoJCS8qIENocmlzIEZhbm5pbmcgPHZpZGVvNGxpbnV4QGhheWRvbi5uZXQ+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIJPSAxLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS5tdXhzZWxfaG9vayAgICA9IHRpYmV0Q1MxNl9tdXhzZWwsCn0sCnsKCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwoJLyoKCSAqIE5vdGUgdGhhdCwgYmVjYXVzZSBvZiB0aGUgY2FyZCdzIHdpcmluZywgdGhlICJtYXN0ZXIiCgkgKiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUgb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoCgkgKiBhbmQgbXVzdCB1c2UgdGhpcyBjYXJkIHR5cGUpIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlCgkgKiBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgY2FyZCB0eXBlIDB4ODUsIHdob3NlIGRlc2NyaXB0aW9uCgkgKiBmb2xsb3dzIHRoaXMgb25lLiAgVGhlcmUgaXMgYSBFRVBST00gb24gdGhlIGNhcmQgKHdoaWNoIGlzCgkgKiBjb25uZWN0ZWQgdG8gdGhlIEkyQyBvZiBvbmUgb2YgdGhvc2Ugb3RoZXIgY2hpcHMpLCBidXQgaXMKCSAqIG5vdCBjdXJyZW50bHkgaGFuZGxlZC4gIFRoZXJlIGlzIGFsc28gYSBmYWNpbGl0eSBmb3IgYQoJICogIm1vbml0b3IiLCB3aGljaCBpcyBhbHNvIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCgkgKi8KCS5uYW1lCQk9ICJLb2RpY29tIDQ0MDBSIChtYXN0ZXIpIiwKCS52aWRlb19pbnB1dHMJPSAxNiwKCS5hdWRpb19pbnB1dHMJPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLyogR1BJTyBiaXRzIDAtOSB1c2VkIGZvciBhbmFsb2cgc3dpdGNoOgoJICogICAwMCAtIDAzOgljYW1lcmEgc2VsZWN0b3IKCSAqICAgMDQgLSAwNjoJY2hhbm5lbCAoY29udHJvbGxlcikgc2VsZWN0b3IKCSAqICAgMDc6CWRhdGEgKDEtPm9uLCAwLT5vZmYpCgkgKiAgIDA4OglzdHJvYmUKCSAqICAgMDk6CXJlc2V0CgkgKiBiaXQgMTYgaXMgaW5wdXQgZnJvbSBzeW5jIHNlcGFyYXRvciBmb3IgdGhlIGNoYW5uZWwKCSAqLwoJLmdwaW9tYXNrCT0gMHgwMDAzZmYsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAoJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCS5wbGwJCT0gUExMXzI4LAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTc0MzIJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKfSwKewoJLyogQmlsbCBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+ICovCgkvKiBOb3RlIHRoYXQsIGZvciByZWFzb25zIHVua25vd24sIHRoZSAibWFzdGVyIiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUKCSAqIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIG11c3QgdXNlIHRoZSBjYXJkIHR5cGUpCgkgKiBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZSBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgdGhpcyBjYXJkCgkgKiB0eXBlCgkgKi8KCS5uYW1lCQk9ICJLb2RpY29tIDQ0MDBSIChzbGF2ZSkiLAoJLnZpZGVvX2lucHV0cwk9IDE2LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnN2aHMJCT0gLTEsCgkuZ3Bpb21hc2sJPSAweDAxMDAwMCwKCS5ub19ncGlvaXJxICAgICA9IDEsCgkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJLnBsbAkJPSBQTExfMjgsCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhNzQzMgk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkubXV4c2VsX2hvb2sJPSBrb2RpY29tNDQwMHJfbXV4c2VsLAp9LAp7CiAgICAgICAgLyogLS0tLSBjYXJkIDB4ODUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyogTWljaGFlbCBIZW5zb24gPG1oZW5zb25AY2xhcml0eXZpLmNvbT4gKi8KICAgICAgICAvKiBBZGxpbmsgUlRWMjQgd2l0aCBzcGVjaWFsIHVubG9jayBjb2RlcyAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBZGxpbmsgUlRWMjQiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCgp9fTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnR0dl9udW1fdHZjYXJkcyA9IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdOwoKLyoKICogaWRlbnRpZnkgY2FyZAogKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pZGNhcmQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgaW50IGdwaW9iaXRzOwoJaW50IGksdHlwZTsKCXVuc2lnbmVkIHNob3J0IHRtcDsKCgkvKiByZWFkIFBDSSBzdWJzeXN0ZW0gSUQgKi8KCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgPSB0bXAgPDwgMTY7CglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRtcCk7CglidHYtPmNhcmRpZCB8PSB0bXA7CgoJaWYgKDAgIT0gYnR2LT5jYXJkaWQgJiYgMHhmZmZmZmZmZiAhPSBidHYtPmNhcmRpZCkgewoJCS8qIGxvb2sgZm9yIHRoZSBjYXJkICovCgkJZm9yICh0eXBlID0gLTEsIGkgPSAwOyBjYXJkc1tpXS5pZCAhPSAwOyBpKyspCgkJCWlmIChjYXJkc1tpXS5pZCAgPT0gYnR2LT5jYXJkaWQpCgkJCQl0eXBlID0gaTsKCgkJaWYgKHR5cGUgIT0gLTEpIHsKCQkJLyogZm91bmQgaXQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBkZXRlY3RlZDogJXMgW2NhcmQ9JWRdLCAiCgkJCSAgICAgICAiUENJIHN1YnN5c3RlbSBJRCBpcyAlMDR4OiUwNHhcbiIsCgkJCSAgICAgICBidHYtPmMubnIsY2FyZHNbdHlwZV0ubmFtZSxjYXJkc1t0eXBlXS5jYXJkbnIsCgkJCSAgICAgICBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlidHYtPmMudHlwZSA9IGNhcmRzW3R5cGVdLmNhcmRucjsKCQl9IGVsc2UgewoJCQkvKiA0MDQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCAoVU5LTk9XTilcbiIsCgkJCSAgICAgICBidHYtPmMubnIsIGJ0di0+Y2FyZGlkICYgMHhmZmZmLAoJCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CgkJCXByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSBhbmQgIgoJCQkgICAgICAgInRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8ga3JheGVsQGJ5dGVzZXgub3JnXG4iKTsKCQl9Cgl9CgoJLyogbGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBhdXRvZGV0ZWN0ZWQgdHlwZSAqLwoJaWYgKGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMpCgkJYnR2LT5jLnR5cGU9Y2FyZFtidHYtPmMubnJdOwoKCS8qIHByaW50IHdoaWNoIGNhcmQgY29uZmlnIHdlIGFyZSB1c2luZyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLGJ0di0+Yy5uciwKCSAgICAgICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlLAoJICAgICAgIGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMKCSAgICAgICA/ICJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKCgkvKiBvdmVyd3JpdGUgZ3BpbyBzdHVmZiA/PyAqLwoJaWYgKFVOU0VUID09IGF1ZGlvYWxsICYmIFVOU0VUID09IGF1ZGlvbXV4WzBdKQoJCXJldHVybjsKCglpZiAoVU5TRVQgIT0gYXVkaW9tdXhbMF0pIHsKCQlncGlvYml0cyA9IDA7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9tdXhbaV07CgkJCWdwaW9iaXRzIHw9IGF1ZGlvbXV4W2ldOwoJCX0KCX0gZWxzZSB7CgkJZ3Bpb2JpdHMgPSBhdWRpb2FsbDsKCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0gPSBhdWRpb2FsbDsKCQl9Cgl9CglidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrID0gKFVOU0VUICE9IGdwaW9tYXNrKSA/IGdwaW9tYXNrIDogZ3Bpb2JpdHM7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGdwaW8gY29uZmlnIG92ZXJyaWRlOiBtYXNrPTB4JXgsIG11eD0iLAoJICAgICAgIGJ0di0+Yy5ucixidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrKTsKCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQlwcmludGsoIiVzMHgleCIsIGkgPyAiLCIgOiAiIiwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSk7Cgl9CglwcmludGsoIlxuIik7Cn0KCi8qCiAqIChtb3N0KSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbnMgZ29lcyBoZXJlCiAqLwoKLyogU29tZSBNb2R1bGFyIFRlY2hub2xvZ3kgY2FyZHMgaGF2ZSBhbiBlZXByb20sIGJ1dCBubyBzdWJzeXN0ZW0gSUQgKi8Kdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdKQp7CglpbnQgdHlwZSA9IC0xOwoKCWlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGEsIkdFVCBNTTIweFBDVFYiLDEzKSkKCQl0eXBlID0gQlRUVl9NT0RURUNfMjA1OwoJZWxzZSBpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhKzIwLCJQaWNvbG8iLDcpKQoJCXR5cGUgPSBCVFRWX0VVUkVTWVNfUElDT0xPOwoJZWxzZSBpZiAoZWVwcm9tX2RhdGFbMF0gPT0gMHg4NCAmJiBlZXByb21fZGF0YVsyXT09IDApCiAgICAgICAgICAgICAgICB0eXBlID0gQlRUVl9IQVVQUEFVR0U7IC8qIG9sZCBidDg0OCAqLwoKCWlmICgtMSAhPSB0eXBlKSB7CgkJYnR2LT5jLnR5cGUgPSB0eXBlOwoJCXByaW50aygiYnR0diVkOiBkZXRlY3RlZCBieSBlZXByb206ICVzIFtjYXJkPSVkXVxuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKCX0KfQoKc3RhdGljIHZvaWQgZmx5dmlkZW9fZ3BpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZ3BpbyxoYXNfcmVtb3RlLGhhc19yYWRpbyxpc19jYXB0dXJlX29ubHksaXNfbHI5MCxoYXNfdGRhOTgyMF90ZGE5ODIxOwoJaW50IHR1bmVyPS0xLHR0eXBlOwoKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDApOwoJdWRlbGF5KDgpOyAgLy8gd2l0aG91dCB0aGlzIHdlIHdvdWxkIHNlZSB0aGUgMHgxODAwIG1hc2sKCWdwaW8gPSBncGlvX3JlYWQoKTsKCS8qIEZJWE1FOiBtdXN0IHJlc3RvcmUgT1VSX0VOID8/PyAqLwoKCS8vIGFsbCBjYXJkcyBwcm92aWRlIEdQSU8gaW5mbywgc29tZSBoYXZlIGFuIGFkZGl0aW9uYWwgZWVwcm9tCgkvLyBMUjUwOiBHUElPIGNvZGluZyBjYW4gYmUgZm91bmQgbG93ZXIgcmlnaHQgQ1AxIC4uIENQOQoJLy8gICAgICAgQ1A5PUdQSU8yMyAuLiBDUDE9R1BJTzE1OyB3aGVuIE9QRU4sIHRoZSBjb3JyZXNwb25kaW5nIEdQSU8gcmVhZHMgMS4KCS8vICAgICAgIEdQSU8xNC0xMjogbi5jLgoJLy8gTFI5MDogR1A5PUdQSU8yMyAuLiBHUDE9R1BJTzE1IChyaWdodCBhYm92ZSB0aGUgYnQ4NzgpCgoJLy8gbG93ZXN0IDMgYnl0ZXMgYXJlIHJlbW90ZSBjb250cm9sIGNvZGVzIChubyBoYW5kc2hha2UgbmVlZGVkKQogICAgICAgIC8vIHh4eEZGRjogTm8gcmVtb3RlIGNvbnRyb2wgY2hpcCBzb2xkZXJlZAogICAgICAgIC8vIHh4eEYwMChMUjI2L0xSNTApLCB4eHhGRTAoTFI5MCk6IFJlbW90ZSBjb250cm9sIGNoaXAgKExWQTAwMSBvciBDRjQ1KSBzb2xkZXJlZAoJLy8gTm90ZTogU29tZSBiaXRzIGFyZSBBdWRpb19NYXNrICEKCgl0dHlwZT0oZ3BpbyYweDBmMDAwMCk+PjE2OwoJc3dpdGNoKHR0eXBlKSB7CgljYXNlIDB4MDogdHVuZXI9MjsgLy8gTlRTQywgZS5nLiBUUEk4TlNSMTFQCgkJYnJlYWs7CiAgICAgICAgY2FzZSAweDI6IHR1bmVyPTM5Oy8vIExHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUg3MDFQCgkJYnJlYWs7CgljYXNlIDB4NDogdHVuZXI9NTsgLy8gUGhpbGlwcyBQQUwgVFBJOFBTQjAyUCwgVFBJOFBTQjEyUCwgVFBJOFBTQjEyRCBvciBGSTEyMTYsIEZNMTIxNgoJCWJyZWFrOwoJY2FzZSAweDY6IHR1bmVyPTM3OyAvLyBMRyBQQUwgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUc3MDJQCgkJYnJlYWs7CgljYXNlIDB4QzogdHVuZXI9MzsgLy8gUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7Cgl9CgoJaGFzX3JlbW90ZSAgICAgICAgICA9ICAgZ3BpbyAmIDB4ODAwMDAwOwoJaGFzX3JhZGlvCSAgICA9ICAgZ3BpbyAmIDB4NDAwMDAwOwoJLy8gICB1bmtub3duICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwOwoJLy8gICB1bmtub3duMiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwOwogICAgICAgIGlzX2NhcHR1cmVfb25seSAgICAgPSAhKGdwaW8gJiAweDAwODAwMCk7IC8vR1BJTzE1CgloYXNfdGRhOTgyMF90ZGE5ODIxID0gIShncGlvICYgMHgwMDQwMDApOwoJaXNfbHI5MCAgICAgICAgICAgICA9ICEoZ3BpbyAmIDB4MDAyMDAwKTsgLy8gZWxzZSBMUjI2L0xSNTAgKExSMzgvTFI1MSBmLiBjYXB0dXJlIG9ubHkpCiAgICAgICAgLy8JCSAgICAgICAgZ3BpbyAmIDB4MDAxMDAwIC8vIG91dHB1dCBiaXQgZm9yIGF1ZGlvIHJvdXRpbmcKCglpZihpc19jYXB0dXJlX29ubHkpCgkJdHVuZXI9NDsgLy8gTm8gdHVuZXIgcHJlc2VudAoKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gUmFkaW89JXMgUmVtb3RlQ29udHJvbD0lcyBUdW5lcj0lZCBncGlvPTB4JTA2eFxuIiwKCSAgICAgICBidHYtPmMubnIsIGhhc19yYWRpbz8gInllcyI6Im5vICIsIGhhc19yZW1vdGU/ICJ5ZXMiOiJubyAiLCB0dW5lciwgZ3Bpbyk7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvICBMUjkwPSVzIHRkYTk4MjEvdGRhOTgyMD0lcyBjYXB0dXJlX29ubHk9JXNcbiIsCgkJYnR2LT5jLm5yLCBpc19scjkwPyJ5ZXMiOiJubyAiLCBoYXNfdGRhOTgyMF90ZGE5ODIxPyJ5ZXMiOiJubyAiLAoJCWlzX2NhcHR1cmVfb25seT8ieWVzIjoibm8gIik7CgoJaWYodHVuZXIhPSAtMSkgLy8gb25seSBzZXQgaWYga25vd24gdHVuZXIgYXV0b2RldGVjdGVkLCBlbHNlIGxldCBpbnNtb2Qgb3B0aW9uIHRocm91Z2gKCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcjsKCWJ0di0+aGFzX3JhZGlvID0gaGFzX3JhZGlvOwoKCS8vIExSOTAgQXVkaW8gUm91dGluZyBpcyBkb25lIGJ5IDIgaGVmNDA1Miwgc28gQXVkaW9fTWFzayBoYXMgNCBiaXRzOiAweDAwMWM4MAogICAgICAgIC8vIExSMjYvTFI1MCBvbmx5IGhhcyAxIGhlZjQwNTIsIEF1ZGlvX01hc2sgMHgwMDBjMDAKCS8vIEF1ZGlvIG9wdGlvbnM6IGZyb20gdHVuZXIsIGZyb20gdGRhOTgyMS90ZGE5ODIxKG1vbm8sc3RlcmVvLHNhcCksIGZyb20gdGRhOTg3NCwgZXh0LiwgbXV0ZQoJaWYoaGFzX3RkYTk4MjBfdGRhOTgyMSkgYnR2LT5hdWRpb19ob29rID0gbHQ5NDE1X2F1ZGlvOwoJLy90b2RvOiBpZihoYXNfdGRhOTg3NCkgYnR2LT5hdWRpb19ob29rID0gZnYyMDAwc19hdWRpbzsKfQoKc3RhdGljIGludCBtaXJvX3R1bmVybWFwW10gPSB7IDAsNiwyLDMsICAgNCw1LDYsMCwgIDMsMCw0LDUsICA1LDIsMTYsMSwKCQkJICAgICAgIDE0LDIsMTcsMSwgNCwxLDQsMywgIDEsMiwxNiwxLCA0LDQsNCw0IH07CnN0YXRpYyBpbnQgbWlyb19mbXR1bmVyW10gID0geyAwLDAsMCwwLCAgIDAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMSwKCQkJICAgICAgIDEsMSwxLDEsICAgMSwxLDEsMCwgIDAsMCwwLDAsICAwLDEsMCwwIH07CgpzdGF0aWMgdm9pZCBtaXJvX3Bpbm5hY2xlX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGlkLG1zcCxncGlvOwoJY2hhciAqaW5mbzsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKICAgICAgICBncGlvID0gZ3Bpb19yZWFkKCk7CglpZCAgID0gKChncGlvPj4xMCkgJiA2MykgLTE7Cgltc3AgID0gYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4Iik7CglpZiAoaWQgPCAzMikgewoJCWJ0di0+dHVuZXJfdHlwZSA9IG1pcm9fdHVuZXJtYXBbaWRdOwoJCWlmICgwID09IChncGlvICYgMHgyMCkpIHsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlpZiAoIW1pcm9fZm10dW5lcltpZF0pIHsKCQkJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCQkJCWJ0di0+bWJveF93ZSAgICA9ICgxPDw2KTsKCQkJCWJ0di0+bWJveF9tb3N0ICA9ICgxPDw3KTsKCQkJCWJ0di0+bWJveF9jbGsgICA9ICgxPDw4KTsKCQkJCWJ0di0+bWJveF9kYXRhICA9ICgxPDw5KTsKCQkJCWJ0di0+bWJveF9tYXNrICA9ICgxPDw2KXwoMTw8Nyl8KDE8PDgpfCgxPDw5KTsKCQkJfQoJCX0gZWxzZSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQl9CgkJaWYgKC0xICE9IG1zcCkgewoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9NSVJPKQoJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX01JUk9QUk87CgkJCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX1BJTk5BQ0xFKQoJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX1BJTk5BQ0xFUFJPOwoJCX0KCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJidHR2JWQ6IG1pcm86IGlkPSVkIHR1bmVyPSVkIHJhZGlvPSVzIHN0ZXJlbz0lc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCgkJICAgICAgICFidHYtPmhhc19yYWRpbyA/ICJubyIgOgoJCSAgICAgICAoYnR2LT5oYXNfbWF0Y2hib3ggPyAibWF0Y2hib3giIDogImZtdHVuZXIiKSwKCQkgICAgICAgKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOwoJfSBlbHNlIHsKCQkvKiBuZXcgY2FyZHMgd2l0aCBtaWNyb3R1bmUgdHVuZXIgKi8KCQlpZCA9IDYzIC0gaWQ7CgkJYnR2LT5oYXNfcmFkaW8gPSAwOwoJCXN3aXRjaCAoaWQpIHsKCQljYXNlIDE6CgkJCWluZm8gPSAiUEFMIC8gbW9ubyI7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJaW5mbyA9ICJQQUwrU0VDQU0gLyBzdGVyZW8iOwoJCQlidHYtPmhhc19yYWRpbyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgMzoKCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlicmVhazsKCQljYXNlIDQ6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gbW9ubyI7CgkJCWJyZWFrOwoJCWNhc2UgNToKCQkJaW5mbyA9ICJOVFNDIC8gbW9ubyI7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlpbmZvID0gIlBBTCAvIHN0ZXJlbyI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8gPSAib29wczogdW5rbm93biBjYXJkIjsKCQkJYnJlYWs7CgkJfQoJCWlmICgtMSAhPSBtc3ApCgkJCWJ0di0+Yy50eXBlID0gQlRUVl9QSU5OQUNMRVBSTzsKCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCBpZCwgaW5mbywgYnR2LT5oYXNfcmFkaW8gPyAieWVzIiA6ICJubyIpOwoJCWJ0di0+dHVuZXJfdHlwZSAgPSAzMzsKCQlidHYtPnBpbm5hY2xlX2lkID0gaWQ7Cgl9Cn0KCi8qIEdQSU8yMSAgIEw6IEJ1ZmZlciBha3RpdiwgSDogQnVmZmVyIGluYWt0aXYgKi8KI2RlZmluZSBMTTE4ODJfU1lOQ19EUklWRSAgICAgMHgyMDAwMDBMCgpzdGF0aWMgdm9pZCBpbml0X2lkc19lYWdsZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglncGlvX2lub3V0KDB4ZmZmZmZmLDB4RkZGRjM3KTsKCWdwaW9fd3JpdGUoMHgyMDAwMjApOwoKCS8qIGZsYXNoIHN0cm9iZSBpbnZlcnRlciA/ISAqLwoJZ3Bpb193cml0ZSgweDIwMDAyNCk7CgoJLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCglncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwoKCS8qIHNldCBCVDg0OCBtdXhlbCB0byAyICovCglidGFvcigoMik8PDUsIH4oMjw8NSksIEJUODQ4X0lGT1JNKTsKfQoKLyogTXV4c2VsIGhlbHBlciBmb3IgdGhlIElEUyBFYWdsZS4KICogdGhlIGVhZ2xlcyBkb2VzIG5vdCB1c2UgdGhlIHN0YW5kYXJkIG11eHNlbC1iaXRzIGJ1dAogKiBoYXMgaXRzIG93biBtdWx0aXBsZXhlciAqLwpzdGF0aWMgdm9pZCBlYWdsZV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglidGFvcigoMik8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKCWdwaW9fYml0cygzLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXV4c2VsW2lucHV0JjddKTsKCiNpZiAwCiAgICAgICAvKiBzdmhzICovCiAgICAgICAvKiB3YWtlIGNocm9tYSBBREMgKi8KICAgICAgIGJ0YW5kKH5CVDg0OF9BRENfQ19TTEVFUCwgQlQ4NDhfQURDKTsKICAgICAgIC8qIHNldCB0byBZQyB2aWRlbyAqLwogICAgICAgYnRvcihCVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X0VfQ09OVFJPTCk7CiAgICAgICBidG9yKEJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKI2Vsc2UKICAgICAgIC8qIGNvbXBvc2l0ZSAqLwogICAgICAgLyogc2V0IGNocm9tYSBBREMgdG8gc2xlZXAgKi8KICAgICAgIGJ0b3IoQlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7CiAgICAgICAvKiBzZXQgdG8gY29tcG9zaXRlIHZpZGVvICovCiAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKI2VuZGlmCgogICAgICAgLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCiAgICAgICBncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwp9CgpzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7MHgzMCwgMHgwMSwgMHgxMiwgMHgyM307CglncGlvX3dyaXRlKG1hc2tzW2lucHV0JTRdKTsKfQoKLyogTE1MQlQ0eCBpbml0aWFsaXphdGlvbiAtIHRvIGFsbG93IGFjY2VzcyB0byBHUElPIGJpdHMgZm9yIHNlbnNvcnMgaW5wdXQgYW5kCiAgIGFsYXJtcyBvdXRwdXQKCiAgIEdQSU9iaXQgICAgfCAxMCB8IDkgfCA4IHwgNyB8IDYgfCA1IHwgNCB8IDMgfCAyIHwgMSB8IDAgfAogICBhc3NpZ25tZW50IHwgVEkgfCBPM3xJTnh8IE8yfCBPMXxJTjR8SU4zfElOMnxJTjF8ICAgfCAgIHwKCiAgIElOIC0gc2Vuc29yIGlucHV0cywgSU54IC0gc2Vuc29yIGlucHV0cyBhbmQgVEkgWE9SZWQgdG9nZXRoZXIKICAgTzEsTzIsTzMgLSBhbGFybSBvdXRwdXRzIChyZWxheXMpCgogICBPVVQgRU5BQkxFICAgMSAgICAxICAgMCAgLiAxICAxICAgMCAgIDAgLiAwICAgMCAgIDAgICAgMCAgID0gMHg2QzAKCiovCgpzdGF0aWMgdm9pZCBpbml0X2xtbGJ0NHgoc3RydWN0IGJ0dHYgKmJ0dikKewoJcHJpbnRrKEtFUk5fREVCVUcgIkxNTEJUNHggaW5pdFxuIik7CglidHdyaXRlKDB4MDAwMDAwLCBCVDg0OF9HUElPX1JFR19JTlApOwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwMDA2QzApOwoJZ3Bpb193cml0ZSgweDAwMDAwMCk7Cn0KCnN0YXRpYyB2b2lkIHNpZ21hU1FfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA4OwoJZ3Bpb19pbm91dCggMHhmLCAweGYgKTsKCWdwaW9fYml0cyggMHhmLCBpbm11eCApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNMQ19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7Cgl1bnNpZ25lZCBpbnQgaW5tdXggPSBpbnB1dCAlIDQ7CglncGlvX2lub3V0KCAzPDw5LCAzPDw5ICk7CglncGlvX2JpdHMoIDM8PDksIGlubXV4PDw5ICk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBidHR2X3Jlc2V0X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCS8qCgkgKiBCVDg3OEEgaGFzIGEgYXVkaW8tcmVzZXQgcmVnaXN0ZXIuCgkgKiAxLiBUaGlzIHJlZ2lzdGVyIGlzIGFuIGF1ZGlvIHJlc2V0IGZ1bmN0aW9uIGJ1dCBpdCBpcyBpbgoJICogICAgZnVuY3Rpb24tMCAodmlkZW8gY2FwdHVyZSkgYWRkcmVzcyBzcGFjZS4KCSAqIDIuIEl0IGlzIGVub3VnaCB0byBkbyB0aGlzIG9uY2UgcGVyIHBvd2VyLXVwIG9mIHRoZSBjYXJkLgoJICogMy4gVGhlcmUgaXMgYSB0eXBvIGluIHRoZSBDb25leGFudCBkb2MgLS0gaXQgaXMgbm90IGF0CgkgKiAgICAweDVCLCBidXQgYXQgMHgwNTguIChCIGlzIGFuIG9kZC1udW1iZXIsIG9idmlvdXNseSBhIHR5cG8hKS4KCSAqIC0tLy9TaHJpa3VtYXIgMDMwNjA5CgkgKi8KCWlmIChidHYtPmlkICE9IDg3OCkKCQlyZXR1cm47CgoJaWYgKGJ0dHZfZGVidWcpCgkJcHJpbnRrKCJidHR2JWQ6IEJUODc4QSBBUkVTRVRcbiIsYnR2LT5jLm5yKTsKCWJ0d3JpdGUoKDE8PDcpLCAweDA1OCk7Cgl1ZGVsYXkoMTApOwoJYnR3cml0ZSggICAgIDAsIDB4MDU4KTsKfQoKLyogaW5pdGlhbGl6YXRpb24gcGFydCBvbmUgLS0gYmVmb3JlIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQxKHN0cnVjdCBidHR2ICpidHYpCnsKCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKCWNhc2UgQlRUVl9IQVVQUEFVR0U6CgljYXNlIEJUVFZfSEFVUFBBVUdFODc4OgogICAgICAgICAgICAgICAgYm9vdF9tc3AzNHh4KGJ0diw1KTsKCQlicmVhazsKCWNhc2UgQlRUVl9WT09ET09UVl9GTToKICAgICAgICAgICAgICAgIGJvb3RfbXNwMzR4eChidHYsMjApOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0FWRVJNRURJQTk4OgoJCWJvb3RfbXNwMzR4eChidHYsMTEpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0hBVVBQQVVHRVBWUjoKCQlwdnJfYm9vdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1RXSU5IQU5fRFNUOgoJY2FzZSBCVFRWX0FWRFZCVF83NzE6CgkJYnR2LT51c2VfaTJjX2h3ID0gMTsKCQlicmVhazsKICAgICAgICBjYXNlIEJUVFZfQURMSU5LX1JUVjI0OgogICAgICAgICAgICAgICAgaW5pdF9SVFYyNCggYnR2ICk7CiAgICAgICAgICAgICAgICBicmVhazsKCgl9CglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKCQlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgdHdvIC0tIGFmdGVyIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQyKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0ZGE5ODg3OwogICAgICAgIGJ0di0+dHVuZXJfdHlwZSA9IC0xOwoKCWlmIChCVFRWX1VOS05PV04gPT0gYnR2LT5jLnR5cGUpIHsKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJaWRlbnRpZnlfYnlfZWVwcm9tKGJ0dixlZXByb21fZGF0YSk7Cgl9CgoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX01JUk86CgljYXNlIEJUVFZfTUlST1BSTzoKCWNhc2UgQlRUVl9QSU5OQUNMRToKCWNhc2UgQlRUVl9QSU5OQUNMRVBSTzoKCQkvKiBtaXJvL3Bpbm5hY2xlICovCgkJbWlyb19waW5uYWNsZV9ncGlvKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfRkxZVklERU9fOTg6CgljYXNlIEJUVFZfTUFYSToKCWNhc2UgQlRUVl9MSUZFX0ZMWUtJVDoKCWNhc2UgQlRUVl9GTFlWSURFTzoKCWNhc2UgQlRUVl9UWVBIT09OX1RWSUVXOgoJY2FzZSBCVFRWX0NIUk9OT1NfVlMyOgoJY2FzZSBCVFRWX0ZMWVZJREVPXzk4Rk06CgljYXNlIEJUVFZfRkxZVklERU8yMDAwOgoJY2FzZSBCVFRWX0ZMWVZJREVPOThFWjoKCWNhc2UgQlRUVl9DT05GRVJFTkNFVFY6CgljYXNlIEJUVFZfTElGRVRFQ185NDE1OgoJCWZseXZpZGVvX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9IQVVQUEFVR0U6CgljYXNlIEJUVFZfSEFVUFBBVUdFODc4OgoJY2FzZSBCVFRWX0hBVVBQQVVHRVBWUjoKCQkvKiBwaWNrIHVwIHNvbWUgY29uZmlnIGluZm9zIGZyb20gdGhlIGVlcHJvbSAqLwoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIGhhdXBwYXVnZV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9BVkVSTUVESUE5ODoKCWNhc2UgQlRUVl9BVlBIT05FOTg6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWF2ZXJtZWRpYV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9QWEMyMDA6CgkJaW5pdF9QWEMyMDAoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUDoKCQlwaWNvbG9fdGV0cmFfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1ZIWDoKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJCWJ0di0+bWJveF93ZSAgICAgID0gMHgyMDsKCQlidHYtPm1ib3hfbW9zdCAgICA9IDA7CgkJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJCWJ0di0+bWJveF9kYXRhICAgID0gMHgxMDsKCQlidHYtPm1ib3hfbWFzayAgICA9IDB4Mzg7CgkJYnJlYWs7CgljYXNlIEJUVFZfVk9CSVNfQk9PU1RBUjoKCWNhc2UgQlRUVl9URVJSQVRWOgoJCXRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfTUFHSUNUVklFVzA2MToKCQlpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDAyMTQ0ZikgewoJCQlidHYtPmhhc19yYWRpbz0xOwoJCQlwcmludGsoImJ0dHYlZDogcmFkaW8gZGV0ZWN0ZWQgYnkgc3Vic3lzdGVtIGlkIChDUEgwNXgpXG4iLGJ0di0+Yy5ucik7CgkJfQoJCWJyZWFrOwogICAgICAgY2FzZSBCVFRWX1NUQjI6CiAgICAgICAgICAgICAgICBpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDYwMTIxYSkgewoJCQkvKiBGaXggdXAgZW50cnkgZm9yIDNERlggVm9vZG9vVFYgMTAwLAoJCQkgICB3aGljaCBpcyBhbiBPRU0gU1RCIGNhcmQgdmFyaWFudC4gKi8KCQkJYnR2LT5oYXNfcmFkaW89MDsKCQkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDX05UU0M7CgkJfQoJCWJyZWFrOwoJY2FzZSBCVFRWX09TUFJFWTF4MDoKCWNhc2UgQlRUVl9PU1BSRVkxeDBfODQ4OgoJY2FzZSBCVFRWX09TUFJFWTEwMV84NDg6CgljYXNlIEJUVFZfT1NQUkVZMXgxOgoJY2FzZSBCVFRWX09TUFJFWTF4MV9TVklEOgoJY2FzZSBCVFRWX09TUFJFWTJ4eDoKCWNhc2UgQlRUVl9PU1BSRVkyeDBfU1ZJRDoKCWNhc2UgQlRUVl9PU1BSRVkyeDA6CgljYXNlIEJUVFZfT1NQUkVZNTAwOgoJY2FzZSBCVFRWX09TUFJFWTU0MDoKCWNhc2UgQlRUVl9PU1BSRVkyMDAwOgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIG9zcHJleV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9JRFNfRUFHTEU6CgkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9NT0RURUNfMjA1OgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQltb2R0ZWNfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfTE1MQlQ0OgoJCWluaXRfbG1sYnQ0eChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1RJQkVUX0NTMTY6CgkJdGliZXRDUzE2X2luaXQoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9LT0RJQ09NXzQ0MDBSOgoJCWtvZGljb200NDAwcl9pbml0KGJ0dik7CgkJYnJlYWs7Cgl9CgoJLyogcGxsIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICBpZiAoIShidHYtPmlkPT04NDggJiYgYnR2LT5yZXZpc2lvbj09MHgxMSkpIHsKCQkvKiBkZWZhdWx0cyBmcm9tIGNhcmQgbGlzdCAqLwoJCWlmIChQTExfMjggPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDA7CgkJfQoJCWlmIChQTExfMzUgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDE7CgkJfQoJCS8qIGluc21vZCBvcHRpb25zIGNhbiBvdmVycmlkZSAqLwogICAgICAgICAgICAgICAgc3dpdGNoIChwbGxbYnR2LT5jLm5yXSkgewogICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBub25lICovCgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gMDsKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOiAvKiAyOCBNSHogKi8KCQljYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfaWZyZXEgICA9IDI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjogLyogMzUgTUh6ICovCgkJY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2lmcmVxICAgPSAzNTQ2ODk1MDsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKCglidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7CgoJLyogdHVuZXIgY29uZmlndXJhdGlvbiAoZnJvbSBjYXJkIGxpc3QgLyBhdXRvZGV0ZWN0IC8gaW5zbW9kIG9wdGlvbikgKi8KIAlpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQoJCWlmKFVOU0VUID09IGJ0di0+dHVuZXJfdHlwZSkKICAgICAgICAgICAgICAgIAlidHYtPnR1bmVyX3R5cGUgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGU7CglpZiAoVU5TRVQgIT0gdHVuZXJbYnR2LT5jLm5yXSkKCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwoJcHJpbnRrKCJidHR2JWQ6IHVzaW5nIHR1bmVyPSVkXG4iLGJ0di0+Yy5ucixidHYtPnR1bmVyX3R5cGUpOwoJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixBVURDX0NPTkZJR19QSU5OQUNMRSwKCQkJCSAgICAgICZidHYtPnBpbm5hY2xlX2lkKTsKCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixUVU5FUl9TRVRfVFlQRSwmYnR2LT50dW5lcl90eXBlKTsKCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKCWlmIChzdmhzW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5zdmhzID0gc3Zoc1tidHYtPmMubnJdOwoJaWYgKHJlbW90ZVtidHYtPmMubnJdICE9IFVOU0VUKQoJCWJ0di0+aGFzX3JlbW90ZSA9IHJlbW90ZVtidHYtPmMubnJdOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yYWRpbykKCQlidHYtPmhhc19yYWRpbz0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JlbW90ZSkKCQlidHYtPmhhc19yZW1vdGU9MTsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX2dwaW9pcnEpCgkJYnR2LT5ncGlvaXJxPTA7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19ob29rKQoJCWJ0di0+YXVkaW9faG9vaz1idHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2s7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZGlnaXRhbF9tb2RlID09IERJR0lUQUxfTU9ERV9DQU1FUkEpIHsKCQkvKiBkZXRlY3QgQnQ4MzIgY2hpcCBmb3IgcXVhcnR6c2lnaHQgZGlnaXRhbCBjYW1lcmEgKi8KCQlpZiAoKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQxLCAiQnQ4MzIiKSA+PTApIHx8CgkJICAgIChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQlQ4MzJfQUxUMiwgIkJ0ODMyIikgPj0wKSkKCQkJYm9vdF9idDgzMihidHYpOwoJfQoKCWlmICghYXV0b2xvYWQpCgkJcmV0dXJuOwoKCS8qIHRyeSB0byBkZXRlY3QgYXVkaW8vZmFkZXIgY2hpcHMgKi8KCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub19tc3AzNHh4ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXNwMzR4eF9hbHQgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMF9BTFQsICJNU1AzNHh4IChhbHRlcm5hdGUgYWRkcmVzcykiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhOTg3NSAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE5ODc1LCAiVERBOTg3NSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg3NSIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE3NDMyICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTc0MzIsICJUREE3NDMyIikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE3NDMyIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmVlZHNfdHZhdWRpbykKCQlyZXF1ZXN0X21vZHVsZSgidHZhdWRpbyIpOwoKCS8qIHR1bmVyIG1vZHVsZXMgKi8KCXRkYTk4ODcgPSAwOwoJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCgkJdGRhOTg4NyA9IDE7CglpZiAoMCA9PSB0ZGE5ODg3ICYmIDAgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4ODcsICJUREE5ODg3IikgPj0wKQoJCXRkYTk4ODcgPSAxOwoJaWYoKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMykgfHwKCSAgIChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszKSB8fAoJICAgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMpIHx8CgkgICAgdGRhOTg4NykKCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg4NyIpOwoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCWlmKCBzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJUZW1pYyA0MDY2IEZZNSIsMTQpID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JOwoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiQWxwcyBUU0JCNSIsMTApID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9BTFBTX1RTQkI1X1BBTF9JOwoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwogICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiUGhpbGlwcyBGTTEyNDYiLDE0KSA9PTApIHsKICAgICAgICAgICAgICAgIGJ0di0+dHVuZXJfdHlwZT1UVU5FUl9QSElMSVBTX05UU0M7CiAgICAgICAgICAgICAgICBwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0gZWxzZSB7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVW5rbm93biBUdW5lclN0cmluZzogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfQp9CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CglzdHJ1Y3QgdHZlZXByb20gdHY7CgoJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKCWJ0di0+dHVuZXJfdHlwZSA9IHR2LnR1bmVyX3R5cGU7CglidHYtPmhhc19yYWRpbyAgPSB0di5oYXNfcmFkaW87Cn0KCnN0YXRpYyBpbnQgdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGZyZXE7CgoJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJYnR2LT5tYm94X3dlICAgICAgPSAweDEwOwoJYnR2LT5tYm94X21vc3QgICAgPSAweDIwOwoJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJYnR2LT5tYm94X2RhdGEgICAgPSAweDA0OwoJYnR2LT5tYm94X21hc2sgICAgPSAweDNjOwoKCWJ0di0+bWJveF9pb3cgICAgID0gMSA8PCAgODsKCWJ0di0+bWJveF9pb3IgICAgID0gMSA8PCAgOTsKCWJ0di0+bWJveF9jc2VsICAgID0gMSA8PCAxMDsKCglmcmVxPTg4MDAwLzYyLjU7Cgl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8vIHdyaXRlIDB4MWVkOAoJaWYgKDB4MWVkOCA9PSB0ZWE1NzU3X3JlYWQoYnR2KSkgewoJCXByaW50aygiYnR0diVkOiBUZXJyYXRlYyBBY3RpdmUgUmFkaW8gVXBncmFkZSBmb3VuZC5cbiIsCgkJICAgICAgIGJ0di0+Yy5ucik7CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCX0gZWxzZSB7CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAwOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMDsKCX0KCXJldHVybiAwOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIG1pbmltYWwgYm9vdHN0cmFwIGZvciB0aGUgV2luVFYvUFZSIC0tIHVwbG9hZCBhbHRlcmEgZmlybXdhcmUuCiAqCiAqIFRoZSBoY3dhbWMucmJmIGZpcm13YXJlIGZpbGUgaXMgb24gdGhlIEhhdXBwYXVnZSBkcml2ZXIgQ0QuICBIYXZlCiAqIGEgbG9vayBhdCBQdnIvcHZyNDV4eHguRVhFIChzZWxmLWV4dHJhY3RpbmcgemlwIGFyY2hpdmUsIGNhbiBiZQogKiB1bnBhY2tlZCB3aXRoIHVuemlwKS4KICovCiNkZWZpbmUgUFZSX0dQSU9fREVMQVkJCTEwCgojZGVmaW5lIEJUVFZfQUxUX0RBVEEJCTB4MDAwMDAxCiNkZWZpbmUgQlRUVl9BTFRfRENMSwkJMHgxMDAwMDAKI2RlZmluZSBCVFRWX0FMVF9OQ09ORklHCTB4ODAwMDAwCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYWx0ZXJhX2xvYWQoc3RydWN0IGJ0dHYgKmJ0diwgdTggKm1pY3JvLCB1MzIgbWljcm9sZW4pCnsKCXUzMiBuOwogIAl1OCBiaXRzOwoJaW50IGk7CgoJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglncGlvX3dyaXRlKEJUVFZfQUxUX05DT05GSUcpOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglmb3IgKG4gPSAwOyBuIDwgbWljcm9sZW47IG4rKykgewoJCWJpdHMgPSBtaWNyb1tuXTsKCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgewoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQkJaWYgKGJpdHMgJiAweDAxKQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CgkJCWVsc2UKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLDApOwoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCQkJYml0cyA+Pj0gMTsKCQl9Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJLyogYmVnaW4gQWx0ZXJhIGluaXQgbG9vcCAoTm90IG5lY2Vzc2FyeSxidXQgZG9lc24ndCBodXJ0KSAqLwoJZm9yIChpID0gMCA7IGkgPCAzMCA7IGkrKykgewoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CglpbnQgcmM7CgoJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhjd2FtYy5yYmYiLCAmYnR2LT5jLnBjaS0+ZGV2KTsKCWlmIChyYyAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBubyBhbHRlcmEgZmlybXdhcmUgW3ZpYSBob3RwbHVnXVxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKICAgICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICB9CglyYyA9IHB2cl9hbHRlcmFfbG9hZChidHYsIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSk7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGFsdGVyYSBmaXJtd2FyZSB1cGxvYWQgJXNcbiIsCgkgICAgICAgYnR2LT5jLm5yLCAocmMgPCAwKSA/ICJmYWlsZWQiIDogIm9rIik7CiAgICAgICAgcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CglyZXR1cm4gcmM7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHNvbWUgb3NwcmV5IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICBpbnQgaSA9IDA7CiAgICAgICB1bnNpZ25lZCBjaGFyICplZSA9IGVlcHJvbV9kYXRhOwogICAgICAgdW5zaWduZWQgbG9uZyBzZXJpYWwgPSAwOwoKICAgICAgIGlmIChidHYtPmMudHlwZSA9PSAwKSB7CiAgICAgICAgICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KICAgICAgICAgICAgICAgaWYgKChlZVswXT09J00nKSAmJiAoZWVbMV09PSdNJykgJiYgKGVlWzJdPT0nQScpICYmIChlZVszXT09J0MnKSkgewogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9MDsgaTwyMTsgaSsrKQoJCQkgICAgICAgY2hlY2tzdW0gKz0gZWVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrc3VtICE9IGVlWzIxXSkKCQkJICAgICAgIHJldHVybjsKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CgkJICAgICAgIGZvciAoaSA9IDEyOyBpIDwgMjE7IGkrKykKCQkJICAgICAgIHNlcmlhbCAqPSAxMCwgc2VyaWFsICs9IGVlW2ldIC0gJzAnOwogICAgICAgICAgICAgICB9CiAgICAgICB9IGVsc2UgewoJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGU7CiAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwoKICAgICAgICAgICAgICAgZm9yKDsgb2Zmc2V0IDwgOCoxNjsgb2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcmlmeSB0aGUgY2hlY2tzdW0gKi8KICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8MTQ7IGkrKykgY2hlY2tzdW0gKz0gZWVbaStvZmZzZXRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSB+Y2hlY2tzdW07ICAvKiBubyBpZGVhIHdoeSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoKGNoZWNrc3VtPj44KSYweDBGRikgPT0gZWVbb2Zmc2V0KzE0XSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoZWNrc3VtICYgMHgwRkYpID09IGVlW29mZnNldCsxNV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKCQkgICAgICAgcmV0dXJuOwoKCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKCgkgICAgICAgc3dpdGNoKHR5cGUpIHsKCgkgICAgICAgLyogODQ4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMDQ6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAwNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTEwMV84NDg7CgkJICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgLyogODc4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMTI6CgkgICAgICAgY2FzZSAweDAwMTM6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDA7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE0OgoJICAgICAgIGNhc2UgMHgwMDE1OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxNjoKCSAgICAgICBjYXNlIDB4MDAxNzoKCSAgICAgICBjYXNlIDB4MDAyMDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MV9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxODoKCSAgICAgICBjYXNlIDB4MDAxOToKCSAgICAgICBjYXNlIDB4MDAxRToKCSAgICAgICBjYXNlIDB4MDAxRjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4eDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMUE6CgkgICAgICAgY2FzZSAweDAwMUI6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkyeDBfU1ZJRDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNDA6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVk1MDA7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDUwOgoJICAgICAgIGNhc2UgMHgwMDU2OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZNTQwOwoJCSAgICAgICAvKiBidHR2X29zcHJleV81NDBfaW5pdChidHYpOyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA2MDoKCSAgICAgICBjYXNlIDB4MDA3MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MDsKCQkgICAgICAgLy9lbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1BISUxJUFNfTlRTQywgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1CRyovLAogICAgICAgIFRVTkVSX1BISUxJUFNfUEFMLCAgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1JKi8sCiAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCiAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19TRUNBTSwKICAgICAgICBUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1BBTCwKCVRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH07CiNpZiAwCmludCB0dW5lcl8wX2ZtX3RhYmxlW10gPSB7CiAgICAgICAgUEhJTElQU19GUjEyMzZfTlRTQywgIFBISUxJUFNfRlIxMjE2X1BBTCwKICAgICAgICBQSElMSVBTX0ZSMTIxNl9QQUwsICAgUEhJTElQU19GUjEyMTZfUEFMLAogICAgICAgIFBISUxJUFNfRlIxMjE2X1BBTCwgICBQSElMSVBTX0ZSMTIxNl9QQUwsCiAgICAgICAgUEhJTElQU19GUjEyMzZfU0VDQU0sIFBISUxJUFNfRlIxMjM2X1NFQ0FNLAogICAgICAgIFBISUxJUFNfRlIxMjM2X1NFQ0FNLCBQSElMSVBTX0ZSMTIxNl9QQUx9OwojZW5kaWYKCnN0YXRpYyBpbnQgdHVuZXJfMV90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1RFTUlDX05UU0MsICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ19QQUwsICAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvL1RVTkVSX1RFTUlDX1NFQ0FNCiAgICAgICAgVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfUEFMfTsKCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKICAgICAgICBpbnQgdHVuZXJfbWFrZSx0dW5lcl90dl9mbSx0dW5lcl9mb3JtYXQsdHVuZXI9MDsKCgl0dW5lcl9tYWtlICAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDcpOwogICAgICAgIHR1bmVyX3R2X2ZtICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4MTgpID4+IDM7CiAgICAgICAgdHVuZXJfZm9ybWF0ICAgID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHhmMCkgPj4gNDsKCWJ0di0+aGFzX3JlbW90ZSA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4MDEpOwoKCWlmICh0dW5lcl9tYWtlID09IDAgfHwgdHVuZXJfbWFrZSA9PSAyKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTB4MGEpCgkJCXR1bmVyID0gdHVuZXJfMF90YWJsZVt0dW5lcl9mb3JtYXRdOwoJaWYgKHR1bmVyX21ha2UgPT0gMSkKCQlpZih0dW5lcl9mb3JtYXQgPD05KQoJCQl0dW5lciA9IHR1bmVyXzFfdGFibGVbdHVuZXJfZm9ybWF0XTsKCglpZiAodHVuZXJfbWFrZSA9PSA0KQoJCWlmKHR1bmVyX2Zvcm1hdCA9PSAweDA5KQoJCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8vIFRBUEMtRzcwMlAKCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCgkJYnR2LT5jLm5yLGVlcHJvbV9kYXRhWzB4NDFdLGVlcHJvbV9kYXRhWzB4NDJdKTsKCWlmKHR1bmVyKSB7CgkJYnR2LT50dW5lcl90eXBlPXR1bmVyOwoJCXByaW50aygiJWQiLHR1bmVyKTsKCX0gZWxzZQoJCXByaW50aygiVW5rbm93biB0eXBlIik7CglwcmludGsoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKCSAgICAgICB0dW5lcl90dl9mbSAgICAgPyAieWVzIiA6ICJubyIsCgkgICAgICAgYnR2LT5oYXNfcmVtb3RlID8gInllcyIgOiAibm8iKTsKfQoKLyogdXNlZCBvbiBWb29kb28gVFYvRk0gKFZvb2RvbyAyMDApLCBTMCB3aXJlZCB0byAweDEwMDAwICovCnZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pCnsKCS8vIGZpeCB1cCBvdXIgY2FyZCBlbnRyeQoJaWYobm9ybT09VklERU9fTU9ERV9OVFNDKSB7CgkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTU3ZmZmOwoJCWJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk1N2ZmZjsKCQlkcHJpbnRrKCJidHR2X3RkYTk4ODBfc2V0bm9ybSB0byBOVFNDXG4iKTsKCX0KCWVsc2UgewoJICAgICAgICBidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbMF09MHg5NDdmZmY7CiAgICAgICAgICAgICAgICBidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NDdmZmY7CgkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gUEFMXG4iKTsKCX0KCS8vIHNldCBHUElPIGFjY29yZGluZwoJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssCgkJICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2J0di0+YXVkaW9dKTsKfQoKCi8qCiAqIHJlc2V0L2VuYWJsZSB0aGUgTVNQIG9uIHNvbWUgSGF1cHBhdWdlIGNhcmRzCiAqIFRoYW5rcyB0byBLefZzdGkgTeRsa2tpIChrbWFsa2tpQGNjLmh1dC5maSkhCiAqCiAqIEhhdXBwYXVnZTogIHBpbiAgNQogKiBWb29kb286ICAgICBwaW4gMjAKICovCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbikKewoJaW50IG1hc2sgPSAoMSA8PCBwaW4pOwoKCWdwaW9faW5vdXQobWFzayxtYXNrKTsKCWdwaW9fYml0cyhtYXNrLDApOwogICAgICAgIHVkZWxheSgyNTAwKTsKCWdwaW9fYml0cyhtYXNrLG1hc2spOwoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibXNwMzR4eCIpOwoJaWYgKGJ0dHZfdmVyYm9zZSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEhhdXBwYXVnZS9Wb29kb28gbXNwMzR4eDogcmVzZXQgbGluZSAiCgkJICAgICAgICJpbml0IFslZF1cbiIsIGJ0di0+Yy5uciwgcGluKTsKfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfYnQ4MzIoc3RydWN0IGJ0dHYgKmJ0dikKewojaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KCWludCByZXNldGJpdD0wOwoKCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKCWNhc2UgQlRUVl9QWEVMVldQTFRWUEFLOgoJCXJlc2V0Yml0ID0gMHg0MDAwMDA7CgkJYnJlYWs7CgljYXNlIEJUVFZfTU9EVEVDXzIwNToKCQlyZXNldGJpdCA9IDE8PDk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJfQoKCXJlcXVlc3RfbW9kdWxlKCJidDgzMiIpOwoJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQlQ4MzJfSEVYRFVNUCwgTlVMTCk7CgoJcHJpbnRrKCJidHR2JWQ6IFJlc2V0IEJ0ODMyIFtsaW5lPTB4JXhdXG4iLGJ0di0+Yy5ucixyZXNldGJpdCk7CglncGlvX3dyaXRlKDApOwoJZ3Bpb19pbm91dChyZXNldGJpdCwgcmVzZXRiaXQpOwoJdWRlbGF5KDUpOwoJZ3Bpb19iaXRzKHJlc2V0Yml0LCByZXNldGJpdCk7Cgl1ZGVsYXkoNSk7CglncGlvX2JpdHMocmVzZXRiaXQsIDApOwoJdWRlbGF5KDUpOwoKCS8vIGJ0ODMyIG9uIHBpeGVsdmlldyBjaGFuZ2VzIGZyb20gaTJjIDB4OGEgdG8gMHg4OCBhZnRlcgoJLy8gYmVpbmcgcmVzZXQgYXMgYWJvdmUuIFNvIHdlIG11c3QgZm9sbG93IGJ5IHRoaXM6CglidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBCVDgzMl9SRUFUVEFDSCwgTlVMTCk7CiNlbmRpZgp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgSW1hZ2VuYXRpb24gTC1Nb2RlbCBQWEMyMDAgRnJhbWVncmFiYmVyICovCi8qICBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBwcm9jZWR1cmUgYXMKICogIHVzZWQgYnkgQWxlc3NhbmRybyBSdWJpbmkgaW4gaGlzIHB4YzIwMAogKiAgZHJpdmVyLCBidXQgdXNpbmcgQlRUViBmdW5jdGlvbnMgKi8KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KQp7CglzdGF0aWMgaW50IHZhbHNbXSBfX2RldmluaXRkYXRhID0geyAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBkLCAweDBkLAoJCQkJCSAgICAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAoJCQkJCSAgICAweDAwIH07Cgl1bnNpZ25lZCBpbnQgaTsKCWludCB0bXA7Cgl1MzIgdmFsOwoKCS8qIEluaXRpYWxpc2UgR1BJTy1jb25uZXZ0ZWQgc3R1ZmYgKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsICgxPDwxMykpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheSgzKTsKCWdwaW9fd3JpdGUoMTw8MTMpOwoJLyogR1BJTyBpbnB1dHMgYXJlIHB1bGxlZCB1cCwgc28gbm8gbmVlZCB0byBkcml2ZQoJICogcmVzZXQgcGluIGFueSBsb25nZXIgKi8KCWdwaW9fYml0cygweGZmZmZmZiwgMCk7CglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB4YzIwMCIpOwoKCS8qICB3ZSBjb3VsZC9zaG91bGQgdHJ5IGFuZCByZXNldC9jb250cm9sIHRoZSBBRCBwb3RzPyBidXQKCSAgICByaWdodCBub3cgIHdlIHNpbXBseSAgdHVybmVkIG9mZiB0aGUgY3J1c2hpbmcuICBXaXRob3V0CgkgICAgdGhpcyB0aGUgQUdDIGRyaWZ0cyBkcmlmdHMKCSAgICByZW1lbWJlciB0aGUgRU4gaXMgcmV2ZXJzZSBsb2dpYyAtLT4KCSAgICBzZXR0aW5nIEJUODQ4X0FEQ19BR0NfRU4gZGlzYWJsZSB0aGUgQUdDCgkgICAgdGJvdWx0QGVlY3MubGVoaWdoLmVkdQoJKi8KCglidHdyaXRlKEJUODQ4X0FEQ19SRVNFUlZFRHxCVDg0OF9BRENfQUdDX0VOLCBCVDg0OF9BREMpOwoKCS8qCUluaXRpYWxpc2UgTUFYNTE3IERBQyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBEQUMgcmVmZXJlbmNlIHZvbHRhZ2UgbGV2ZWwgLi4uXG4iKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LDB4NUUsMCwweDgwLDEpOwoKCS8qCUluaXRpYWxpc2UgMTJDNTA4IFBJQyAqLwoJLyoJVGhlIEkyQ1dyaXRlIGFuZCBJMkNSZWFkIGNvbW1tYW5kcyBhcmUgYWN0dWFsbHkgdG8gdGhlCgkgKglzYW1lIGNoaXBzIC0gYnV0IHRoZSBSL1cgYml0IGlzIGluY2x1ZGVkIGluIHRoZSBhZGRyZXNzCgkgKglhcmd1bWVudCBzbyB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50ICovCgoKCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpc2luZyAxMkM1MDggUElDIGNoaXAgLi4uXG4iKTsKCgkvKiBGaXJzdCBvZiBhbGwsIGVuYWJsZSB0aGUgY2xvY2sgbGluZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBQWEMyMDAtRiAqLwoJdmFsID0gYnRyZWFkKEJUODQ4X0dQSU9fRE1BX0NUTCk7Cgl2YWwgfD0gQlQ4NDhfR1BJT19ETUFfQ1RMX0dQQ0xLTU9ERTsKCWJ0d3JpdGUodmFsLCBCVDg0OF9HUElPX0RNQV9DVEwpOwoKCS8qIFRoZW4sIHB1c2ggdG8gMCB0aGUgcmVzZXQgcGluIGxvbmcgZW5vdWdoIHRvIHJlc2V0IHRoZSAqCgkgKiBkZXZpY2Ugc2FtZSBhcyBhYm92ZSBmb3IgdGhlIHJlc2V0IGxpbmUsIGJ1dCBub3QgdGhlIHNhbWUKCSAqIHZhbHVlIHNlbnQgdG8gdGhlIEdQSU8tY29ubmVjdGVkIHN0dWZmCgkgKiB3aGljaCBvbmUgaXMgdGhlIGdvb2Qgb25lPyAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwoMTw8MikpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheSgxMCk7CglncGlvX3dyaXRlKDE8PDIpOwoKICAgICAgIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxzKTsgaSsrKSB7CgkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwoJCWlmICh0bXAgIT0gLTEpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTwoJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAoJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKCQl9Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiUFhDMjAwIEluaXRpYWxpc2VkLlxuIik7Cn0KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoKICogIFRoZSBBZGxpbmsgUlRWLTI0IChha2EgQW5nZWxvKSBoYXMgc29tZSBzcGVjaWFsIGluaXRpYWxpc2F0aW9uIHRvIHVubG9jawogKiAgaXQuIFRoaXMgYXBwYXJlbnRseSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBmb3IgZWFjaCA4NzggY2hpcDoKICoKICogIDEpIHdyaXRlIDB4MDBDM0ZFRkYgdG8gdGhlIEdQSU9fT1VUX0VOIHJlZ2lzdGVyCiAqCiAqICAyKSAgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIDB4MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSAweDBFCiAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQogKiAgICAgIC0gaWYgKCBkYXRhPj4xOCAmIDB4MDEgIT0gMCkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAxICkKICogICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCBzdG9wLgogKgogKiAgMykgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSB3cml0ZSAweDQ0MDAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSB3cml0ZSAweDQ0MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIHdyaXRlIDB4MEUKICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCiAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYmIDB4MDEgIT0gMCApCiAqICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZC4KICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnZvaWQKaW5pdF9SVFYyNCAoc3RydWN0IGJ0dHYgKmJ0dikKewoJdWludDMyX3QgZGF0YVJlYWQgPSAwOwoJbG9uZyB3YXRjaGRvZ192YWx1ZSA9IDB4MEU7CgoJcHJpbnRrIChLRVJOX0lORk8KCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGluIHByb2dyZXNzIC4uLlxuIiwKCQlidHYtPmMubnIpOwoKCWJ0d3JpdGUgKDB4MDBjM2ZlZmYsIEJUODQ4X0dQSU9fT1VUX0VOKTsKCglidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJYnR3cml0ZSAoMHgxMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxMCk7CglidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7CgoJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CgoJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDEpKSB7CgkJcHJpbnRrIChLRVJOX0lORk8KCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigxKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCgkJCWJ0di0+Yy5uciwgZGF0YVJlYWQpOwoJfQoKCWJ0d3JpdGUgKDB4NDQwMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxMCk7CglidHdyaXRlICgweDQ0MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglidHdyaXRlICh3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglkYXRhUmVhZCA9IGJ0cmVhZCAoQlQ4NDhfR1BJT19EQVRBKTsKCglpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMCkpIHsKCQlwcmludGsgKEtFUk5fSU5GTwoJCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uKDIpIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIChyZWFkICVkKVxuIiwKCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7CgoJCXJldHVybjsKCX0KCglwcmludGsgKEtFUk5fSU5GTwoJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gY29tcGxldGUuXG4iLCBidHYtPmMubnIpOwp9CgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIE1pcm8gUHJvIHJhZGlvIHN0dWZmIC0tIHRoZSB0ZWE1NzU3IGlzIGNvbm5lY3RlZCB0byBzb21lIEdQSU8gcG9ydHMgICAgICovCi8qCiAqIENvcHlyaWdodCAoYykgMTk5OSBDc2FiYSBIYWxhc3ogPHFnZWhhbGlAdW5pLW1pc2tvbGMuaHU+CiAqIFRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKgogKiBCcnV0YWxseSBoYWNrZWQgYnkgRGFuIFNoZXJpZGFuIDxkYW4uc2hlcmlkYW5AY29udGFjdC5vcmcudWs+IGRqczUyIDgvMy8wMAogKi8KCnN0YXRpYyB2b2lkIGJ1c19sb3coc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCwwKTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIHZvaWQgYnVzX2hpZ2goc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCxiaXQpOwoJdWRlbGF5KDUpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQp9CgpzdGF0aWMgaW50IGJ1c19pbihzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgYml0KQp7CglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQoJcmV0dXJuIGdwaW9fcmVhZCgpICYgKGJpdCk7Cn0KCi8qIFRFQTU3NTcgcmVnaXN0ZXIgYml0cyAqLwojZGVmaW5lIFRFQV9GUkVRCQkwOjE0CiNkZWZpbmUgVEVBX0JVRkZFUgkJMTU6MTUKCiNkZWZpbmUgVEVBX1NJR05BTF9TVFJFTkdUSAkxNjoxNwoKI2RlZmluZSBURUFfUE9SVDEJCTE4OjE4CiNkZWZpbmUgVEVBX1BPUlQwCQkxOToxOQoKI2RlZmluZSBURUFfQkFORAkJMjA6MjEKI2RlZmluZSBURUFfQkFORF9GTQkJMAojZGVmaW5lIFRFQV9CQU5EX01XCQkxCiNkZWZpbmUgVEVBX0JBTkRfTFcJCTIKI2RlZmluZSBURUFfQkFORF9TVwkJMwoKI2RlZmluZSBURUFfTU9OTwkJMjI6MjIKI2RlZmluZSBURUFfQUxMT1dfU1RFUkVPCTAKI2RlZmluZSBURUFfRk9SQ0VfTU9OTwkJMQoKI2RlZmluZSBURUFfU0VBUkNIX0RJUkVDVElPTgkyMzoyMwojZGVmaW5lIFRFQV9TRUFSQ0hfRE9XTgkJMAojZGVmaW5lIFRFQV9TRUFSQ0hfVVAJCTEKCiNkZWZpbmUgVEVBX1NUQVRVUwkJMjQ6MjQKI2RlZmluZSBURUFfU1RBVFVTX1RVTkVECTAKI2RlZmluZSBURUFfU1RBVFVTX1NFQVJDSElORwkxCgovKiBMb3ctbGV2ZWwgc3R1ZmYgKi8Kc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwoJaW50IHZhbHVlID0gMDsKCWludCBpOwoKCS8qIGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KCWdwaW9faW5vdXQoYnR2LT5tYm94X21hc2ssIGJ0di0+bWJveF9jbGsgfCBidHYtPm1ib3hfd2UpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyByZWFkIik7CgoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoKCXVkZWxheSgxMCk7Cgl0aW1lb3V0PSBqaWZmaWVzICsgSFo7CgoJLy8gd2FpdCBmb3IgREFUQSBsaW5lIHRvIGdvIGxvdzsgZXJyb3IgaWYgaXQgZG9lc24ndAoJd2hpbGUgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQoJCXNjaGVkdWxlKCk7CglpZiAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHRlYTU3NTc6IHJlYWQgdGltZW91dFxuIixidHYtPmMubnIpOwoJCXJldHVybiAtMTsKCX0KCglkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IixidHYtPmMubnIpOwoJZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKCXsKCQl1ZGVsYXkoNSk7CgkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSg1KTsKCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXZhbHVlIDw8PSAxOwoJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KCQlkcHJpbnRrKCIlYyIsIChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nUyc6J00nKTsKCX0KCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOwoJcmV0dXJuIHZhbHVlOwp9CgpzdGF0aWMgaW50IHRlYTU3NTdfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHZhbHVlKQp7CglpbnQgaTsKCWludCByZWcgPSB2YWx1ZTsKCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlIHwgYnR2LT5tYm94X2RhdGEpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZWE1NzU3IHdyaXRlIik7CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiB3cml0ZSAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7Cglmb3IoaSA9IDA7IGkgPCAyNTsgaSsrKQoJewoJCWlmIChyZWcgJiAweDEwMDAwMDApCgkJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJZWxzZQoJCQlidXNfbG93KGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJcmVnIDw8PSAxOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSgxMCk7Cgl9CglidXNfbG93KGJ0dixidHYtPm1ib3hfd2UpOyAgLyogdW5tdXRlICEhISAqLwoJcmV0dXJuIDA7Cn0KCnZvaWQgdGVhNTc1N19zZXRfZnJlcShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBzaG9ydCBmcmVxKQp7CglkcHJpbnRrKCJ0ZWE1NzU3X3NldF9mcmVxICVkXG4iLGZyZXEpOwoJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvKiBhZGQgMTAuN01IeiAoc2VlIGRvY3MpICovCiNpZiAwCgkvKiBicmVha3MgTWlybyBQQ1RWICovCgl2YWx1ZSA9IHRlYTU3NTdfcmVhZChidHYpOwoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3IHJlYWRiYWNrPTB4JXhcbiIsYnR2LT5jLm5yLHZhbHVlKTsKI2VuZGlmCn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiB3aW52aWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJLyogUFQyMjU0QSBwcm9ncmFtbWluZyBKb24gVG9tYnMsIGpvbkBndGUuZXNpLnVzLmVzICovCglpbnQgYml0c19vdXQsIGxvb3BzLCB2b2wsIGRhdGE7CgoJaWYgKCFzZXQpIHsKCQkvKiBGaXhlZCBieSBMZWFuZHJvIEx1Y2FyZWxsYSA8bHVjYUBsaW51eG1lbmRvemEub3JnLmFyICgwNy8zMS8wMSkgKi8KCQl2LT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUU7CgkJcmV0dXJuOwoJfQoKCS8qIDMyIGxldmVscyBsb2dhcml0aG1pYyAqLwoJdm9sID0gMzIgLSAoKHYtPnZvbHVtZT4+MTEpKTsKCS8qIHVuaXRzICovCgliaXRzX291dCA9IChQVDIyNTRfREJTX0lOXzI+Pih2b2wlNSkpOwoJLyogdGVucyAqLwoJYml0c19vdXQgfD0gKFBUMjI1NF9EQlNfSU5fMTA+Pih2b2wvNSkpOwoJYml0c19vdXQgfD0gUFQyMjU0X0xfQ0hBTk5FTCB8IFBUMjI1NF9SX0NIQU5ORUw7CglkYXRhID0gZ3Bpb19yZWFkKCk7CglkYXRhICY9IH4oV0lOVklFV19QVDIyNTRfQ0xLfCBXSU5WSUVXX1BUMjI1NF9EQVRBfAoJCSAgV0lOVklFV19QVDIyNTRfU1RST0JFKTsKCWZvciAobG9vcHMgPSAxNzsgbG9vcHMgPj0gMCA7IGxvb3BzLS0pIHsKCQlpZiAoYml0c19vdXQgJiAoMTw8bG9vcHMpKQoJCQlkYXRhIHw9ICBXSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWVsc2UKCQkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhIHw9IFdJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9DTEs7CgkJZ3Bpb193cml0ZShkYXRhKTsKCX0KCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0RBVEE7CglncGlvX3dyaXRlKGRhdGEpOwoJdWRlbGF5KDEwKTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWdwaW9fd3JpdGUoZGF0YSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1vbm8vc3RlcmVvIGNvbnRyb2wgZm9yIHZhcmlvdXMgY2FyZHMgKHdoaWNoIGRvbid0IHVzZSBpMmMgY2hpcHMgYnV0ICAgICovCi8qIGNvbm5lY3Qgc29tZXRoaW5nIHRvIHRoZSBHUElPIHBpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZApndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgzMDAsIDB4MzAwKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDMwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJY29uID0gMHgyMDA7Ci8vCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCi8vCQkJY29uID0gMHgxMDA7CgkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKZ3ZiY3R2NXBjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwsIGNvbjsKCiNpZiBCVFRWX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDAsOCwwKQoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CiNlbHNlCglpZiAoYnR2LT5yYWRpbykKCQlyZXR1cm47CiNlbmRpZgoKCXZhbCA9IGdwaW9fcmVhZCgpOwoJaWYgKHNldCkgewoJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpIHsKCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgewoJCQkJLyogTEFORzEgKyBMQU5HMiAqLwoJCQkJY29uID0gMHgxMDA7CgkJCX0KCQkJZWxzZSB7CgkJCQkvKiBMQU5HMiAqLwoJCQkJY29uID0gMHgzMDA7CgkJCX0KCQl9CgkJaWYgKGNvbiAhPSAodmFsICYgMHgzMDApKSB7CgkJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImd2YmN0djVwY2kiKTsKCQl9Cgl9IGVsc2UgewoJCXN3aXRjaCAodmFsICYgMHg3MCkgewoJCSAgY2FzZSAweDEwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4MzA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NTA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMTsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NjA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU87CgkJCWJyZWFrOwoJCSAgY2FzZSAweDcwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQkJYnJlYWs7CgkJICBkZWZhdWx0OgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJfQoJfQp9CgovKgogKiBNYXJpbyBNZWRpbmEgTnVzc2JhdW0gPG1lZGlzb2Z0QGFsb2hhYmJzLm9yZy5teD4KICogIEkgZGlzY292ZXIgdGhhdCBvbiBCVDg0OF9HUElPX0RBVEEgYWRkcmVzcyBhIGJ5dGUgMHhjY2UgZW5hYmxlIHN0ZXJlbywKICogIDB4ZGRlIGVuYWJsZXMgbW9ubyBhbmQgMHhjY2QgZW5hYmxlcyBzYXAKICoKICogUGV0ciBWYW5kcm92ZWMgPFZBTkRST1ZFQHZjLmN2dXQuY3o+CiAqICBQLlMuOiBBdCBsZWFzdCBtYXNrIGluIGxpbmUgYWJvdmUgaXMgd3JvbmcgLSBHUElPIHBpbnMgMywyIHNlbGVjdAogKiAgaW5wdXQvb3V0cHV0IHNvdW5kIGNvbm5lY3Rpb24sIHNvIGJvdGggbXVzdCBiZSBzZXQgZm9yIG91dHB1dCBtb2RlLgogKgogKiBMb29rcyBsaWtlIGl0J3MgbmVlZGVkIG9ubHkgZm9yIHRoZSAidHZwaG9uZSIsIHRoZSAidHZwaG9uZSA5OCIKICogaGFuZGxlcyB0aGlzIHdpdGggYSB0ZGE5ODQwCiAqCiAqLwpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCWludCB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLwoJCQl2YWwgPSAweDAyOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQl2YWwgPSAweDAxOwoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMTsKCQlyZXR1cm47Cgl9Cn0KCnN0YXRpYyB2b2lkCmF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgIC8qIFNURVJFTyAqLwoJCQl2YWwgPSAweDAyOwoJCWJ0YW9yKHZhbCwgfjB4MDMsIEJUODQ4X0dQSU9fREFUQSk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiYXZlcm1lZGlhIik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIExpZmV0ZWMgOTQxNSBoYW5kbGluZyAqLwpzdGF0aWMgdm9pZApsdDk0MTVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CiAgICAgICAgaW50IHZhbCA9IDA7CgogICAgICAgIGlmIChncGlvX3JlYWQoKSAmIDB4NDAwMCkgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05POwoJCXJldHVybjsKCX0KCiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgIC8qIEEyIFNBUCAqLwogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDAwODA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pIC8qIEEyIHN0ZXJlbyAqLwogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA4ODA7CiAgICAgICAgICAgICAgICBpZiAoKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgfHwKCQkgICAgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKSkKCQkJdmFsID0gMDsKCQlncGlvX2JpdHMoMHgwODgwLCB2YWwpOwogICAgICAgICAgICAgICAgaWYgKGJ0dHZfZ3BpbykKICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibHQ5NDE1Iik7CiAgICAgICAgfSBlbHNlIHsKCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3aXRoIHRoaXMgY2FyZCA6LSggKi8KICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9Cn0KCi8vIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4CnN0YXRpYyB2b2lkCnRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDE4MDAwMCwweDE4MDAwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgwODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MTgwMDAwOwoJCWdwaW9fYml0cygweDE4MDAwMCwgY29uKTsKCQlpZiAoYnR0dl9ncGlvKQoJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZXJyYXR2Iik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCS8qYnRvciAoMHhjMzIwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsqLwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkJLyogTW9ubyAqLwoJCQl2YWwgPSAweDQyMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQkvKiBTQVAgKi8KCQkJdmFsID0gMHg0MTAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCS8qIFN0ZXJlbyAqLwoJCQl2YWwgPSAweDAyMDAwMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDQzMDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmZhc3QyMDAwIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgUHJvbGluayBQVi1CVDg3OFArOUIgKFBpeGVsVmlldyBQbGF5VFYgUHJvIEZNK05JQ0FNCiAqIHJldmlzaW9uIDlCIGhhcyBvbi1ib2FyZCBUREE5ODc0QSBzb3VuZCBkZWNvZGVyKS4KICoKICogTm90ZTogVGhlcmUgYXJlIGNhcmQgdmFyaWFudHMgd2l0aG91dCB0ZGE5ODc0YS4gRm9yY2luZyB0aGUgInN0ZXJlbyBzb3VuZCByb3V0ZSIKICogICAgICAgd2lsbCBtdXRlIHRoaXMgY2FyZHMuCiAqLwpzdGF0aWMgdm9pZApwdmJ0ODc4cDliX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDA7CgojaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwojZWxzZQoJaWYgKGJ0di0+cmFkaW8pCgkJcmV0dXJuOwojZW5kaWYKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDE7CgkJfQoJCWlmICgodi0+bW9kZSAmIChWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyKSkKCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7CgkJCXZhbCA9IDB4MDI7CgkJfQoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB2YnQ4NzhwOWIiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgRmx5VmlkZW8gMjAwMFMgKHdpdGggdGRhOTg3NCBkZWNvZGVyKQogKiBiYXNlZCBvbiBwdmJ0ODc4cDliX2F1ZGlvKCkgLSB0aGlzIGlzIG5vdCB0ZXN0ZWQsIHBsZWFzZSBmaXghISEKICovCnN0YXRpYyB2b2lkCmZ2MjAwMHNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgdmFsID0gMHhmZmZmOwoKI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKI2Vsc2UKCWlmIChidHYtPnJhZGlvKQoJCXJldHVybjsKI2VuZGlmCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDAwMDsKCQl9CgkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQoJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKCQkJdmFsID0gMHgxMDgwOyAvLy1kay0/Pz86IDB4MDg4MCwgMHgwMDgwLCAweDE4MDAgLi4uCgkJfQoJCWlmICh2YWwgIT0gMHhmZmZmKSB7CgkJCWdwaW9fYml0cygweDE4MDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJmdjIwMDBzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIENhbm9wdXMgV2luRFZSIFBDSQogKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPgogKi8Kc3RhdGljIHZvaWQKd2luZHZyX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewogICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gMDsKCiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA0MDAwMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDEwMDAwMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOwogICAgICAgICAgICAgICAgaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgxNDAwMDAsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidHR2X2dwaW8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwid2luZHZyIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogICAgICAgIH0KfQoKLyoKICogc291bmQgY29udHJvbCBmb3IgQUQtVFZLNTAzCiAqIEhpcm9zaGkgVGFrZWthd2EgPHNpYW5AYmlnLm9yLmpwPgogKi8Kc3RhdGljIHZvaWQKYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMHhmZmZmZmY7CgoJLy9idGFvcigweDFlMDAwMCwgfjB4MWUwMDAwLCBCVDg0OF9HUElPX09VVF9FTik7CgoJaWYgKHNldCkgewoJCS8vYnRvcigqKiosIEJUODQ4X0dQSU9fT1VUX0VOKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDAxODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MDAwMDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQoJCQljb24gPSAweDAwMDYwMDAwOwoJCWlmIChjb24gIT0gMHhmZmZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MWUwMDAwLGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCAiYWR0dms1MDMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyogUmVtb3RlVmlzaW9uIE1YIChydjYwNSkgbXV4c2VsIGhlbHBlciBbTWlndWVsIEZyZWl0YXNdCiAqCiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcnY2MDUgZG9uJ3QgdXNlIGEgbm9ybWFsIG11bHRpcGxleCwgYnV0IGEgY3Jvc3Nwb2ludAogKiBzd2l0Y2ggaW5zdGVhZCAoQ0QyMk0zNDk0RSkuIFRoaXMgSUMgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNvbm5lY3Rpb25zCiAqIGJldHdlZW4gWG4gKGlucHV0KSBhbmQgWW4gKG91dHB1dCkgcGlucy4gV2UgbmVlZCB0byBjbGVhciBhbnkgZXhpc3RpbmcKICogY29ubmVjdGlvbiBwcmlvciB0byBlc3RhYmxpc2ggYSBuZXcgb25lLCBwdWxzaW5nIHRoZSBTVFJPQkUgcGluLgogKgogKiBUaGUgYm9hcmQgaGFyZHdpcmUgWTAgKHhwb2ludCkgdG8gTVVYMSBhbmQgTVVYT1VUIHRvIFlpbi4KICogR1BJTyBwaW5zIGFyZSB3aXJlZCBhczoKICogIEdQSU9bMDozXSAtIEFYWzA6M10gKHhwb2ludCkgLSBQMVswOjNdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bNDo2XSAtIEFZWzA6Ml0gKHhwb2ludCkgLSBQMVs0OjZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bN10gICAtIERBVEEgKHhwb2ludCkgICAgLSBQMVs3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzhdICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNV0gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s5XSAgIC0gUkVTRVQgKHhwb2ludCkgICAtIFAzWzZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bMTBdICAtIFNUUk9CRSAoeHBvaW50KSAgLSBQM1s3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElOVFIgICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNF0gKG1pY3JvY29udHJvbGVyKQogKgogKiBUaGUgbWljcm9jb250cm9sZXIgaXMgYSA4MEMzMiBsaWtlLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY2hhbmdlIHhwb2ludAogKiBjb25maWd1cmF0aW9uIGVpdGhlciBkaXJlY3RseSAoYXMgd2UgYXJlIGRvaW5nKSBvciB1c2luZyB0aGUgbWljcm9jb250cm9sZXIKICogd2hpY2ggaXMgYWxzbyB3aXJlZCB0byBJMkMgaW50ZXJmYWNlLiBJIGhhdmUgbm8gZnVydGhlciBpbmZvIG9uIHRoZQogKiBtaWNyb2NvbnRyb2xlciBmZWF0dXJlcywgb25lIHdvdWxkIG5lZWQgdG8gZGlzYXNzZW1ibHkgdGhlIGZpcm13YXJlLgogKiBub3RlOiB0aGUgdmVuZG9yIHJlZnVzZWQgdG8gZ2l2ZSBhbnkgaW5mb3JtYXRpb24gb24gdGhpcyBwcm9kdWN0LCBhbGwKICogICAgICAgdGhhdCBzdHVmZiB3YXMgZm91bmQgdXNpbmcgYSBtdWx0aW1ldGVyISA6KQogKi8Kc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogcmVzZXQgYWxsIGNvbmVjdGlvbnMgKi8KCWdwaW9fYml0cygweDIwMCwweDIwMCk7CgltZGVsYXkoMSk7CglncGlvX2JpdHMoMHgyMDAsMHgwMDApOwoJbWRlbGF5KDEpOwoKCS8qIGNyZWF0ZSBhIG5ldyBjb25lY3Rpb24gKi8KCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CglncGlvX2JpdHMoMHg0ODAsMHg0ODApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4NDgwLDB4MDgwKTsKCW1kZWxheSgxKTsKfQoKLyogVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IG11eHNlbCBoZWxwZXIgW0NocmlzIEZhbm5pbmddCiAqCiAqIFRoZSBDUzE2IChhdmFpbGFibGUgb24gZUJheSBjaGVhcCkgaXMgYSBQQ0kgYm9hcmQgd2l0aCBmb3VyIEZ1c2lvbgogKiA4NzhBIGNoaXBzLCBhIFBDSSBicmlkZ2UsIGFuIEF0bWVsIG1pY3JvY29udHJvbGxlciwgZm91ciBzeW5jIHNlcGVyYXRvcgogKiBjaGlwcywgdGVuIGVpZ2h0IGlucHV0IGFuYWxvZyBtdWx0aXBsZXhvcnMsIGEgbm90IGNoaXAgYW5kIGEgZmV3CiAqIG90aGVyIGNvbXBvbmVudHMuCiAqCiAqIDE2IGlucHV0cyBvbiBhIHNlY29uZGFyeSBicmFja2V0IGFyZSBwcm92aWRlZCBhbmQgY2FuIGJlIHNlbGVjdGVkCiAqIGZyb20gZWFjaCBvZiB0aGUgZm91ciBjYXB0dXJlIGNoaXBzLiAgVHdvIG9mIHRoZSBlaWdodCBpbnB1dAogKiBtdWx0aXBsZXhvcnMgYXJlIHVzZWQgdG8gc2VsZWN0IGZyb20gYW55IG9mIHRoZSAxNiBpbnB1dCBzaWduYWxzLgogKgogKiBVbnN1cHBvcnRlZCBoYXJkd2FyZSBjYXBhYmlsaXRpZXM6CiAqICAuIEEgdmlkZW8gb3V0cHV0IG1vbml0b3Igb24gdGhlIHNlY29uZGFyeSBicmFja2V0IGNhbiBiZSBzZWxlY3RlZCBmcm9tCiAqICAgIG9uZSBvZiB0aGUgODc4QSBjaGlwcy4KICogIC4gQW5vdGhlciBwYXNzdGhyb3VnaCBidXQgSSBoYXZlbid0IHNwZW50IGFueSB0aW1lIGludmVzdGlnYXRpbmcgaXQuCiAqICAuIERpZ2l0YWwgSS9PIChsb2dpYyBsZXZlbCBjb25uZWN0ZWQgdG8gR1BJTykgaXMgYXZhaWxhYmxlIGZyb20gYW4KICogICAgb25ib2FyZCBoZWFkZXIuCiAqCiAqIFRoZSBvbiBjaGlwIGlucHV0IG11eCBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAyLgogKiBHUElPWzE2OjE5XSAtIFZpZGVvIGlucHV0IHNlbGVjdGlvbgogKiBHUElPWzA6M10gICAtIFZpZGVvIG91dHB1dCBtb25pdG9yIHNlbGVjdCAob25seSBhdmFpbGFibGUgZnJvbSBvbmUgODc4QSkKICogR1BJT1s/Oj9dICAgLSBEaWdpdGFsIEkvTy4KICoKICogVGhlcmUgaXMgYW4gQVRNRUwgbWljcm9jb250cm9sbGVyIHdpdGggYW4gODAzMSBjb3JlIG9uIGJvYXJkLiAgSSBoYXZlIG5vdAogKiBkZXRlcm1pbmVkIHdoYXQgZnVuY3Rpb24gKGlmIGFueSkgaXQgcHJvdmlkZXMuICBXaXRoIHRoZSBtaWNyb2NvbnRyb2xsZXIKICogYW5kIHN5bmMgc2VwZXJhdG9yIGNoaXBzIGEgZ3Vlc3MgaXMgdGhhdCBpdCBtaWdodCBoYXZlIHRvIGRvIHdpdGggdmlkZW8KICogc3dpdGNoaW5nIGFuZCBtYXliZSBzb21lIGRpZ2l0YWwgSS9PLgogKi8Kc3RhdGljIHZvaWQgdGliZXRDUzE2X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHZpZGVvIG11eCAqLwoJZ3Bpb19iaXRzKDB4MGYwMDAwLCBpbnB1dCA8PCAxNik7Cn0KCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCS8qIGVuYWJsZSBncGlvIGJpdHMsIG1hc2sgb2J0YWluZWQgdmlhIGJ0U3B5ICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAweDBmN2ZmZik7CglncGlvX3dyaXRlKDB4MGY3ZmZmKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdGhlIEtvZGljb20tNDQwMHIgZ2V0IGEgbGl0dGxlIG1pbmQtdHdpc3RpbmcuCiAqIFRoZXJlIGlzIGEgIm1hc3RlciIgY29udHJvbGxlciBhbmQgdGhyZWUgInNsYXZlIiBjb250cm9sbGVycywgdG9nZXRoZXIKICogYW4gYW5hbG9nIHN3aXRjaCB3aGljaCBjb25uZWN0cyBhbnkgb2YgMTYgY2FtZXJhcyB0byBhbnkgb2YgdGhlIEJUODdBJ3MuCiAqIFRoZSBhbmFsb2cgc3dpdGNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlICJtYXN0ZXIiLCBidXQgdGhlIGRldGVjdGlvbiBvcmRlcgogKiBvZiB0aGUgZm91ciBCVDg3OEEgY2hpcHMgaXMgaW4gYW4gb3JkZXIgd2hpY2ggSSBqdXN0IGRvbid0IHVuZGVyc3RhbmQuCiAqIFRoZSAibWFzdGVyIiBpcyBhY3R1YWxseSB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgdG8gYmUgZGV0ZWN0ZWQuICBUaGUKICogbG9naWMgb24gdGhlIGJvYXJkIHVzZXMgbG9naWNhbCBudW1iZXJzIGZvciB0aGUgNCBjb250cm9sZXJzLCBidXQKICogdGhvc2UgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZS4gIFdoZW4gd29ya2luZwogKiB3aXRoIHRoZSBhbmFsb2cgc3dpdGNoLCB3ZSBuZWVkIHRvICJtYXAiIGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZQogKiBvdmVyIHRvIHRoZSBib2FyZCdzIGxvZ2ljYWwgY29udHJvbGxlciBudW1iZXIuICBUaGlzIG1hcHBpbmcgc2VxdWVuY2UKICogaXMgezMsIDAsIDIsIDF9LCBpLmUuIHRoZSBmaXJzdCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkIGlzIGxvZ2ljYWwKICogdW5pdCAzLCB0aGUgc2Vjb25kICh3aGljaCBpcyB0aGUgbWFzdGVyKSBpcyBsb2dpY2FsIHVuaXQgMCwgZXRjLgogKiBXZSBuZWVkIHRvIG1haW50YWluIHRoZSBzdGF0dXMgb2YgdGhlIGFuYWxvZyBzd2l0Y2ggKHdoaWNoIG9mIHRoZSAxNgogKiBjYW1lcmFzIGlzIGNvbm5lY3RlZCB0byB3aGljaCBvZiB0aGUgNCBjb250cm9sbGVycykuICBSYXRoZXIgdGhhbgogKiBhZGQgdG8gdGhlIGJ0dHYgc3RydWN0dXJlIGZvciB0aGlzLCB3ZSB1c2UgdGhlIGRhdGEgcmVzZXJ2ZWQgZm9yCiAqIHRoZSBtYm94ICh1bnVzZWQgZm9yIHRoaXMgY2FyZCB0eXBlKS4KICovCgovKgogKiBGaXJzdCBhIHJvdXRpbmUgdG8gc2V0IHRoZSBhbmFsb2cgc3dpdGNoLCB3aGljaCBjb250cm9scyB3aGljaCBjYW1lcmEKICogaXMgcm91dGVkIHRvIHdoaWNoIGNvbnRyb2xsZXIuICBUaGUgc3dpdGNoIGNvbXByaXNlcyBhbiBYLWFkZHJlc3MKICogKGdwaW8gYml0cyAwLTMsIHJlcHJlc2VudGluZyB0aGUgY2FtZXJhLCByYW5naW5nIGZyb20gMC0xNSksIGFuZCBhCiAqIFktYWRkcmVzcyAoZ3BpbyBiaXRzIDQtNiwgcmVwcmVzZW50aW5nIHRoZSBjb250cm9sbGVyLCByYW5naW5nIGZyb20gMC0zKS4KICogQSBkYXRhIHZhbHVlIChncGlvIGJpdCA3KSBvZiAnMScgZW5hYmxlcyB0aGUgc3dpdGNoLCBhbmQgJzAnIGRpc2FibGVzCiAqIHRoZSBzd2l0Y2guICBBIFNUUk9CRSBiaXQgKGdwaW8gYml0IDgpIGxhdGNoZXMgdGhlIGRhdGEgdmFsdWUgaW50byB0aGUKICogc3BlY2lmaWVkIGFkZHJlc3MuICBUaGUgaWRlYSBpcyB0byBzZXQgdGhlIGFkZHJlc3MgYW5kIGRhdGEsIHRoZW4gYnJpbmcKICogU1RST0JFIGhpZ2gsIGFuZCBmaW5hbGx5IGJyaW5nIFNUUk9CRSBiYWNrIHRvIGxvdy4KICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl93cml0ZShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciB4YWRkciwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeWFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGEpIHsKCXVuc2lnbmVkIGludCB1ZGF0YTsKCgl1ZGF0YSA9IChkYXRhIDw8IDcpIHwgKCh5YWRkciYzKSA8PCA0KSB8ICh4YWRkciYweGYpOwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiB3cml0ZSBBRERSIGFuZCBEQVQgKi8KCWdwaW9fYml0cygweDFmZiwgdWRhdGEgfCAoMSA8PCA4KSk7CS8qIHN0cm9iZSBoaWdoICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhKTsJCS8qIHN0cm9iZSBsb3cgKi8KfQoKLyoKICogTmV4dCB0aGUgbXV4IHNlbGVjdC4gIEJvdGggdGhlICJtYXN0ZXIiIGFuZCAic2xhdmUiICdjYXJkcycgKGNvbnRyb2xsZXJzKQogKiB1c2UgdGhpcyByb3V0aW5lLiAgVGhlIHJvdXRpbmUgZmluZHMgdGhlICJtYXN0ZXIiIGZvciB0aGUgY2FyZCwgbWFwcwogKiB0aGUgY29udHJvbGxlciBudW1iZXIgZnJvbSB0aGUgZGV0ZWN0ZWQgcG9zaXRpb24gb3ZlciB0byB0aGUgbG9naWNhbAogKiBudW1iZXIsIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0byB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIGhvdXNla2VlcHMKICogdGhlIGxvY2FsIGNvcHkgb2YgdGhlIHN3aXRjaCBpbmZvcm1hdGlvbi4gIFRoZSBwYXJhbWV0ZXIgJ2lucHV0JyBpcyB0aGUKICogcmVxdWVzdGVkIGNhbWVyYSBudW1iZXIgKDAgLSAxNSkuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJY2hhciAqc3dfc3RhdHVzOwoJaW50IHhhZGRyLCB5YWRkcjsKCXN0cnVjdCBidHR2ICptY3RscjsKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hcFs0XSA9IHszLCAwLCAyLCAxfTsKCgltY3RsciA9IG1hc3RlcltidHYtPmMubnJdOwoJaWYgKG1jdGxyID09IE5VTEwpIHsJLyogaWdub3JlIGlmIG1hc3RlciBub3QgeWV0IGRldGVjdGVkICovCgkJcmV0dXJuOwoJfQoJeWFkZHIgPSAoYnR2LT5jLm5yIC0gbWN0bHItPmMubnIgKyAxKSAmIDM7IC8qIHRoZSAnJicgaXMgZm9yIHNhZmV0eSAqLwoJeWFkZHIgPSBtYXBbeWFkZHJdOwoJc3dfc3RhdHVzID0gKGNoYXIgKikoJm1jdGxyLT5tYm94X3dlKTsKCXhhZGRyID0gaW5wdXQgJiAweGY7CgkvKiBDaGVjayBpZiB0aGUgY29udHJvbGxlci9jYW1lcmEgcGFpciBoYXMgY2hhbmdlZCwgZWxzZSBpZ25vcmUgKi8KCWlmIChzd19zdGF0dXNbeWFkZHJdICE9IHhhZGRyKQoJewoJCS8qICJvcGVuIiB0aGUgb2xkIHN3aXRjaCwgImNsb3NlIiB0aGUgbmV3IG9uZSwgc2F2ZSB0aGUgbmV3ICovCgkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCBzd19zdGF0dXNbeWFkZHJdLCB5YWRkciwgMCk7CgkJc3dfc3RhdHVzW3lhZGRyXSA9IHhhZGRyOwoJCWtvZGljb200NDAwcl93cml0ZShtY3RsciwgeGFkZHIsIHlhZGRyLCAxKTsKCX0KfQoKLyoKICogRHVyaW5nIGluaXRpYWxpc2F0aW9uLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBhbmFsb2cgc3dpdGNoLiAgV2UKICogYWxzbyBwcmVzZXQgdGhlIHN3aXRjaCB0byBtYXAgdGhlIDQgY29ubmVjdG9ycyBvbiB0aGUgY2FyZCB0byB0aGUKICogKnVzZXIncyogKHNlZSBhYm92ZSBkZXNjcmlwdGlvbiBvZiBrb2RpY29tNDQwMHJfbXV4c2VsKSBjaGFubmVscwogKiAwIHRocm91Z2ggMwogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJY2hhciAqc3dfc3RhdHVzID0gKGNoYXIgKikoJmJ0di0+bWJveF93ZSk7CglpbnQgaXg7CgoJZ3Bpb19pbm91dCgweDAwMDNmZiwgMHgwMDAzZmYpOwoJZ3Bpb193cml0ZSgxIDw8IDkpOwkvKiByZXNldCBNVVggKi8KCWdwaW9fd3JpdGUoMCk7CgkvKiBQcmVzZXQgY2FtZXJhIDAgdG8gdGhlIDQgY29udHJvbGxlcnMgKi8KCWZvciAoaXg9MDsgaXg8NDsgaXgrKykgewoJCXN3X3N0YXR1c1tpeF0gPSBpeDsKCQlrb2RpY29tNDQwMHJfd3JpdGUoYnR2LCBpeCwgaXgsIDEpOwoJfQoJLyoKCSAqIFNpbmNlIHRoaXMgaXMgdGhlICJtYXN0ZXIiLCB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKCSAqIG90aGVyIHRocmVlIGNvbnRyb2xsZXIgY2hpcHMnIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlCgkgKiBmb3IgbGF0ZXIgdXNlIGluIHRoZSBtdXhzZWwgcm91dGluZS4KCSAqLwoJaWYgKChidHYtPmMubnI8MSkgfHwgKGJ0di0+Yy5ucj5CVFRWX01BWC0zKSkKCSAgICByZXR1cm47CgltYXN0ZXJbYnR2LT5jLm5yLTFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucl0gICA9IGJ0djsKCW1hc3RlcltidHYtPmMubnIrMV0gPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzJdID0gYnR2Owp9CgovLyBUaGUgR3JhbmR0ZWMgWC1HdWFyZCBmcmFtZWdyYWJiZXIgY2FyZCB1c2VzIHR3byBEdWFsIDQtY2hhbm5lbAovLyB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCi8vIG11bHRpcGxleGVycyBhcmUgY29udHJvbGxlZCBieSB0aGUgbG93ZXIgOCBHUElPIHBpbnMgb2YgdGhlCi8vIGJ0ODc4LiBUaGUgbXVsdGlwbGV4ZXJzIHByb2JhYmx5IFBlcmljb20gUEk1VjMzMVEgb3Igc2ltaWxhci4KCi8vIHh4eDAgaXMgcGluIHh4eCBvZiBtdWx0aXBsZXhlciBVNSwKLy8geXl5MSBpcyBwaW4geXl5IG9mIG11bHRpcGxleGVyIFUyCgojZGVmaW5lIEVOQTAgICAgMHgwMQojZGVmaW5lIEVOQjAgICAgMHgwMgojZGVmaW5lIEVOQTEgICAgMHgwNAojZGVmaW5lIEVOQjEgICAgMHgwOAoKI2RlZmluZSBJTjEwICAgIDB4MTAKI2RlZmluZSBJTjAwICAgIDB4MjAKI2RlZmluZSBJTjExICAgIDB4NDAKI2RlZmluZSBJTjAxICAgIDB4ODAKCnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7CiAgICAgICAgICAgICAgICBFTkIwLCBFTkIwfElOMDAsIEVOQjB8SU4xMCwgRU5CMHxJTjAwfElOMTAsCiAgICAgICAgICAgICAgICBFTkEwLCBFTkEwfElOMDAsIEVOQTB8SU4xMCwgRU5BMHxJTjAwfElOMTAsCiAgICAgICAgICAgICAgICBFTkIxLCBFTkIxfElOMDEsIEVOQjF8SU4xMSwgRU5CMXxJTjAxfElOMTEsCiAgICAgICAgICAgICAgICBFTkExLCBFTkExfElOMDEsIEVOQTF8SU4xMSwgRU5BMXxJTjAxfElOMTEsCgl9OwoJZ3Bpb193cml0ZShtYXNrc1tpbnB1dCUxNl0pOwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCS8qVGhpcyBpcyB0aGUgdmlkZW8gaW5wdXQgcmVkaXJlY3Rpb24gZm9uY3Rpb25hbGl0eSA6IEkgRElEIE5PVCBVU0VEIElULiAqLwoJYnR3cml0ZSAoMHgwODw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMTldIFs9PT4gNDA1MyBCK0NdIHNldCB0byAxICovCglidHdyaXRlICgweDA0PDwxNixCVDg0OF9HUElPX0RBVEEpOy8qR1BJT1sxOF0gWz09PiA0MDUzIEFdICBzZXQgdG8gMSovCn0Kc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX211eHNlbCAoc3RydWN0IGJ0dHYqIGJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgoJZHByaW50ayAoS0VSTl9ERUJVRyAiYnR0diVkIDogcGljb2xvX3RldHJhX211eHNlbCA9PiAgaW5wdXQgPSAlZFxuIixidHYtPmMubnIsaW5wdXQpOwoJLypKdXN0IHNldCB0aGUgcmlnaHQgcGF0aCBpbiB0aGUgYW5hbG9nIG11bHRpcGxleGVycyA6IGNoYW5uZWwgMSAtPiA0ID09PiBBbmFsb2cgTXV4ID09PiBNVVgwKi8KCS8qR1BJT1syMF0mR1BJT1syMV0gdXNlZCB0byBjaG9vc2UgdGhlIHJpZ2h0IGlucHV0Ki8KCWJ0d3JpdGUgKGlucHV0PDwyMCxCVDg0OF9HUElPX0RBVEEpOwoKfQoKLyoKICogaXZjMTIwX211eHNlbCBbQWRkZWQgYnkgQWxhbiBHYXJmaWVsZCA8YWxhbkBmcm9tb3JiaXQuY29tPl0KICoKICogVGhlIElWQzEyMEcgc2VjdXJpdHkgY2FyZCBoYXMgNCBpMmMgY29udHJvbGxlZCBUREE4NTQwIG1hdHJpeAogKiBzd2ljaGVycyB0byBwcm92aWRlIDE2IGNoYW5uZWxzIHRvIE1VWDAuIFRoZSBUREE4NTQwJ3MgaGF2ZQogKiA0IGluZGVwZWRhbnQgb3V0cHV0cyBhbmQgYXMgc3VjaCB0aGUgSVZDMTIwRyBhbHNvIGhhcyB0aGUKICogb3B0aW9uYWwgIk1vbml0b3IgT3V0IiBidXMuIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIGxvb2tpbmcKICogYXQgb25lIGlucHV0IHdoaWxlIHRoZSBtb25pdG9yIGlzIGxvb2tpbmcgYXQgYW5vdGhlci4KICoKICogU2luY2UgSSd2ZSBjb3VsZG4ndCBiZSBib3RoZXJlZCBmaWd1cmluZyBvdXQgaG93IHRvIGFkZCBhbgogKiBpbmRlcGVuZGFudCBtdXhzZWwgZm9yIHRoZSBtb25pdG9yIGJ1cywgSSd2ZSBqdXN0IHNldCBpdCB0bwogKiB3aGF0ZXZlciB0aGUgY2FyZCBpcyBsb29raW5nIGF0LgogKgogKiAgT1VUMCBvZiB0aGUgVERBODU0MCdzIGlzIGNvbm5lY3RlZCB0byBNVVgwICAgICAgICAgKDB4MDMpCiAqICBPVVQxIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvICJNb25pdG9yIE91dCIgICAgICAgICgweDBDKQogKgogKiAgVERBODU0MF9BTFQzIElOMC0zID0gQ2hhbm5lbCAxMyAtIDE2ICAgICAgICgweDAzKQogKiAgVERBODU0MF9BTFQ0IElOMC0zID0gQ2hhbm5lbCAxIC0gNCAgICAgICAgICgweDAzKQogKiAgVERBODU0MF9BTFQ1IElOMC0zID0gQ2hhbm5lbCA1IC0gOCAgICAgICAgICgweDAzKQogKiAgVERBODU0MF9BTFQ2IElOMC0zID0gQ2hhbm5lbCA5IC0gMTIgICAgICAgICAgICAgICAgKDB4MDMpCiAqCiAqLwoKLyogQWxsIDcgcG9zc2libGUgc3ViLWlkcyBmb3IgdGhlIFREQTg1NDAgTWF0cml4IFN3aXRjaGVyICovCiNkZWZpbmUgSTJDX1REQTg1NDAgICAgICAgIDB4OTAKI2RlZmluZSBJMkNfVERBODU0MF9BTFQxICAgMHg5MgojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDIgICAweDk0CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMyAgIDB4OTYKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ0ICAgMHg5OAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDUgICAweDlhCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNiAgIDB4OWMKCnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvLyBTaW1wbGUgbWF0aHMKCWludCBrZXkgPSBpbnB1dCAlIDQ7CglpbnQgbWF0cml4ID0gaW5wdXQgLyA0OwoKCWRwcmludGsoImJ0dHYlZDogaXZjMTIwX211eHNlbDogSW5wdXQgLSAlMDJkIHwgVERBIC0gJTAyZCB8IEluIC0gJTAyZFxuIiwKCQlidHYtPmMubnIsIGlucHV0LCBtYXRyaXgsIGtleSk7CgoJLy8gSGFuZGxlcyB0aGUgaW5wdXQgc2VsZWN0aW9uIG9uIHRoZSBUREE4NTQwJ3MKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDMpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDApID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ1LCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDEpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDIpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCgkvLyBIYW5kbGVzIHRoZSBvdXRwdXQgZW5hYmxlcyBvbiB0aGUgVERBODU0MCdzCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyAxMyAtIDE2CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyAxLTQKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ1LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDEpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDUtOAoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDYsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMikgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gOS0xMgoKCS8vIFNlbGVjdHMgTVVYMCBmb3IgaW5wdXQgb24gdGhlIDg3OAoJYnRhb3IoKDApPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7Cn0KCgovKiBQWEMyMDAgbXV4c2VsIGhlbHBlcgogKiBsdWtlQHN5c2VuZy5hbnUuZWR1LmF1CiAqIGFub3RoZXIgdHJhbnNwbGFudAogKiBmcm9tIEFsZXNzYW5kcm8gUnViaW5pIChydWJpbmlAbGludXguaXQpCiAqCiAqIFRoZXJlIGFyZSA0IGtpbmRzIG9mIGNhcmRzOgogKiBQWEMyMDBMIHdoaWNoIGlzIGJ0ODQ4CiAqIFBYQzIwMEYgd2hpY2ggaXMgYnQ4NDggd2l0aCBQSUMgY29udHJvbGxpbmcgbXV4CiAqIFBYQzIwMEFMIHdoaWNoIGlzIGJ0ODc4CiAqIFBYQzIwMEFGIHdoaWNoIGlzIGJ0ODc4IHdpdGggUElDIGNvbnRyb2xsaW5nIG11eAogKi8KI2RlZmluZSBQWF9DRkdfUFhDMjAwRiAweDAxCiNkZWZpbmUgUFhfRkxBR19QWEMyMDBBICAweDAwMDAxMDAwIC8qIGEgcHhjMjAwQSBpcyBidC04NzggYmFzZWQgKi8KI2RlZmluZSBQWF9JMkNfUElDICAgICAgIDB4MGYKI2RlZmluZSBQWF9QWEMyMDBBX0NBUkRJRCAweDIwMGExMjk1CiNkZWZpbmUgUFhfSTJDX0NNRF9DRkcgICAweDAwCgpzdGF0aWMgdm9pZCBQWEMyMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewogICAgICAgIGludCByYzsKCWxvbmcgbXV4OwoJaW50IGJpdG1hc2s7CiAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMl07CgoJLyogUmVhZCBQSUMgY29uZmlnIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGEgUFhDMjAwRiAqLwoJLyogUFhfSTJDX0NNRF9DRkcqLwoJYnVmWzBdPTA7CglidWZbMV09MDsKCXJjPWJ0dHZfSTJDV3JpdGUoYnR2LChQWF9JMkNfUElDPDwxKSxidWZbMF0sYnVmWzFdLDEpOwoJaWYgKHJjKSB7CgkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IHBpYyBjZmcgd3JpdGUgZmFpbGVkOiVkXG4iLCBidHYtPmMubnIscmMpOwoJICAvKiBub3QgUFhDID8gZG8gbm90aGluZyAqLwoJICByZXR1cm47Cgl9CgoJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CglpZiAoIShyYyAmIFBYX0NGR19QWEMyMDBGKSkgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBub3QgUFhDMjAwRiByYzolZCBcbiIsIGJ0di0+Yy5ucixyYyk7CgkgIHJldHVybjsKCX0KCgoJLyogVGhlIG11bHRpcGxleGVyIGluIHRoZSAyMDBGIGlzIGhhbmRsZWQgYnkgdGhlIEdQSU8gcG9ydCAqLwoJLyogZ2V0IGNvcnJlY3QgbWFwcGluZyBiZXR3ZWVuIGlucHV0cyAgKi8KCS8qICBtdXggPSBidHR2X3R2Y2FyZHNbYnR2LT50eXBlXS5tdXhzZWxbaW5wdXRdICYgMzsgKi8KCS8qICoqIG5vdCBuZWVkZWQhPyAgICovCgltdXggPSBpbnB1dDsKCgkvKiBtYWtlIHN1cmUgb3V0cHV0IHBpbnMgYXJlIGVuYWJsZWQgKi8KCS8qIGJpdG1hc2s9MHgzMGY7ICovCgliaXRtYXNrPTB4MzAyOwoJLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgUFhDMjAwQSAqLwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkgIHsKCSAgIGJpdG1hc2sgXj0gMHgxODA7IC8qIHVzZSA3IGFuZCA5LCBub3QgOCBhbmQgOSAqLwoJICAgYml0bWFzayB8PSA3PDw0OyAvKiB0aGUgREFDICovCgl9CglidHdyaXRlKGJpdG1hc2ssIEJUODQ4X0dQSU9fT1VUX0VOKTsKCgliaXRtYXNrID0gYnRyZWFkKEJUODQ4X0dQSU9fREFUQSk7CiAJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKQoJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgyODApIHwgKChtdXggJiAyKSA8PCA4KSB8ICgobXV4ICYgMSkgPDwgNyk7CgllbHNlIC8qIG9sZGVyIGRldmljZSAqLwoJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgzMDApIHwgKChtdXggJiAzKSA8PCA4KTsKCWJ0d3JpdGUoYml0bWFzayxCVDg0OF9HUElPX0RBVEEpOwoKCS8qCgkgKiBXYXMgInRvIGJlIHNhZmUsIHNldCB0aGUgYnQ4NDggdG8gaW5wdXQgMCIKCSAqIEFjdHVhbGx5LCBzaW5jZSBpdCdzIG9rIGF0IGxvYWQgdGltZSwgYmV0dGVyIG5vdCBtZXNzaW5nCgkgKiB3aXRoIHRoZXNlIGJpdHMgKG9uIFBYQzIwMEFGIHlvdSBuZWVkIHRvIHNldCBtdXggMiBoZXJlKQoJICoKCSAqIG5lZWRlZCBiZWNhdXNlIGJ0dHYtZHJpdmVyIHNldHMgbXV4IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KCSAqLwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYnRhb3IoMjw8NSwgfkJUODQ4X0lGT1JNX01VWFNFTCwgQlQ4NDhfSUZPUk0pOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYnRhbmQofkJUODQ4X0lGT1JNX01VWFNFTCxCVDg0OF9JRk9STSk7CgoJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogc2V0dGluZyBpbnB1dCBjaGFubmVsIHRvOiVkXG4iLCBidHYtPmMubnIsKGludCltdXgpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtb3RoZXJib2FyZCBjaGlwc2V0IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCBfX2RldmluaXQgYnR0dl9jaGVja19jaGlwc2V0KHZvaWQpCnsKCWludCBwY2lwY2lfZmFpbCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKQoJCXBjaXBjaV9mYWlsID0gMTsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgKFBDSVBDSV9UUklUT058UENJUENJX05BVE9NQXxQQ0lQQ0lfVklBRVRCRikpCgkJdHJpdG9uMSA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9WU0ZYKQoJCXZzZnggPSAxOwojaWZkZWYgUENJUENJX0FMSU1BR0lLCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9BTElNQUdJSykKCQlsYXRlbmN5ID0gMHgwQTsKI2VuZGlmCgojaWYgMAoJLyogcHJpbnQgd2hpY2ggY2hpcHNldCB3ZSBoYXZlICovCgl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2NsYXNzKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4LGRldikpKQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIGlzICVzXG4iLHBjaV9uYW1lKGRldikpOwojZW5kaWYKCgkvKiBwcmludCB3YXJuaW5ncyBhYm91dCBhbnkgcXVpcmtzIGZvdW5kICovCglpZiAodHJpdG9uMSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKCWlmICh2c2Z4KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIG5lZWRzIFZTRlggZW5hYmxlZC5cbiIpOwoJaWYgKHBjaXBjaV9mYWlsKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogQlQ4NDggYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgdG9nZXRoZXIuXG4iKTsKCQlpZiAoVU5TRVQgPT0gbm9fb3ZlcmxheSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2OiBnb2luZyB0byBkaXNhYmxlIG92ZXJsYXkuXG4iKTsKCQkJbm9fb3ZlcmxheSA9IDE7CgkJfQoJfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogcGNpIGxhdGVuY3kgZml4dXAgWyVkXVxuIixsYXRlbmN5KTsKCgl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSwgZGV2KSkpIHsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTMsICZiKTsKCQlpZiAoYnR0dl9kZWJ1ZykKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2U6IDgyNDQxRlggTmF0b21hLCAiCgkJCSAgICAgICAiYnVmY29uPTB4JTAyeFxuIixiKTsKCX0KfQoKaW50IF9fZGV2aW5pdCBidHR2X2hhbmRsZV9jaGlwc2V0KHN0cnVjdCBidHR2ICpidHYpCnsKIAl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CgoJaWYgKCF0cml0b24xICYmICF2c2Z4ICYmIFVOU0VUID09IGxhdGVuY3kpCgkJcmV0dXJuIDA7CgoJaWYgKGJ0dHZfdmVyYm9zZSkgewoJCWlmICh0cml0b24xKQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIEVUQkYgKDQzMEZYL1ZQMyBjb21wYXRpYmlsdHkpXG4iLGJ0di0+Yy5ucik7CgkJaWYgKHZzZnggJiYgYnR2LT5pZCA+PSA4NzgpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZW5hYmxpbmcgVlNGWFxuIixidHYtPmMubnIpOwoJCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGxhdGVuY3kpOwoJfQoKCWlmIChidHYtPmlkIDwgODc4KSB7CgkJLyogYnQ4NDggKG1pcyl1c2VzIGEgYml0IGluIHRoZSBpcnEgbWFzayBmb3IgZXRiZiAqLwoJCWlmICh0cml0b24xKQoJCQlidHYtPnRyaXRvbjEgPSBCVDg0OF9JTlRfRVRCRjsKCX0gZWxzZSB7CgkJLyogYnQ4NzggaGFzIGEgYml0IGluIHRoZSBwY2kgY29uZmlnIHNwYWNlIGZvciBpdCAqLwogICAgICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgQlQ4NzhfREVWQ1RSTCwgJmNvbW1hbmQpOwoJCWlmICh0cml0b24xKQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1RCRlg7CgkJaWYgKHZzZngpCgkJCWNvbW1hbmQgfD0gQlQ4NzhfRU5fVlNGWDsKICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCBjb21tYW5kKTsKICAgICAgICB9CglpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIGMtYmFzaWMtb2Zmc2V0OiA4CiAqIEVuZDoKICovCg==