LyogaTJjLWNvcmUuYyAtIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIGlpYy1idXMgaW50ZXJmYWNlCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTkgU2ltb24gRy4gVm9nbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPi4KICAgQWxsIFNNQnVzLXJlbGF0ZWQgdGhpbmdzIGFyZSB3cml0dGVuIGJ5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KICAgU01CdXMgMi4wIHN1cHBvcnQgYnkgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiBhbmQKICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+ICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2lkci5oPgojaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CgojaW5jbHVkZSAiaTJjLWNvcmUuaCIKCgpzdGF0aWMgTElTVF9IRUFEKGFkYXB0ZXJzKTsKc3RhdGljIExJU1RfSEVBRChkcml2ZXJzKTsKc3RhdGljIERFRklORV9NVVRFWChjb3JlX2xpc3RzKTsKc3RhdGljIERFRklORV9JRFIoaTJjX2FkYXB0ZXJfaWRyKTsKCiNkZWZpbmUgaXNfbmV3c3R5bGVfZHJpdmVyKGQpICgoZCktPnByb2JlIHx8IChkKS0+cmVtb3ZlKQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGludCBpMmNfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKewoJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBpMmNfZHJpdmVyCSpkcml2ZXIgPSB0b19pMmNfZHJpdmVyKGRydik7CgoJLyogbWFrZSBsZWdhY3kgaTJjIGRyaXZlcnMgYnlwYXNzIGRyaXZlciBtb2RlbCBwcm9iaW5nIGVudGlyZWx5OwoJICogc3VjaCBkcml2ZXJzIHNjYW4gZWFjaCBpMmMgYWRhcHRlci9idXMgdGhlbXNlbHZlcy4KCSAqLwoJaWYgKCFpc19uZXdzdHlsZV9kcml2ZXIoZHJpdmVyKSkKCQlyZXR1cm4gMDsKCgkvKiBuZXcgc3R5bGUgZHJpdmVycyB1c2UgdGhlIHNhbWUga2luZCBvZiBkcml2ZXIgbWF0Y2hpbmcgcG9saWN5CgkgKiBhcyBwbGF0Zm9ybSBkZXZpY2VzIG9yIFNQSTogIGNvbXBhcmUgZGV2aWNlIGFuZCBkcml2ZXIgSURzLgoJICovCglyZXR1cm4gc3RyY21wKGNsaWVudC0+ZHJpdmVyX25hbWUsIGRydi0+bmFtZSkgPT0gMDsKfQoKI2lmZGVmCUNPTkZJR19IT1RQTFVHCgovKiB1ZXZlbnQgaGVscHMgd2l0aCBob3RwbHVnOiBtb2Rwcm9iZSAtcSAkKE1PREFMSUFTKSAqLwpzdGF0aWMgaW50IGkyY19kZXZpY2VfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQp7CglzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoKCS8qIGJ5IGRlZmluaXRpb24sIGxlZ2FjeSBkcml2ZXJzIGNhbid0IGhvdHBsdWcgKi8KCWlmIChkZXYtPmRyaXZlciB8fCAhY2xpZW50LT5kcml2ZXJfbmFtZSkKCQlyZXR1cm4gMDsKCglpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9JXMiLCBjbGllbnQtPmRyaXZlcl9uYW1lKSkKCQlyZXR1cm4gLUVOT01FTTsKCWRldl9kYmcoZGV2LCAidWV2ZW50XG4iKTsKCXJldHVybiAwOwp9CgojZWxzZQojZGVmaW5lIGkyY19kZXZpY2VfdWV2ZW50CU5VTEwKI2VuZGlmCS8qIENPTkZJR19IT1RQTFVHICovCgpzdGF0aWMgaW50IGkyY19kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQp7CglzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IGkyY19kcml2ZXIJKmRyaXZlciA9IHRvX2kyY19kcml2ZXIoZGV2LT5kcml2ZXIpOwoKCWlmICghZHJpdmVyLT5wcm9iZSkKCQlyZXR1cm4gLUVOT0RFVjsKCWNsaWVudC0+ZHJpdmVyID0gZHJpdmVyOwoJZGV2X2RiZyhkZXYsICJwcm9iZVxuIik7CglyZXR1cm4gZHJpdmVyLT5wcm9iZShjbGllbnQpOwp9CgpzdGF0aWMgaW50IGkyY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBpMmNfZHJpdmVyCSpkcml2ZXI7CglpbnQJCQlzdGF0dXM7CgoJaWYgKCFkZXYtPmRyaXZlcikKCQlyZXR1cm4gMDsKCglkcml2ZXIgPSB0b19pMmNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKCWlmIChkcml2ZXItPnJlbW92ZSkgewoJCWRldl9kYmcoZGV2LCAicmVtb3ZlXG4iKTsKCQlzdGF0dXMgPSBkcml2ZXItPnJlbW92ZShjbGllbnQpOwoJfSBlbHNlIHsKCQlkZXYtPmRyaXZlciA9IE5VTEw7CgkJc3RhdHVzID0gMDsKCX0KCWlmIChzdGF0dXMgPT0gMCkKCQljbGllbnQtPmRyaXZlciA9IE5VTEw7CglyZXR1cm4gc3RhdHVzOwp9CgpzdGF0aWMgdm9pZCBpMmNfZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcjsKCglpZiAoIWRldi0+ZHJpdmVyKQoJCXJldHVybjsKCWRyaXZlciA9IHRvX2kyY19kcml2ZXIoZGV2LT5kcml2ZXIpOwoJaWYgKGRyaXZlci0+c2h1dGRvd24pCgkJZHJpdmVyLT5zaHV0ZG93bih0b19pMmNfY2xpZW50KGRldikpOwp9CgpzdGF0aWMgaW50IGkyY19kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKewoJc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcjsKCglpZiAoIWRldi0+ZHJpdmVyKQoJCXJldHVybiAwOwoJZHJpdmVyID0gdG9faTJjX2RyaXZlcihkZXYtPmRyaXZlcik7CglpZiAoIWRyaXZlci0+c3VzcGVuZCkKCQlyZXR1cm4gMDsKCXJldHVybiBkcml2ZXItPnN1c3BlbmQodG9faTJjX2NsaWVudChkZXYpLCBtZXNnKTsKfQoKc3RhdGljIGludCBpMmNfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQp7CglzdHJ1Y3QgaTJjX2RyaXZlciAqZHJpdmVyOwoKCWlmICghZGV2LT5kcml2ZXIpCgkJcmV0dXJuIDA7Cglkcml2ZXIgPSB0b19pMmNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKCWlmICghZHJpdmVyLT5yZXN1bWUpCgkJcmV0dXJuIDA7CglyZXR1cm4gZHJpdmVyLT5yZXN1bWUodG9faTJjX2NsaWVudChkZXYpKTsKfQoKc3RhdGljIHZvaWQgaTJjX2NsaWVudF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCWNvbXBsZXRlKCZjbGllbnQtPnJlbGVhc2VkKTsKfQoKc3RhdGljIHZvaWQgaTJjX2NsaWVudF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCWtmcmVlKHRvX2kyY19jbGllbnQoZGV2KSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfY2xpZW50X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNsaWVudC0+bmFtZSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJcmV0dXJuIGNsaWVudC0+ZHJpdmVyX25hbWUKCQk/IHNwcmludGYoYnVmLCAiJXNcbiIsIGNsaWVudC0+ZHJpdmVyX25hbWUpCgkJOiAwOwp9CgpzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaTJjX2Rldl9hdHRyc1tdID0gewoJX19BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfY2xpZW50X25hbWUsIE5VTEwpLAoJLyogbW9kYWxpYXMgaGVscHMgY29sZHBsdWc6ICBtb2Rwcm9iZSAkKGNhdCAuLi4vbW9kYWxpYXMpICovCglfX0FUVFIobW9kYWxpYXMsIFNfSVJVR08sIHNob3dfbW9kYWxpYXMsIE5VTEwpLAoJeyB9LAp9OwoKc3RydWN0IGJ1c190eXBlIGkyY19idXNfdHlwZSA9IHsKCS5uYW1lCQk9ICJpMmMiLAoJLmRldl9hdHRycwk9IGkyY19kZXZfYXR0cnMsCgkubWF0Y2gJCT0gaTJjX2RldmljZV9tYXRjaCwKCS51ZXZlbnQJCT0gaTJjX2RldmljZV91ZXZlbnQsCgkucHJvYmUJCT0gaTJjX2RldmljZV9wcm9iZSwKCS5yZW1vdmUJCT0gaTJjX2RldmljZV9yZW1vdmUsCgkuc2h1dGRvd24JPSBpMmNfZGV2aWNlX3NodXRkb3duLAoJLnN1c3BlbmQJPSBpMmNfZGV2aWNlX3N1c3BlbmQsCgkucmVzdW1lCQk9IGkyY19kZXZpY2VfcmVzdW1lLAp9OwpFWFBPUlRfU1lNQk9MX0dQTChpMmNfYnVzX3R5cGUpOwoKLyoqCiAqIGkyY19uZXdfZGV2aWNlIC0gaW5zdGFudGlhdGUgYW4gaTJjIGRldmljZSBmb3IgdXNlIHdpdGggYSBuZXcgc3R5bGUgZHJpdmVyCiAqIEBhZGFwOiB0aGUgYWRhcHRlciBtYW5hZ2luZyB0aGUgZGV2aWNlCiAqIEBpbmZvOiBkZXNjcmliZXMgb25lIEkyQyBkZXZpY2U7IGJ1c19udW0gaXMgaWdub3JlZAogKiBDb250ZXh0OiBjYW4gc2xlZXAKICoKICogQ3JlYXRlIGEgZGV2aWNlIHRvIHdvcmsgd2l0aCBhIG5ldyBzdHlsZSBpMmMgZHJpdmVyLCB3aGVyZSBiaW5kaW5nIGlzCiAqIGhhbmRsZWQgdGhyb3VnaCBkcml2ZXIgbW9kZWwgcHJvYmUoKS9yZW1vdmUoKSBtZXRob2RzLiAgVGhpcyBjYWxsIGlzIG5vdAogKiBhcHByb3ByaWF0ZSBmb3IgdXNlIGJ5IG1haW5ib2FkIGluaXRpYWxpemF0aW9uIGxvZ2ljLCB3aGljaCB1c3VhbGx5IHJ1bnMKICogZHVyaW5nIGFuIGFyY2hfaW5pdGNhbGwoKSBsb25nIGJlZm9yZSBhbnkgaTJjX2FkYXB0ZXIgY291bGQgZXhpc3QuCiAqCiAqIFRoaXMgcmV0dXJucyB0aGUgbmV3IGkyYyBjbGllbnQsIHdoaWNoIG1heSBiZSBzYXZlZCBmb3IgbGF0ZXIgdXNlIHdpdGgKICogaTJjX3VucmVnaXN0ZXJfZGV2aWNlKCk7IG9yIE5VTEwgdG8gaW5kaWNhdGUgYW4gZXJyb3IuCiAqLwpzdHJ1Y3QgaTJjX2NsaWVudCAqCmkyY19uZXdfZGV2aWNlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19ib2FyZF9pbmZvIGNvbnN0ICppbmZvKQp7CglzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwoJaW50CQkJc3RhdHVzOwoKCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mICpjbGllbnQsIEdGUF9LRVJORUwpOwoJaWYgKCFjbGllbnQpCgkJcmV0dXJuIE5VTEw7CgoJY2xpZW50LT5hZGFwdGVyID0gYWRhcDsKCgljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhID0gaW5mby0+cGxhdGZvcm1fZGF0YTsKCWNsaWVudC0+ZmxhZ3MgPSBpbmZvLT5mbGFnczsKCWNsaWVudC0+YWRkciA9IGluZm8tPmFkZHI7CgljbGllbnQtPmlycSA9IGluZm8tPmlycTsKCglzdHJsY3B5KGNsaWVudC0+ZHJpdmVyX25hbWUsIGluZm8tPmRyaXZlcl9uYW1lLAoJCXNpemVvZihjbGllbnQtPmRyaXZlcl9uYW1lKSk7CglzdHJsY3B5KGNsaWVudC0+bmFtZSwgaW5mby0+dHlwZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkpOwoKCS8qIGEgbmV3IHN0eWxlIGRyaXZlciBtYXkgYmUgYm91bmQgdG8gdGhpcyBkZXZpY2Ugd2hlbiB3ZQoJICogcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiwgb3IgYW55IGxhdGVyIG1vbWVudCAoZS5nLiBtYXliZQoJICogaG90cGx1Z2dpbmcgd2lsbCBsb2FkIHRoZSBkcml2ZXIgbW9kdWxlKS4gIGFuZCB0aGUgZGV2aWNlCgkgKiByZWZjb3VudCBtb2RlbCBpcyB0aGUgc3RhbmRhcmQgZHJpdmVyIG1vZGVsIG9uZS4KCSAqLwoJc3RhdHVzID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKCWlmIChzdGF0dXMgPCAwKSB7CgkJa2ZyZWUoY2xpZW50KTsKCQljbGllbnQgPSBOVUxMOwoJfQoJcmV0dXJuIGNsaWVudDsKfQpFWFBPUlRfU1lNQk9MX0dQTChpMmNfbmV3X2RldmljZSk7CgoKLyoqCiAqIGkyY191bnJlZ2lzdGVyX2RldmljZSAtIHJldmVyc2UgZWZmZWN0IG9mIGkyY19uZXdfZGV2aWNlKCkKICogQGNsaWVudDogdmFsdWUgcmV0dXJuZWQgZnJvbSBpMmNfbmV3X2RldmljZSgpCiAqIENvbnRleHQ6IGNhbiBzbGVlcAogKi8Kdm9pZCBpMmNfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwoJc3RydWN0IGkyY19kcml2ZXIJKmRyaXZlciA9IGNsaWVudC0+ZHJpdmVyOwoKCWlmIChkcml2ZXIgJiYgIWlzX25ld3N0eWxlX2RyaXZlcihkcml2ZXIpKSB7CgkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjYW4ndCB1bnJlZ2lzdGVyIGRldmljZXMgIgoJCQkid2l0aCBsZWdhY3kgZHJpdmVyc1xuIik7CgkJV0FSTl9PTigxKTsKCQlyZXR1cm47Cgl9CgoJbXV0ZXhfbG9jaygmYWRhcHRlci0+Y2xpc3RfbG9jayk7CglsaXN0X2RlbCgmY2xpZW50LT5saXN0KTsKCW11dGV4X3VubG9jaygmYWRhcHRlci0+Y2xpc3RfbG9jayk7CgoJZGV2aWNlX3VucmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKfQpFWFBPUlRfU1lNQk9MX0dQTChpMmNfdW5yZWdpc3Rlcl9kZXZpY2UpOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIEkyQyBidXMgYWRhcHRlcnMgLS0gb25lIHJvb3RzIGVhY2ggSTJDIG9yIFNNQlVTIHNlZ21lbnQgKi8KCnZvaWQgaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQp7CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSB0b19pMmNfYWRhcHRlcihkZXYpOwoJY29tcGxldGUoJmFkYXAtPmRldl9yZWxlYXNlZCk7Cn0KCnN0YXRpYyBzc2l6ZV90CnNob3dfYWRhcHRlcl9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gdG9faTJjX2FkYXB0ZXIoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhZGFwLT5uYW1lKTsKfQoKc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGkyY19hZGFwdGVyX2F0dHJzW10gPSB7CglfX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19hZGFwdGVyX25hbWUsIE5VTEwpLAoJeyB9LAp9OwoKc3RydWN0IGNsYXNzIGkyY19hZGFwdGVyX2NsYXNzID0gewoJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQkJPSAiaTJjLWFkYXB0ZXIiLAoJLmRldl9hdHRycwkJPSBpMmNfYWRhcHRlcl9hdHRycywKfTsKCnN0YXRpYyB2b2lkIGkyY19zY2FuX3N0YXRpY19ib2FyZF9pbmZvKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IGkyY19kZXZpbmZvCSpkZXZpbmZvOwoKCW11dGV4X2xvY2soJl9faTJjX2JvYXJkX2xvY2spOwoJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpbmZvLCAmX19pMmNfYm9hcmRfbGlzdCwgbGlzdCkgewoJCWlmIChkZXZpbmZvLT5idXNudW0gPT0gYWRhcHRlci0+bnIKCQkJCSYmICFpMmNfbmV3X2RldmljZShhZGFwdGVyLAoJCQkJCQkmZGV2aW5mby0+Ym9hcmRfaW5mbykpCgkJCXByaW50ayhLRVJOX0VSUiAiaTJjLWNvcmU6IGNhbid0IGNyZWF0ZSBpMmMlZC0lMDR4XG4iLAoJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksCgkJCQlkZXZpbmZvLT5ib2FyZF9pbmZvLmFkZHIpOwoJfQoJbXV0ZXhfdW5sb2NrKCZfX2kyY19ib2FyZF9sb2NrKTsKfQoKc3RhdGljIGludCBpMmNfcmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCWludCByZXMgPSAwOwoJc3RydWN0IGxpc3RfaGVhZCAgICppdGVtOwoJc3RydWN0IGkyY19kcml2ZXIgICpkcml2ZXI7CgoJbXV0ZXhfaW5pdCgmYWRhcC0+YnVzX2xvY2spOwoJbXV0ZXhfaW5pdCgmYWRhcC0+Y2xpc3RfbG9jayk7CglJTklUX0xJU1RfSEVBRCgmYWRhcC0+Y2xpZW50cyk7CgoJbXV0ZXhfbG9jaygmY29yZV9saXN0cyk7CglsaXN0X2FkZF90YWlsKCZhZGFwLT5saXN0LCAmYWRhcHRlcnMpOwoKCS8qIEFkZCB0aGUgYWRhcHRlciB0byB0aGUgZHJpdmVyIGNvcmUuCgkgKiBJZiB0aGUgcGFyZW50IHBvaW50ZXIgaXMgbm90IHNldCB1cCwKCSAqIHdlIGFkZCB0aGlzIGFkYXB0ZXIgdG8gdGhlIGhvc3QgYnVzLgoJICovCglpZiAoYWRhcC0+ZGV2LnBhcmVudCA9PSBOVUxMKSB7CgkJYWRhcC0+ZGV2LnBhcmVudCA9ICZwbGF0Zm9ybV9idXM7CgkJcHJfZGVidWcoIkkyQyBhZGFwdGVyIGRyaXZlciBbJXNdIGZvcmdvdCB0byBzcGVjaWZ5ICIKCQkJICJwaHlzaWNhbCBkZXZpY2VcbiIsIGFkYXAtPm5hbWUpOwoJfQoJc3ByaW50ZihhZGFwLT5kZXYuYnVzX2lkLCAiaTJjLSVkIiwgYWRhcC0+bnIpOwoJYWRhcC0+ZGV2LnJlbGVhc2UgPSAmaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2U7CglhZGFwLT5kZXYuY2xhc3MgPSAmaTJjX2FkYXB0ZXJfY2xhc3M7CglyZXMgPSBkZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmRldik7CglpZiAocmVzKQoJCWdvdG8gb3V0X2xpc3Q7CgoJZGV2X2RiZygmYWRhcC0+ZGV2LCAiYWRhcHRlciBbJXNdIHJlZ2lzdGVyZWRcbiIsIGFkYXAtPm5hbWUpOwoKCS8qIGNyZWF0ZSBwcmUtZGVjbGFyZWQgZGV2aWNlIG5vZGVzIGZvciBuZXctc3R5bGUgZHJpdmVycyAqLwoJaWYgKGFkYXAtPm5yIDwgX19pMmNfZmlyc3RfZHluYW1pY19idXNfbnVtKQoJCWkyY19zY2FuX3N0YXRpY19ib2FyZF9pbmZvKGFkYXApOwoKCS8qIGxldCBsZWdhY3kgZHJpdmVycyBzY2FuIHRoaXMgYnVzIGZvciBtYXRjaGluZyBkZXZpY2VzICovCglsaXN0X2Zvcl9lYWNoKGl0ZW0sJmRyaXZlcnMpIHsKCQlkcml2ZXIgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfZHJpdmVyLCBsaXN0KTsKCQlpZiAoZHJpdmVyLT5hdHRhY2hfYWRhcHRlcikKCQkJLyogV2UgaWdub3JlIHRoZSByZXR1cm4gY29kZTsgaWYgaXQgZmFpbHMsIHRvbyBiYWQgKi8KCQkJZHJpdmVyLT5hdHRhY2hfYWRhcHRlcihhZGFwKTsKCX0KCm91dF91bmxvY2s6CgltdXRleF91bmxvY2soJmNvcmVfbGlzdHMpOwoJcmV0dXJuIHJlczsKCm91dF9saXN0OgoJbGlzdF9kZWwoJmFkYXAtPmxpc3QpOwoJaWRyX3JlbW92ZSgmaTJjX2FkYXB0ZXJfaWRyLCBhZGFwLT5ucik7Cglnb3RvIG91dF91bmxvY2s7Cn0KCi8qKgogKiBpMmNfYWRkX2FkYXB0ZXIgLSBkZWNsYXJlIGkyYyBhZGFwdGVyLCB1c2UgZHluYW1pYyBidXMgbnVtYmVyCiAqIEBhZGFwdGVyOiB0aGUgYWRhcHRlciB0byBhZGQKICogQ29udGV4dDogY2FuIHNsZWVwCiAqCiAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gSTJDIGFkYXB0ZXIgd2hlbiBpdHMgYnVzIG51bWJlcgogKiBkb2Vzbid0IG1hdHRlci4gIEV4YW1wbGVzOiBmb3IgSTJDIGFkYXB0ZXJzIGR5bmFtaWNhbGx5IGFkZGVkIGJ5CiAqIFVTQiBsaW5rcyBvciBQQ0kgcGx1Z2luIGNhcmRzLgogKgogKiBXaGVuIHRoaXMgcmV0dXJucyB6ZXJvLCBhIG5ldyBidXMgbnVtYmVyIHdhcyBhbGxvY2F0ZWQgYW5kIHN0b3JlZAogKiBpbiBhZGFwLT5uciwgYW5kIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBiZWNhbWUgYXZhaWxhYmxlIGZvciBjbGllbnRzLgogKiBPdGhlcndpc2UsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAqLwppbnQgaTJjX2FkZF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJaW50CWlkLCByZXMgPSAwOwoKcmV0cnk6CglpZiAoaWRyX3ByZV9nZXQoJmkyY19hZGFwdGVyX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkKCQlyZXR1cm4gLUVOT01FTTsKCgltdXRleF9sb2NrKCZjb3JlX2xpc3RzKTsKCS8qICJhYm92ZSIgaGVyZSBtZWFucyAiYWJvdmUgb3IgZXF1YWwgdG8iLCBzaWdoICovCglyZXMgPSBpZHJfZ2V0X25ld19hYm92ZSgmaTJjX2FkYXB0ZXJfaWRyLCBhZGFwdGVyLAoJCQkJX19pMmNfZmlyc3RfZHluYW1pY19idXNfbnVtLCAmaWQpOwoJbXV0ZXhfdW5sb2NrKCZjb3JlX2xpc3RzKTsKCglpZiAocmVzIDwgMCkgewoJCWlmIChyZXMgPT0gLUVBR0FJTikKCQkJZ290byByZXRyeTsKCQlyZXR1cm4gcmVzOwoJfQoKCWFkYXB0ZXItPm5yID0gaWQ7CglyZXR1cm4gaTJjX3JlZ2lzdGVyX2FkYXB0ZXIoYWRhcHRlcik7Cn0KRVhQT1JUX1NZTUJPTChpMmNfYWRkX2FkYXB0ZXIpOwoKLyoqCiAqIGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlciAtIGRlY2xhcmUgaTJjIGFkYXB0ZXIsIHVzZSBzdGF0aWMgYnVzIG51bWJlcgogKiBAYWRhcDogdGhlIGFkYXB0ZXIgdG8gcmVnaXN0ZXIgKHdpdGggYWRhcC0+bnIgaW5pdGlhbGl6ZWQpCiAqIENvbnRleHQ6IGNhbiBzbGVlcAogKgogKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIEkyQyBhZGFwdGVyIHdoZW4gaXRzIGJ1cyBudW1iZXIKICogbWF0dGVycy4gIEV4YW1wbGU6IGZvciBJMkMgYWRhcHRlcnMgZnJvbSBzeXN0ZW0tb24tY2hpcCBDUFVzLCBvcgogKiBvdGhlcndpc2UgYnVpbHQgaW4gdG8gdGhlIHN5c3RlbSdzIG1haW5ib2FyZCwgYW5kIHdoZXJlIGkyY19ib2FyZF9pbmZvCiAqIGlzIHVzZWQgdG8gcHJvcGVybHkgY29uZmlndXJlIEkyQyBkZXZpY2VzLgogKgogKiBJZiBubyBkZXZpY2VzIGhhdmUgcHJlLWJlZW4gZGVjbGFyZWQgZm9yIHRoaXMgYnVzLCB0aGVuIGJlIHN1cmUgdG8KICogcmVnaXN0ZXIgdGhlIGFkYXB0ZXIgYmVmb3JlIGFueSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgb25lcy4gIE90aGVyd2lzZQogKiB0aGUgcmVxdWlyZWQgYnVzIElEIG1heSBub3QgYmUgYXZhaWxhYmxlLgogKgogKiBXaGVuIHRoaXMgcmV0dXJucyB6ZXJvLCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYmVjYW1lIGF2YWlsYWJsZSBmb3IKICogY2xpZW50cyB1c2luZyB0aGUgYnVzIG51bWJlciBwcm92aWRlZCBpbiBhZGFwLT5uci4gIEFsc28sIHRoZSB0YWJsZQogKiBvZiBJMkMgZGV2aWNlcyBwcmUtZGVjbGFyZWQgdXNpbmcgaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oKSBpcyBzY2FubmVkLAogKiBhbmQgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBtb2RlbCBkZXZpY2Ugbm9kZXMgYXJlIGNyZWF0ZWQuICBPdGhlcndpc2UsIGEKICogbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAqLwppbnQgaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJaW50CWlkOwoJaW50CXN0YXR1czsKCglpZiAoYWRhcC0+bnIgJiB+TUFYX0lEX01BU0spCgkJcmV0dXJuIC1FSU5WQUw7CgpyZXRyeToKCWlmIChpZHJfcHJlX2dldCgmaTJjX2FkYXB0ZXJfaWRyLCBHRlBfS0VSTkVMKSA9PSAwKQoJCXJldHVybiAtRU5PTUVNOwoKCW11dGV4X2xvY2soJmNvcmVfbGlzdHMpOwoJLyogImFib3ZlIiBoZXJlIG1lYW5zICJhYm92ZSBvciBlcXVhbCB0byIsIHNpZ2g7CgkgKiB3ZSBuZWVkIHRoZSAiZXF1YWwgdG8iIHJlc3VsdCB0byBmb3JjZSB0aGUgcmVzdWx0CgkgKi8KCXN0YXR1cyA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZpMmNfYWRhcHRlcl9pZHIsIGFkYXAsIGFkYXAtPm5yLCAmaWQpOwoJaWYgKHN0YXR1cyA9PSAwICYmIGlkICE9IGFkYXAtPm5yKSB7CgkJc3RhdHVzID0gLUVCVVNZOwoJCWlkcl9yZW1vdmUoJmkyY19hZGFwdGVyX2lkciwgaWQpOwoJfQoJbXV0ZXhfdW5sb2NrKCZjb3JlX2xpc3RzKTsKCWlmIChzdGF0dXMgPT0gLUVBR0FJTikKCQlnb3RvIHJldHJ5OwoKCWlmIChzdGF0dXMgPT0gMCkKCQlzdGF0dXMgPSBpMmNfcmVnaXN0ZXJfYWRhcHRlcihhZGFwKTsKCXJldHVybiBzdGF0dXM7Cn0KRVhQT1JUX1NZTUJPTF9HUEwoaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKTsKCi8qKgogKiBpMmNfZGVsX2FkYXB0ZXIgLSB1bnJlZ2lzdGVyIEkyQyBhZGFwdGVyCiAqIEBhZGFwOiB0aGUgYWRhcHRlciBiZWluZyB1bnJlZ2lzdGVyZWQKICogQ29udGV4dDogY2FuIHNsZWVwCiAqCiAqIFRoaXMgdW5yZWdpc3RlcnMgYW4gSTJDIGFkYXB0ZXIgd2hpY2ggd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAogKiBieSBAaTJjX2FkZF9hZGFwdGVyIG9yIEBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIuCiAqLwppbnQgaTJjX2RlbF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJc3RydWN0IGxpc3RfaGVhZCAgKml0ZW0sICpfbjsKCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcF9mcm9tX2xpc3Q7CglzdHJ1Y3QgaTJjX2RyaXZlciAqZHJpdmVyOwoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKCWludCByZXMgPSAwOwoKCW11dGV4X2xvY2soJmNvcmVfbGlzdHMpOwoKCS8qIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoaXMgYWRhcHRlciB3YXMgZXZlciBhZGRlZCAqLwoJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwX2Zyb21fbGlzdCwgJmFkYXB0ZXJzLCBsaXN0KSB7CgkJaWYgKGFkYXBfZnJvbV9saXN0ID09IGFkYXApCgkJCWJyZWFrOwoJfQoJaWYgKGFkYXBfZnJvbV9saXN0ICE9IGFkYXApIHsKCQlwcl9kZWJ1ZygiaTJjLWNvcmU6IGF0dGVtcHRpbmcgdG8gZGVsZXRlIHVucmVnaXN0ZXJlZCAiCgkJCSAiYWRhcHRlciBbJXNdXG4iLCBhZGFwLT5uYW1lKTsKCQlyZXMgPSAtRUlOVkFMOwoJCWdvdG8gb3V0X3VubG9jazsKCX0KCglsaXN0X2Zvcl9lYWNoKGl0ZW0sJmRyaXZlcnMpIHsKCQlkcml2ZXIgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfZHJpdmVyLCBsaXN0KTsKCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcikKCQkJaWYgKChyZXMgPSBkcml2ZXItPmRldGFjaF9hZGFwdGVyKGFkYXApKSkgewoJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiZGV0YWNoX2FkYXB0ZXIgZmFpbGVkICIKCQkJCQkiZm9yIGRyaXZlciBbJXNdXG4iLAoJCQkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwoJCQkJZ290byBvdXRfdW5sb2NrOwoJCQl9Cgl9CgoJLyogZGV0YWNoIGFueSBhY3RpdmUgY2xpZW50cy4gVGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QsIGJlY2F1c2UKCSAqIGl0IGNhbiBmYWlsOyBpbiB3aGljaCBjYXNlIHdlIGdpdmUgdXAuICovCglsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlbSwgX24sICZhZGFwLT5jbGllbnRzKSB7CgkJc3RydWN0IGkyY19kcml2ZXIJKmRyaXZlcjsKCgkJY2xpZW50ID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2NsaWVudCwgbGlzdCk7CgkJZHJpdmVyID0gY2xpZW50LT5kcml2ZXI7CgoJCS8qIG5ldyBzdHlsZSwgZm9sbG93IHN0YW5kYXJkIGRyaXZlciBtb2RlbCAqLwoJCWlmICghZHJpdmVyIHx8IGlzX25ld3N0eWxlX2RyaXZlcihkcml2ZXIpKSB7CgkJCWkyY191bnJlZ2lzdGVyX2RldmljZShjbGllbnQpOwoJCQljb250aW51ZTsKCQl9CgoJCS8qIGxlZ2FjeSBkcml2ZXJzIGNyZWF0ZSBhbmQgcmVtb3ZlIGNsaWVudHMgdGhlbXNlbHZlcyAqLwoJCWlmICgocmVzID0gZHJpdmVyLT5kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CgkJCWRldl9lcnIoJmFkYXAtPmRldiwgImRldGFjaF9jbGllbnQgZmFpbGVkIGZvciBjbGllbnQgIgoJCQkJIlslc10gYXQgYWRkcmVzcyAweCUwMnhcbiIsIGNsaWVudC0+bmFtZSwKCQkJCWNsaWVudC0+YWRkcik7CgkJCWdvdG8gb3V0X3VubG9jazsKCQl9Cgl9CgoJLyogY2xlYW4gdXAgdGhlIHN5c2ZzIHJlcHJlc2VudGF0aW9uICovCglpbml0X2NvbXBsZXRpb24oJmFkYXAtPmRldl9yZWxlYXNlZCk7CglkZXZpY2VfdW5yZWdpc3RlcigmYWRhcC0+ZGV2KTsKCWxpc3RfZGVsKCZhZGFwLT5saXN0KTsKCgkvKiB3YWl0IGZvciBzeXNmcyB0byBkcm9wIGFsbCByZWZlcmVuY2VzICovCgl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhZGFwLT5kZXZfcmVsZWFzZWQpOwoKCS8qIGZyZWUgYnVzIGlkICovCglpZHJfcmVtb3ZlKCZpMmNfYWRhcHRlcl9pZHIsIGFkYXAtPm5yKTsKCglkZXZfZGJnKCZhZGFwLT5kZXYsICJhZGFwdGVyIFslc10gdW5yZWdpc3RlcmVkXG4iLCBhZGFwLT5uYW1lKTsKCiBvdXRfdW5sb2NrOgoJbXV0ZXhfdW5sb2NrKCZjb3JlX2xpc3RzKTsKCXJldHVybiByZXM7Cn0KRVhQT1JUX1NZTUJPTChpMmNfZGVsX2FkYXB0ZXIpOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIEFuIGkyY19kcml2ZXIgaXMgdXNlZCB3aXRoIG9uZSBvciBtb3JlIGkyY19jbGllbnQgKGRldmljZSkgbm9kZXMgdG8gYWNjZXNzCiAqIGkyYyBzbGF2ZSBjaGlwcywgb24gYSBidXMgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHNvbWUgaTJjX2FkYXB0ZXIuICBUaGVyZQogKiBhcmUgdHdvIG1vZGVscyBmb3IgYmluZGluZyB0aGUgZHJpdmVyIHRvIGl0cyBkZXZpY2U6ICAibmV3IHN0eWxlIiBkcml2ZXJzCiAqIGZvbGxvdyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIG1vZGVsIGFuZCBqdXN0IHJlc3BvbmQgdG8gcHJvYmUoKSBjYWxscwogKiBpc3N1ZWQgaWYgdGhlIGRyaXZlciBjb3JlIHNlZXMgdGhleSBtYXRjaCgpOyAibGVnYWN5IiBkcml2ZXJzIGNyZWF0ZSBkZXZpY2UKICogbm9kZXMgdGhlbXNlbHZlcy4KICovCgppbnQgaTJjX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbW9kdWxlICpvd25lciwgc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcikKewoJaW50IHJlczsKCgkvKiBuZXcgc3R5bGUgZHJpdmVyIG1ldGhvZHMgY2FuJ3QgbWl4IHdpdGggbGVnYWN5IG9uZXMgKi8KCWlmIChpc19uZXdzdHlsZV9kcml2ZXIoZHJpdmVyKSkgewoJCWlmIChkcml2ZXItPmF0dGFjaF9hZGFwdGVyIHx8IGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIKCQkJCXx8IGRyaXZlci0+ZGV0YWNoX2NsaWVudCkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJCQkJImkyYy1jb3JlOiBkcml2ZXIgWyVzXSBpcyBjb25mdXNlZFxuIiwKCQkJCQlkcml2ZXItPmRyaXZlci5uYW1lKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJfQoKCS8qIGFkZCB0aGUgZHJpdmVyIHRvIHRoZSBsaXN0IG9mIGkyYyBkcml2ZXJzIGluIHRoZSBkcml2ZXIgY29yZSAqLwoJZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKCWRyaXZlci0+ZHJpdmVyLmJ1cyA9ICZpMmNfYnVzX3R5cGU7CgoJLyogZm9yIG5ldyBzdHlsZSBkcml2ZXJzLCB3aGVuIHJlZ2lzdHJhdGlvbiByZXR1cm5zIHRoZSBkcml2ZXIgY29yZQoJICogd2lsbCBoYXZlIGNhbGxlZCBwcm9iZSgpIGZvciBhbGwgbWF0Y2hpbmctYnV0LXVuYm91bmQgZGV2aWNlcy4KCSAqLwoJcmVzID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CglpZiAocmVzKQoJCXJldHVybiByZXM7CgoJbXV0ZXhfbG9jaygmY29yZV9saXN0cyk7CgoJbGlzdF9hZGRfdGFpbCgmZHJpdmVyLT5saXN0LCZkcml2ZXJzKTsKCXByX2RlYnVnKCJpMmMtY29yZTogZHJpdmVyIFslc10gcmVnaXN0ZXJlZFxuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CgoJLyogbGVnYWN5IGRyaXZlcnMgc2NhbiBpMmMgYnVzc2VzIGRpcmVjdGx5ICovCglpZiAoZHJpdmVyLT5hdHRhY2hfYWRhcHRlcikgewoJCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKCgkJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwdGVyLCAmYWRhcHRlcnMsIGxpc3QpIHsKCQkJZHJpdmVyLT5hdHRhY2hfYWRhcHRlcihhZGFwdGVyKTsKCQl9Cgl9CgoJbXV0ZXhfdW5sb2NrKCZjb3JlX2xpc3RzKTsKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaTJjX3JlZ2lzdGVyX2RyaXZlcik7CgovKioKICogaTJjX2RlbF9kcml2ZXIgLSB1bnJlZ2lzdGVyIEkyQyBkcml2ZXIKICogQGRyaXZlcjogdGhlIGRyaXZlciBiZWluZyB1bnJlZ2lzdGVyZWQKICogQ29udGV4dDogY2FuIHNsZWVwCiAqLwp2b2lkIGkyY19kZWxfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIpCnsKCXN0cnVjdCBsaXN0X2hlYWQgICAqaXRlbTEsICppdGVtMiwgKl9uOwoJc3RydWN0IGkyY19jbGllbnQgICpjbGllbnQ7CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CgoJbXV0ZXhfbG9jaygmY29yZV9saXN0cyk7CgoJLyogbmV3LXN0eWxlIGRyaXZlcj8gKi8KCWlmIChpc19uZXdzdHlsZV9kcml2ZXIoZHJpdmVyKSkKCQlnb3RvIHVucmVnaXN0ZXI7CgoJLyogSGF2ZSBhIGxvb2sgYXQgZWFjaCBhZGFwdGVyLCBpZiBjbGllbnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBzdGlsbAoJICogYXR0YWNoZWQuIElmIHNvLCBkZXRhY2ggdGhlbSB0byBiZSBhYmxlIHRvIGtpbGwgdGhlIGRyaXZlcgoJICogYWZ0ZXJ3YXJkcy4KCSAqLwoJbGlzdF9mb3JfZWFjaChpdGVtMSwmYWRhcHRlcnMpIHsKCQlhZGFwID0gbGlzdF9lbnRyeShpdGVtMSwgc3RydWN0IGkyY19hZGFwdGVyLCBsaXN0KTsKCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcikgewoJCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcihhZGFwKSkgewoJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiZGV0YWNoX2FkYXB0ZXIgZmFpbGVkICIKCQkJCQkiZm9yIGRyaXZlciBbJXNdXG4iLAoJCQkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZW0yLCBfbiwgJmFkYXAtPmNsaWVudHMpIHsKCQkJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbTIsIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKCQkJCWlmIChjbGllbnQtPmRyaXZlciAhPSBkcml2ZXIpCgkJCQkJY29udGludWU7CgkJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJkZXRhY2hpbmcgY2xpZW50IFslc10gIgoJCQkJCSJhdCAweCUwMnhcbiIsIGNsaWVudC0+bmFtZSwKCQkJCQljbGllbnQtPmFkZHIpOwoJCQkJaWYgKGRyaXZlci0+ZGV0YWNoX2NsaWVudChjbGllbnQpKSB7CgkJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiZGV0YWNoX2NsaWVudCAiCgkJCQkJCSJmYWlsZWQgZm9yIGNsaWVudCBbJXNdIGF0ICIKCQkJCQkJIjB4JTAyeFxuIiwgY2xpZW50LT5uYW1lLAoJCQkJCQljbGllbnQtPmFkZHIpOwoJCQkJfQoJCQl9CgkJfQoJfQoKIHVucmVnaXN0ZXI6Cglkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOwoJbGlzdF9kZWwoJmRyaXZlci0+bGlzdCk7Cglwcl9kZWJ1ZygiaTJjLWNvcmU6IGRyaXZlciBbJXNdIHVucmVnaXN0ZXJlZFxuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CgoJbXV0ZXhfdW5sb2NrKCZjb3JlX2xpc3RzKTsKfQpFWFBPUlRfU1lNQk9MKGkyY19kZWxfZHJpdmVyKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbnQgX19pMmNfY2hlY2tfYWRkcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBhZGRyKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CglzdHJ1Y3QgaTJjX2NsaWVudCAgKmNsaWVudDsKCglsaXN0X2Zvcl9lYWNoKGl0ZW0sJmFkYXB0ZXItPmNsaWVudHMpIHsKCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKCQlpZiAoY2xpZW50LT5hZGRyID09IGFkZHIpCgkJCXJldHVybiAtRUJVU1k7Cgl9CglyZXR1cm4gMDsKfQoKaW50IGkyY19jaGVja19hZGRyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpCnsKCWludCBydmFsOwoKCW11dGV4X2xvY2soJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoJcnZhbCA9IF9faTJjX2NoZWNrX2FkZHIoYWRhcHRlciwgYWRkcik7CgltdXRleF91bmxvY2soJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoKCXJldHVybiBydmFsOwp9CkVYUE9SVF9TWU1CT0woaTJjX2NoZWNrX2FkZHIpOwoKaW50IGkyY19hdHRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKCWludCByZXMgPSAwOwoKCW11dGV4X2xvY2soJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoJaWYgKF9faTJjX2NoZWNrX2FkZHIoY2xpZW50LT5hZGFwdGVyLCBjbGllbnQtPmFkZHIpKSB7CgkJcmVzID0gLUVCVVNZOwoJCWdvdG8gb3V0X3VubG9jazsKCX0KCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+bGlzdCwmYWRhcHRlci0+Y2xpZW50cyk7CgoJY2xpZW50LT51c2FnZV9jb3VudCA9IDA7CgoJY2xpZW50LT5kZXYucGFyZW50ID0gJmNsaWVudC0+YWRhcHRlci0+ZGV2OwoJY2xpZW50LT5kZXYuYnVzID0gJmkyY19idXNfdHlwZTsKCglpZiAoY2xpZW50LT5kcml2ZXIpCgkJY2xpZW50LT5kZXYuZHJpdmVyID0gJmNsaWVudC0+ZHJpdmVyLT5kcml2ZXI7CgoJaWYgKGNsaWVudC0+ZHJpdmVyICYmICFpc19uZXdzdHlsZV9kcml2ZXIoY2xpZW50LT5kcml2ZXIpKSB7CgkJY2xpZW50LT5kZXYucmVsZWFzZSA9IGkyY19jbGllbnRfcmVsZWFzZTsKCQljbGllbnQtPmRldi51ZXZlbnRfc3VwcHJlc3MgPSAxOwoJfSBlbHNlCgkJY2xpZW50LT5kZXYucmVsZWFzZSA9IGkyY19jbGllbnRfZGV2X3JlbGVhc2U7CgoJc25wcmludGYoJmNsaWVudC0+ZGV2LmJ1c19pZFswXSwgc2l6ZW9mKGNsaWVudC0+ZGV2LmJ1c19pZCksCgkJIiVkLSUwNHgiLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgY2xpZW50LT5hZGRyKTsKCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImNsaWVudCBbJXNdIHJlZ2lzdGVyZWQgd2l0aCBidXMgaWQgJXNcbiIsCgkJY2xpZW50LT5uYW1lLCBjbGllbnQtPmRldi5idXNfaWQpOwoJcmVzID0gZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CglpZiAocmVzKQoJCWdvdG8gb3V0X2xpc3Q7CgltdXRleF91bmxvY2soJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoKCWlmIChhZGFwdGVyLT5jbGllbnRfcmVnaXN0ZXIpICB7CgkJaWYgKGFkYXB0ZXItPmNsaWVudF9yZWdpc3RlcihjbGllbnQpKSB7CgkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImNsaWVudF9yZWdpc3RlciAiCgkJCQkiZmFpbGVkIGZvciBjbGllbnQgWyVzXSBhdCAweCUwMnhcbiIsCgkJCQljbGllbnQtPm5hbWUsIGNsaWVudC0+YWRkcik7CgkJfQoJfQoKCXJldHVybiAwOwoKb3V0X2xpc3Q6CglsaXN0X2RlbCgmY2xpZW50LT5saXN0KTsKCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkZhaWxlZCB0byBhdHRhY2ggaTJjIGNsaWVudCAlcyBhdCAweCUwMnggIgoJCSIoJWQpXG4iLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+YWRkciwgcmVzKTsKb3V0X3VubG9jazoKCW11dGV4X3VubG9jaygmYWRhcHRlci0+Y2xpc3RfbG9jayk7CglyZXR1cm4gcmVzOwp9CkVYUE9SVF9TWU1CT0woaTJjX2F0dGFjaF9jbGllbnQpOwoKaW50IGkyY19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKCWludCByZXMgPSAwOwoKCWlmIChjbGllbnQtPnVzYWdlX2NvdW50ID4gMCkgewoJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkNsaWVudCBbJXNdIHN0aWxsIGJ1c3ksICIKCQkJICJjYW4ndCBkZXRhY2hcbiIsIGNsaWVudC0+bmFtZSk7CgkJcmV0dXJuIC1FQlVTWTsKCX0KCglpZiAoYWRhcHRlci0+Y2xpZW50X3VucmVnaXN0ZXIpICB7CgkJcmVzID0gYWRhcHRlci0+Y2xpZW50X3VucmVnaXN0ZXIoY2xpZW50KTsKCQlpZiAocmVzKSB7CgkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAoJCQkJImNsaWVudF91bnJlZ2lzdGVyIFslc10gZmFpbGVkLCAiCgkJCQkiY2xpZW50IG5vdCBkZXRhY2hlZFxuIiwgY2xpZW50LT5uYW1lKTsKCQkJZ290byBvdXQ7CgkJfQoJfQoKCW11dGV4X2xvY2soJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoJbGlzdF9kZWwoJmNsaWVudC0+bGlzdCk7Cglpbml0X2NvbXBsZXRpb24oJmNsaWVudC0+cmVsZWFzZWQpOwoJZGV2aWNlX3VucmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKCW11dGV4X3VubG9jaygmYWRhcHRlci0+Y2xpc3RfbG9jayk7Cgl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjbGllbnQtPnJlbGVhc2VkKTsKCiBvdXQ6CglyZXR1cm4gcmVzOwp9CkVYUE9SVF9TWU1CT0woaTJjX2RldGFjaF9jbGllbnQpOwoKc3RhdGljIGludCBpMmNfaW5jX3VzZV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoKCWlmICghdHJ5X21vZHVsZV9nZXQoY2xpZW50LT5kcml2ZXItPmRyaXZlci5vd25lcikpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+YWRhcHRlci0+b3duZXIpKSB7CgkJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgaTJjX2RlY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCW1vZHVsZV9wdXQoY2xpZW50LT5kcml2ZXItPmRyaXZlci5vd25lcik7Cgltb2R1bGVfcHV0KGNsaWVudC0+YWRhcHRlci0+b3duZXIpOwp9CgppbnQgaTJjX3VzZV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJaW50IHJldDsKCglyZXQgPSBpMmNfaW5jX3VzZV9jbGllbnQoY2xpZW50KTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCgljbGllbnQtPnVzYWdlX2NvdW50Kys7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpMmNfdXNlX2NsaWVudCk7CgppbnQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCWlmICghY2xpZW50LT51c2FnZV9jb3VudCkgewoJCXByX2RlYnVnKCJpMmMtY29yZTogJXMgdXNlZCBvbmUgdG9vIG1hbnkgdGltZXNcbiIsCgkJCSBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAtRVBFUk07Cgl9CgoJY2xpZW50LT51c2FnZV9jb3VudC0tOwoJaTJjX2RlY191c2VfY2xpZW50KGNsaWVudCk7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpMmNfcmVsZWFzZV9jbGllbnQpOwoKdm9pZCBpMmNfY2xpZW50c19jb21tYW5kKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICAqaXRlbTsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CgoJbXV0ZXhfbG9jaygmYWRhcC0+Y2xpc3RfbG9jayk7CglsaXN0X2Zvcl9lYWNoKGl0ZW0sJmFkYXAtPmNsaWVudHMpIHsKCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIub3duZXIpKQoJCQljb250aW51ZTsKCQlpZiAoTlVMTCAhPSBjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkgewoJCQltdXRleF91bmxvY2soJmFkYXAtPmNsaXN0X2xvY2spOwoJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsY21kLGFyZyk7CgkJCW11dGV4X2xvY2soJmFkYXAtPmNsaXN0X2xvY2spOwoJCX0KCQltb2R1bGVfcHV0KGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIub3duZXIpOwogICAgICAgfQogICAgICAgbXV0ZXhfdW5sb2NrKCZhZGFwLT5jbGlzdF9sb2NrKTsKfQpFWFBPUlRfU1lNQk9MKGkyY19jbGllbnRzX2NvbW1hbmQpOwoKc3RhdGljIGludCBfX2luaXQgaTJjX2luaXQodm9pZCkKewoJaW50IHJldHZhbDsKCglyZXR2YWwgPSBidXNfcmVnaXN0ZXIoJmkyY19idXNfdHlwZSk7CglpZiAocmV0dmFsKQoJCXJldHVybiByZXR2YWw7CglyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJmkyY19hZGFwdGVyX2NsYXNzKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGkyY19leGl0KHZvaWQpCnsKCWNsYXNzX3VucmVnaXN0ZXIoJmkyY19hZGFwdGVyX2NsYXNzKTsKCWJ1c191bnJlZ2lzdGVyKCZpMmNfYnVzX3R5cGUpOwp9CgpzdWJzeXNfaW5pdGNhbGwoaTJjX2luaXQpOwptb2R1bGVfZXhpdChpMmNfZXhpdCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHRoZSBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgaTJjIGJ1c3Nlcy4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCmludCBpMmNfdHJhbnNmZXIoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCnsKCWludCByZXQ7CgoJaWYgKGFkYXAtPmFsZ28tPm1hc3Rlcl94ZmVyKSB7CiNpZmRlZiBERUJVRwoJCWZvciAocmV0ID0gMDsgcmV0IDwgbnVtOyByZXQrKykgewoJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJtYXN0ZXJfeGZlclslZF0gJWMsIGFkZHI9MHglMDJ4LCAiCgkJCQkibGVuPSVkJXNcbiIsIHJldCwgKG1zZ3NbcmV0XS5mbGFncyAmIEkyQ19NX1JEKQoJCQkJPyAnUicgOiAnVycsIG1zZ3NbcmV0XS5hZGRyLCBtc2dzW3JldF0ubGVuLAoJCQkJKG1zZ3NbcmV0XS5mbGFncyAmIEkyQ19NX1JFQ1ZfTEVOKSA/ICIrIiA6ICIiKTsKCQl9CiNlbmRpZgoKCQltdXRleF9sb2NrX25lc3RlZCgmYWRhcC0+YnVzX2xvY2ssIGFkYXAtPmxldmVsKTsKCQlyZXQgPSBhZGFwLT5hbGdvLT5tYXN0ZXJfeGZlcihhZGFwLG1zZ3MsbnVtKTsKCQltdXRleF91bmxvY2soJmFkYXAtPmJ1c19sb2NrKTsKCgkJcmV0dXJuIHJldDsKCX0gZWxzZSB7CgkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiSTJDIGxldmVsIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkXG4iKTsKCQlyZXR1cm4gLUVOT1NZUzsKCX0KfQpFWFBPUlRfU1lNQk9MKGkyY190cmFuc2Zlcik7CgppbnQgaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsY29uc3QgY2hhciAqYnVmICxpbnQgY291bnQpCnsKCWludCByZXQ7CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA9Y2xpZW50LT5hZGFwdGVyOwoJc3RydWN0IGkyY19tc2cgbXNnOwoKCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOwoJbXNnLmZsYWdzID0gY2xpZW50LT5mbGFncyAmIEkyQ19NX1RFTjsKCW1zZy5sZW4gPSBjb3VudDsKCW1zZy5idWYgPSAoY2hhciAqKWJ1ZjsKCglyZXQgPSBpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSk7CgoJLyogSWYgZXZlcnl0aGluZyB3ZW50IG9rIChpLmUuIDEgbXNnIHRyYW5zbWl0dGVkKSwgcmV0dXJuICNieXRlcwoJICAgdHJhbnNtaXR0ZWQsIGVsc2UgZXJyb3IgY29kZS4gKi8KCXJldHVybiAocmV0ID09IDEpID8gY291bnQgOiByZXQ7Cn0KRVhQT1JUX1NZTUJPTChpMmNfbWFzdGVyX3NlbmQpOwoKaW50IGkyY19tYXN0ZXJfcmVjdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjaGFyICpidWYgLGludCBjb3VudCkKewoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwPWNsaWVudC0+YWRhcHRlcjsKCXN0cnVjdCBpMmNfbXNnIG1zZzsKCWludCByZXQ7CgoJbXNnLmFkZHIgPSBjbGllbnQtPmFkZHI7Cgltc2cuZmxhZ3MgPSBjbGllbnQtPmZsYWdzICYgSTJDX01fVEVOOwoJbXNnLmZsYWdzIHw9IEkyQ19NX1JEOwoJbXNnLmxlbiA9IGNvdW50OwoJbXNnLmJ1ZiA9IGJ1ZjsKCglyZXQgPSBpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSk7CgoJLyogSWYgZXZlcnl0aGluZyB3ZW50IG9rIChpLmUuIDEgbXNnIHRyYW5zbWl0dGVkKSwgcmV0dXJuICNieXRlcwoJICAgdHJhbnNtaXR0ZWQsIGVsc2UgZXJyb3IgY29kZS4gKi8KCXJldHVybiAocmV0ID09IDEpID8gY291bnQgOiByZXQ7Cn0KRVhQT1JUX1NZTUJPTChpMmNfbWFzdGVyX3JlY3YpOwoKaW50IGkyY19jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCgl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJaW50IHJldCA9IDA7CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSBjbGllbnQtPmFkYXB0ZXI7CgoJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJpMmMgaW9jdGwsIGNtZDogMHgleCwgYXJnOiAlI2x4XG4iLCBjbWQsIGFyZyk7Cglzd2l0Y2ggKGNtZCkgewoJCWNhc2UgSTJDX1JFVFJJRVM6CgkJCWFkYXAtPnJldHJpZXMgPSBhcmc7CgkJCWJyZWFrOwoJCWNhc2UgSTJDX1RJTUVPVVQ6CgkJCWFkYXAtPnRpbWVvdXQgPSBhcmc7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWlmIChhZGFwLT5hbGdvLT5hbGdvX2NvbnRyb2whPU5VTEwpCgkJCQlyZXQgPSBhZGFwLT5hbGdvLT5hbGdvX2NvbnRyb2woYWRhcCxjbWQsYXJnKTsKCX0KCXJldHVybiByZXQ7Cn0KRVhQT1JUX1NZTUJPTChpMmNfY29udHJvbCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHRoZSBpMmMgYWRkcmVzcyBzY2FubmluZyBmdW5jdGlvbgogKiBXaWxsIG5vdCB3b3JrIGZvciAxMC1iaXQgYWRkcmVzc2VzIQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IGkyY19wcm9iZV9hZGRyZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBraW5kLAoJCQkgICAgIGludCAoKmZvdW5kX3Byb2MpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50LCBpbnQpKQp7CglpbnQgZXJyOwoKCS8qIE1ha2Ugc3VyZSB0aGUgYWRkcmVzcyBpcyB2YWxpZCAqLwoJaWYgKGFkZHIgPCAweDAzIHx8IGFkZHIgPiAweDc3KSB7CgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIkludmFsaWQgcHJvYmUgYWRkcmVzcyAweCUwMnhcbiIsCgkJCSBhZGRyKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiBTa2lwIGlmIGFscmVhZHkgaW4gdXNlICovCglpZiAoaTJjX2NoZWNrX2FkZHIoYWRhcHRlciwgYWRkcikpCgkJcmV0dXJuIDA7CgoJLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyBhdCB0aGlzIGFkZHJlc3MsIHVubGVzcyBmb3JjZWQgKi8KCWlmIChraW5kIDwgMCkgewoJCWlmIChpMmNfc21idXNfeGZlcihhZGFwdGVyLCBhZGRyLCAwLCAwLCAwLAoJCQkJICAgSTJDX1NNQlVTX1FVSUNLLCBOVUxMKSA8IDApCgkJCXJldHVybiAwOwoKCQkvKiBwcmV2ZW50IDI0UkYwOCBjb3JydXB0aW9uICovCgkJaWYgKChhZGRyICYgfjB4MGYpID09IDB4NTApCgkJCWkyY19zbWJ1c194ZmVyKGFkYXB0ZXIsIGFkZHIsIDAsIDAsIDAsCgkJCQkgICAgICAgSTJDX1NNQlVTX1FVSUNLLCBOVUxMKTsKCX0KCgkvKiBGaW5hbGx5IGNhbGwgdGhlIGN1c3RvbSBkZXRlY3Rpb24gZnVuY3Rpb24gKi8KCWVyciA9IGZvdW5kX3Byb2MoYWRhcHRlciwgYWRkciwga2luZCk7CgkvKiAtRU5PREVWIGNhbiBiZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBhIGNoaXAgYXQgdGhlIGdpdmVuIGFkZHJlc3MKCSAgIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwIGRyaXZlci4gV2UgY2F0Y2ggaXQgaGVyZSBhcwoJICAgdGhpcyBpc24ndCBhbiBlcnJvci4gKi8KCWlmIChlcnIgPT0gLUVOT0RFVikKCQllcnIgPSAwOwoKCWlmIChlcnIpCgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIkNsaWVudCBjcmVhdGlvbiBmYWlsZWQgYXQgMHgleCAoJWQpXG4iLAoJCQkgYWRkciwgZXJyKTsKCXJldHVybiBlcnI7Cn0KCmludCBpMmNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAoJICAgICAgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhICphZGRyZXNzX2RhdGEsCgkgICAgICBpbnQgKCpmb3VuZF9wcm9jKSAoc3RydWN0IGkyY19hZGFwdGVyICosIGludCwgaW50KSkKewoJaW50IGksIGVycjsKCWludCBhZGFwX2lkID0gaTJjX2FkYXB0ZXJfaWQoYWRhcHRlcik7CgoJLyogRm9yY2UgZW50cmllcyBhcmUgZG9uZSBmaXJzdCwgYW5kIGFyZSBub3QgYWZmZWN0ZWQgYnkgaWdub3JlCgkgICBlbnRyaWVzICovCglpZiAoYWRkcmVzc19kYXRhLT5mb3JjZXMpIHsKCQl1bnNpZ25lZCBzaG9ydCAqKmZvcmNlcyA9IGFkZHJlc3NfZGF0YS0+Zm9yY2VzOwoJCWludCBraW5kOwoKCQlmb3IgKGtpbmQgPSAwOyBmb3JjZXNba2luZF07IGtpbmQrKykgewoJCQlmb3IgKGkgPSAwOyBmb3JjZXNba2luZF1baV0gIT0gSTJDX0NMSUVOVF9FTkQ7CgkJCSAgICAgaSArPSAyKSB7CgkJCQlpZiAoZm9yY2VzW2tpbmRdW2ldID09IGFkYXBfaWQKCQkJCSB8fCBmb3JjZXNba2luZF1baV0gPT0gQU5ZX0kyQ19CVVMpIHsKCQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBmb3JjZSAiCgkJCQkJCSJwYXJhbWV0ZXIgZm9yIGFkYXB0ZXIgJWQsICIKCQkJCQkJImFkZHIgMHglMDJ4LCBraW5kICVkXG4iLAoJCQkJCQlhZGFwX2lkLCBmb3JjZXNba2luZF1baSArIDFdLAoJCQkJCQlraW5kKTsKCQkJCQllcnIgPSBpMmNfcHJvYmVfYWRkcmVzcyhhZGFwdGVyLAoJCQkJCQlmb3JjZXNba2luZF1baSArIDFdLAoJCQkJCQlraW5kLCBmb3VuZF9wcm9jKTsKCQkJCQlpZiAoZXJyKQoJCQkJCQlyZXR1cm4gZXJyOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qIFN0b3AgaGVyZSBpZiB3ZSBjYW4ndCB1c2UgU01CVVNfUVVJQ0sgKi8KCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfUVVJQ0spKSB7CgkJaWYgKGFkZHJlc3NfZGF0YS0+cHJvYmVbMF0gPT0gSTJDX0NMSUVOVF9FTkQKCQkgJiYgYWRkcmVzc19kYXRhLT5ub3JtYWxfaTJjWzBdID09IEkyQ19DTElFTlRfRU5EKQoJCQlyZXR1cm4gMDsKCgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIlNNQnVzIFF1aWNrIGNvbW1hbmQgbm90IHN1cHBvcnRlZCwgIgoJCQkgImNhbid0IHByb2JlIGZvciBjaGlwc1xuIik7CgkJcmV0dXJuIC0xOwoJfQoKCS8qIFByb2JlIGVudHJpZXMgYXJlIGRvbmUgc2Vjb25kLCBhbmQgYXJlIG5vdCBhZmZlY3RlZCBieSBpZ25vcmUKCSAgIGVudHJpZXMgZWl0aGVyICovCglmb3IgKGkgPSAwOyBhZGRyZXNzX2RhdGEtPnByb2JlW2ldICE9IEkyQ19DTElFTlRfRU5EOyBpICs9IDIpIHsKCQlpZiAoYWRkcmVzc19kYXRhLT5wcm9iZVtpXSA9PSBhZGFwX2lkCgkJIHx8IGFkZHJlc3NfZGF0YS0+cHJvYmVbaV0gPT0gQU5ZX0kyQ19CVVMpIHsKCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmUgcGFyYW1ldGVyIGZvciAiCgkJCQkiYWRhcHRlciAlZCwgYWRkciAweCUwMnhcbiIsIGFkYXBfaWQsCgkJCQlhZGRyZXNzX2RhdGEtPnByb2JlW2kgKyAxXSk7CgkJCWVyciA9IGkyY19wcm9iZV9hZGRyZXNzKGFkYXB0ZXIsCgkJCQkJCWFkZHJlc3NfZGF0YS0+cHJvYmVbaSArIDFdLAoJCQkJCQktMSwgZm91bmRfcHJvYyk7CgkJCWlmIChlcnIpCgkJCQlyZXR1cm4gZXJyOwoJCX0KCX0KCgkvKiBOb3JtYWwgZW50cmllcyBhcmUgZG9uZSBsYXN0LCB1bmxlc3Mgc2hhZG93ZWQgYnkgYW4gaWdub3JlIGVudHJ5ICovCglmb3IgKGkgPSAwOyBhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNbaV0gIT0gSTJDX0NMSUVOVF9FTkQ7IGkgKz0gMSkgewoJCWludCBqLCBpZ25vcmU7CgoJCWlnbm9yZSA9IDA7CgkJZm9yIChqID0gMDsgYWRkcmVzc19kYXRhLT5pZ25vcmVbal0gIT0gSTJDX0NMSUVOVF9FTkQ7CgkJICAgICBqICs9IDIpIHsKCQkJaWYgKChhZGRyZXNzX2RhdGEtPmlnbm9yZVtqXSA9PSBhZGFwX2lkIHx8CgkJCSAgICAgYWRkcmVzc19kYXRhLT5pZ25vcmVbal0gPT0gQU5ZX0kyQ19CVVMpCgkJCSAmJiBhZGRyZXNzX2RhdGEtPmlnbm9yZVtqICsgMV0KCQkJICAgID09IGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSkgewoJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgaWdub3JlICIKCQkJCQkicGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCAiCgkJCQkJImFkZHIgMHglMDJ4XG4iLCBhZGFwX2lkLAoJCQkJCWFkZHJlc3NfZGF0YS0+aWdub3JlW2ogKyAxXSk7CgkJCQlpZ25vcmUgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKGlnbm9yZSkKCQkJY29udGludWU7CgoJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIG5vcm1hbCBlbnRyeSBmb3IgYWRhcHRlciAlZCwgIgoJCQkiYWRkciAweCUwMnhcbiIsIGFkYXBfaWQsCgkJCWFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSk7CgkJZXJyID0gaTJjX3Byb2JlX2FkZHJlc3MoYWRhcHRlciwgYWRkcmVzc19kYXRhLT5ub3JtYWxfaTJjW2ldLAoJCQkJCS0xLCBmb3VuZF9wcm9jKTsKCQlpZiAoZXJyKQoJCQlyZXR1cm4gZXJyOwoJfQoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaTJjX3Byb2JlKTsKCnN0cnVjdCBpMmNfY2xpZW50ICoKaTJjX25ld19wcm9iZWRfZGV2aWNlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKCQkgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8sCgkJICAgICAgdW5zaWduZWQgc2hvcnQgY29uc3QgKmFkZHJfbGlzdCkKewoJaW50IGk7CgoJLyogU3RvcCBoZXJlIGlmIHRoZSBidXMgZG9lc24ndCBzdXBwb3J0IHByb2JpbmcgKi8KCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcCwgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFKSkgewoJCWRldl9lcnIoJmFkYXAtPmRldiwgIlByb2Jpbmcgbm90IHN1cHBvcnRlZFxuIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbXV0ZXhfbG9jaygmYWRhcC0+Y2xpc3RfbG9jayk7Cglmb3IgKGkgPSAwOyBhZGRyX2xpc3RbaV0gIT0gSTJDX0NMSUVOVF9FTkQ7IGkrKykgewoJCS8qIENoZWNrIGFkZHJlc3MgdmFsaWRpdHkgKi8KCQlpZiAoYWRkcl9saXN0W2ldIDwgMHgwMyB8fCBhZGRyX2xpc3RbaV0gPiAweDc3KSB7CgkJCWRldl93YXJuKCZhZGFwLT5kZXYsICJJbnZhbGlkIDctYml0IGFkZHJlc3MgIgoJCQkJICIweCUwMnhcbiIsIGFkZHJfbGlzdFtpXSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLyogQ2hlY2sgYWRkcmVzcyBhdmFpbGFiaWxpdHkgKi8KCQlpZiAoX19pMmNfY2hlY2tfYWRkcihhZGFwLCBhZGRyX2xpc3RbaV0pKSB7CgkJCWRldl9kYmcoJmFkYXAtPmRldiwgIkFkZHJlc3MgMHglMDJ4IGFscmVhZHkgaW4gIgoJCQkJInVzZSwgbm90IHByb2JpbmdcbiIsIGFkZHJfbGlzdFtpXSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLyogVGVzdCBhZGRyZXNzIHJlc3BvbnNpdmVuZXNzCgkJICAgVGhlIGRlZmF1bHQgcHJvYmUgbWV0aG9kIGlzIGEgcXVpY2sgd3JpdGUsIGJ1dCBpdCBpcyBrbm93bgoJCSAgIHRvIGNvcnJ1cHQgdGhlIDI0UkYwOCBFRVBST01zIGR1ZSB0byBhIHN0YXRlIG1hY2hpbmUgYnVnLAoJCSAgIGFuZCBjb3VsZCBhbHNvIGlycmV2ZXJzaWJseSB3cml0ZS1wcm90ZWN0IHNvbWUgRUVQUk9Ncywgc28KCQkgICBmb3IgYWRkcmVzcyByYW5nZXMgMHgzMC0weDM3IGFuZCAweDUwLTB4NWYsIHdlIHVzZSBhIGJ5dGUKCQkgICByZWFkIGluc3RlYWQuIEFsc28sIHNvbWUgYnVzIGRyaXZlcnMgZG9uJ3QgaW1wbGVtZW50CgkJICAgcXVpY2sgd3JpdGUsIHNvIHdlIGZhbGxiYWNrIHRvIGEgYnl0ZSByZWFkIGl0IHRoYXQgY2FzZQoJCSAgIHRvby4gKi8KCQlpZiAoKGFkZHJfbGlzdFtpXSAmIH4weDA3KSA9PSAweDMwCgkJIHx8IChhZGRyX2xpc3RbaV0gJiB+MHgwZikgPT0gMHg1MAoJCSB8fCAhaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcCwgSTJDX0ZVTkNfU01CVVNfUVVJQ0spKSB7CgkJCWlmIChpMmNfc21idXNfeGZlcihhZGFwLCBhZGRyX2xpc3RbaV0sIDAsCgkJCQkJICAgSTJDX1NNQlVTX1JFQUQsIDAsCgkJCQkJICAgSTJDX1NNQlVTX0JZVEUsIE5VTEwpID49IDApCgkJCQlicmVhazsKCQl9IGVsc2UgewoJCQlpZiAoaTJjX3NtYnVzX3hmZXIoYWRhcCwgYWRkcl9saXN0W2ldLCAwLAoJCQkJCSAgIEkyQ19TTUJVU19XUklURSwgMCwKCQkJCQkgICBJMkNfU01CVVNfUVVJQ0ssIE5VTEwpID49IDApCgkJCQlicmVhazsKCQl9Cgl9CgltdXRleF91bmxvY2soJmFkYXAtPmNsaXN0X2xvY2spOwoKCWlmIChhZGRyX2xpc3RbaV0gPT0gSTJDX0NMSUVOVF9FTkQpIHsKCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJQcm9iaW5nIGZhaWxlZCwgbm8gZGV2aWNlIGZvdW5kXG4iKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglpbmZvLT5hZGRyID0gYWRkcl9saXN0W2ldOwoJcmV0dXJuIGkyY19uZXdfZGV2aWNlKGFkYXAsIGluZm8pOwp9CkVYUE9SVF9TWU1CT0xfR1BMKGkyY19uZXdfcHJvYmVkX2RldmljZSk7CgpzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyY19nZXRfYWRhcHRlcihpbnQgaWQpCnsKCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKCgltdXRleF9sb2NrKCZjb3JlX2xpc3RzKTsKCWFkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyICopaWRyX2ZpbmQoJmkyY19hZGFwdGVyX2lkciwgaWQpOwoJaWYgKGFkYXB0ZXIgJiYgIXRyeV9tb2R1bGVfZ2V0KGFkYXB0ZXItPm93bmVyKSkKCQlhZGFwdGVyID0gTlVMTDsKCgltdXRleF91bmxvY2soJmNvcmVfbGlzdHMpOwoJcmV0dXJuIGFkYXB0ZXI7Cn0KRVhQT1JUX1NZTUJPTChpMmNfZ2V0X2FkYXB0ZXIpOwoKdm9pZCBpMmNfcHV0X2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7Cgltb2R1bGVfcHV0KGFkYXAtPm93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGkyY19wdXRfYWRhcHRlcik7CgovKiBUaGUgU01CdXMgcGFydHMgKi8KCiNkZWZpbmUgUE9MWSAgICAoMHgxMDcwVSA8PCAzKQpzdGF0aWMgdTgKY3JjOCh1MTYgZGF0YSkKewoJaW50IGk7CgoJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJaWYgKGRhdGEgJiAweDgwMDApCgkJCWRhdGEgPSBkYXRhIF4gUE9MWTsKCQlkYXRhID0gZGF0YSA8PCAxOwoJfQoJcmV0dXJuICh1OCkoZGF0YSA+PiA4KTsKfQoKLyogSW5jcmVtZW50YWwgQ1JDOCBvdmVyIGNvdW50IGJ5dGVzIGluIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5IHAgKi8Kc3RhdGljIHU4IGkyY19zbWJ1c19wZWModTggY3JjLCB1OCAqcCwgc2l6ZV90IGNvdW50KQp7CglpbnQgaTsKCglmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCWNyYyA9IGNyYzgoKGNyYyBeIHBbaV0pIDw8IDgpOwoJcmV0dXJuIGNyYzsKfQoKLyogQXNzdW1lIGEgNy1iaXQgYWRkcmVzcywgd2hpY2ggaXMgcmVhc29uYWJsZSBmb3IgU01CdXMgKi8Kc3RhdGljIHU4IGkyY19zbWJ1c19tc2dfcGVjKHU4IHBlYywgc3RydWN0IGkyY19tc2cgKm1zZykKewoJLyogVGhlIGFkZHJlc3Mgd2lsbCBiZSBzZW50IGZpcnN0ICovCgl1OCBhZGRyID0gKG1zZy0+YWRkciA8PCAxKSB8ICEhKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCk7CglwZWMgPSBpMmNfc21idXNfcGVjKHBlYywgJmFkZHIsIDEpOwoKCS8qIFRoZSBkYXRhIGJ1ZmZlciBmb2xsb3dzICovCglyZXR1cm4gaTJjX3NtYnVzX3BlYyhwZWMsIG1zZy0+YnVmLCBtc2ctPmxlbik7Cn0KCi8qIFVzZWQgZm9yIHdyaXRlIG9ubHkgdHJhbnNhY3Rpb25zICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpMmNfc21idXNfYWRkX3BlYyhzdHJ1Y3QgaTJjX21zZyAqbXNnKQp7Cgltc2ctPmJ1Zlttc2ctPmxlbl0gPSBpMmNfc21idXNfbXNnX3BlYygwLCBtc2cpOwoJbXNnLT5sZW4rKzsKfQoKLyogUmV0dXJuIDwwIG9uIENSQyBlcnJvcgogICBJZiB0aGVyZSB3YXMgYSB3cml0ZSBiZWZvcmUgdGhpcyByZWFkIChtb3N0IGNhc2VzKSB3ZSBuZWVkIHRvIHRha2UgdGhlCiAgIHBhcnRpYWwgQ1JDIGZyb20gdGhlIHdyaXRlIHBhcnQgaW50byBhY2NvdW50LgogICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG1vZGlmeSB0aGUgbWVzc2FnZSAod2UgbmVlZCB0byBkZWNyZWFzZSB0aGUKICAgbWVzc2FnZSBsZW5ndGggdG8gaGlkZSB0aGUgQ1JDIGJ5dGUgZnJvbSB0aGUgY2FsbGVyKS4gKi8Kc3RhdGljIGludCBpMmNfc21idXNfY2hlY2tfcGVjKHU4IGNwZWMsIHN0cnVjdCBpMmNfbXNnICptc2cpCnsKCXU4IHJwZWMgPSBtc2ctPmJ1ZlstLW1zZy0+bGVuXTsKCWNwZWMgPSBpMmNfc21idXNfbXNnX3BlYyhjcGVjLCBtc2cpOwoKCWlmIChycGVjICE9IGNwZWMpIHsKCQlwcl9kZWJ1ZygiaTJjLWNvcmU6IEJhZCBQRUMgMHglMDJ4IHZzLiAweCUwMnhcbiIsCgkJCXJwZWMsIGNwZWMpOwoJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwp9CgpzMzIgaTJjX3NtYnVzX3dyaXRlX3F1aWNrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHZhbHVlKQp7CglyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAoJICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLDAsSTJDX1NNQlVTX1FVSUNLLE5VTEwpOwp9CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX3F1aWNrKTsKCnMzMiBpMmNfc21idXNfcmVhZF9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CglpZiAoaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAoJICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19SRUFELDAsSTJDX1NNQlVTX0JZVEUsICZkYXRhKSkKCQlyZXR1cm4gLTE7CgllbHNlCgkJcmV0dXJuIGRhdGEuYnl0ZTsKfQpFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c19yZWFkX2J5dGUpOwoKczMyIGkyY19zbWJ1c193cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHZhbHVlKQp7CglyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAoJICAgICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19XUklURSwgdmFsdWUsIEkyQ19TTUJVU19CWVRFLCBOVUxMKTsKfQpFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c193cml0ZV9ieXRlKTsKCnMzMiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCWlmIChpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwgSTJDX1NNQlVTX0JZVEVfREFUQSwmZGF0YSkpCgkJcmV0dXJuIC0xOwoJZWxzZQoJCXJldHVybiBkYXRhLmJ5dGU7Cn0KRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEpOwoKczMyIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwgdTggdmFsdWUpCnsKCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CglkYXRhLmJ5dGUgPSB2YWx1ZTsKCXJldHVybiBpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1dSSVRFLGNvbW1hbmQsCgkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwmZGF0YSk7Cn0KRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKTsKCnMzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCWlmIChpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwgSTJDX1NNQlVTX1dPUkRfREFUQSwgJmRhdGEpKQoJCXJldHVybiAtMTsKCWVsc2UKCQlyZXR1cm4gZGF0YS53b3JkOwp9CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKTsKCnMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCWRhdGEud29yZCA9IHZhbHVlOwoJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV1JJVEUsY29tbWFuZCwKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV09SRF9EQVRBLCZkYXRhKTsKfQpFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEpOwoKLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgKi8KczMyIGkyY19zbWJ1c19yZWFkX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKCQkJICAgICAgdTggKnZhbHVlcykKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCglpZiAoaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLCBjbGllbnQtPmFkZHIsIGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsIGNvbW1hbmQsCgkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX0JMT0NLX0RBVEEsICZkYXRhKSkKCQlyZXR1cm4gLTE7CgoJbWVtY3B5KHZhbHVlcywgJmRhdGEuYmxvY2tbMV0sIGRhdGEuYmxvY2tbMF0pOwoJcmV0dXJuIGRhdGEuYmxvY2tbMF07Cn0KRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKTsKCnMzMiBpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAoJCQkgICAgICAgdTggbGVuZ3RoLCBjb25zdCB1OCAqdmFsdWVzKQp7Cgl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwoKCWlmIChsZW5ndGggPiBJMkNfU01CVVNfQkxPQ0tfTUFYKQoJCWxlbmd0aCA9IEkyQ19TTUJVU19CTE9DS19NQVg7CglkYXRhLmJsb2NrWzBdID0gbGVuZ3RoOwoJbWVtY3B5KCZkYXRhLmJsb2NrWzFdLCB2YWx1ZXMsIGxlbmd0aCk7CglyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAoJCQkgICAgICBJMkNfU01CVVNfV1JJVEUsY29tbWFuZCwKCQkJICAgICAgSTJDX1NNQlVTX0JMT0NLX0RBVEEsJmRhdGEpOwp9CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEpOwoKLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgKi8KczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCgkJCQkgIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCglpZiAobGVuZ3RoID4gSTJDX1NNQlVTX0JMT0NLX01BWCkKCQlsZW5ndGggPSBJMkNfU01CVVNfQkxPQ0tfTUFYOwoJZGF0YS5ibG9ja1swXSA9IGxlbmd0aDsKCWlmIChpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEsJmRhdGEpKQoJCXJldHVybiAtMTsKCgltZW1jcHkodmFsdWVzLCAmZGF0YS5ibG9ja1sxXSwgZGF0YS5ibG9ja1swXSk7CglyZXR1cm4gZGF0YS5ibG9ja1swXTsKfQpFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKTsKCnMzMiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKCQkJCSAgIHU4IGxlbmd0aCwgY29uc3QgdTggKnZhbHVlcykKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCglpZiAobGVuZ3RoID4gSTJDX1NNQlVTX0JMT0NLX01BWCkKCQlsZW5ndGggPSBJMkNfU01CVVNfQkxPQ0tfTUFYOwoJZGF0YS5ibG9ja1swXSA9IGxlbmd0aDsKCW1lbWNweShkYXRhLmJsb2NrICsgMSwgdmFsdWVzLCBsZW5ndGgpOwoJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlciwgY2xpZW50LT5hZGRyLCBjbGllbnQtPmZsYWdzLAoJCQkgICAgICBJMkNfU01CVVNfV1JJVEUsIGNvbW1hbmQsCgkJCSAgICAgIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSwgJmRhdGEpOwp9CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKTsKCi8qIFNpbXVsYXRlIGEgU01CdXMgY29tbWFuZCB1c2luZyB0aGUgaTJjIHByb3RvY29sCiAgIE5vIGNoZWNraW5nIG9mIHBhcmFtZXRlcnMgaXMgZG9uZSEgICovCnN0YXRpYyBzMzIgaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlciwgdTE2IGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCnsKCS8qIFNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBzZXJpZXMgb2YgbXNncy4gSW4gdGhlIGNhc2Ugb2Ygd3JpdGluZywgd2UKCSAgbmVlZCB0byB1c2Ugb25seSBvbmUgbWVzc2FnZTsgd2hlbiByZWFkaW5nLCB3ZSBuZWVkIHR3by4gV2UgaW5pdGlhbGl6ZQoJICBtb3N0IHRoaW5ncyB3aXRoIHNhbmUgZGVmYXVsdHMsIHRvIGtlZXAgdGhlIGNvZGUgYmVsb3cgc29tZXdoYXQKCSAgc2ltcGxlci4gKi8KCXVuc2lnbmVkIGNoYXIgbXNnYnVmMFtJMkNfU01CVVNfQkxPQ0tfTUFYKzNdOwoJdW5zaWduZWQgY2hhciBtc2didWYxW0kyQ19TTUJVU19CTE9DS19NQVgrMl07CglpbnQgbnVtID0gcmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRD8yOjE7CglzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7IHsgYWRkciwgZmxhZ3MsIDEsIG1zZ2J1ZjAgfSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhZGRyLCBmbGFncyB8IEkyQ19NX1JELCAwLCBtc2didWYxIH0KCSAgICAgICAgICAgICAgICAgICAgICAgIH07CglpbnQgaTsKCXU4IHBhcnRpYWxfcGVjID0gMDsKCgltc2didWYwWzBdID0gY29tbWFuZDsKCXN3aXRjaChzaXplKSB7CgljYXNlIEkyQ19TTUJVU19RVUlDSzoKCQltc2dbMF0ubGVuID0gMDsKCQkvKiBTcGVjaWFsIGNhc2U6IFRoZSByZWFkL3dyaXRlIGZpZWxkIGlzIHVzZWQgYXMgZGF0YSAqLwoJCW1zZ1swXS5mbGFncyA9IGZsYWdzIHwgKHJlYWRfd3JpdGU9PUkyQ19TTUJVU19SRUFEKT9JMkNfTV9SRDowOwoJCW51bSA9IDE7CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19CWVRFOgoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CgkJCS8qIFNwZWNpYWwgY2FzZTogb25seSBhIHJlYWQhICovCgkJCW1zZ1swXS5mbGFncyA9IEkyQ19NX1JEIHwgZmxhZ3M7CgkJCW51bSA9IDE7CgkJfQoJCWJyZWFrOwoJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKQoJCQltc2dbMV0ubGVuID0gMTsKCQllbHNlIHsKCQkJbXNnWzBdLmxlbiA9IDI7CgkJCW1zZ2J1ZjBbMV0gPSBkYXRhLT5ieXRlOwoJCX0KCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKCQkJbXNnWzFdLmxlbiA9IDI7CgkJZWxzZSB7CgkJCW1zZ1swXS5sZW49MzsKCQkJbXNnYnVmMFsxXSA9IGRhdGEtPndvcmQgJiAweGZmOwoJCQltc2didWYwWzJdID0gZGF0YS0+d29yZCA+PiA4OwoJCX0KCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKCQludW0gPSAyOyAvKiBTcGVjaWFsIGNhc2UgKi8KCQlyZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7CgkJbXNnWzBdLmxlbiA9IDM7CgkJbXNnWzFdLmxlbiA9IDI7CgkJbXNnYnVmMFsxXSA9IGRhdGEtPndvcmQgJiAweGZmOwoJCW1zZ2J1ZjBbMl0gPSBkYXRhLT53b3JkID4+IDg7CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CgkJCW1zZ1sxXS5mbGFncyB8PSBJMkNfTV9SRUNWX0xFTjsKCQkJbXNnWzFdLmxlbiA9IDE7IC8qIGJsb2NrIGxlbmd0aCB3aWxsIGJlIGFkZGVkIGJ5CgkJCQkJICAgdGhlIHVuZGVybHlpbmcgYnVzIGRyaXZlciAqLwoJCX0gZWxzZSB7CgkJCW1zZ1swXS5sZW4gPSBkYXRhLT5ibG9ja1swXSArIDI7CgkJCWlmIChtc2dbMF0ubGVuID4gSTJDX1NNQlVTX0JMT0NLX01BWCArIDIpIHsKCQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInNtYnVzX2FjY2VzcyBjYWxsZWQgd2l0aCAiCgkJCQkgICAgICAgImludmFsaWQgYmxvY2sgd3JpdGUgc2l6ZSAoJWQpXG4iLAoJCQkJICAgICAgIGRhdGEtPmJsb2NrWzBdKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlmb3IgKGkgPSAxOyBpIDwgbXNnWzBdLmxlbjsgaSsrKQoJCQkJbXNnYnVmMFtpXSA9IGRhdGEtPmJsb2NrW2ktMV07CgkJfQoJCWJyZWFrOwoJY2FzZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMOgoJCW51bSA9IDI7IC8qIEFub3RoZXIgc3BlY2lhbCBjYXNlICovCgkJcmVhZF93cml0ZSA9IEkyQ19TTUJVU19SRUFEOwoJCWlmIChkYXRhLT5ibG9ja1swXSA+IEkyQ19TTUJVU19CTE9DS19NQVgpIHsKCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiJXMgY2FsbGVkIHdpdGggaW52YWxpZCAiCgkJCQkiYmxvY2sgcHJvYyBjYWxsIHNpemUgKCVkKVxuIiwgX19GVU5DVElPTl9fLAoJCQkJZGF0YS0+YmxvY2tbMF0pOwoJCQlyZXR1cm4gLTE7CgkJfQoJCW1zZ1swXS5sZW4gPSBkYXRhLT5ibG9ja1swXSArIDI7CgkJZm9yIChpID0gMTsgaSA8IG1zZ1swXS5sZW47IGkrKykKCQkJbXNnYnVmMFtpXSA9IGRhdGEtPmJsb2NrW2ktMV07CgkJbXNnWzFdLmZsYWdzIHw9IEkyQ19NX1JFQ1ZfTEVOOwoJCW1zZ1sxXS5sZW4gPSAxOyAvKiBibG9jayBsZW5ndGggd2lsbCBiZSBhZGRlZCBieQoJCQkJICAgdGhlIHVuZGVybHlpbmcgYnVzIGRyaXZlciAqLwoJCWJyZWFrOwoJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CgkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKCQkJbXNnWzFdLmxlbiA9IGRhdGEtPmJsb2NrWzBdOwoJCX0gZWxzZSB7CgkJCW1zZ1swXS5sZW4gPSBkYXRhLT5ibG9ja1swXSArIDE7CgkJCWlmIChtc2dbMF0ubGVuID4gSTJDX1NNQlVTX0JMT0NLX01BWCArIDEpIHsKCQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImkyY19zbWJ1c194ZmVyX2VtdWxhdGVkIGNhbGxlZCB3aXRoICIKCQkJCSAgICAgICAiaW52YWxpZCBibG9jayB3cml0ZSBzaXplICglZClcbiIsCgkJCQkgICAgICAgZGF0YS0+YmxvY2tbMF0pOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCWZvciAoaSA9IDE7IGkgPD0gZGF0YS0+YmxvY2tbMF07IGkrKykKCQkJCW1zZ2J1ZjBbaV0gPSBkYXRhLT5ibG9ja1tpXTsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInNtYnVzX2FjY2VzcyBjYWxsZWQgd2l0aCBpbnZhbGlkIHNpemUgKCVkKVxuIiwKCQkgICAgICAgc2l6ZSk7CgkJcmV0dXJuIC0xOwoJfQoKCWkgPSAoKGZsYWdzICYgSTJDX0NMSUVOVF9QRUMpICYmIHNpemUgIT0gSTJDX1NNQlVTX1FVSUNLCgkJCQkgICAgICAmJiBzaXplICE9IEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSk7CglpZiAoaSkgewoJCS8qIENvbXB1dGUgUEVDIGlmIGZpcnN0IG1lc3NhZ2UgaXMgYSB3cml0ZSAqLwoJCWlmICghKG1zZ1swXS5mbGFncyAmIEkyQ19NX1JEKSkgewoJCQlpZiAobnVtID09IDEpIC8qIFdyaXRlIG9ubHkgKi8KCQkJCWkyY19zbWJ1c19hZGRfcGVjKCZtc2dbMF0pOwoJCQllbHNlIC8qIFdyaXRlIGZvbGxvd2VkIGJ5IHJlYWQgKi8KCQkJCXBhcnRpYWxfcGVjID0gaTJjX3NtYnVzX21zZ19wZWMoMCwgJm1zZ1swXSk7CgkJfQoJCS8qIEFzayBmb3IgUEVDIGlmIGxhc3QgbWVzc2FnZSBpcyBhIHJlYWQgKi8KCQlpZiAobXNnW251bS0xXS5mbGFncyAmIEkyQ19NX1JEKQoJCQltc2dbbnVtLTFdLmxlbisrOwoJfQoKCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNnLCBudW0pIDwgMCkKCQlyZXR1cm4gLTE7CgoJLyogQ2hlY2sgUEVDIGlmIGxhc3QgbWVzc2FnZSBpcyBhIHJlYWQgKi8KCWlmIChpICYmIChtc2dbbnVtLTFdLmZsYWdzICYgSTJDX01fUkQpKSB7CgkJaWYgKGkyY19zbWJ1c19jaGVja19wZWMocGFydGlhbF9wZWMsICZtc2dbbnVtLTFdKSA8IDApCgkJCXJldHVybiAtMTsKCX0KCglpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKCQlzd2l0Y2goc2l6ZSkgewoJCQljYXNlIEkyQ19TTUJVU19CWVRFOgoJCQkJZGF0YS0+Ynl0ZSA9IG1zZ2J1ZjBbMF07CgkJCQlicmVhazsKCQkJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgoJCQkJZGF0YS0+Ynl0ZSA9IG1zZ2J1ZjFbMF07CgkJCQlicmVhazsKCQkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgoJCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CgkJCQlkYXRhLT53b3JkID0gbXNnYnVmMVswXSB8IChtc2didWYxWzFdIDw8IDgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgoJCQkJZm9yIChpID0gMDsgaSA8IGRhdGEtPmJsb2NrWzBdOyBpKyspCgkJCQkJZGF0YS0+YmxvY2tbaSsxXSA9IG1zZ2J1ZjFbaV07CgkJCQlicmVhazsKCQkJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKCQkJY2FzZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMOgoJCQkJZm9yIChpID0gMDsgaSA8IG1zZ2J1ZjFbMF0gKyAxOyBpKyspCgkJCQkJZGF0YS0+YmxvY2tbaV0gPSBtc2didWYxW2ldOwoJCQkJYnJlYWs7CgkJfQoJcmV0dXJuIDA7Cn0KCgpzMzIgaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlciwgdTE2IGFkZHIsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogICAgICAgICAgICAgICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKewoJczMyIHJlczsKCglmbGFncyAmPSBJMkNfTV9URU4gfCBJMkNfQ0xJRU5UX1BFQzsKCglpZiAoYWRhcHRlci0+YWxnby0+c21idXNfeGZlcikgewoJCW11dGV4X2xvY2soJmFkYXB0ZXItPmJ1c19sb2NrKTsKCQlyZXMgPSBhZGFwdGVyLT5hbGdvLT5zbWJ1c194ZmVyKGFkYXB0ZXIsYWRkcixmbGFncyxyZWFkX3dyaXRlLAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCxzaXplLGRhdGEpOwoJCW11dGV4X3VubG9jaygmYWRhcHRlci0+YnVzX2xvY2spOwoJfSBlbHNlCgkJcmVzID0gaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQoYWRhcHRlcixhZGRyLGZsYWdzLHJlYWRfd3JpdGUsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsc2l6ZSxkYXRhKTsKCglyZXR1cm4gcmVzOwp9CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3hmZXIpOwoKTU9EVUxFX0FVVEhPUigiU2ltb24gRy4gVm9nbCA8c2ltb25AdGsudW5pLWxpbnouYWMuYXQ+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBtYWluIG1vZHVsZSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==