ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggMTAwNDE4MS4uZGUwNGNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTU4Miw2ICs1ODIsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1vY3Rlb24uCiAKK2NvbmZpZyBJMkNfWElMSU5YCisJdHJpc3RhdGUgIlhpbGlueCBJMkMgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBIQVNfSU9NRU0KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgIFhpbGlueCBJMkMgY29udHJvbGxlci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgeGlsaW54X2kyYy4KKwogY29tbWVudCAiRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycyIKIAogY29uZmlnIEkyQ19QQVJQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKaW5kZXggNTlhYmNmNC4uMDk3MjM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtNTYsNiArNTYsNyBAQAogb2JqLSQoQ09ORklHX0kyQ19TVFUzMDApCSs9IGkyYy1zdHUzMDAubwogb2JqLSQoQ09ORklHX0kyQ19WRVJTQVRJTEUpCSs9IGkyYy12ZXJzYXRpbGUubwogb2JqLSQoQ09ORklHX0kyQ19PQ1RFT04pCSs9IGkyYy1vY3Rlb24ubworb2JqLSQoQ09ORklHX0kyQ19YSUxJTlgpCSs9IGkyYy14aWljLm8KIAogIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCiBvYmotJChDT05GSUdfSTJDX1BBUlBPUlQpCSs9IGkyYy1wYXJwb3J0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGlpYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14aWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjZTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGlpYy5jCkBAIC0wLDAgKzEsODI0IEBACisvKgorICogaTJjLXhpaWMuYworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgWGlsaW54IEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIFRoaXMgY29kZSB3YXMgaW1wbGVtZW50ZWQgYnkgTW9jZWFuIExhYm9yYXRvcmllcyBBQiB3aGVuIHBvcnRpbmcgbGludXgKKyAqIHRvIHRoZSBhdXRvbW90aXZlIGRldmVsb3BtZW50IGJvYXJkIFJ1c3NlbGx2aWxsZS4gVGhlIGNvcHlyaWdodCBob2xkZXIKKyAqIGFzIHNlZW4gaW4gdGhlIGhlYWRlciBpcyBJbnRlbCBjb3Jwb3JhdGlvbi4KKyAqIE1vY2VhbiBMYWJvcmF0b3JpZXMgZm9ya2VkIG9mZiB0aGUgR05VL0xpbnV4IHBsYXRmb3JtIHdvcmsgaW50byBhCisgKiBzZXBhcmF0ZSBjb21wYW55IGNhbGxlZCBQZWxhZ2ljb3JlIEFCLCB3aGljaCBjb21taXRlZCB0aGUgY29kZSB0byB0aGUKKyAqIGtlcm5lbC4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIFhpbGlueCBJSUMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMteGlpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgInhpaWMtaTJjIgorCitlbnVtIHhpbGlueF9pMmNfc3RhdGUgeworCVNUQVRFX0RPTkUsCisJU1RBVEVfRVJST1IsCisJU1RBVEVfU1RBUlQKK307CisKKy8qKgorICogc3RydWN0IHhpaWNfaTJjIC0gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhJSUMgSTJDIGJ1cworICogQGJhc2U6CU1lbW9yeSBiYXNlIG9mIHRoZSBIVyByZWdpc3RlcnMKKyAqIEB3YWl0OglXYWl0IHF1ZXVlIGZvciBjYWxsZXJzCisgKiBAYWRhcDoJS2VybmVsIGFkYXB0ZXIgcmVwcmVzZW50YXRpb24KKyAqIEB0eF9tc2c6CU1lc3NhZ2VzIGZyb20gYWJvdmUgdG8gYmUgc2VudAorICogQGxvY2s6CU11dHVhbCBleGNsdXNpb24KKyAqIEB0eF9wb3M6CUN1cnJlbnQgcG9zIGluIFRYIG1lc3NhZ2UKKyAqIEBubXNnczoJTnVtYmVyIG9mIG1lc3NhZ2VzIGluIHR4X21zZworICogQHN0YXRlOglTZWUgU1RBVEVfCisgKiBAcnhfbXNnOglDdXJyZW50IFJYIG1lc3NhZ2UKKyAqIEByeF9wb3M6CVBvc2l0aW9uIHdpdGhpbiBjdXJyZW50IFJYIG1lc3NhZ2UKKyAqLworc3RydWN0IHhpaWNfaTJjIHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CisJc3RydWN0IGkyY19hZGFwdGVyCWFkYXA7CisJc3RydWN0IGkyY19tc2cJCSp0eF9tc2c7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1bnNpZ25lZCBpbnQgCQl0eF9wb3M7CisJdW5zaWduZWQgaW50CQlubXNnczsKKwllbnVtIHhpbGlueF9pMmNfc3RhdGUJc3RhdGU7CisJc3RydWN0IGkyY19tc2cJCSpyeF9tc2c7CisJaW50CQkJcnhfcG9zOworfTsKKworCisjZGVmaW5lIFhJSUNfTVNCX09GRlNFVCAwCisjZGVmaW5lIFhJSUNfUkVHX09GRlNFVCAoMHgxMDArWElJQ19NU0JfT0ZGU0VUKQorCisvKgorICogUmVnaXN0ZXIgb2Zmc2V0cyBpbiBieXRlcyBmcm9tIFJlZ2lzdGVyQmFzZS4gVGhyZWUgaXMgYWRkZWQgdG8gdGhlCisgKiBiYXNlIG9mZnNldCB0byBhY2Nlc3MgTFNCIChJQk0gc3R5bGUpIG9mIHRoZSB3b3JkCisgKi8KKyNkZWZpbmUgWElJQ19DUl9SRUdfT0ZGU0VUICAgKDB4MDArWElJQ19SRUdfT0ZGU0VUKQkvKiBDb250cm9sIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgWElJQ19TUl9SRUdfT0ZGU0VUICAgKDB4MDQrWElJQ19SRUdfT0ZGU0VUKQkvKiBTdGF0dXMgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgWElJQ19EVFJfUkVHX09GRlNFVCAgKDB4MDgrWElJQ19SRUdfT0ZGU0VUKQkvKiBEYXRhIFR4IFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgWElJQ19EUlJfUkVHX09GRlNFVCAgKDB4MEMrWElJQ19SRUdfT0ZGU0VUKQkvKiBEYXRhIFJ4IFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgWElJQ19BRFJfUkVHX09GRlNFVCAgKDB4MTArWElJQ19SRUdfT0ZGU0VUKQkvKiBBZGRyZXNzIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgWElJQ19URk9fUkVHX09GRlNFVCAgKDB4MTQrWElJQ19SRUdfT0ZGU0VUKQkvKiBUeCBGSUZPIE9jY3VwYW5jeSAgKi8KKyNkZWZpbmUgWElJQ19SRk9fUkVHX09GRlNFVCAgKDB4MTgrWElJQ19SRUdfT0ZGU0VUKQkvKiBSeCBGSUZPIE9jY3VwYW5jeSAgKi8KKyNkZWZpbmUgWElJQ19UQkFfUkVHX09GRlNFVCAgKDB4MUMrWElJQ19SRUdfT0ZGU0VUKQkvKiAxMCBCaXQgQWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgWElJQ19SRkRfUkVHX09GRlNFVCAgKDB4MjArWElJQ19SRUdfT0ZGU0VUKQkvKiBSeCBGSUZPIERlcHRoIHJlZyAgKi8KKyNkZWZpbmUgWElJQ19HUE9fUkVHX09GRlNFVCAgKDB4MjQrWElJQ19SRUdfT0ZGU0VUKQkvKiBPdXRwdXQgUmVnaXN0ZXIgICAgKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBtYXNrcyAqLworI2RlZmluZSBYSUlDX0NSX0VOQUJMRV9ERVZJQ0VfTUFTSyAgICAgICAgMHgwMQkvKiBEZXZpY2UgZW5hYmxlID0gMSAgICAgICovCisjZGVmaW5lIFhJSUNfQ1JfVFhfRklGT19SRVNFVF9NQVNLICAgICAgICAweDAyCS8qIFRyYW5zbWl0IEZJRk8gcmVzZXQ9MSAgKi8KKyNkZWZpbmUgWElJQ19DUl9NU01TX01BU0sgICAgICAgICAgICAgICAgIDB4MDQJLyogTWFzdGVyIHN0YXJ0cyBUeGluZz0xICAqLworI2RlZmluZSBYSUlDX0NSX0RJUl9JU19UWF9NQVNLICAgICAgICAgICAgMHgwOAkvKiBEaXIgb2YgdHguIFR4aW5nPTEgICAgICovCisjZGVmaW5lIFhJSUNfQ1JfTk9fQUNLX01BU0sgICAgICAgICAgICAgICAweDEwCS8qIFR4IEFjay4gTk8gYWNrID0gMSAgICAgKi8KKyNkZWZpbmUgWElJQ19DUl9SRVBFQVRFRF9TVEFSVF9NQVNLICAgICAgIDB4MjAJLyogUmVwZWF0ZWQgc3RhcnQgPSAxICAgICAqLworI2RlZmluZSBYSUlDX0NSX0dFTkVSQUxfQ0FMTF9NQVNLICAgICAgICAgMHg0MAkvKiBHZW4gQ2FsbCBlbmFibGVkID0gMSAgICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciBtYXNrcyAqLworI2RlZmluZSBYSUlDX1NSX0dFTl9DQUxMX01BU0sgICAgICAgICAgICAgMHgwMQkvKiAxPWEgbXN0ciBpc3N1ZWQgYSBHQyAgICovCisjZGVmaW5lIFhJSUNfU1JfQUREUl9BU19TTEFWRV9NQVNLICAgICAgICAweDAyCS8qIDE9d2hlbiBhZGRyIGFzIHNsYXZlICAgKi8KKyNkZWZpbmUgWElJQ19TUl9CVVNfQlVTWV9NQVNLICAgICAgICAgICAgIDB4MDQJLyogMSA9IGJ1cyBpcyBidXN5ICAgICAgICAqLworI2RlZmluZSBYSUlDX1NSX01TVFJfUkRJTkdfU0xBVkVfTUFTSyAgICAgMHgwOAkvKiAxPURpcjogbXN0ciA8LS0gc2xhdmUgICovCisjZGVmaW5lIFhJSUNfU1JfVFhfRklGT19GVUxMX01BU0sgICAgICAgICAweDEwCS8qIDEgPSBUeCBGSUZPIGZ1bGwgICAgICAgKi8KKyNkZWZpbmUgWElJQ19TUl9SWF9GSUZPX0ZVTExfTUFTSyAgICAgICAgIDB4MjAJLyogMSA9IFJ4IEZJRk8gZnVsbCAgICAgICAqLworI2RlZmluZSBYSUlDX1NSX1JYX0ZJRk9fRU1QVFlfTUFTSyAgICAgICAgMHg0MAkvKiAxID0gUnggRklGTyBlbXB0eSAgICAgICovCisjZGVmaW5lIFhJSUNfU1JfVFhfRklGT19FTVBUWV9NQVNLICAgICAgICAweDgwCS8qIDEgPSBUeCBGSUZPIGVtcHR5ICAgICAgKi8KKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBtYXNrcyAgICBJbnRlcnJ1cHQgb2NjdXJzIHdoZW4uLi4gICAgICAgKi8KKyNkZWZpbmUgWElJQ19JTlRSX0FSQl9MT1NUX01BU0sgICAgICAgICAgIDB4MDEJLyogMSA9IGFyYml0cmF0aW9uIGxvc3QgICAqLworI2RlZmluZSBYSUlDX0lOVFJfVFhfRVJST1JfTUFTSyAgICAgICAgICAgMHgwMgkvKiAxPVR4IGVycm9yL21zZyBjb21wbGV0ZSAqLworI2RlZmluZSBYSUlDX0lOVFJfVFhfRU1QVFlfTUFTSyAgICAgICAgICAgMHgwNAkvKiAxID0gVHggRklGTy9yZWcgZW1wdHkgICovCisjZGVmaW5lIFhJSUNfSU5UUl9SWF9GVUxMX01BU0sgICAgICAgICAgICAweDA4CS8qIDE9UnggRklGTy9yZWc9T0NZIGxldmVsICovCisjZGVmaW5lIFhJSUNfSU5UUl9CTkJfTUFTSyAgICAgICAgICAgICAgICAweDEwCS8qIDEgPSBCdXMgbm90IGJ1c3kgICAgICAgKi8KKyNkZWZpbmUgWElJQ19JTlRSX0FBU19NQVNLICAgICAgICAgICAgICAgIDB4MjAJLyogMSA9IHdoZW4gYWRkciBhcyBzbGF2ZSAqLworI2RlZmluZSBYSUlDX0lOVFJfTkFBU19NQVNLICAgICAgICAgICAgICAgMHg0MAkvKiAxID0gbm90IGFkZHIgYXMgc2xhdmUgICovCisjZGVmaW5lIFhJSUNfSU5UUl9UWF9IQUxGX01BU0sgICAgICAgICAgICAweDgwCS8qIDEgPSBUWCBGSUZPIGhhbGYgZW1wdHkgKi8KKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc3BlY2lmeSB0aGUgZGVwdGggb2YgdGhlIEZJRk9zICovCisjZGVmaW5lIElJQ19SWF9GSUZPX0RFUFRIICAgICAgICAgMTYJLyogUnggZmlmbyBjYXBhY2l0eSAgICAgICAgICAgICAgICovCisjZGVmaW5lIElJQ19UWF9GSUZPX0RFUFRIICAgICAgICAgMTYJLyogVHggZmlmbyBjYXBhY2l0eSAgICAgICAgICAgICAgICovCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNwZWNpZnkgZ3JvdXBzIG9mIGludGVycnVwdHMgdGhhdCBhcmUgdHlwaWNhbGx5CisgKiBlbmFibGVkIG9yIGRpc2FibGVzIGF0IHRoZSBzYW1lIHRpbWUKKyAqLworI2RlZmluZSBYSUlDX1RYX0lOVEVSUlVQVFMgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoWElJQ19JTlRSX1RYX0VSUk9SX01BU0sgfCBYSUlDX0lOVFJfVFhfRU1QVFlfTUFTSyB8IFhJSUNfSU5UUl9UWF9IQUxGX01BU0spCisKKyNkZWZpbmUgWElJQ19UWF9SWF9JTlRFUlJVUFRTIChYSUlDX0lOVFJfUlhfRlVMTF9NQVNLIHwgWElJQ19UWF9JTlRFUlJVUFRTKQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIHNwZWNpZnkgdGhlCisgKiBvcGVyYXRpb24sIGEgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgWElJQ19SRUFEX09QRVJBVElPTiAgMQorI2RlZmluZSBYSUlDX1dSSVRFX09QRVJBVElPTiAwCisKKy8qCisgKiBUeCBGaWZvIHVwcGVyIGJpdCBtYXNrcy4KKyAqLworI2RlZmluZSBYSUlDX1RYX0RZTl9TVEFSVF9NQVNLICAgICAgICAgICAgMHgwMTAwIC8qIDEgPSBTZXQgZHluYW1pYyBzdGFydCAqLworI2RlZmluZSBYSUlDX1RYX0RZTl9TVE9QX01BU0sgICAgICAgICAgICAgMHgwMjAwIC8qIDEgPSBTZXQgZHluYW1pYyBzdG9wICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmUgdGhlIHJlZ2lzdGVyIG9mZnNldHMgZm9yIHRoZSBJbnRlcnJ1cHQKKyAqIHJlZ2lzdGVycy4gVGhlcmUgYXJlIHNvbWUgaG9sZXMgaW4gdGhlIG1lbW9yeSBtYXAgZm9yIHJlc2VydmVkIGFkZHJlc3NlcworICogdG8gYWxsb3cgb3RoZXIgcmVnaXN0ZXJzIHRvIGJlIGFkZGVkIGFuZCBzdGlsbCBtYXRjaCB0aGUgbWVtb3J5IG1hcCBvZiB0aGUKKyAqIGludGVycnVwdCBjb250cm9sbGVyIHJlZ2lzdGVycworICovCisjZGVmaW5lIFhJSUNfREdJRVJfT0ZGU0VUICAgIDB4MUMgLyogRGV2aWNlIEdsb2JhbCBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFhJSUNfSUlTUl9PRkZTRVQgICAgIDB4MjAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBYSUlDX0lJRVJfT0ZGU0VUICAgICAweDI4IC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElJQ19SRVNFVFJfT0ZGU0VUICAgMHg0MCAvKiBSZXNldCBSZWdpc3RlciAqLworCisjZGVmaW5lIFhJSUNfUkVTRVRfTUFTSyAgICAgICAgICAgICAweEFVTAorCisvKgorICogVGhlIGZvbGxvd2luZyBjb25zdGFudCBpcyB1c2VkIGZvciB0aGUgZGV2aWNlIGdsb2JhbCBpbnRlcnJ1cHQgZW5hYmxlCisgKiByZWdpc3RlciwgdG8gZW5hYmxlIGFsbCBpbnRlcnJ1cHRzIGZvciB0aGUgZGV2aWNlLCB0aGlzIGlzIHRoZSBvbmx5IGJpdAorICogaW4gdGhlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgWElJQ19HSU5UUl9FTkFCTEVfTUFTSyAgICAgIDB4ODAwMDAwMDBVTAorCisjZGVmaW5lIHhpaWNfdHhfc3BhY2UoaTJjKSAoKGkyYyktPnR4X21zZy0+bGVuIC0gKGkyYyktPnR4X3BvcykKKyNkZWZpbmUgeGlpY19yeF9zcGFjZShpMmMpICgoaTJjKS0+cnhfbXNnLT5sZW4gLSAoaTJjKS0+cnhfcG9zKQorCitzdGF0aWMgdm9pZCB4aWljX3N0YXJ0X3hmZXIoc3RydWN0IHhpaWNfaTJjICppMmMpOworc3RhdGljIHZvaWQgX194aWljX3N0YXJ0X3hmZXIoc3RydWN0IHhpaWNfaTJjICppMmMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgeGlpY19zZXRyZWc4KHN0cnVjdCB4aWljX2kyYyAqaTJjLCBpbnQgcmVnLCB1OCB2YWx1ZSkKK3sKKwlpb3dyaXRlOCh2YWx1ZSwgaTJjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1OCB4aWljX2dldHJlZzgoc3RydWN0IHhpaWNfaTJjICppMmMsIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDgoaTJjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhpaWNfc2V0cmVnMTYoc3RydWN0IHhpaWNfaTJjICppMmMsIGludCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlpb3dyaXRlMTYodmFsdWUsIGkyYy0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4aWljX3NldHJlZzMyKHN0cnVjdCB4aWljX2kyYyAqaTJjLCBpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisJaW93cml0ZTMyKHZhbHVlLCBpMmMtPmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCB4aWljX2dldHJlZzMyKHN0cnVjdCB4aWljX2kyYyAqaTJjLCBpbnQgcmVnKQoreworCXJldHVybiBpb3JlYWQzMihpMmMtPmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGlpY19pcnFfZGlzKHN0cnVjdCB4aWljX2kyYyAqaTJjLCB1MzIgbWFzaykKK3sKKwl1MzIgaWVyID0geGlpY19nZXRyZWczMihpMmMsIFhJSUNfSUlFUl9PRkZTRVQpOworCXhpaWNfc2V0cmVnMzIoaTJjLCBYSUlDX0lJRVJfT0ZGU0VULCBpZXIgJiB+bWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4aWljX2lycV9lbihzdHJ1Y3QgeGlpY19pMmMgKmkyYywgdTMyIG1hc2spCit7CisJdTMyIGllciA9IHhpaWNfZ2V0cmVnMzIoaTJjLCBYSUlDX0lJRVJfT0ZGU0VUKTsKKwl4aWljX3NldHJlZzMyKGkyYywgWElJQ19JSUVSX09GRlNFVCwgaWVyIHwgbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4aWljX2lycV9jbHIoc3RydWN0IHhpaWNfaTJjICppMmMsIHUzMiBtYXNrKQoreworCXUzMiBpc3IgPSB4aWljX2dldHJlZzMyKGkyYywgWElJQ19JSVNSX09GRlNFVCk7CisJeGlpY19zZXRyZWczMihpMmMsIFhJSUNfSUlTUl9PRkZTRVQsIGlzciAmIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGlpY19pcnFfY2xyX2VuKHN0cnVjdCB4aWljX2kyYyAqaTJjLCB1MzIgbWFzaykKK3sKKwl4aWljX2lycV9jbHIoaTJjLCBtYXNrKTsKKwl4aWljX2lycV9lbihpMmMsIG1hc2spOworfQorCitzdGF0aWMgdm9pZCB4aWljX2NsZWFyX3J4X2ZpZm8oc3RydWN0IHhpaWNfaTJjICppMmMpCit7CisJdTggc3I7CisJZm9yIChzciA9IHhpaWNfZ2V0cmVnOChpMmMsIFhJSUNfU1JfUkVHX09GRlNFVCk7CisJCSEoc3IgJiBYSUlDX1NSX1JYX0ZJRk9fRU1QVFlfTUFTSyk7CisJCXNyID0geGlpY19nZXRyZWc4KGkyYywgWElJQ19TUl9SRUdfT0ZGU0VUKSkKKwkJeGlpY19nZXRyZWc4KGkyYywgWElJQ19EUlJfUkVHX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIHhpaWNfcmVpbml0KHN0cnVjdCB4aWljX2kyYyAqaTJjKQoreworCXhpaWNfc2V0cmVnMzIoaTJjLCBYSUlDX1JFU0VUUl9PRkZTRVQsIFhJSUNfUkVTRVRfTUFTSyk7CisKKwkvKiBTZXQgcmVjZWl2ZSBGaWZvIGRlcHRoIHRvIG1heGltdW0gKHplcm8gYmFzZWQpLiAqLworCXhpaWNfc2V0cmVnOChpMmMsIFhJSUNfUkZEX1JFR19PRkZTRVQsIElJQ19SWF9GSUZPX0RFUFRIIC0gMSk7CisKKwkvKiBSZXNldCBUeCBGaWZvLiAqLworCXhpaWNfc2V0cmVnOChpMmMsIFhJSUNfQ1JfUkVHX09GRlNFVCwgWElJQ19DUl9UWF9GSUZPX1JFU0VUX01BU0spOworCisJLyogRW5hYmxlIElJQyBEZXZpY2UsIHJlbW92ZSBUeCBGaWZvIHJlc2V0ICYgZGlzYWJsZSBnZW5lcmFsIGNhbGwuICovCisJeGlpY19zZXRyZWc4KGkyYywgWElJQ19DUl9SRUdfT0ZGU0VULCBYSUlDX0NSX0VOQUJMRV9ERVZJQ0VfTUFTSyk7CisKKwkvKiBtYWtlIHN1cmUgUlggZmlmbyBpcyBlbXB0eSAqLworCXhpaWNfY2xlYXJfcnhfZmlmbyhpMmMpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwl4aWljX3NldHJlZzMyKGkyYywgWElJQ19ER0lFUl9PRkZTRVQsIFhJSUNfR0lOVFJfRU5BQkxFX01BU0spOworCisJeGlpY19pcnFfY2xyX2VuKGkyYywgWElJQ19JTlRSX0FBU19NQVNLIHwgWElJQ19JTlRSX0FSQl9MT1NUX01BU0spOworfQorCitzdGF0aWMgdm9pZCB4aWljX2RlaW5pdChzdHJ1Y3QgeGlpY19pMmMgKmkyYykKK3sKKwl1OCBjcjsKKworCXhpaWNfc2V0cmVnMzIoaTJjLCBYSUlDX1JFU0VUUl9PRkZTRVQsIFhJSUNfUkVTRVRfTUFTSyk7CisKKwkvKiBEaXNhYmxlIElJQyBEZXZpY2UuICovCisJY3IgPSB4aWljX2dldHJlZzgoaTJjLCBYSUlDX0NSX1JFR19PRkZTRVQpOworCXhpaWNfc2V0cmVnOChpMmMsIFhJSUNfQ1JfUkVHX09GRlNFVCwgY3IgJiB+WElJQ19DUl9FTkFCTEVfREVWSUNFX01BU0spOworfQorCitzdGF0aWMgdm9pZCB4aWljX3JlYWRfcngoc3RydWN0IHhpaWNfaTJjICppMmMpCit7CisJdTggYnl0ZXNfaW5fZmlmbzsKKwlpbnQgaTsKKworCWJ5dGVzX2luX2ZpZm8gPSB4aWljX2dldHJlZzgoaTJjLCBYSUlDX1JGT19SRUdfT0ZGU0VUKSArIDE7CisKKwlkZXZfZGJnKGkyYy0+YWRhcC5kZXYucGFyZW50LCAiJXMgZW50cnksIGJ5dGVzIGluIGZpZm86ICVkLCBtc2c6ICVkIgorCQkiLCBTUjogMHgleCwgQ1I6IDB4JXhcbiIsCisJCV9fZnVuY19fLCBieXRlc19pbl9maWZvLCB4aWljX3J4X3NwYWNlKGkyYyksCisJCXhpaWNfZ2V0cmVnOChpMmMsIFhJSUNfU1JfUkVHX09GRlNFVCksCisJCXhpaWNfZ2V0cmVnOChpMmMsIFhJSUNfQ1JfUkVHX09GRlNFVCkpOworCisJaWYgKGJ5dGVzX2luX2ZpZm8gPiB4aWljX3J4X3NwYWNlKGkyYykpCisJCWJ5dGVzX2luX2ZpZm8gPSB4aWljX3J4X3NwYWNlKGkyYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXNfaW5fZmlmbzsgaSsrKQorCQlpMmMtPnJ4X21zZy0+YnVmW2kyYy0+cnhfcG9zKytdID0KKwkJCXhpaWNfZ2V0cmVnOChpMmMsIFhJSUNfRFJSX1JFR19PRkZTRVQpOworCisJeGlpY19zZXRyZWc4KGkyYywgWElJQ19SRkRfUkVHX09GRlNFVCwKKwkJKHhpaWNfcnhfc3BhY2UoaTJjKSA+IElJQ19SWF9GSUZPX0RFUFRIKSA/CisJCUlJQ19SWF9GSUZPX0RFUFRIIC0gMSA6ICB4aWljX3J4X3NwYWNlKGkyYykgLSAxKTsKK30KKworc3RhdGljIGludCB4aWljX3R4X2ZpZm9fc3BhY2Uoc3RydWN0IHhpaWNfaTJjICppMmMpCit7CisJLyogcmV0dXJuIHRoZSBhY3R1YWwgc3BhY2UgbGVmdCBpbiB0aGUgRklGTyAqLworCXJldHVybiBJSUNfVFhfRklGT19ERVBUSCAtIHhpaWNfZ2V0cmVnOChpMmMsIFhJSUNfVEZPX1JFR19PRkZTRVQpIC0gMTsKK30KKworc3RhdGljIHZvaWQgeGlpY19maWxsX3R4X2ZpZm8oc3RydWN0IHhpaWNfaTJjICppMmMpCit7CisJdTggZmlmb19zcGFjZSA9IHhpaWNfdHhfZmlmb19zcGFjZShpMmMpOworCWludCBsZW4gPSB4aWljX3R4X3NwYWNlKGkyYyk7CisKKwlsZW4gPSAobGVuID4gZmlmb19zcGFjZSkgPyBmaWZvX3NwYWNlIDogbGVuOworCisJZGV2X2RiZyhpMmMtPmFkYXAuZGV2LnBhcmVudCwgIiVzIGVudHJ5LCBsZW46ICVkLCBmaWZvIHNwYWNlOiAlZFxuIiwKKwkJX19mdW5jX18sIGxlbiwgZmlmb19zcGFjZSk7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJdTE2IGRhdGEgPSBpMmMtPnR4X21zZy0+YnVmW2kyYy0+dHhfcG9zKytdOworCQlpZiAoKHhpaWNfdHhfc3BhY2UoaTJjKSA9PSAwKSAmJiAoaTJjLT5ubXNncyA9PSAxKSkgeworCQkJLyogbGFzdCBtZXNzYWdlIGluIHRyYW5zZmVyIC0+IFNUT1AgKi8KKwkJCWRhdGEgfD0gWElJQ19UWF9EWU5fU1RPUF9NQVNLOworCQkJZGV2X2RiZyhpMmMtPmFkYXAuZGV2LnBhcmVudCwgIiVzIFRYIFNUT1BcbiIsIF9fZnVuY19fKTsKKworCQkJeGlpY19zZXRyZWcxNihpMmMsIFhJSUNfRFRSX1JFR19PRkZTRVQsIGRhdGEpOworCQl9IGVsc2UKKwkJCXhpaWNfc2V0cmVnOChpMmMsIFhJSUNfRFRSX1JFR19PRkZTRVQsIGRhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQgeGlpY193YWtldXAoc3RydWN0IHhpaWNfaTJjICppMmMsIGludCBjb2RlKQoreworCWkyYy0+dHhfbXNnID0gTlVMTDsKKwlpMmMtPnJ4X21zZyA9IE5VTEw7CisJaTJjLT5ubXNncyA9IDA7CisJaTJjLT5zdGF0ZSA9IGNvZGU7CisJd2FrZV91cCgmaTJjLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgeGlpY19wcm9jZXNzKHN0cnVjdCB4aWljX2kyYyAqaTJjKQoreworCXUzMiBwZW5kLCBpc3IsIGllcjsKKwl1MzIgY2xyID0gMDsKKworCS8qIEdldCB0aGUgaW50ZXJydXB0IFN0YXR1cyBmcm9tIHRoZSBJUElGLiBUaGVyZSBpcyBubyBjbGVhcmluZyBvZgorCSAqIGludGVycnVwdHMgaW4gdGhlIElQSUYuIEludGVycnVwdHMgbXVzdCBiZSBjbGVhcmVkIGF0IHRoZSBzb3VyY2UuCisJICogVG8gZmluZCB3aGljaCBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nOyBBTkQgaW50ZXJydXB0cyBwZW5kaW5nIHdpdGgKKwkgKiBpbnRlcnJ1cHRzIG1hc2tlZC4KKwkgKi8KKwlpc3IgPSB4aWljX2dldHJlZzMyKGkyYywgWElJQ19JSVNSX09GRlNFVCk7CisJaWVyID0geGlpY19nZXRyZWczMihpMmMsIFhJSUNfSUlFUl9PRkZTRVQpOworCXBlbmQgPSBpc3IgJiBpZXI7CisKKwlkZXZfZGJnKGkyYy0+YWRhcC5kZXYucGFyZW50LCAiJXMgZW50cnksIElFUjogMHgleCwgSVNSOiAweCV4LCAiCisJCSJwZW5kOiAweCV4LCBTUjogMHgleCwgbXNnOiAlcCwgbm1zZ3M6ICVkXG4iLAorCQlfX2Z1bmNfXywgaWVyLCBpc3IsIHBlbmQsIHhpaWNfZ2V0cmVnOChpMmMsIFhJSUNfU1JfUkVHX09GRlNFVCksCisJCWkyYy0+dHhfbXNnLCBpMmMtPm5tc2dzKTsKKworCS8qIERvIG5vdCBwcm9jZXNzZXMgYSBkZXZpY2VzIGludGVycnVwdHMgaWYgdGhlIGRldmljZSBoYXMgbm8KKwkgKiBpbnRlcnJ1cHRzIHBlbmRpbmcKKwkgKi8KKwlpZiAoIXBlbmQpCisJCXJldHVybjsKKworCS8qIFNlcnZpY2UgcmVxdWVzdGluZyBpbnRlcnJ1cHQgKi8KKwlpZiAoKHBlbmQgJiBYSUlDX0lOVFJfQVJCX0xPU1RfTUFTSykgfHwKKwkJKChwZW5kICYgWElJQ19JTlRSX1RYX0VSUk9SX01BU0spICYmCisJCSEocGVuZCAmIFhJSUNfSU5UUl9SWF9GVUxMX01BU0spKSkgeworCQkvKiBidXMgYXJicml0cmF0aW9uIGxvc3QsIG9yLi4uCisJCSAqIFRyYW5zbWl0IGVycm9yIF9PUl8gUlggY29tcGxldGVkCisJCSAqIGlmIHRoaXMgaGFwcGVucyB3aGVuIFJYX0ZVTEwgaXMgbm90IHNldAorCQkgKiB0aGlzIGlzIHByb2JhYmx5IGEgVFggZXJyb3IKKwkJICovCisKKwkJZGV2X2RiZyhpMmMtPmFkYXAuZGV2LnBhcmVudCwgIiVzIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogZHluYW1pYyBtb2RlIHNlZW0gdG8gc3VmZmVyIGZyb20gcHJvYmxlbXMgaWYgd2UganVzdCBmbHVzaGVzCisJCSAqIGZpZm9zIGFuZCB0aGUgbmV4dCBtZXNzYWdlIGlzIGEgVFggd2l0aCBsZW4gMCAob25seSBhZGRyKQorCQkgKiByZXNldCB0aGUgSVAgaW5zdGVhZCBvZiBqdXN0IGZsdXNoIGZpZm9zCisJCSAqLworCQl4aWljX3JlaW5pdChpMmMpOworCisJCWlmIChpMmMtPnR4X21zZykKKwkJCXhpaWNfd2FrZXVwKGkyYywgU1RBVEVfRVJST1IpOworCisJfSBlbHNlIGlmIChwZW5kICYgWElJQ19JTlRSX1JYX0ZVTExfTUFTSykgeworCQkvKiBSZWNlaXZlIHJlZ2lzdGVyL0ZJRk8gaXMgZnVsbCAqLworCisJCWNsciA9IFhJSUNfSU5UUl9SWF9GVUxMX01BU0s7CisJCWlmICghaTJjLT5yeF9tc2cpIHsKKwkJCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsCisJCQkJIiVzIHVuZXhwZXh0ZWQgUlggSVJRXG4iLCBfX2Z1bmNfXyk7CisJCQl4aWljX2NsZWFyX3J4X2ZpZm8oaTJjKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJeGlpY19yZWFkX3J4KGkyYyk7CisJCWlmICh4aWljX3J4X3NwYWNlKGkyYykgPT0gMCkgeworCQkJLyogdGhpcyBpcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBtZXNzYWdlICovCisJCQlpMmMtPnJ4X21zZyA9IE5VTEw7CisKKwkJCS8qIGFsc28gY2xlYXIgVFggZXJyb3IgaWYgdGhlcmUgKFJYIGNvbXBsZXRlKSAqLworCQkJY2xyIHw9IChpc3IgJiBYSUlDX0lOVFJfVFhfRVJST1JfTUFTSyk7CisKKwkJCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsCisJCQkJIiVzIGVuZCBvZiBtZXNzYWdlLCBubXNnczogJWRcbiIsCisJCQkJX19mdW5jX18sIGkyYy0+bm1zZ3MpOworCisJCQkvKiBzZW5kIG5leHQgbWVzc2FnZSBpZiB0aGlzIHdhc24ndCB0aGUgbGFzdCwKKwkJCSAqIG90aGVyd2lzZSB0aGUgdHJhbnNmZXIgd2lsbCBiZSBmaW5pYWxpc2Ugd2hlbgorCQkJICogcmVjZWl2aW5nIHRoZSBidXMgbm90IGJ1c3kgaW50ZXJydXB0CisJCQkgKi8KKwkJCWlmIChpMmMtPm5tc2dzID4gMSkgeworCQkJCWkyYy0+bm1zZ3MtLTsKKwkJCQlpMmMtPnR4X21zZysrOworCQkJCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsCisJCQkJCSIlcyB3aWxsIHN0YXJ0IG5leHQuLi5cbiIsIF9fZnVuY19fKTsKKworCQkJCV9feGlpY19zdGFydF94ZmVyKGkyYyk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHBlbmQgJiBYSUlDX0lOVFJfQk5CX01BU0spIHsKKwkJLyogSUlDIGJ1cyBoYXMgdHJhbnNpdGlvbmVkIHRvIG5vdCBidXN5ICovCisJCWNsciA9IFhJSUNfSU5UUl9CTkJfTUFTSzsKKworCQkvKiBUaGUgYnVzIGlzIG5vdCBidXN5LCBkaXNhYmxlIEJ1c05vdEJ1c3kgaW50ZXJydXB0ICovCisJCXhpaWNfaXJxX2RpcyhpMmMsIFhJSUNfSU5UUl9CTkJfTUFTSyk7CisKKwkJaWYgKCFpMmMtPnR4X21zZykKKwkJCWdvdG8gb3V0OworCisJCWlmICgoaTJjLT5ubXNncyA9PSAxKSAmJiAhaTJjLT5yeF9tc2cgJiYKKwkJCXhpaWNfdHhfc3BhY2UoaTJjKSA9PSAwKQorCQkJeGlpY193YWtldXAoaTJjLCBTVEFURV9ET05FKTsKKwkJZWxzZQorCQkJeGlpY193YWtldXAoaTJjLCBTVEFURV9FUlJPUik7CisKKwl9IGVsc2UgaWYgKHBlbmQgJiAoWElJQ19JTlRSX1RYX0VNUFRZX01BU0sgfCBYSUlDX0lOVFJfVFhfSEFMRl9NQVNLKSkgeworCQkvKiBUcmFuc21pdCByZWdpc3Rlci9GSUZPIGlzIGVtcHR5IG9yIL0gZW1wdHkgKi8KKworCQljbHIgPSBwZW5kICYKKwkJCShYSUlDX0lOVFJfVFhfRU1QVFlfTUFTSyB8IFhJSUNfSU5UUl9UWF9IQUxGX01BU0spOworCisJCWlmICghaTJjLT50eF9tc2cpIHsKKwkJCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsCisJCQkJIiVzIHVuZXhwZXh0ZWQgVFggSVJRXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXhpaWNfZmlsbF90eF9maWZvKGkyYyk7CisKKwkJLyogY3VycmVudCBtZXNzYWdlIHNlbnQgYW5kIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBmaWZvICovCisJCWlmICgheGlpY190eF9zcGFjZShpMmMpICYmIHhpaWNfdHhfZmlmb19zcGFjZShpMmMpID49IDIpIHsKKwkJCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsCisJCQkJIiVzIGVuZCBvZiBtZXNzYWdlIHNlbnQsIG5tc2dzOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaTJjLT5ubXNncyk7CisJCQlpZiAoaTJjLT5ubXNncyA+IDEpIHsKKwkJCQlpMmMtPm5tc2dzLS07CisJCQkJaTJjLT50eF9tc2crKzsKKwkJCQlfX3hpaWNfc3RhcnRfeGZlcihpMmMpOworCQkJfSBlbHNlIHsKKwkJCQl4aWljX2lycV9kaXMoaTJjLCBYSUlDX0lOVFJfVFhfSEFMRl9NQVNLKTsKKworCQkJCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsCisJCQkJCSIlcyBHb3QgVFggSVJRIGJ1dCBubyBtb3JlIHRvIGRvLi4uXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCX0gZWxzZSBpZiAoIXhpaWNfdHhfc3BhY2UoaTJjKSAmJiAoaTJjLT5ubXNncyA9PSAxKSkKKwkJCS8qIGN1cnJlbnQgZnJhbWUgaXMgc2VudCBhbmQgaXMgbGFzdCwKKwkJCSAqIG1ha2Ugc3VyZSB0byBkaXNhYmxlIHR4IGhhbGYKKwkJCSAqLworCQkJeGlpY19pcnFfZGlzKGkyYywgWElJQ19JTlRSX1RYX0hBTEZfTUFTSyk7CisJfSBlbHNlIHsKKwkJLyogZ290IElSUSB3aGljaCBpcyBub3QgYWNrZWQgKi8KKwkJZGV2X2VycihpMmMtPmFkYXAuZGV2LnBhcmVudCwgIiVzIEdvdCB1bmV4cGVjdGVkIElSUVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJY2xyID0gcGVuZDsKKwl9CitvdXQ6CisJZGV2X2RiZyhpMmMtPmFkYXAuZGV2LnBhcmVudCwgIiVzIGNscjogMHgleFxuIiwgX19mdW5jX18sIGNscik7CisKKwl4aWljX3NldHJlZzMyKGkyYywgWElJQ19JSVNSX09GRlNFVCwgY2xyKTsKK30KKworc3RhdGljIGludCB4aWljX2J1c19idXN5KHN0cnVjdCB4aWljX2kyYyAqaTJjKQoreworCXU4IHNyID0geGlpY19nZXRyZWc4KGkyYywgWElJQ19TUl9SRUdfT0ZGU0VUKTsKKworCXJldHVybiAoc3IgJiBYSUlDX1NSX0JVU19CVVNZX01BU0spID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIGludCB4aWljX2J1c3koc3RydWN0IHhpaWNfaTJjICppMmMpCit7CisJaW50IHRyaWVzID0gMzsKKwlpbnQgZXJyOworCisJaWYgKGkyYy0+dHhfbXNnKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogZm9yIGluc3RhbmNlIGlmIHByZXZpb3VzIHRyYW5zZmVyIHdhcyB0ZXJtaW5hdGVkIGR1ZSB0byBUWCBlcnJvcgorCSAqIGl0IG1pZ2h0IGJlIHRoYXQgdGhlIGJ1cyBpcyBvbiBpdCdzIHdheSB0byBiZWNvbWUgYXZhaWxhYmxlCisJICogZ2l2ZSBpdCBhdCBtb3N0IDMgbXMgdG8gd2FrZQorCSAqLworCWVyciA9IHhpaWNfYnVzX2J1c3koaTJjKTsKKwl3aGlsZSAoZXJyICYmIHRyaWVzLS0pIHsKKwkJbWRlbGF5KDEpOworCQllcnIgPSB4aWljX2J1c19idXN5KGkyYyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgeGlpY19zdGFydF9yZWN2KHN0cnVjdCB4aWljX2kyYyAqaTJjKQoreworCXU4IHJ4X3dhdGVybWFyazsKKwlzdHJ1Y3QgaTJjX21zZyAqbXNnID0gaTJjLT5yeF9tc2cgPSBpMmMtPnR4X21zZzsKKworCS8qIENsZWFyIGFuZCBlbmFibGUgUnggZnVsbCBpbnRlcnJ1cHQuICovCisJeGlpY19pcnFfY2xyX2VuKGkyYywgWElJQ19JTlRSX1JYX0ZVTExfTUFTSyB8IFhJSUNfSU5UUl9UWF9FUlJPUl9NQVNLKTsKKworCS8qIHdlIHdhbnQgdG8gZ2V0IGFsbCBidXQgbGFzdCBieXRlLCBiZWNhdXNlIHRoZSBUWF9FUlJPUiBJUlEgaXMgdXNlZAorCSAqIHRvIGluaWRpY2F0ZSBlcnJvciBBQ0sgb24gdGhlIGFkZHJlc3MsIGFuZCBuZWdhdGl2ZSBhY2sgb24gdGhlIGxhc3QKKwkgKiByZWNlaXZlZCBieXRlLCBzbyB0byBub3QgbWl4IHRoZW0gcmVjZWl2ZSBhbGwgYnV0IGxhc3QuCisJICogSW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25seSBvbmUgYnl0ZSB0byByZWNlaXZlCisJICogd2UgY2FuIGNoZWNrIGlmIEVSUk9SIGFuZCBSWCBmdWxsIGlzIHNldCBhdCB0aGUgc2FtZSB0aW1lCisJICovCisJcnhfd2F0ZXJtYXJrID0gbXNnLT5sZW47CisJaWYgKHJ4X3dhdGVybWFyayA+IElJQ19SWF9GSUZPX0RFUFRIKQorCQlyeF93YXRlcm1hcmsgPSBJSUNfUlhfRklGT19ERVBUSDsKKwl4aWljX3NldHJlZzgoaTJjLCBYSUlDX1JGRF9SRUdfT0ZGU0VULCByeF93YXRlcm1hcmsgLSAxKTsKKworCWlmICghKG1zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKSkKKwkJLyogd3JpdGUgdGhlIGFkZHJlc3MgKi8KKwkJeGlpY19zZXRyZWcxNihpMmMsIFhJSUNfRFRSX1JFR19PRkZTRVQsCisJCQkobXNnLT5hZGRyIDw8IDEpIHwgWElJQ19SRUFEX09QRVJBVElPTiB8CisJCQlYSUlDX1RYX0RZTl9TVEFSVF9NQVNLKTsKKworCXhpaWNfaXJxX2Nscl9lbihpMmMsIFhJSUNfSU5UUl9CTkJfTUFTSyk7CisKKwl4aWljX3NldHJlZzE2KGkyYywgWElJQ19EVFJfUkVHX09GRlNFVCwKKwkJbXNnLT5sZW4gfCAoKGkyYy0+bm1zZ3MgPT0gMSkgPyBYSUlDX1RYX0RZTl9TVE9QX01BU0sgOiAwKSk7CisJaWYgKGkyYy0+bm1zZ3MgPT0gMSkKKwkJLyogdmVyeSBsYXN0LCBlbmFibGUgYnVzIG5vdCBidXN5IGFzIHdlbGwgKi8KKwkJeGlpY19pcnFfY2xyX2VuKGkyYywgWElJQ19JTlRSX0JOQl9NQVNLKTsKKworCS8qIHRoZSBtZXNzYWdlIGlzIHR4OmVkICovCisJaTJjLT50eF9wb3MgPSBtc2ctPmxlbjsKK30KKworc3RhdGljIHZvaWQgeGlpY19zdGFydF9zZW5kKHN0cnVjdCB4aWljX2kyYyAqaTJjKQoreworCXN0cnVjdCBpMmNfbXNnICptc2cgPSBpMmMtPnR4X21zZzsKKworCXhpaWNfaXJxX2NscihpMmMsIFhJSUNfSU5UUl9UWF9FUlJPUl9NQVNLKTsKKworCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsICIlcyBlbnRyeSwgbXNnOiAlcCwgbGVuOiAlZCwgIgorCQkiSVNSOiAweCV4LCBDUjogMHgleFxuIiwKKwkJX19mdW5jX18sIG1zZywgbXNnLT5sZW4sIHhpaWNfZ2V0cmVnMzIoaTJjLCBYSUlDX0lJU1JfT0ZGU0VUKSwKKwkJeGlpY19nZXRyZWc4KGkyYywgWElJQ19DUl9SRUdfT0ZGU0VUKSk7CisKKwlpZiAoIShtc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpIHsKKwkJLyogd3JpdGUgdGhlIGFkZHJlc3MgKi8KKwkJdTE2IGRhdGEgPSAoKG1zZy0+YWRkciA8PCAxKSAmIDB4ZmUpIHwgWElJQ19XUklURV9PUEVSQVRJT04gfAorCQkJWElJQ19UWF9EWU5fU1RBUlRfTUFTSzsKKwkJaWYgKChpMmMtPm5tc2dzID09IDEpICYmIG1zZy0+bGVuID09IDApCisJCQkvKiBubyBkYXRhIGFuZCBsYXN0IG1lc3NhZ2UgLT4gYWRkIFNUT1AgKi8KKwkJCWRhdGEgfD0gWElJQ19UWF9EWU5fU1RPUF9NQVNLOworCisJCXhpaWNfc2V0cmVnMTYoaTJjLCBYSUlDX0RUUl9SRUdfT0ZGU0VULCBkYXRhKTsKKwl9CisKKwl4aWljX2ZpbGxfdHhfZmlmbyhpMmMpOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgVHggZW1wdHksIFR4IEVycm9yIGFuZCB0aGVuIGVuYWJsZSB0aGVtLiAqLworCXhpaWNfaXJxX2Nscl9lbihpMmMsIFhJSUNfSU5UUl9UWF9FTVBUWV9NQVNLIHwgWElJQ19JTlRSX1RYX0VSUk9SX01BU0sgfAorCQlYSUlDX0lOVFJfQk5CX01BU0spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGlpY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB4aWljX2kyYyAqaTJjID0gZGV2X2lkOworCisJc3Bpbl9sb2NrKCZpMmMtPmxvY2spOworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBnbG9iYWxseSAqLworCXhpaWNfc2V0cmVnMzIoaTJjLCBYSUlDX0RHSUVSX09GRlNFVCwgMCk7CisKKwlkZXZfZGJnKGkyYy0+YWRhcC5kZXYucGFyZW50LCAiJXMgZW50cnlcbiIsIF9fZnVuY19fKTsKKworCXhpaWNfcHJvY2VzcyhpMmMpOworCisJeGlpY19zZXRyZWczMihpMmMsIFhJSUNfREdJRVJfT0ZGU0VULCBYSUlDX0dJTlRSX0VOQUJMRV9NQVNLKTsKKwlzcGluX3VubG9jaygmaTJjLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgX194aWljX3N0YXJ0X3hmZXIoc3RydWN0IHhpaWNfaTJjICppMmMpCit7CisJaW50IGZpcnN0ID0gMTsKKwlpbnQgZmlmb19zcGFjZSA9IHhpaWNfdHhfZmlmb19zcGFjZShpMmMpOworCWRldl9kYmcoaTJjLT5hZGFwLmRldi5wYXJlbnQsICIlcyBlbnRyeSwgbXNnOiAlcCwgZmlmb3Mgc3BhY2U6ICVkXG4iLAorCQlfX2Z1bmNfXywgaTJjLT50eF9tc2csIGZpZm9fc3BhY2UpOworCisJaWYgKCFpMmMtPnR4X21zZykKKwkJcmV0dXJuOworCisJaTJjLT5yeF9wb3MgPSAwOworCWkyYy0+dHhfcG9zID0gMDsKKwlpMmMtPnN0YXRlID0gU1RBVEVfU1RBUlQ7CisJd2hpbGUgKChmaWZvX3NwYWNlID49IDIpICYmIChmaXJzdCB8fCAoaTJjLT5ubXNncyA+IDEpKSkgeworCQlpZiAoIWZpcnN0KSB7CisJCQlpMmMtPm5tc2dzLS07CisJCQlpMmMtPnR4X21zZysrOworCQkJaTJjLT50eF9wb3MgPSAwOworCQl9IGVsc2UKKwkJCWZpcnN0ID0gMDsKKworCQlpZiAoaTJjLT50eF9tc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKKwkJCS8qIHdlIGRvbnQgZGF0ZSBwdXR0aW5nIHNldmVyYWwgcmVhZHMgaW4gdGhlIEZJRk8gKi8KKwkJCXhpaWNfc3RhcnRfcmVjdihpMmMpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJeGlpY19zdGFydF9zZW5kKGkyYyk7CisJCQlpZiAoeGlpY190eF9zcGFjZShpMmMpICE9IDApIHsKKwkJCQkvKiB0aGUgbWVzc2FnZSBjb3VsZCBub3QgYmUgY29tcGxldGVseSBzZW50ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlmaWZvX3NwYWNlID0geGlpY190eF9maWZvX3NwYWNlKGkyYyk7CisJfQorCisJLyogdGhlcmUgYXJlIG1vcmUgbWVzc2FnZXMgb3IgdGhlIGN1cnJlbnQgb25lIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWx5CisJICogcHV0IGludG8gdGhlIEZJRk8sIGFsc28gZW5hYmxlIHRoZSBoYWxmIGVtcHR5IGludGVycnVwdAorCSAqLworCWlmIChpMmMtPm5tc2dzID4gMSB8fCB4aWljX3R4X3NwYWNlKGkyYykpCisJCXhpaWNfaXJxX2Nscl9lbihpMmMsIFhJSUNfSU5UUl9UWF9IQUxGX01BU0spOworCit9CisKK3N0YXRpYyB2b2lkIHhpaWNfc3RhcnRfeGZlcihzdHJ1Y3QgeGlpY19pMmMgKmkyYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyYy0+bG9jaywgZmxhZ3MpOworCXhpaWNfcmVpbml0KGkyYyk7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGdsb2JhbGx5ICovCisJeGlpY19zZXRyZWczMihpMmMsIFhJSUNfREdJRVJfT0ZGU0VULCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmMtPmxvY2ssIGZsYWdzKTsKKworCV9feGlpY19zdGFydF94ZmVyKGkyYyk7CisJeGlpY19zZXRyZWczMihpMmMsIFhJSUNfREdJRVJfT0ZGU0VULCBYSUlDX0dJTlRSX0VOQUJMRV9NQVNLKTsKK30KKworc3RhdGljIGludCB4aWljX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkKK3sKKwlzdHJ1Y3QgeGlpY19pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IGVycjsKKworCWRldl9kYmcoYWRhcC0+ZGV2LnBhcmVudCwgIiVzIGVudHJ5IFNSOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJeGlpY19nZXRyZWc4KGkyYywgWElJQ19TUl9SRUdfT0ZGU0VUKSk7CisKKwllcnIgPSB4aWljX2J1c3koaTJjKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaTJjLT50eF9tc2cgPSBtc2dzOworCWkyYy0+bm1zZ3MgPSBudW07CisKKwl4aWljX3N0YXJ0X3hmZXIoaTJjKTsKKworCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT53YWl0LCAoaTJjLT5zdGF0ZSA9PSBTVEFURV9FUlJPUikgfHwKKwkJKGkyYy0+c3RhdGUgPT0gU1RBVEVfRE9ORSksIEhaKSkKKwkJcmV0dXJuIChpMmMtPnN0YXRlID09IFNUQVRFX0RPTkUpID8gbnVtIDogLUVJTzsKKwllbHNlIHsKKwkJaTJjLT50eF9tc2cgPSBOVUxMOworCQlpMmMtPnJ4X21zZyA9IE5VTEw7CisJCWkyYy0+bm1zZ3MgPSAwOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9Cit9CisKK3N0YXRpYyB1MzIgeGlpY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHhpaWNfYWxnb3JpdGhtID0geworCS5tYXN0ZXJfeGZlcgk9IHhpaWNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IHhpaWNfZnVuYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgeGlpY19hZGFwdGVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRCwKKwkuYWxnbwkJPSAmeGlpY19hbGdvcml0aG0sCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHhpaWNfaTJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhpaWNfaTJjICppMmM7CisJc3RydWN0IHhpaWNfaTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQsIGlycTsKKwl1OCBpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJZ290byByZXNvdXJjZV9taXNzaW5nOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJZ290byByZXNvdXJjZV9taXNzaW5nOworCisJcGRhdGEgPSAoc3RydWN0IHhpaWNfaTJjX3BsYXRmb3JtX2RhdGEgKikgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpMmMgPSBremFsbG9jKHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpMmMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgcmVnaW9uIGJ1c3lcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gcmVxdWVzdF9tZW1fZmFpbGVkOworCX0KKworCWkyYy0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWkyYy0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gbWFwIHJlZ2lzdGVyc1xuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gbWFwX2ZhaWxlZDsKKwl9CisKKwkvKiBob29rIHVwIGRyaXZlciB0byB0cmVlICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKKwlpMmMtPmFkYXAgPSB4aWljX2FkYXB0ZXI7CisJaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwLCBpMmMpOworCWkyYy0+YWRhcC5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCXhpaWNfcmVpbml0KGkyYyk7CisKKwlzcGluX2xvY2tfaW5pdCgmaTJjLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPndhaXQpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgeGlpY19pc3IsIDAsIHBkZXYtPm5hbWUsIGkyYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY2xhaW0gSVJRXG4iKTsKKwkJZ290byByZXF1ZXN0X2lycV9mYWlsZWQ7CisJfQorCisJLyogYWRkIGkyYyBhZGFwdGVyIHRvIGkyYyB0cmVlICovCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKKwkJZ290byBhZGRfYWRhcHRlcl9mYWlsZWQ7CisJfQorCisJLyogYWRkIGluIGtub3duIGRldmljZXMgdG8gdGhlIGJ1cyAqLworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2RldmljZXM7IGkrKykKKwkJaTJjX25ld19kZXZpY2UoJmkyYy0+YWRhcCwgcGRhdGEtPmRldmljZXMgKyBpKTsKKworCXJldHVybiAwOworCithZGRfYWRhcHRlcl9mYWlsZWQ6CisJZnJlZV9pcnEoaXJxLCBpMmMpOworcmVxdWVzdF9pcnFfZmFpbGVkOgorCXhpaWNfZGVpbml0KGkyYyk7CisJaW91bm1hcChpMmMtPmJhc2UpOworbWFwX2ZhaWxlZDoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK3JlcXVlc3RfbWVtX2ZhaWxlZDoKKwlrZnJlZShpMmMpOworCisJcmV0dXJuIHJldDsKK3Jlc291cmNlX21pc3Npbmc6CisJZGV2X2VycigmcGRldi0+ZGV2LCAiSVJRIG9yIE1lbW9yeSByZXNvdXJjZSBpcyBtaXNzaW5nXG4iKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgeGlpY19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UqIHBkZXYpCit7CisJc3RydWN0IHhpaWNfaTJjICppMmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCS8qIHJlbW92ZSBhZGFwdGVyICYgZGF0YSAqLworCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKKworCXhpaWNfZGVpbml0KGkyYyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWZyZWVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIGkyYyk7CisKKwlpb3VubWFwKGkyYy0+YmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCisJa2ZyZWUoaTJjKTsKKworCXJldHVybiAwOworfQorCisKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiRFJJVkVSX05BTUUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4aWljX2kyY19kcml2ZXIgPSB7CisJLnByb2JlICAgPSB4aWljX2kyY19wcm9iZSwKKwkucmVtb3ZlICA9IF9fZGV2ZXhpdF9wKHhpaWNfaTJjX3JlbW92ZSksCisJLmRyaXZlciAgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4aWljX2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmeGlpY19pMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHhpaWNfaTJjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmeGlpY19pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeGlpY19pMmNfaW5pdCk7Cittb2R1bGVfZXhpdCh4aWljX2kyY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiaW5mb0Btb2NlYW4tbGFicy5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IEkyQyBidXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==