LyoKICogTW9kaWZpZWQgaW4gb3JkZXIgdG8ga2VlcCBpdCBjb21wYXRpYmxlIGJvdGggd2l0aCBuZXcgYW5kIG9sZCB2aWRlb3RleHQgSU9DVExzIGJ5CiAqIE1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+CiAqCiAqCUNsZWFuZWQgdXAgdG8gdXNlIGV4aXN0aW5nIHZpZGVvZGV2IGludGVyZmFjZSBhbmQgYWxsb3cgdGhlIGlkZWEKICoJb2YgbXVsdGlwbGUgdGVsZXRleHQgZGVjb2RlcnMgb24gdGhlIHZpZGVvNGxpbnV4IGlmYWNlLiBDaGFuZ2VkIGkyYwogKgl0byBjb3ZlciBhZGRyZXNzaW5nIGNsYXNoZXMgb24gZGV2aWNlIGJ1c3Nlcy4gSXQncyBhbHNvIHJlYnVpbHQgc28KICoJeW91IGNhbiBhZGQgYXJiaXRhcnkgbXVsdGlwbGUgdGVsZXRleHQgZGV2aWNlcyB0byBMaW51eCB2aWRlbzRsaW51eAogKglub3cgKHdlbGwgMzIgYW55d2F5KS4KICoKICoJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KICoKICoJVGhlIG9yaWdpbmFsIGRyaXZlciB3YXMgaGVhdmlseSBtb2RpZmllZCB0byBtYXRjaCB0aGUgaTJjIGludGVyZmFjZQogKglJdCB3YXMgdHJ1bmNhdGVkIHRvIHVzZSB0aGUgV2luVFYgYm9hcmRzLCB0b28uCiAqCiAqCUNvcHlyaWdodCAoYykgMTk5OCBSaWNoYXJkIEd1ZW50aGVyIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KICoKICogJElkOiBzYWE1MjQ5LmMsdiAxLjEgMTk5OC8wMy8zMCAyMjoyMzoyMyBhbGFuIEV4cCAkCiAqCiAqCURlcml2ZWQgRnJvbQogKgogKiB2dHguYzoKICogVGhpcyBpcyBhIGxvYWRhYmxlIGNoYXJhY3Rlci1kZXZpY2UtZHJpdmVyIGZvciB2aWRlb3RleHQtaW50ZXJmYWNlcwogKiAoYWthIHRlbGV0ZXh0KS4gUGxlYXNlIGNoZWNrIHRoZSBNYWtlZmlsZS9SRUFETUUgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQKICogaW50ZXJmYWNlcy4KICoKICogQ29weXJpZ2h0IChjKSAxOTk0LTk3IE1hcnRpbiBCdWNrICA8bWFydGluLTIuYnVja0BzdHVkZW50LnVuaS11bG0uZGU+CiAqCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAogKiBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvbW0uaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CiNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNkZWZpbmUgVlRYX1ZFUl9NQUogMQojZGVmaW5lIFZUWF9WRVJfTUlOIDgKCgoKI2RlZmluZSBOVU1fREFVUyA0CiNkZWZpbmUgTlVNX0JVRlMgOAojZGVmaW5lIElGX05BTUUgIlNBQTUyNDkiCgpzdGF0aWMgY29uc3QgaW50IGRpc3BfbW9kZXNbOF1bM10gPSAKewoJeyAweDQ2LCAweDAzLCAweDAzIH0sCS8qIERJU1BPRkYgKi8KCXsgMHg0NiwgMHhjYywgMHhjYyB9LAkvKiBESVNQTk9STSAqLwoJeyAweDQ0LCAweDBmLCAweDBmIH0sCS8qIERJU1BUUkFOUyAqLwoJeyAweDQ2LCAweGNjLCAweDQ2IH0sCS8qIERJU1BJTlMgKi8KCXsgMHg0NCwgMHgwMywgMHgwMyB9LAkvKiBESVNQT0ZGLCBpbnRlcmxhY2VkICovCgl7IDB4NDQsIDB4Y2MsIDB4Y2MgfSwJLyogRElTUE5PUk0sIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHgwZiwgMHgwZiB9LAkvKiBESVNQVFJBTlMsIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHhjYywgMHg0NiB9CS8qIERJU1BJTlMsIGludGVybGFjZWQgKi8KfTsKCgoKI2RlZmluZSBQQUdFX1dBSVQgKDMwMCpIWi8xMDAwKQkJCS8qIFRpbWUgYmV0d2VlbiByZXF1ZXN0aW5nIHBhZ2UgYW5kICovCgkJCQkJCS8qIGNoZWNraW5nIHN0YXR1cyBiaXRzICovCiNkZWZpbmUgUEdCVUZfRVhQSVJFICgxNSpIWikJCQkvKiBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJhbnNtaXR0aW5nICovCgkJCQkJCS8qIHBhZ2UgcmVnYXJkbGVzcyBvZiBpbmZvYml0cyAqLwp0eXBlZGVmIHN0cnVjdCB7Cgl1OCBwZ2J1ZltWVFhfVklSVFVBTFNJWkVdOwkJLyogUGFnZS1idWZmZXIgKi8KCXU4IGxhc3RzdGF0WzEwXTsJCQkvKiBMYXN0IHZhbHVlIG9mIGluZm9iaXRzIGZvciBEQVUgKi8KCXU4IHNyZWdzWzddOwkJCQkvKiBQYWdlLXJlcXVlc3QgcmVnaXN0ZXJzICovCgl1bnNpZ25lZCBsb25nIGV4cGlyZTsJCQkvKiBUaW1lIHdoZW4gcGFnZSB3aWxsIGJlIGV4cGlyZWQgKi8KCXVuc2lnbmVkIGNscmZvdW5kIDogMTsJCQkvKiBWVFhJT0NDTFJGT1VORCBoYXMgYmVlbiBjYWxsZWQgKi8KCXVuc2lnbmVkIHN0b3BwZWQgOiAxOwkJCS8qIFZUWElPQ1NUT1BEQVUgaGFzIGJlZW4gY2FsbGVkICovCn0gdmRhdV90OwoKc3RydWN0IHNhYTUyNDlfZGV2aWNlCnsKCXZkYXVfdCB2ZGF1W05VTV9EQVVTXTsJCQkvKiBEYXRhIGZvciB2aXJ0dWFsIERBVXMgKHRoZSA1MjQ5IG9ubHkgaGFzIG9uZSAqLwoJCQkJCQkvKiByZWFsIERBVSwgc28gd2UgaGF2ZSB0byBzaW11bGF0ZSBzb21lIG1vcmUpICovCglpbnQgdnR4X3VzZV9jb3VudDsKCWludCBpc19zZWFyY2hpbmdbTlVNX0RBVVNdOwoJaW50IGRpc3BfbW9kZTsKCWludCB2aXJ0dWFsX21vZGU7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwoJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwp9OwoKCiNkZWZpbmUgQ0NUV1IgMzQJCS8qIEmyQyB3cml0ZS9yZWFkLWFkZHJlc3Mgb2YgdnR4LWNoaXAgKi8KI2RlZmluZSBDQ1RSRCAzNQojZGVmaW5lIE5PQUNLX1JFUEVBVCAxMAkJLyogUmV0cnkgYWNjZXNzIHRoaXMgbWFueSB0aW1lcyBvbiBmYWlsdXJlICovCiNkZWZpbmUgQ0xFQVJfREVMQVkgKEhaLzIwKQkvKiBUaW1lIHJlcXVpcmVkIHRvIGNsZWFyIGEgcGFnZSAqLwojZGVmaW5lIFJFQURZX1RJTUVPVVQgKDMwKkhaLzEwMDApCS8qIFRpbWUgdG8gd2FpdCBmb3IgcmVhZHkgc2lnbmFsIG9mIEmyQy1idXMgaW50ZXJmYWNlICovCiNkZWZpbmUgSU5JVF9ERUxBWSA1MDAJCS8qIFRpbWUgaW4gdXNlYyB0byB3YWl0IGF0IGluaXRpYWxpemF0aW9uIG9mIENFQSBpbnRlcmZhY2UgKi8KI2RlZmluZSBTVEFSVF9ERUxBWSAxMAkJLyogVGltZSBpbiB1c2VjIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHdyaXRlLWN5Y2xlIChDRUEpICovCgojZGVmaW5lIFZUWF9ERVZfTUlOT1IgMAoKLyogR2VuZXJhbCBkZWZpbmVzIGFuZCBkZWJ1Z2dpbmcgc3VwcG9ydCAqLwoKI2lmbmRlZiBGQUxTRQojZGVmaW5lIEZBTFNFIDAKI2RlZmluZSBUUlVFIDEKI2VuZGlmCgojZGVmaW5lIFJFU0NIRUQgZG8geyBjb25kX3Jlc2NoZWQoKTsgfSB3aGlsZSgwKQoKc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlOwkvKiBEZWNsYXJlZCBuZWFyIGJvdHRvbSAqLwoKLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHszND4+MSxJMkNfQ0xJRU5UX0VORH07CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjX3JhbmdlW10gPSB7STJDX0NMSUVOVF9FTkR9OwpJMkNfQ0xJRU5UX0lOU01PRDsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CgpzdGF0aWMgaW50IHNhYTUyNDlfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQp7CglpbnQgcGdidWY7CglpbnQgZXJyOwoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkOwoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0OwoKCXByaW50ayhLRVJOX0lORk8gInNhYTUyNDk6IHRlbGV0ZXh0IGNoaXAgZm91bmQuXG4iKTsKCWNsaWVudD1rbWFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CglpZihjbGllbnQ9PU5VTEwpCgkJcmV0dXJuIC1FTk9NRU07CiAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwogICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZigqY2xpZW50KSk7Cgl0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKCWlmKHQ9PU5VTEwpCgl7CgkJa2ZyZWUoY2xpZW50KTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBJRl9OQU1FLCBJMkNfTkFNRV9TSVpFKTsKCWluaXRfTVVURVgoJnQtPmxvY2spOwoJCgkvKgoJICoJTm93IGNyZWF0ZSBhIHZpZGVvNGxpbnV4IGRldmljZQoJICovCgkgCgl2ZCA9IChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOwoJaWYodmQ9PU5VTEwpCgl7CgkJa2ZyZWUodCk7CgkJa2ZyZWUoY2xpZW50KTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHZkKTsKCW1lbWNweSh2ZCwgJnNhYV90ZW1wbGF0ZSwgc2l6ZW9mKCp2ZCkpOwoJCQoJZm9yIChwZ2J1ZiA9IDA7IHBnYnVmIDwgTlVNX0RBVVM7IHBnYnVmKyspIAoJewoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0ubGFzdHN0YXQsIDAsIHNpemVvZih0LT52ZGF1WzBdLmxhc3RzdGF0KSk7CgkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IFRSVUU7CgkJdC0+dmRhdVtwZ2J1Zl0uc3RvcHBlZCA9IFRSVUU7CgkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IEZBTFNFOwoJfQoJdmQtPnByaXY9dDsJCgkgCgkKCS8qCgkgKglSZWdpc3RlciBpdAoJICovCgoJaWYoKGVycj12aWRlb19yZWdpc3Rlcl9kZXZpY2UodmQsIFZGTF9UWVBFX1ZUWCwtMSkpPDApCgl7CgkJa2ZyZWUodCk7CgkJa2ZyZWUodmQpOwoJCWtmcmVlKGNsaWVudCk7CgkJcmV0dXJuIGVycjsKCX0KCXQtPmNsaWVudCA9IGNsaWVudDsKCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CglyZXR1cm4gMDsKfQoKLyoKICoJV2UgZG8gbW9zdCBvZiB0aGUgaGFyZCB3b3JrIHdoZW4gd2UgYmVjb21lIGEgZGV2aWNlIG9uIHRoZSBpMmMuCiAqLwogCnN0YXRpYyBpbnQgc2FhNTI0OV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCgkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBzYWE1MjQ5X2F0dGFjaCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzYWE1MjQ5X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkKTsKCWtmcmVlKHZkLT5wcml2KTsKCWtmcmVlKHZkKTsKCWtmcmVlKGNsaWVudCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzYWE1MjQ5X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmRldmljZSwKCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCnsKCXJldHVybiAtRUlOVkFMOwp9CgovKiBuZXcgSTJDIGRyaXZlciBzdXBwb3J0ICovCgpzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl92aWRlb3RleHQgPSAKewoJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKCS5uYW1lIAkJPSBJRl9OQU1FLAkJLyogbmFtZSAqLwoJLmlkIAkJPSBJMkNfRFJJVkVSSURfU0FBNTI0OSwgLyogaW4gaTJjLmggKi8KCS5mbGFncyAJCT0gSTJDX0RGX05PVElGWSwKCS5hdHRhY2hfYWRhcHRlciA9IHNhYTUyNDlfcHJvYmUsCgkuZGV0YWNoX2NsaWVudCAgPSBzYWE1MjQ5X2RldGFjaCwKCS5jb21tYW5kIAk9IHNhYTUyNDlfY29tbWFuZAp9OwoKc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKCS5kcml2ZXIJCT0gJmkyY19kcml2ZXJfdmlkZW90ZXh0LAoJLm5hbWUJCT0gIih1bnNldCkiLAp9OwoKLyoKICoJV2FpdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGppZmZpZXMgKDEwbXMpLiBUaGlzIGNhbGxzIHRoZSBzY2hlZHVsZXIsIHNvIHRoZSBhY3R1YWwKICoJZGVsYXkgbWF5IGJlIGxvbmdlci4KICovCgpzdGF0aWMgdm9pZCBqZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkgCnsKCXNpZ3NldF90IG9sZGJsb2NrZWQgPSBjdXJyZW50LT5ibG9ja2VkOwoKCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwoJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CglyZWNhbGNfc2lncGVuZGluZygpOwoJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoZGVsYXkpKTsKCglzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRibG9ja2VkOwoJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cn0KCgovKgogKglJMkMgaW50ZXJmYWNlcwogKi8KIApzdGF0aWMgaW50IGkyY19zZW5kYnVmKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IHJlZywgaW50IGNvdW50LCB1OCAqZGF0YSkgCnsKCWNoYXIgYnVmWzY0XTsKCQoJYnVmWzBdID0gcmVnOwoJbWVtY3B5KGJ1ZisxLCBkYXRhLCBjb3VudCk7CgkKCWlmKGkyY19tYXN0ZXJfc2VuZCh0LT5jbGllbnQsIGJ1ZiwgY291bnQrMSk9PWNvdW50KzEpCgkJcmV0dXJuIDA7CglyZXR1cm4gLTE7Cn0KCnN0YXRpYyBpbnQgaTJjX3NlbmRkYXRhKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgLi4uKQp7Cgl1bnNpZ25lZCBjaGFyIGJ1Zls2NF07CglpbnQgdjsKCWludCBjdD0wOwoJdmFfbGlzdCBhcmdwOwoJdmFfc3RhcnQoYXJncCx0KTsKCQoJd2hpbGUoKHY9dmFfYXJnKGFyZ3AsaW50KSkhPS0xKQoJCWJ1ZltjdCsrXT12OwoJcmV0dXJuIGkyY19zZW5kYnVmKHQsIGJ1ZlswXSwgY3QtMSwgYnVmKzEpOwp9CgovKiBHZXQgY291bnQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gSbJDLWRldmljZSBhdCBhZGRyZXNzIGFkciwgc3RvcmUgdGhlbSBpbiBidWYuIFN0YXJ0ICYgc3RvcAogKiBoYW5kc2hha2luZyBpcyBkb25lIGJ5IHRoaXMgcm91dGluZSwgYWNrIHdpbGwgYmUgc2VudCBhZnRlciB0aGUgbGFzdCBieXRlIHRvIGluaGliaXQgZnVydGhlcgogKiBzZW5kaW5nIG9mIGRhdGEuIElmIHVhY2Nlc3MgaXMgVFJVRSwgZGF0YSBpcyB3cml0dGVuIHRvIHVzZXItc3BhY2Ugd2l0aCBwdXRfdXNlci4KICogUmV0dXJucyAtMSBpZiBJskMtZGV2aWNlIGRpZG4ndCBzZW5kIGFja25vd2xlZGdlLCAwIG90aGVyd2lzZQogKi8KCnN0YXRpYyBpbnQgaTJjX2dldGRhdGEoc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0LCBpbnQgY291bnQsIHU4ICpidWYpIAp7CglpZihpMmNfbWFzdGVyX3JlY3YodC0+Y2xpZW50LCBidWYsIGNvdW50KSE9Y291bnQpCgkJcmV0dXJuIC0xOwoJcmV0dXJuIDA7Cn0KCgovKgogKglTdGFuZGFyZCBjaGFyYWN0ZXItZGV2aWNlLWRyaXZlciBmdW5jdGlvbnMKICovCgpzdGF0aWMgaW50IGRvX3NhYTUyNDlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCgkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCnsKCXN0YXRpYyBpbnQgdmlydHVhbF9tb2RlID0gRkFMU0U7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ9dmQtPnByaXY7CgoJc3dpdGNoKGNtZCkgCgl7CgkJY2FzZSBWVFhJT0NHRVRJTkZPOiAKCQl7CgkJCXZ0eF9pbmZvX3QgKmluZm8gPSBhcmc7CgkJCWluZm8tPnZlcnNpb25fbWFqb3IgPSBWVFhfVkVSX01BSjsKCQkJaW5mby0+dmVyc2lvbl9taW5vciA9IFZUWF9WRVJfTUlOOwoJCQlpbmZvLT5udW1wYWdlcyA9IE5VTV9EQVVTOwoJCQkvKmluZm8tPmNjdF90eXBlID0gQ0NUX1RZUEU7Ki8KCQkJcmV0dXJuIDA7CgkJfQoKCQljYXNlIFZUWElPQ0NMUlBBR0U6IAoJCXsKCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwogICAgICAKCQkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYsICcgJywgc2l6ZW9mKHQtPnZkYXVbMF0ucGdidWYpKTsKCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IFRSVUU7CgkJCXJldHVybiAwOwoJCX0KCgkJY2FzZSBWVFhJT0NDTFJGT1VORDogCgkJewoJCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CiAgICAgIAoJCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gVFJVRTsKCQkJcmV0dXJuIDA7CgkJfQoKCQljYXNlIFZUWElPQ1BBR0VSRVE6IAoJCXsKCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoJCQlpZiAoIShyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX1BBR0UpKQoJCQkJcmVxLT5wYWdlID0gMDsKCQkJaWYgKCEocmVxLT5wYWdlbWFzayAmIFBHTUFTS19IT1VSKSkKCQkJCXJlcS0+aG91ciA9IDA7CgkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKSkKCQkJCXJlcS0+bWludXRlID0gMDsKCQkJaWYgKHJlcS0+cGFnZSA8IDAgfHwgcmVxLT5wYWdlID4gMHg4ZmYpIC8qIDdGRiA/PyAqLwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCXJlcS0+cGFnZSAmPSAweDdmZjsKCQkJaWYgKHJlcS0+aG91ciA8IDAgfHwgcmVxLT5ob3VyID4gMHgzZiB8fCByZXEtPm1pbnV0ZSA8IDAgfHwgcmVxLT5taW51dGUgPiAweDdmIHx8CgkJCQlyZXEtPnBhZ2VtYXNrIDwgMCB8fCByZXEtPnBhZ2VtYXNrID49IFBHTUFTS19NQVggfHwgcmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19IVU5EID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAvIDB4MTAwKTsKCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1sxXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVEVOID8gMHgxMCA6IDApIHwgKChyZXEtPnBhZ2UgLyAweDEwKSAmIDB4Zik7CgkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMl0gPSAocmVxLT5wYWdlbWFzayAmIFBHX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5wYWdlICYgMHhmKTsKCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1szXSA9IChyZXEtPnBhZ2VtYXNrICYgSFJfVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAvIDB4MTApOwoJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzRdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAmIDB4Zik7CgkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbNV0gPSAocmVxLT5wYWdlbWFzayAmIE1JTl9URU4gPyAweDEwIDogMCkgfCAocmVxLT5taW51dGUgLyAweDEwKTsKCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1s2XSA9IChyZXEtPnBhZ2VtYXNrICYgTUlOX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5taW51dGUgJiAweGYpOwoJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBGQUxTRTsKCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IFRSVUU7CgkJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IFRSVUU7CgkJCXJldHVybiAwOwoJCX0KCgkJY2FzZSBWVFhJT0NHRVRTVEFUOiAKCQl7CgkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQkJdTggaW5mb2JpdHNbMTBdOwoJCQl2dHhfcGFnZWluZm9fdCBpbmZvOwoJCQlpbnQgYTsKCgkJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCWlmICghdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkKSAKCQkJewoJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCAyLCAwLCAtMSkgfHwKCQkJCQlpMmNfc2VuZGJ1Zih0LCAzLCBzaXplb2YodC0+dmRhdVswXS5zcmVncyksIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3MpIHx8CgkJCQkJaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDI1LCAwLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAtMSkgfHwKCQkJCQlpMmNfc2VuZGRhdGEodCwgMiwgMCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1swXSB8IDgsIC0xKSB8fAoJCQkJCWkyY19zZW5kZGF0YSh0LCA4LCAwLCAyNSwgMCwgLTEpKQoJCQkJCXJldHVybiAtRUlPOwoJCQkJamRlbGF5KFBBR0VfV0FJVCk7CgkJCQlpZiAoaTJjX2dldGRhdGEodCwgMTAsIGluZm9iaXRzKSkKCQkJCQlyZXR1cm4gLUVJTzsKCgkJCQlpZiAoIShpbmZvYml0c1s4XSAmIDB4MTApICYmICEoaW5mb2JpdHNbN10gJiAweGYwKSAmJgkvKiBjaGVjayBGT1VORC1iaXQgKi8KCQkJCQkobWVtY21wKGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKSB8fCAKCQkJCQl0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uZXhwaXJlKSkpCgkJCQl7CQkvKiBjaGVjayBpZiBuZXcgcGFnZSBhcnJpdmVkICovCgkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCAwLCAtMSkgfHwKCQkJCQkJaTJjX2dldGRhdGEodCwgVlRYX1BBR0VTSVpFLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmKSkKCQkJCQkJcmV0dXJuIC1FSU87CgkJCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5leHBpcmUgPSBqaWZmaWVzICsgUEdCVUZfRVhQSVJFOwoJCQkJCW1lbXNldCh0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFLCAnICcsIFZUWF9WSVJUVUFMU0laRSAtIFZUWF9QQUdFU0laRSk7CgkJCQkJaWYgKHQtPnZpcnR1YWxfbW9kZSkgCgkJCQkJewoJCQkJCQkvKiBQYWNrZXQgWC8yNCAqLwoJCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjAsIDAsIC0xKSB8fAoJCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMCAqIDQwKSkKCQkJCQkJCXJldHVybiAtRUlPOwoJCQkJCQkvKiBQYWNrZXQgWC8yNy8wICovCgkJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMSwgMCwgLTEpIHx8CgkJCQkJCQlpMmNfZ2V0ZGF0YSh0LCA0MCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSArIDE2ICogNDApKQoJCQkJCQkJcmV0dXJuIC1FSU87CgkJCQkJCS8qIFBhY2tldCA4LzMwLzAuLi44LzMwLzE1CgkJCQkJCSAqIEZJWE1FOiBBRkFJSywgdGhlIDUyNDkgZG9lcyBoYW1taW5nLWRlY29kaW5nIGZvciBzb21lIGJ5dGVzIGluIHBhY2tldCA4LzMwLAoJCQkJCQkgKiAgICAgICAgc28gd2Ugc2hvdWxkIHVuZG8gdGhpcyBoZXJlLgoJCQkJCQkgKi8KCQkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAweDIyLCAwLCAtMSkgfHwKCQkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMjMgKiA0MCkpCgkJCQkJCQlyZXR1cm4gLUVJTzsKCQkJCQl9CgkJCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IEZBTFNFOwoJCQkJCW1lbWNweSh0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBpbmZvYml0cywgc2l6ZW9mKGluZm9iaXRzKSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJbWVtY3B5KGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCW1lbWNweShpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSk7CgkJCX0KCgkJCWluZm8ucGFnZW51bSA9ICgoaW5mb2JpdHNbOF0gPDwgOCkgJiAweDcwMCkgfCAoKGluZm9iaXRzWzFdIDw8IDQpICYgMHhmMCkgfCAoaW5mb2JpdHNbMF0gJiAweDBmKTsKCQkJaWYgKGluZm8ucGFnZW51bSA8IDB4MTAwKQoJCQkJaW5mby5wYWdlbnVtICs9IDB4ODAwOwoJCQlpbmZvLmhvdXIgPSAoKGluZm9iaXRzWzVdIDw8IDQpICYgMHgzMCkgfCAoaW5mb2JpdHNbNF0gJiAweDBmKTsKCQkJaW5mby5taW51dGUgPSAoKGluZm9iaXRzWzNdIDw8IDQpICYgMHg3MCkgfCAoaW5mb2JpdHNbMl0gJiAweDBmKTsKCQkJaW5mby5jaGFyc2V0ID0gKChpbmZvYml0c1s3XSA+PiAxKSAmIDcpOwoJCQlpbmZvLmRlbGV0ZSA9ICEhKGluZm9iaXRzWzNdICYgOCk7CgkJCWluZm8uaGVhZGxpbmUgPSAhIShpbmZvYml0c1s1XSAmIDQpOwoJCQlpbmZvLnN1YnRpdGxlID0gISEoaW5mb2JpdHNbNV0gJiA4KTsKCQkJaW5mby5zdXBwX2hlYWRlciA9ICEhKGluZm9iaXRzWzZdICYgMSk7CgkJCWluZm8udXBkYXRlID0gISEoaW5mb2JpdHNbNl0gJiAyKTsKCQkJaW5mby5pbnRlcl9zZXEgPSAhIShpbmZvYml0c1s2XSAmIDQpOwoJCQlpbmZvLmRpc19kaXNwID0gISEoaW5mb2JpdHNbNl0gJiA4KTsKCQkJaW5mby5zZXJpYWwgPSAhIShpbmZvYml0c1s3XSAmIDEpOwoJCQlpbmZvLm5vdGZvdW5kID0gISEoaW5mb2JpdHNbOF0gJiAweDEwKTsKCQkJaW5mby5wYmxmID0gISEoaW5mb2JpdHNbOV0gJiAweDIwKTsKCQkJaW5mby5oYW1taW5nID0gMDsKCQkJZm9yIChhID0gMDsgYSA8PSA3OyBhKyspIAoJCQl7CgkJCQlpZiAoaW5mb2JpdHNbYV0gJiAweGYwKSAKCQkJCXsKCQkJCQlpbmZvLmhhbW1pbmcgPSAxOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWlmICh0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kKQoJCQkJaW5mby5ub3Rmb3VuZCA9IDE7CgkJCWlmKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJmluZm8sIHNpemVvZih2dHhfcGFnZWluZm9fdCkpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCWlmICghaW5mby5oYW1taW5nICYmICFpbmZvLm5vdGZvdW5kKSAKCQkJewoJCQkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gRkFMU0U7CgkJCX0KCQkJcmV0dXJuIDA7CgkJfQoKCQljYXNlIFZUWElPQ0dFVFBBR0U6IAoJCXsKCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoJCQlpbnQgc3RhcnQsIGVuZDsKCgkJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTIHx8IHJlcS0+c3RhcnQgPCAwIHx8CgkJCQlyZXEtPnN0YXJ0ID4gcmVxLT5lbmQgfHwgcmVxLT5lbmQgPj0gKHZpcnR1YWxfbW9kZSA/IFZUWF9WSVJUVUFMU0laRSA6IFZUWF9QQUdFU0laRSkpCgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJaWYoY29weV90b191c2VyKHJlcS0+YnVmZmVyLCAmdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZltyZXEtPnN0YXJ0XSwgcmVxLT5lbmQgLSByZXEtPnN0YXJ0ICsgMSkpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCQoJCQkgLyogCgkJCSAgKglBbHdheXMgcmVhZCB0aGUgdGltZSBkaXJlY3RseSBmcm9tIFNBQTUyNDkKCQkJICAqLwoJCQkgIAoJCQlpZiAocmVxLT5zdGFydCA8PSAzOSAmJiByZXEtPmVuZCA+PSAzMikgCgkJCXsKCQkJCWludCBsZW47CgkJCQljaGFyIGJ1ZlsxNl07ICAKCQkJCXN0YXJ0ID0gbWF4KHJlcS0+c3RhcnQsIDMyKTsKCQkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzkpOwoJCQkJbGVuPWVuZC1zdGFydCsxOwoJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCBzdGFydCwgLTEpIHx8CgkJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQoJCQkJCXJldHVybiAtRUlPOwoJCQkJaWYoY29weV90b191c2VyKHJlcS0+YnVmZmVyK3N0YXJ0LXJlcS0+c3RhcnQsIGJ1ZiwgbGVuKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJfQoJCQkvKiBJbnNlcnQgdGhlIGN1cnJlbnQgaGVhZGVyIGlmIERBVSBpcyBzdGlsbCBzZWFyY2hpbmcgZm9yIGEgcGFnZSAqLwoJCQlpZiAocmVxLT5zdGFydCA8PSAzMSAmJiByZXEtPmVuZCA+PSA3ICYmIHQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSkgCgkJCXsKCQkJCWNoYXIgYnVmWzMyXTsKCQkJCWludCBsZW47CgkJCQlzdGFydCA9IG1heChyZXEtPnN0YXJ0LCA3KTsKCQkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzEpOwoJCQkJbGVuPWVuZC1zdGFydCsxOwoJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCBzdGFydCwgLTEpIHx8CgkJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQoJCQkJCXJldHVybiAtRUlPOwoJCQkJaWYoY29weV90b191c2VyKHJlcS0+YnVmZmVyK3N0YXJ0LXJlcS0+c3RhcnQsIGJ1ZiwgbGVuKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJfQoJCQlyZXR1cm4gMDsKCQl9CgoJCWNhc2UgVlRYSU9DU1RPUERBVTogCgkJewoJCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgoJCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBUUlVFOwoJCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBGQUxTRTsKCQkJcmV0dXJuIDA7CgkJfQoKCQljYXNlIFZUWElPQ1BVVFBBR0U6IAoJCWNhc2UgVlRYSU9DU0VURElTUDogCgkJY2FzZSBWVFhJT0NQVVRTVEFUOiAKCQkJcmV0dXJuIDA7CgkJCQoJCWNhc2UgVlRYSU9DQ0xSQ0FDSEU6IAoJCXsKCQkJaWYgKGkyY19zZW5kZGF0YSh0LCAwLCBOVU1fREFVUywgMCwgOCwgLTEpIHx8IGkyY19zZW5kZGF0YSh0LCAxMSwKCQkJCScgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLAoJCQkJJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsIC0xKSkKCQkJCXJldHVybiAtRUlPOwoJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDMsIDB4MjAsIC0xKSkKCQkJCXJldHVybiAtRUlPOwoJCQlqZGVsYXkoMTAgKiBDTEVBUl9ERUxBWSk7CQkJLyogSSBoYXZlIG5vIGlkZWEgaG93IGxvbmcgd2UgaGF2ZSB0byB3YWl0IGhlcmUgKi8KCQkJcmV0dXJuIDA7CgkJfQoKCQljYXNlIFZUWElPQ1NFVFZJUlQ6IAoJCXsKCQkJLyogVGhlIFNBQTUyNDkgaGFzIHZpcnR1YWwtcm93IHJlY2VwdGlvbiB0dXJuZWQgb24gYWx3YXlzICovCgkJCXQtPnZpcnR1YWxfbW9kZSA9IChpbnQpKGxvbmcpYXJnOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKLyoKICogVHJhbnNsYXRlcyBvbGQgdnR4IElPQ1RMcyB0byBuZXcgb25lcwogKgogKiBUaGlzIGtlZXBzIG5ldyBrZXJuZWwgdmVyc2lvbnMgY29tcGF0aWJsZSB3aXRoIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMuCiAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2dHhfZml4X2NvbW1hbmQodW5zaWduZWQgaW50IGNtZCkKewoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVlRYSU9DR0VUSU5GT19PTEQ6CgkJY21kID0gVlRYSU9DR0VUSU5GTzsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DQ0xSUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSRk9VTkRfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUkZPVU5EOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQQUdFUkVRX09MRDoKCQljbWQgPSBWVFhJT0NQQUdFUkVROwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NHRVRTVEFUX09MRDoKCQljbWQgPSBWVFhJT0NHRVRTVEFUOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NHRVRQQUdFX09MRDoKCQljbWQgPSBWVFhJT0NHRVRQQUdFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTVE9QREFVX09MRDoKCQljbWQgPSBWVFhJT0NTVE9QREFVOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQVVRQQUdFX09MRDoKCQljbWQgPSBWVFhJT0NQVVRQQUdFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTRVRESVNQX09MRDoKCQljbWQgPSBWVFhJT0NTRVRESVNQOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQVVRTVEFUX09MRDoKCQljbWQgPSBWVFhJT0NQVVRTVEFUOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NDTFJDQUNIRV9PTEQ6CgkJY21kID0gVlRYSU9DQ0xSQ0FDSEU7CgkJYnJlYWs7CgljYXNlIFZUWElPQ1NFVFZJUlRfT0xEOgoJCWNtZCA9IFZUWElPQ1NFVFZJUlQ7CgkJYnJlYWs7Cgl9CglyZXR1cm4gY21kOwp9CgovKgogKglIYW5kbGUgdGhlIGxvY2tpbmcKICovCiAKc3RhdGljIGludCBzYWE1MjQ5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAoJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpIAp7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ9dmQtPnByaXY7CglpbnQgZXJyOwoJCgljbWQgPSB2dHhfZml4X2NvbW1hbmQoY21kKTsKCWRvd24oJnQtPmxvY2spOwoJZXJyID0gdmlkZW9fdXNlcmNvcHkoaW5vZGUsZmlsZSxjbWQsYXJnLGRvX3NhYTUyNDlfaW9jdGwpOwoJdXAoJnQtPmxvY2spOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBzYWE1MjQ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIAp7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ9dmQtPnByaXY7CglpbnQgZXJyLHBnYnVmOwoKCWVyciA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKGlub2RlLGZpbGUpOwoJaWYgKGVyciA8IDApCgkJcmV0dXJuIGVycjsKCQoJaWYgKHQtPmNsaWVudD09TlVMTCkgewoJCWVyciA9IC1FTk9ERVY7CgkJZ290byBmYWlsOwoJfQoKCWlmIChpMmNfc2VuZGRhdGEodCwgMCwgMCwgLTEpIHx8CQkvKiBTZWxlY3QgUjExICovCgkJCQkJCS8qIFR1cm4gb2ZmIHBhcml0eSBjaGVja3MgKHdlIGRvIHRoaXMgb3Vyc2VsdmVzKSAqLwoJCWkyY19zZW5kZGF0YSh0LCAxLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMF0sIDAsIC0xKSB8fAoJCQkJCQkvKiBEaXNwbGF5IFRWLXBpY3R1cmUsIG5vIHZpcnR1YWwgcm93cyAqLwoJCWkyY19zZW5kZGF0YSh0LCA0LCBOVU1fREFVUywgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzFdLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMl0sIDcsIC0xKSkgLyogU2V0IGRpc3BsYXkgdG8gcGFnZSA0ICovCgkKCXsKCQllcnIgPSAtRUlPOwoJCWdvdG8gZmFpbDsKCX0KCglmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykgCgl7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnNyZWdzLCAwLCBzaXplb2YodC0+dmRhdVswXS5zcmVncykpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5sYXN0c3RhdCwgMCwgc2l6ZW9mKHQtPnZkYXVbMF0ubGFzdHN0YXQpKTsKCQl0LT52ZGF1W3BnYnVmXS5leHBpcmUgPSAwOwoJCXQtPnZkYXVbcGdidWZdLmNscmZvdW5kID0gVFJVRTsKCQl0LT52ZGF1W3BnYnVmXS5zdG9wcGVkID0gVFJVRTsKCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gRkFMU0U7Cgl9Cgl0LT52aXJ0dWFsX21vZGU9RkFMU0U7CglyZXR1cm4gMDsKCiBmYWlsOgoJdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UoaW5vZGUsZmlsZSk7CglyZXR1cm4gZXJyOwp9CgoKCnN0YXRpYyBpbnQgc2FhNTI0OV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKSAKewoJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0PXZkLT5wcml2OwoJaTJjX3NlbmRkYXRhKHQsIDEsIDB4MjAsIC0xKTsJCS8qIFR1cm4gb2ZmIENDVCAqLwoJaTJjX3NlbmRkYXRhKHQsIDUsIDMsIDMsIC0xKTsJCS8qIFR1cm4gb2ZmIFRWLWRpc3BsYXkgKi8KCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLGZpbGUpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGluaXRfc2FhXzUyNDkgKHZvaWQpCnsKCXByaW50ayhLRVJOX0lORk8gIlNBQTUyNDkgZHJpdmVyICgiIElGX05BTUUgIiBpbnRlcmZhY2UpIGZvciBWaWRlb1RleHQgdmVyc2lvbiAlZC4lZFxuIiwKCQkJVlRYX1ZFUl9NQUosIFZUWF9WRVJfTUlOKTsKCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl92aWRlb3RleHQpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zYWFfNTI0OSAodm9pZCkgCnsKCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX3ZpZGVvdGV4dCk7Cn0KCm1vZHVsZV9pbml0KGluaXRfc2FhXzUyNDkpOwptb2R1bGVfZXhpdChjbGVhbnVwX3NhYV81MjQ5KTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNhYV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4JCT0gc2FhNTI0OV9vcGVuLAoJLnJlbGVhc2UgICAgICAgCT0gc2FhNTI0OV9yZWxlYXNlLAoJLmlvY3RsICAgICAgICAgID0gc2FhNTI0OV9pb2N0bCwKCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKfTsKCnN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYV90ZW1wbGF0ZSA9CnsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQk9IElGX05BTUUsCgkudHlwZQkJPSBWSURfVFlQRV9URUxFVEVYVCwJLyp8IFZJRF9UWVBFX1RVTkVSID8/ICovCgkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfU0FBNTI0OSwKCS5mb3BzICAgICAgICAgICA9ICZzYWFfZm9wcywKfTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK