LyogJElkOiBoZmNfcGNpLmMsdiAxLjQ4LjIuNCAyMDA0LzAyLzExIDEzOjIxOjMzIGtlaWwgRXhwICQKICoKICogbG93IGxldmVsIGRyaXZlciBmb3IgQ0NEtHMgaGZjLXBjaSBiYXNlZCBjYXJkcwogKgogKiBBdXRob3IgICAgICAgV2VybmVyIENvcm5lbGl1cwogKiAgICAgICAgICAgICAgYmFzZWQgb24gZXhpc3RpbmcgZHJpdmVyIGZvciBDQ0QgaGZjIElTQSBjYXJkcwogKiBDb3B5cmlnaHQgICAgYnkgV2VybmVyIENvcm5lbGl1cyAgPHdlcm5lckBpc2RuNGxpbnV4LmRlPgogKiAgICAgICAgICAgICAgYnkgS2Fyc3RlbiBLZWlsICAgICAgPGtlaWxAaXNkbjRsaW51eC5kZT4KICogCiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KICoKICogRm9yIGNoYW5nZXMgYW5kIG1vZGlmaWNhdGlvbnMgcGxlYXNlIHJlYWQKICogRG9jdW1lbnRhdGlvbi9pc2RuL0hpU2F4LmNlcnQKICoKICovCgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSAiaGlzYXguaCIKI2luY2x1ZGUgImhmY19wY2kuaCIKI2luY2x1ZGUgImlzZG5sMS5oIgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KCmV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwoKc3RhdGljIGNvbnN0IGNoYXIgKmhmY3BjaV9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuNDguMi40ICQiOwoKLyogdGFibGUgZW50cnkgaW4gdGhlIFBDSSBkZXZpY2VzIGxpc3QgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJaW50IHZlbmRvcl9pZDsKCWludCBkZXZpY2VfaWQ7CgljaGFyICp2ZW5kb3JfbmFtZTsKCWNoYXIgKmNhcmRfbmFtZTsKfSBQQ0lfRU5UUlk7CgojZGVmaW5lIE5UX1QxX0NPVU5UCTIwCS8qIG51bWJlciBvZiAzLjEyNW1zIGludGVycnVwdHMgZm9yIEcyIHRpbWVvdXQgKi8KI2RlZmluZSBDTEtERUxfVEUJMHgwZQkvKiBDTEtERUwgaW4gVEUgbW9kZSAqLwojZGVmaW5lIENMS0RFTF9OVAkweDZjCS8qIENMS0RFTCBpbiBOVCBtb2RlICovCgpzdGF0aWMgY29uc3QgUENJX0VOVFJZIGlkX2xpc3RbXSA9CnsKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfMkJEMCwgIkNDRC9CaWxsaW9uL0FzdXNjb20iLCAiMkJEMCJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDAwLCAiQmlsbGlvbiIsICJCMDAwIn0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDYsICJCaWxsaW9uIiwgIkIwMDYifSwKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwNywgIkJpbGxpb24iLCAiQjAwNyJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDA4LCAiQmlsbGlvbiIsICJCMDA4In0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDksICJCaWxsaW9uIiwgIkIwMDkifSwKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwQSwgIkJpbGxpb24iLCAiQjAwQSJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDBCLCAiQmlsbGlvbiIsICJCMDBCIn0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEMsICJCaWxsaW9uIiwgIkIwMEMifSwKCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjEwMCwgIlNleWVvbiIsICJCMTAwIn0sCgl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0I3MDAsICJQcmltdXggSUkgUzAiLCAiQjcwMCJ9LAoJe1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CNzAxLCAiUHJpbXV4IElJIFMwIE5UIiwgIkI3MDEifSwKCXtQQ0lfVkVORE9SX0lEX0FCT0NPTSwgUENJX0RFVklDRV9JRF9BQk9DT01fMkJEMSwgIkFib2NvbS9NYWdpdGVrIiwgIjJCRDEifSwKCXtQQ0lfVkVORE9SX0lEX0FTVVNURUssIFBDSV9ERVZJQ0VfSURfQVNVU1RFS18wNjc1LCAiQXN1c2NvbS9Bc2tleSIsICI2NzUifSwKCXtQQ0lfVkVORE9SX0lEX0JFUktPTSwgUENJX0RFVklDRV9JRF9CRVJLT01fVF9DT05DRVBULCAiR2VybWFuIHRlbGVrb20iLCAiVC1Db25jZXB0In0sCgl7UENJX1ZFTkRPUl9JRF9CRVJLT00sIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVCwgIkdlcm1hbiB0ZWxla29tIiwgIkExVCJ9LAoJe1BDSV9WRU5ET1JfSURfQU5JR01BLCBQQ0lfREVWSUNFX0lEX0FOSUdNQV9NQzE0NTU3NSwgIk1vdG9yb2xhIE1DMTQ1NTc1IiwgIk1DMTQ1NTc1In0sCgl7UENJX1ZFTkRPUl9JRF9aT0xUUklYLCBQQ0lfREVWSUNFX0lEX1pPTFRSSVhfMkJEMCwgIlpvbHRyaXgiLCAiMkJEMCJ9LAoJe1BDSV9WRU5ET1JfSURfRElHSSwgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fSU9NMl9FLCJEaWdpIEludGVybmF0aW9uYWwiLCAiRGlnaSBEYXRhRmlyZSBNaWNybyBWIElPTTIgKEV1cm9wZSkifSwKCXtQQ0lfVkVORE9SX0lEX0RJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0UsIkRpZ2kgSW50ZXJuYXRpb25hbCIsICJEaWdpIERhdGFGaXJlIE1pY3JvIFYgKEV1cm9wZSkifSwKCXtQQ0lfVkVORE9SX0lEX0RJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfQSwiRGlnaSBJbnRlcm5hdGlvbmFsIiwgIkRpZ2kgRGF0YUZpcmUgTWljcm8gViBJT00yIChOb3J0aCBBbWVyaWNhKSJ9LAoJe1BDSV9WRU5ET1JfSURfRElHSSwgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fQSwiRGlnaSBJbnRlcm5hdGlvbmFsIiwgIkRpZ2kgRGF0YUZpcmUgTWljcm8gViAoTm9ydGggQW1lcmljYSkifSwKCXtQQ0lfVkVORE9SX0lEX1NJVEVDT00sIFBDSV9ERVZJQ0VfSURfU0lURUNPTV9EQzEwNVYyLCAiU2l0ZWNvbSBFdXJvcGUiLCAiREMtMTA1IElTRE4gUENJIn0sCgl7MCwgMCwgTlVMTCwgTlVMTH0sCn07CgoKI2lmZGVmIENPTkZJR19QQ0kKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGZyZWUgaGFyZHdhcmUgcmVzb3VyY2VzIHVzZWQgYnkgZHJpdmVyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCnJlbGVhc2VfaW9faGZjcGNpKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJcHJpbnRrKEtFUk5fSU5GTyAiSGlTYXg6IHJlbGVhc2UgaGZjcGNpIGF0ICVwXG4iLAoJCWNzLT5ody5oZmNwY2kucGNpX2lvKTsKCWNzLT5ody5oZmNwY2kuaW50X20yID0gMDsJCQkJCS8qIGludGVycnVwdCBvdXRwdXQgb2ZmICEgKi8KCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMiwgY3MtPmh3LmhmY3BjaS5pbnRfbTIpOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ0lSTSwgSEZDUENJX1JFU0VUKTsJCQkvKiBSZXNldCBPbiAqLwoJbWRlbGF5KDEwKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NJUk0sIDApOwkJCQkJLyogUmVzZXQgT2ZmICovCgltZGVsYXkoMTApOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00yLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CglwY2lfd3JpdGVfY29uZmlnX3dvcmQoY3MtPmh3LmhmY3BjaS5kZXYsIFBDSV9DT01NQU5ELCAwKTsJLyogZGlzYWJsZSBtZW1vcnkgbWFwcGVkIHBvcnRzICsgYnVzbWFzdGVyICovCglkZWxfdGltZXIoJmNzLT5ody5oZmNwY2kudGltZXIpOwoJa2ZyZWUoY3MtPmh3LmhmY3BjaS5zaGFyZV9zdGFydCk7Cgljcy0+aHcuaGZjcGNpLnNoYXJlX3N0YXJ0ID0gTlVMTDsKCWlvdW5tYXAoKHZvaWQgKiljcy0+aHcuaGZjcGNpLnBjaV9pbyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogZnVuY3Rpb24gY2FsbGVkIHRvIHJlc2V0IHRoZSBIRkMgUENJIGNoaXAuIEEgY29tcGxldGUgc29mdHdhcmUgcmVzZXQgb2YgY2hpcCAqLwovKiBhbmQgZmlmb3MgaXMgZG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKcmVzZXRfaGZjcGNpKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNzLT5ody5oZmNwY2kuZGV2LCBQQ0lfQ09NTUFORCwgUENJX0VOQV9NRU1JTyk7CS8qIGVuYWJsZSBtZW1vcnkgbWFwcGVkIHBvcnRzLCBkaXNhYmxlIGJ1c21hc3RlciAqLwoJY3MtPmh3LmhmY3BjaS5pbnRfbTIgPSAwOwkvKiBpbnRlcnJ1cHQgb3V0cHV0IG9mZiAhICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTIsIGNzLT5ody5oZmNwY2kuaW50X20yKTsKCglwcmludGsoS0VSTl9JTkZPICJIRkNfUENJOiByZXNldHRpbmcgY2FyZFxuIik7CglwY2lfd3JpdGVfY29uZmlnX3dvcmQoY3MtPmh3LmhmY3BjaS5kZXYsIFBDSV9DT01NQU5ELCBQQ0lfRU5BX01FTUlPICsgUENJX0VOQV9NQVNURVIpOwkvKiBlbmFibGUgbWVtb3J5IHBvcnRzICsgYnVzbWFzdGVyICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DSVJNLCBIRkNQQ0lfUkVTRVQpOwkvKiBSZXNldCBPbiAqLwoJbWRlbGF5KDEwKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NJUk0sIDApOwkvKiBSZXNldCBPZmYgKi8KCW1kZWxheSgxMCk7CglpZiAoUmVhZF9oZmMoY3MsIEhGQ1BDSV9TVEFUVVMpICYgMikKCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJIGluaXQgYml0IGJ1c3lcbiIpOwoKCWNzLT5ody5oZmNwY2kuZmlmb19lbiA9IDB4MzA7CS8qIG9ubHkgRCBmaWZvcyBlbmFibGVkICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9GSUZPX0VOLCBjcy0+aHcuaGZjcGNpLmZpZm9fZW4pOwoKCWNzLT5ody5oZmNwY2kudHJtID0gMCArIEhGQ1BDSV9CVFJBTlNfVEhSRVNNQVNLOwkvKiBubyBlY2hvIGNvbm5lY3QgLCB0aHJlc2hvbGQgKi8KCVdyaXRlX2hmYyhjcywgSEZDUENJX1RSTSwgY3MtPmh3LmhmY3BjaS50cm0pOwoKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NMS0RFTCwgQ0xLREVMX1RFKTsgLyogU1QtQml0IGRlbGF5IGZvciBURS1Nb2RlICovCgljcy0+aHcuaGZjcGNpLnNjdHJsX2UgPSBIRkNQQ0lfQVVUT19BV0FLRTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMX0UsIGNzLT5ody5oZmNwY2kuc2N0cmxfZSk7CS8qIFMvVCBBdXRvIGF3YWtlICovCgljcy0+aHcuaGZjcGNpLmJzd2FwcGVkID0gMDsJLyogbm8gZXhjaGFuZ2UgKi8KCWNzLT5ody5oZmNwY2kubnRfbW9kZSA9IDA7CS8qIHdlIGFyZSBpbiBURSBtb2RlICovCgljcy0+aHcuaGZjcGNpLmN0bXQgPSBIRkNQQ0lfVElNM18xMjUgfCBIRkNQQ0lfQVVUT19USU1FUjsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NUTVQsIGNzLT5ody5oZmNwY2kuY3RtdCk7CgoJY3MtPmh3LmhmY3BjaS5pbnRfbTEgPSBIRkNQQ0lfSU5UU19EVFJBTlMgfCBIRkNQQ0lfSU5UU19EUkVDIHwKCSAgICBIRkNQQ0lfSU5UU19MMVNUQVRFIHwgSEZDUENJX0lOVFNfVElNRVI7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTEsIGNzLT5ody5oZmNwY2kuaW50X20xKTsKCgkvKiBDbGVhciBhbHJlYWR5IHBlbmRpbmcgaW50cyAqLwoJaWYgKFJlYWRfaGZjKGNzLCBIRkNQQ0lfSU5UX1MxKSk7CgoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCBIRkNQQ0lfTE9BRF9TVEFURSB8IDIpOwkvKiBIRkMgU1QgMiAqLwoJdWRlbGF5KDEwKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgMik7CS8qIEhGQyBTVCAyICovCgljcy0+aHcuaGZjcGNpLm1zdF9tID0gSEZDUENJX01BU1RFUjsJLyogSEZDIE1hc3RlciBNb2RlICovCgoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfTVNUX01PREUsIGNzLT5ody5oZmNwY2kubXN0X20pOwoJY3MtPmh3LmhmY3BjaS5zY3RybCA9IDB4NDA7CS8qIHNldCB0eF9sbyBtb2RlLCBlcnJvciBpbiBkYXRhc2hlZXQgISAqLwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU0NUUkwsIGNzLT5ody5oZmNwY2kuc2N0cmwpOwoJY3MtPmh3LmhmY3BjaS5zY3RybF9yID0gMDsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMX1IsIGNzLT5ody5oZmNwY2kuc2N0cmxfcik7CgoJLyogSW5pdCBHQ0kvSU9NMiBpbiBtYXN0ZXIgbW9kZSAqLwoJLyogU2xvdHMgMCBhbmQgMSBhcmUgc2V0IGZvciBCLWNoYW4gMSBhbmQgMiAqLwoJLyogRC0gYW5kIG1vbml0b3IvQ0kgY2hhbm5lbCBhcmUgbm90IGVuYWJsZWQgKi8KCS8qIFNUSU8xIGlzIHVzZWQgYXMgb3V0cHV0IGZvciBkYXRhLCBCMStCMiBmcm9tIFNULT5JT00rSEZDICovCgkvKiBTVElPMiBpcyB1c2VkIGFzIGRhdGEgaW5wdXQsIEIxK0IyIGZyb20gSU9NLT5TVCAqLwoJLyogU1QgQi1jaGFubmVsIHNlbmQgZGlzYWJsZWQgLT4gY29udGlub3VzIDFzICovCgkvKiBUaGUgSU9NIHNsb3RzIGFyZSBhbHdheXMgZW5hYmxlZCAqLwoJY3MtPmh3LmhmY3BjaS5jb25uID0gMHgzNjsJLyogc2V0IGRhdGEgZmxvdyBkaXJlY3Rpb25zICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DT05ORUNULCBjcy0+aHcuaGZjcGNpLmNvbm4pOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjFfU1NMLCAweDgwKTsJLyogQjEtU2xvdCAwIFNUSU8xIG91dCBlbmFibGVkICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9CMl9TU0wsIDB4ODEpOwkvKiBCMi1TbG90IDEgU1RJTzEgb3V0IGVuYWJsZWQgKi8KCVdyaXRlX2hmYyhjcywgSEZDUENJX0IxX1JTTCwgMHg4MCk7CS8qIEIxLVNsb3QgMCBTVElPMiBpbiBlbmFibGVkICovCglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9CMl9SU0wsIDB4ODEpOwkvKiBCMi1TbG90IDEgU1RJTzIgaW4gZW5hYmxlZCAqLwoKCS8qIEZpbmFsbHkgZW5hYmxlIElSUSBvdXRwdXQgKi8KCWNzLT5ody5oZmNwY2kuaW50X20yID0gSEZDUENJX0lSUV9FTkFCTEU7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTIsIGNzLT5ody5oZmNwY2kuaW50X20yKTsKCWlmIChSZWFkX2hmYyhjcywgSEZDUENJX0lOVF9TMSkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBUaW1lciBmdW5jdGlvbiBjYWxsZWQgd2hlbiBrZXJuZWwgdGltZXIgZXhwaXJlcyAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfVGltZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7Cgljcy0+aHcuaGZjcGNpLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgNzU7CgkvKiBXRCBSRVNFVCAqLwovKiAgICAgIFdyaXRlUmVnKGNzLCBIRkNEX0RBVEEsIEhGQ0RfQ1RNVCwgY3MtPmh3LmhmY3BjaS5jdG10IHwgMHg4MCk7CiAgIGFkZF90aW1lcigmY3MtPmh3LmhmY3BjaS50aW1lcik7CiAqLwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogc2NoZWR1bGUgYSBuZXcgRC1jaGFubmVsIHRhc2sgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKc2NoZWRfZXZlbnRfRF9wY2koc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgZXZlbnQpCnsKCXRlc3RfYW5kX3NldF9iaXQoZXZlbnQsICZjcy0+ZXZlbnQpOwoJc2NoZWR1bGVfd29yaygmY3MtPnRxdWV1ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHNjaGVkdWxlIGEgbmV3IGJfY2hhbm5lbCB0YXNrICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmhmY3BjaV9zY2hlZF9ldmVudChzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBpbnQgZXZlbnQpCnsKCXRlc3RfYW5kX3NldF9iaXQoZXZlbnQsICZiY3MtPmV2ZW50KTsKCXNjaGVkdWxlX3dvcmsoJmJjcy0+dHF1ZXVlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogc2VsZWN0IGEgYi1jaGFubmVsIGVudHJ5IG1hdGNoaW5nIGFuZCBhY3RpdmUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljCnN0cnVjdCBCQ1N0YXRlICoKU2VsX0JDUyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBjaGFubmVsKQp7CglpZiAoY3MtPmJjc1swXS5tb2RlICYmIChjcy0+YmNzWzBdLmNoYW5uZWwgPT0gY2hhbm5lbCkpCgkJcmV0dXJuICgmY3MtPmJjc1swXSk7CgllbHNlIGlmIChjcy0+YmNzWzFdLm1vZGUgJiYgKGNzLT5iY3NbMV0uY2hhbm5lbCA9PSBjaGFubmVsKSkKCQlyZXR1cm4gKCZjcy0+YmNzWzFdKTsKCWVsc2UKCQlyZXR1cm4gKE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBjbGVhciB0aGUgZGVzaXJlZCBCLWNoYW5uZWwgcnggZmlmbyAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBoZmNwY2lfY2xlYXJfZmlmb19yeChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBmaWZvKQp7ICAgICAgIHVfY2hhciBmaWZvX3N0YXRlOwogICAgICAgIGJ6Zmlmb190eXBlICpienI7CgoJaWYgKGZpZm8pIHsKCSAgICAgICAgYnpyID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMucnhiel9iMjsKCQlmaWZvX3N0YXRlID0gY3MtPmh3LmhmY3BjaS5maWZvX2VuICYgSEZDUENJX0ZJRk9FTl9CMlJYOwoJfSBlbHNlIHsKCSAgICAgICAgYnpyID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMucnhiel9iMTsKCQlmaWZvX3N0YXRlID0gY3MtPmh3LmhmY3BjaS5maWZvX2VuICYgSEZDUENJX0ZJRk9FTl9CMVJYOwoJfQoJaWYgKGZpZm9fc3RhdGUpCgkgICAgICAgIGNzLT5ody5oZmNwY2kuZmlmb19lbiBePSBmaWZvX3N0YXRlOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKCWNzLT5ody5oZmNwY2kubGFzdF9iZmlmb19jbnRbZmlmb10gPSAwOwoJYnpyLT56YVtNQVhfQl9GUkFNRVNdLnoxID0gQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwgLSAxOwoJYnpyLT56YVtNQVhfQl9GUkFNRVNdLnoyID0gYnpyLT56YVtNQVhfQl9GUkFNRVNdLnoxOwoJYnpyLT5mMSA9IE1BWF9CX0ZSQU1FUzsKCWJ6ci0+ZjIgPSBienItPmYxOwkvKiBpbml0IEYgcG9pbnRlcnMgdG8gcmVtYWluIGNvbnN0YW50ICovCglpZiAoZmlmb19zdGF0ZSkKCSAgICAgICAgY3MtPmh3LmhmY3BjaS5maWZvX2VuIHw9IGZpZm9fc3RhdGU7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9GSUZPX0VOLCBjcy0+aHcuaGZjcGNpLmZpZm9fZW4pOwp9ICAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBjbGVhciB0aGUgZGVzaXJlZCBCLWNoYW5uZWwgdHggZmlmbyAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBoZmNwY2lfY2xlYXJfZmlmb190eChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBmaWZvKQp7ICAgICAgIHVfY2hhciBmaWZvX3N0YXRlOwogICAgICAgIGJ6Zmlmb190eXBlICpienQ7CgoJaWYgKGZpZm8pIHsKCSAgICAgICAgYnp0ID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMudHhiel9iMjsKCQlmaWZvX3N0YXRlID0gY3MtPmh3LmhmY3BjaS5maWZvX2VuICYgSEZDUENJX0ZJRk9FTl9CMlRYOwoJfSBlbHNlIHsKCSAgICAgICAgYnp0ID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMudHhiel9iMTsKCQlmaWZvX3N0YXRlID0gY3MtPmh3LmhmY3BjaS5maWZvX2VuICYgSEZDUENJX0ZJRk9FTl9CMVRYOwoJfQoJaWYgKGZpZm9fc3RhdGUpCgkgICAgICAgIGNzLT5ody5oZmNwY2kuZmlmb19lbiBePSBmaWZvX3N0YXRlOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKCWJ6dC0+emFbTUFYX0JfRlJBTUVTXS56MSA9IEJfRklGT19TSVpFICsgQl9TVUJfVkFMIC0gMTsKCWJ6dC0+emFbTUFYX0JfRlJBTUVTXS56MiA9IGJ6dC0+emFbTUFYX0JfRlJBTUVTXS56MTsKCWJ6dC0+ZjEgPSBNQVhfQl9GUkFNRVM7CglienQtPmYyID0gYnp0LT5mMTsJLyogaW5pdCBGIHBvaW50ZXJzIHRvIHJlbWFpbiBjb25zdGFudCAqLwoJaWYgKGZpZm9fc3RhdGUpCgkgICAgICAgIGNzLT5ody5oZmNwY2kuZmlmb19lbiB8PSBmaWZvX3N0YXRlOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKfSAgIAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogcmVhZCBhIGNvbXBsZXRlIEItZnJhbWUgb3V0IG9mIHRoZSBidWZmZXIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHN0cnVjdCBza19idWZmCioKaGZjcGNpX2VtcHR5X2ZpZm8oc3RydWN0IEJDU3RhdGUgKmJjcywgYnpmaWZvX3R5cGUgKiBieiwgdV9jaGFyICogYmRhdGEsIGludCBjb3VudCkKewoJdV9jaGFyICpwdHIsICpwdHIxLCBuZXdfZjI7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gYmNzLT5jczsKCWludCB0b3RhbCwgbWF4bGVuLCBuZXdfejI7Cgl6X3R5cGUgKnpwOwoKCWlmICgoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpICYmICEoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1hfRklGTykpCgkJZGVidWdsMShjcywgImhmY3BjaV9lbXB0eV9maWZvIik7Cgl6cCA9ICZiei0+emFbYnotPmYyXTsJLyogcG9pbnQgdG8gWi1SZWdzICovCgluZXdfejIgPSB6cC0+ejIgKyBjb3VudDsJLyogbmV3IHBvc2l0aW9uIGluIGZpZm8gKi8KCWlmIChuZXdfejIgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKCQluZXdfejIgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCgluZXdfZjIgPSAoYnotPmYyICsgMSkgJiBNQVhfQl9GUkFNRVM7CglpZiAoKGNvdW50ID4gSFNDWF9CVUZNQVggKyAzKSB8fCAoY291bnQgPCA0KSB8fAoJICAgICgqKGJkYXRhICsgKHpwLT56MSAtIEJfU1VCX1ZBTCkpKSkgewoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfV0FSTikKCQkJZGVidWdsMShjcywgImhmY3BjaV9lbXB0eV9maWZvOiBpbmNvbWluZyBwYWNrZXQgaW52YWxpZCBsZW5ndGggJWQgb3IgY3JjIiwgY291bnQpOwojaWZkZWYgRVJST1JfU1RBVElTVElDCgkJYmNzLT5lcnJfaW52Kys7CiNlbmRpZgoJCWJ6LT56YVtuZXdfZjJdLnoyID0gbmV3X3oyOwoJCWJ6LT5mMiA9IG5ld19mMjsJLyogbmV4dCBidWZmZXIgKi8KCQlza2IgPSBOVUxMOwoJfSBlbHNlIGlmICghKHNrYiA9IGRldl9hbGxvY19za2IoY291bnQgLSAzKSkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDUENJOiByZWNlaXZlIG91dCBvZiBtZW1vcnlcbiIpOwoJZWxzZSB7CgkJdG90YWwgPSBjb3VudDsKCQljb3VudCAtPSAzOwoJCXB0ciA9IHNrYl9wdXQoc2tiLCBjb3VudCk7CgoJCWlmICh6cC0+ejIgKyBjb3VudCA8PSBCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkKCQkJbWF4bGVuID0gY291bnQ7CQkvKiBjb21wbGV0ZSB0cmFuc2ZlciAqLwoJCWVsc2UKCQkJbWF4bGVuID0gQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwgLSB6cC0+ejI7CS8qIG1heGltdW0gKi8KCgkJcHRyMSA9IGJkYXRhICsgKHpwLT56MiAtIEJfU1VCX1ZBTCk7CS8qIHN0YXJ0IG9mIGRhdGEgKi8KCQltZW1jcHkocHRyLCBwdHIxLCBtYXhsZW4pOwkvKiBjb3B5IGRhdGEgKi8KCQljb3VudCAtPSBtYXhsZW47CgoJCWlmIChjb3VudCkgewkvKiByZXN0IHJlbWFpbmluZyAqLwoJCQlwdHIgKz0gbWF4bGVuOwoJCQlwdHIxID0gYmRhdGE7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwoJCQltZW1jcHkocHRyLCBwdHIxLCBjb3VudCk7CS8qIHJlc3QgKi8KCQl9CgkJYnotPnphW25ld19mMl0uejIgPSBuZXdfejI7CgkJYnotPmYyID0gbmV3X2YyOwkvKiBuZXh0IGJ1ZmZlciAqLwoKCX0KCXJldHVybiAoc2tiKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEQtY2hhbm5lbCByZWNlaXZlIHByb2NlZHVyZSAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljCmludApyZWNlaXZlX2Rtc2coc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJaW50IG1heGxlbjsKCWludCByY250LCB0b3RhbDsKCWludCBjb3VudCA9IDU7Cgl1X2NoYXIgKnB0ciwgKnB0cjE7CglkZmlmb190eXBlICpkZjsKCXpfdHlwZSAqenA7CgoJZGYgPSAmKChmaWZvX2FyZWEgKikgKGNzLT5ody5oZmNwY2kuZmlmb3MpKS0+ZF9jaGFuLmRfcng7CglpZiAodGVzdF9hbmRfc2V0X2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpKSB7CgkJZGVidWdsMShjcywgInJlY19kbXNnIGJsb2NrZWQiKTsKCQlyZXR1cm4gKDEpOwoJfQoJd2hpbGUgKCgoZGYtPmYxICYgRF9GUkVHX01BU0spICE9IChkZi0+ZjIgJiBEX0ZSRUdfTUFTSykpICYmIGNvdW50LS0pIHsKCQl6cCA9ICZkZi0+emFbZGYtPmYyICYgRF9GUkVHX01BU0tdOwoJCXJjbnQgPSB6cC0+ejEgLSB6cC0+ejI7CgkJaWYgKHJjbnQgPCAwKQoJCQlyY250ICs9IERfRklGT19TSVpFOwoJCXJjbnQrKzsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2kgcmVjZCBmMSglZCkgZjIoJWQpIHoxKCV4KSB6MigleCkgY250KCVkKSIsCgkJCQlkZi0+ZjEsIGRmLT5mMiwgenAtPnoxLCB6cC0+ejIsIHJjbnQpOwoKCQlpZiAoKHJjbnQgPiBNQVhfREZSQU1FX0xFTiArIDMpIHx8IChyY250IDwgNCkgfHwKCQkgICAgKGRmLT5kYXRhW3pwLT56MV0pKSB7CgkJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfV0FSTikKCQkJCWRlYnVnbDEoY3MsICJlbXB0eV9maWZvIGhmY3BjaSBwYWtldCBpbnYuIGxlbiAlZCBvciBjcmMgJWQiLCByY250LCBkZi0+ZGF0YVt6cC0+ejFdKTsKI2lmZGVmIEVSUk9SX1NUQVRJU1RJQwoJCQljcy0+ZXJyX3J4Kys7CiNlbmRpZgoJCQlkZi0+ZjIgPSAoKGRmLT5mMiArIDEpICYgTUFYX0RfRlJBTUVTKSB8IChNQVhfRF9GUkFNRVMgKyAxKTsJLyogbmV4dCBidWZmZXIgKi8KCQkJZGYtPnphW2RmLT5mMiAmIERfRlJFR19NQVNLXS56MiA9ICh6cC0+ejIgKyByY250KSAmIChEX0ZJRk9fU0laRSAtIDEpOwoJCX0gZWxzZSBpZiAoKHNrYiA9IGRldl9hbGxvY19za2IocmNudCAtIDMpKSkgewoJCQl0b3RhbCA9IHJjbnQ7CgkJCXJjbnQgLT0gMzsKCQkJcHRyID0gc2tiX3B1dChza2IsIHJjbnQpOwoKCQkJaWYgKHpwLT56MiArIHJjbnQgPD0gRF9GSUZPX1NJWkUpCgkJCQltYXhsZW4gPSByY250OwkvKiBjb21wbGV0ZSB0cmFuc2ZlciAqLwoJCQllbHNlCgkJCQltYXhsZW4gPSBEX0ZJRk9fU0laRSAtIHpwLT56MjsJLyogbWF4aW11bSAqLwoKCQkJcHRyMSA9IGRmLT5kYXRhICsgenAtPnoyOwkvKiBzdGFydCBvZiBkYXRhICovCgkJCW1lbWNweShwdHIsIHB0cjEsIG1heGxlbik7CS8qIGNvcHkgZGF0YSAqLwoJCQlyY250IC09IG1heGxlbjsKCgkJCWlmIChyY250KSB7CS8qIHJlc3QgcmVtYWluaW5nICovCgkJCQlwdHIgKz0gbWF4bGVuOwoJCQkJcHRyMSA9IGRmLT5kYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQkJCW1lbWNweShwdHIsIHB0cjEsIHJjbnQpOwkvKiByZXN0ICovCgkJCX0KCQkJZGYtPmYyID0gKChkZi0+ZjIgKyAxKSAmIE1BWF9EX0ZSQU1FUykgfCAoTUFYX0RfRlJBTUVTICsgMSk7CS8qIG5leHQgYnVmZmVyICovCgkJCWRmLT56YVtkZi0+ZjIgJiBEX0ZSRUdfTUFTS10uejIgPSAoenAtPnoyICsgdG90YWwpICYgKERfRklGT19TSVpFIC0gMSk7CgoJCQlza2JfcXVldWVfdGFpbCgmY3MtPnJxLCBza2IpOwoJCQlzY2hlZF9ldmVudF9EX3BjaShjcywgRF9SQ1ZCVUZSRUFEWSk7CgkJfSBlbHNlCgkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhGQy1QQ0k6IEQgcmVjZWl2ZSBvdXQgb2YgbWVtb3J5XG4iKTsKCX0KCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJcmV0dXJuICgxKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGNoZWNrIGZvciB0cmFuc3BhcmVudCByZWNlaXZlIGRhdGEgYW5kIHJlYWQgbWF4IG9uZSB0aHJlc2hvbGQgc2l6ZSBpZiBhdmFpbCAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApoZmNwY2lfZW1wdHlfZmlmb190cmFucyhzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBiemZpZm9fdHlwZSAqIGJ6LCB1X2NoYXIgKiBiZGF0YSkKewoJdW5zaWduZWQgc2hvcnQgKnoxciwgKnoycjsKCWludCBuZXdfejIsIGZjbnQsIG1heGxlbjsKCXN0cnVjdCBza19idWZmICpza2I7Cgl1X2NoYXIgKnB0ciwgKnB0cjE7CgoJejFyID0gJmJ6LT56YVtNQVhfQl9GUkFNRVNdLnoxOwkJLyogcG9pbnRlciB0byB6IHJlZyAqLwoJejJyID0gejFyICsgMTsKCglpZiAoIShmY250ID0gKnoxciAtICp6MnIpKQoJCXJldHVybiAoMCk7CS8qIG5vIGRhdGEgYXZhaWwgKi8KCglpZiAoZmNudCA8PSAwKQoJCWZjbnQgKz0gQl9GSUZPX1NJWkU7CS8qIGJ5dGVzIGFjdHVhbGx5IGJ1ZmZlcmVkICovCglpZiAoZmNudCA+IEhGQ1BDSV9CVFJBTlNfVEhSRVNIT0xEKQoJCWZjbnQgPSBIRkNQQ0lfQlRSQU5TX1RIUkVTSE9MRDsJCS8qIGxpbWl0IHNpemUgKi8KCgluZXdfejIgPSAqejJyICsgZmNudDsJLyogbmV3IHBvc2l0aW9uIGluIGZpZm8gKi8KCWlmIChuZXdfejIgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKCQluZXdfejIgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCgoJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihmY250KSkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDUENJOiByZWNlaXZlIG91dCBvZiBtZW1vcnlcbiIpOwoJZWxzZSB7CgkJcHRyID0gc2tiX3B1dChza2IsIGZjbnQpOwoJCWlmICgqejJyICsgZmNudCA8PSBCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkKCQkJbWF4bGVuID0gZmNudDsJLyogY29tcGxldGUgdHJhbnNmZXIgKi8KCQllbHNlCgkJCW1heGxlbiA9IEJfRklGT19TSVpFICsgQl9TVUJfVkFMIC0gKnoycjsJLyogbWF4aW11bSAqLwoKCQlwdHIxID0gYmRhdGEgKyAoKnoyciAtIEJfU1VCX1ZBTCk7CS8qIHN0YXJ0IG9mIGRhdGEgKi8KCQltZW1jcHkocHRyLCBwdHIxLCBtYXhsZW4pOwkvKiBjb3B5IGRhdGEgKi8KCQlmY250IC09IG1heGxlbjsKCgkJaWYgKGZjbnQpIHsJLyogcmVzdCByZW1haW5pbmcgKi8KCQkJcHRyICs9IG1heGxlbjsKCQkJcHRyMSA9IGJkYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQkJbWVtY3B5KHB0ciwgcHRyMSwgZmNudCk7CS8qIHJlc3QgKi8KCQl9CgkJc2tiX3F1ZXVlX3RhaWwoJmJjcy0+cnF1ZXVlLCBza2IpOwoJCWhmY3BjaV9zY2hlZF9ldmVudChiY3MsIEJfUkNWQlVGUkVBRFkpOwoJfQoKCSp6MnIgPSBuZXdfejI7CQkvKiBuZXcgcG9zaXRpb24gKi8KCXJldHVybiAoMSk7Cn0JCQkJLyogaGZjcGNpX2VtcHR5X2ZpZm9fdHJhbnMgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBCLWNoYW5uZWwgbWFpbiByZWNlaXZlIHJvdXRpbmUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCm1haW5fcmVjX2hmY3BjaShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQp7CglzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSBiY3MtPmNzOwoJaW50IHJjbnQsIHJlYWxfZmlmbzsKCWludCByZWNlaXZlLCBjb3VudCA9IDU7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJYnpmaWZvX3R5cGUgKmJ6OwoJdV9jaGFyICpiZGF0YTsKCXpfdHlwZSAqenA7CgoKCWlmICgoYmNzLT5jaGFubmVsKSAmJiAoIWNzLT5ody5oZmNwY2kuYnN3YXBwZWQpKSB7CgkJYnogPSAmKChmaWZvX2FyZWEgKikgKGNzLT5ody5oZmNwY2kuZmlmb3MpKS0+Yl9jaGFucy5yeGJ6X2IyOwoJCWJkYXRhID0gKChmaWZvX2FyZWEgKikgKGNzLT5ody5oZmNwY2kuZmlmb3MpKS0+Yl9jaGFucy5yeGRhdF9iMjsKCQlyZWFsX2ZpZm8gPSAxOwoJfSBlbHNlIHsKCQlieiA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4YnpfYjE7CgkJYmRhdGEgPSAoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4ZGF0X2IxOwoJCXJlYWxfZmlmbyA9IDA7Cgl9CiAgICAgIEJlZ2luOgoJY291bnQtLTsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQlkZWJ1Z2wxKGNzLCAicmVjX2RhdGEgJWQgYmxvY2tlZCIsIGJjcy0+Y2hhbm5lbCk7CgkJcmV0dXJuOwoJfQoJaWYgKGJ6LT5mMSAhPSBiei0+ZjIpIHsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2kgcmVjICVkIGYxKCVkKSBmMiglZCkiLAoJCQkJYmNzLT5jaGFubmVsLCBiei0+ZjEsIGJ6LT5mMik7CgkJenAgPSAmYnotPnphW2J6LT5mMl07CgoJCXJjbnQgPSB6cC0+ejEgLSB6cC0+ejI7CgkJaWYgKHJjbnQgPCAwKQoJCQlyY250ICs9IEJfRklGT19TSVpFOwoJCXJjbnQrKzsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2kgcmVjICVkIHoxKCV4KSB6MigleCkgY250KCVkKSIsCgkJCQliY3MtPmNoYW5uZWwsIHpwLT56MSwgenAtPnoyLCByY250KTsKCQlpZiAoKHNrYiA9IGhmY3BjaV9lbXB0eV9maWZvKGJjcywgYnosIGJkYXRhLCByY250KSkpIHsKCQkJc2tiX3F1ZXVlX3RhaWwoJmJjcy0+cnF1ZXVlLCBza2IpOwoJCQloZmNwY2lfc2NoZWRfZXZlbnQoYmNzLCBCX1JDVkJVRlJFQURZKTsKCQl9CgkJcmNudCA9IGJ6LT5mMSAtIGJ6LT5mMjsKCQlpZiAocmNudCA8IDApCgkJCXJjbnQgKz0gTUFYX0JfRlJBTUVTICsgMTsKCQlpZiAoY3MtPmh3LmhmY3BjaS5sYXN0X2JmaWZvX2NudFtyZWFsX2ZpZm9dID4gcmNudCArIDEpIHsKCQkgICAgICAgIHJjbnQgPSAwOwoJCQloZmNwY2lfY2xlYXJfZmlmb19yeChjcywgcmVhbF9maWZvKTsKCQl9CgkJY3MtPmh3LmhmY3BjaS5sYXN0X2JmaWZvX2NudFtyZWFsX2ZpZm9dID0gcmNudDsKCQlpZiAocmNudCA+IDEpCgkJCXJlY2VpdmUgPSAxOwoJCWVsc2UKCQkJcmVjZWl2ZSA9IDA7Cgl9IGVsc2UgaWYgKGJjcy0+bW9kZSA9PSBMMV9NT0RFX1RSQU5TKQoJCXJlY2VpdmUgPSBoZmNwY2lfZW1wdHlfZmlmb190cmFucyhiY3MsIGJ6LCBiZGF0YSk7CgllbHNlCgkJcmVjZWl2ZSA9IDA7Cgl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKTsKCWlmIChjb3VudCAmJiByZWNlaXZlKQoJCWdvdG8gQmVnaW47CglyZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRC1jaGFubmVsIHNlbmQgcm91dGluZSAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmhmY3BjaV9maWxsX2RmaWZvKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJaW50IGZjbnQ7CglpbnQgY291bnQsIG5ld196MSwgbWF4bGVuOwoJZGZpZm9fdHlwZSAqZGY7Cgl1X2NoYXIgKnNyYywgKmRzdCwgbmV3X2YxOwoKCWlmICghY3MtPnR4X3NrYikKCQlyZXR1cm47CglpZiAoY3MtPnR4X3NrYi0+bGVuIDw9IDApCgkJcmV0dXJuOwoKCWRmID0gJigoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmRfY2hhbi5kX3R4OwoKCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfRGZpZm8gZjEoJWQpIGYyKCVkKSB6MShmMSkoJXgpIiwKCQkJZGYtPmYxLCBkZi0+ZjIsCgkJCWRmLT56YVtkZi0+ZjEgJiBEX0ZSRUdfTUFTS10uejEpOwoJZmNudCA9IGRmLT5mMSAtIGRmLT5mMjsJLyogZnJhbWUgY291bnQgYWN0dWFsbHkgYnVmZmVyZWQgKi8KCWlmIChmY250IDwgMCkKCQlmY250ICs9IChNQVhfRF9GUkFNRVMgKyAxKTsJLyogaWYgd3JhcCBhcm91bmQgKi8KCWlmIChmY250ID4gKE1BWF9EX0ZSQU1FUyAtIDEpKSB7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfRGZpZm8gbW9yZSBhcyAxNCBmcmFtZXMiKTsKI2lmZGVmIEVSUk9SX1NUQVRJU1RJQwoJCWNzLT5lcnJfdHgrKzsKI2VuZGlmCgkJcmV0dXJuOwoJfQoJLyogbm93IGRldGVybWluZSBmcmVlIGJ5dGVzIGluIEZJRk8gYnVmZmVyICovCgljb3VudCA9IGRmLT56YVtkZi0+ZjIgJiBEX0ZSRUdfTUFTS10uejIgLSBkZi0+emFbZGYtPmYxICYgRF9GUkVHX01BU0tdLnoxIC0gMTsKCWlmIChjb3VudCA8PSAwKQoJCWNvdW50ICs9IERfRklGT19TSVpFOwkvKiBjb3VudCBub3cgY29udGFpbnMgYXZhaWxhYmxlIGJ5dGVzICovCgoJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9EZmlmbyBjb3VudCglbGQvJWQpIiwKCQkJY3MtPnR4X3NrYi0+bGVuLCBjb3VudCk7CglpZiAoY291bnQgPCBjcy0+dHhfc2tiLT5sZW4pIHsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9EZmlmbyBubyBmaWZvIG1lbSIpOwoJCXJldHVybjsKCX0KCWNvdW50ID0gY3MtPnR4X3NrYi0+bGVuOwkvKiBnZXQgZnJhbWUgbGVuICovCgluZXdfejEgPSAoZGYtPnphW2RmLT5mMSAmIERfRlJFR19NQVNLXS56MSArIGNvdW50KSAmIChEX0ZJRk9fU0laRSAtIDEpOwoJbmV3X2YxID0gKChkZi0+ZjEgKyAxKSAmIERfRlJFR19NQVNLKSB8IChEX0ZSRUdfTUFTSyArIDEpOwoJc3JjID0gY3MtPnR4X3NrYi0+ZGF0YTsJLyogc291cmNlIHBvaW50ZXIgKi8KCWRzdCA9IGRmLT5kYXRhICsgZGYtPnphW2RmLT5mMSAmIERfRlJFR19NQVNLXS56MTsKCW1heGxlbiA9IERfRklGT19TSVpFIC0gZGYtPnphW2RmLT5mMSAmIERfRlJFR19NQVNLXS56MTsJCS8qIGVuZCBmaWZvICovCglpZiAobWF4bGVuID4gY291bnQpCgkJbWF4bGVuID0gY291bnQ7CS8qIGxpbWl0IHNpemUgKi8KCW1lbWNweShkc3QsIHNyYywgbWF4bGVuKTsJLyogZmlyc3QgY29weSAqLwoKCWNvdW50IC09IG1heGxlbjsJLyogcmVtYWluaW5nIGJ5dGVzICovCglpZiAoY291bnQpIHsKCQlkc3QgPSBkZi0+ZGF0YTsJLyogc3RhcnQgb2YgYnVmZmVyICovCgkJc3JjICs9IG1heGxlbjsJLyogbmV3IHBvc2l0aW9uICovCgkJbWVtY3B5KGRzdCwgc3JjLCBjb3VudCk7Cgl9CglkZi0+emFbbmV3X2YxICYgRF9GUkVHX01BU0tdLnoxID0gbmV3X3oxOwkvKiBmb3IgbmV4dCBidWZmZXIgKi8KCWRmLT56YVtkZi0+ZjEgJiBEX0ZSRUdfTUFTS10uejEgPSBuZXdfejE7CS8qIG5ldyBwb3MgYWN0dWFsIGJ1ZmZlciAqLwoJZGYtPmYxID0gbmV3X2YxOwkvKiBuZXh0IGZyYW1lICovCgoJZGV2X2tmcmVlX3NrYl9hbnkoY3MtPnR4X3NrYik7Cgljcy0+dHhfc2tiID0gTlVMTDsKCXJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBCLWNoYW5uZWwgc2VuZCByb3V0aW5lICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKaGZjcGNpX2ZpbGxfZmlmbyhzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQp7CglzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSBiY3MtPmNzOwoJaW50IG1heGxlbiwgZmNudDsKCWludCBjb3VudCwgbmV3X3oxOwoJYnpmaWZvX3R5cGUgKmJ6OwoJdV9jaGFyICpiZGF0YTsKCXVfY2hhciBuZXdfZjEsICpzcmMsICpkc3Q7Cgl1bnNpZ25lZCBzaG9ydCAqejF0LCAqejJ0OwoKCWlmICghYmNzLT50eF9za2IpCgkJcmV0dXJuOwoJaWYgKGJjcy0+dHhfc2tiLT5sZW4gPD0gMCkKCQlyZXR1cm47CgoJaWYgKChiY3MtPmNoYW5uZWwpICYmICghY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCkpIHsKCQlieiA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnR4YnpfYjI7CgkJYmRhdGEgPSAoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnR4ZGF0X2IyOwoJfSBlbHNlIHsKCQlieiA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnR4YnpfYjE7CgkJYmRhdGEgPSAoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnR4ZGF0X2IxOwoJfQoKCWlmIChiY3MtPm1vZGUgPT0gTDFfTU9ERV9UUkFOUykgewoJCXoxdCA9ICZiei0+emFbTUFYX0JfRlJBTUVTXS56MTsKCQl6MnQgPSB6MXQgKyAxOwoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX2ZpZm9fdHJhbnMgJWQgejEoJXgpIHoyKCV4KSIsCgkJCQliY3MtPmNoYW5uZWwsICp6MXQsICp6MnQpOwoJCWZjbnQgPSAqejJ0IC0gKnoxdDsKCQlpZiAoZmNudCA8PSAwKQoJCQlmY250ICs9IEJfRklGT19TSVpFOwkvKiBmY250IGNvbnRhaW5zIGF2YWlsYWJsZSBieXRlcyBpbiBmaWZvICovCgkJZmNudCA9IEJfRklGT19TSVpFIC0gZmNudDsJLyogcmVtYWluaW5nIGJ5dGVzIHRvIHNlbmQgKi8KCgkJd2hpbGUgKChmY250IDwgMiAqIEhGQ1BDSV9CVFJBTlNfVEhSRVNIT0xEKSAmJiAoYmNzLT50eF9za2IpKSB7CgkJCWlmIChiY3MtPnR4X3NrYi0+bGVuIDwgQl9GSUZPX1NJWkUgLSBmY250KSB7CgkJCQkvKiBkYXRhIGlzIHN1aXRhYmxlIGZvciBmaWZvICovCgkJCQljb3VudCA9IGJjcy0+dHhfc2tiLT5sZW47CgoJCQkJbmV3X3oxID0gKnoxdCArIGNvdW50OwkvKiBuZXcgYnVmZmVyIFBvc2l0aW9uICovCgkJCQlpZiAobmV3X3oxID49IChCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkpCgkJCQkJbmV3X3oxIC09IEJfRklGT19TSVpFOwkvKiBidWZmZXIgd3JhcCAqLwoJCQkJc3JjID0gYmNzLT50eF9za2ItPmRhdGE7CS8qIHNvdXJjZSBwb2ludGVyICovCgkJCQlkc3QgPSBiZGF0YSArICgqejF0IC0gQl9TVUJfVkFMKTsKCQkJCW1heGxlbiA9IChCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkgLSAqejF0OwkvKiBlbmQgb2YgZmlmbyAqLwoJCQkJaWYgKG1heGxlbiA+IGNvdW50KQoJCQkJCW1heGxlbiA9IGNvdW50OwkJLyogbGltaXQgc2l6ZSAqLwoJCQkJbWVtY3B5KGRzdCwgc3JjLCBtYXhsZW4pOwkvKiBmaXJzdCBjb3B5ICovCgoJCQkJY291bnQgLT0gbWF4bGVuOwkvKiByZW1haW5pbmcgYnl0ZXMgKi8KCQkJCWlmIChjb3VudCkgewoJCQkJCWRzdCA9IGJkYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQkJCQlzcmMgKz0gbWF4bGVuOwkvKiBuZXcgcG9zaXRpb24gKi8KCQkJCQltZW1jcHkoZHN0LCBzcmMsIGNvdW50KTsKCQkJCX0KCQkJCWJjcy0+dHhfY250IC09IGJjcy0+dHhfc2tiLT5sZW47CgkJCQlmY250ICs9IGJjcy0+dHhfc2tiLT5sZW47CgkJCQkqejF0ID0gbmV3X3oxOwkvKiBub3cgc2VuZCBkYXRhICovCgkJCX0gZWxzZSBpZiAoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCgkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfZmlmb190cmFucyAlZCBmcmFtZSBsZW5ndGggJWQgZGlzY2FyZGVkIiwKCQkJCQliY3MtPmNoYW5uZWwsIGJjcy0+dHhfc2tiLT5sZW4pOwoKCQkJaWYgKHRlc3RfYml0KEZMR19MTElfTDFXQUtFVVAsJmJjcy0+c3QtPmxsaS5mbGFnKSAmJgoJCQkJKFBBQ0tFVF9OT0FDSyAhPSBiY3MtPnR4X3NrYi0+cGt0X3R5cGUpKSB7CgkJCQl1X2xvbmcJZmxhZ3M7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNzLT5hY2xvY2ssIGZsYWdzKTsKCQkJCWJjcy0+YWNrY250ICs9IGJjcy0+dHhfc2tiLT5sZW47CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmFjbG9jaywgZmxhZ3MpOwoJCQkJc2NoZWR1bGVfZXZlbnQoYmNzLCBCX0FDS1BFTkRJTkcpOwoJCQl9CgoJCQlkZXZfa2ZyZWVfc2tiX2FueShiY3MtPnR4X3NrYik7CgkJCWJjcy0+dHhfc2tiID0gc2tiX2RlcXVldWUoJmJjcy0+c3F1ZXVlKTsJLyogZmV0Y2ggbmV4dCBkYXRhICovCgkJfQoJCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7CgkJcmV0dXJuOwoJfQoJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9IU0NYKQoJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9maWZvX2hkbGMgJWQgZjEoJWQpIGYyKCVkKSB6MShmMSkoJXgpIiwKCQkJYmNzLT5jaGFubmVsLCBiei0+ZjEsIGJ6LT5mMiwKCQkJYnotPnphW2J6LT5mMV0uejEpOwoKCWZjbnQgPSBiei0+ZjEgLSBiei0+ZjI7CS8qIGZyYW1lIGNvdW50IGFjdHVhbGx5IGJ1ZmZlcmVkICovCglpZiAoZmNudCA8IDApCgkJZmNudCArPSAoTUFYX0JfRlJBTUVTICsgMSk7CS8qIGlmIHdyYXAgYXJvdW5kICovCglpZiAoZmNudCA+IChNQVhfQl9GUkFNRVMgLSAxKSkgewoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX0JmaWZvIG1vcmUgYXMgMTQgZnJhbWVzIik7CgkJcmV0dXJuOwoJfQoJLyogbm93IGRldGVybWluZSBmcmVlIGJ5dGVzIGluIEZJRk8gYnVmZmVyICovCgljb3VudCA9IGJ6LT56YVtiei0+ZjJdLnoyIC0gYnotPnphW2J6LT5mMV0uejEgLSAxOwoJaWYgKGNvdW50IDw9IDApCgkJY291bnQgKz0gQl9GSUZPX1NJWkU7CS8qIGNvdW50IG5vdyBjb250YWlucyBhdmFpbGFibGUgYnl0ZXMgKi8KCglpZiAoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCgkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX2ZpZm8gJWQgY291bnQoJWxkLyVkKSwlbHgiLAoJCQliY3MtPmNoYW5uZWwsIGJjcy0+dHhfc2tiLT5sZW4sCgkJCWNvdW50LCBjdXJyZW50LT5zdGF0ZSk7CgoJaWYgKGNvdW50IDwgYmNzLT50eF9za2ItPmxlbikgewoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkKCQkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX2ZpZm8gbm8gZmlmbyBtZW0iKTsKCQlyZXR1cm47Cgl9Cgljb3VudCA9IGJjcy0+dHhfc2tiLT5sZW47CS8qIGdldCBmcmFtZSBsZW4gKi8KCW5ld196MSA9IGJ6LT56YVtiei0+ZjFdLnoxICsgY291bnQ7CS8qIG5ldyBidWZmZXIgUG9zaXRpb24gKi8KCWlmIChuZXdfejEgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKCQluZXdfejEgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCgoJbmV3X2YxID0gKChiei0+ZjEgKyAxKSAmIE1BWF9CX0ZSQU1FUyk7CglzcmMgPSBiY3MtPnR4X3NrYi0+ZGF0YTsJLyogc291cmNlIHBvaW50ZXIgKi8KCWRzdCA9IGJkYXRhICsgKGJ6LT56YVtiei0+ZjFdLnoxIC0gQl9TVUJfVkFMKTsKCW1heGxlbiA9IChCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkgLSBiei0+emFbYnotPmYxXS56MTsJCS8qIGVuZCBmaWZvICovCglpZiAobWF4bGVuID4gY291bnQpCgkJbWF4bGVuID0gY291bnQ7CS8qIGxpbWl0IHNpemUgKi8KCW1lbWNweShkc3QsIHNyYywgbWF4bGVuKTsJLyogZmlyc3QgY29weSAqLwoKCWNvdW50IC09IG1heGxlbjsJLyogcmVtYWluaW5nIGJ5dGVzICovCglpZiAoY291bnQpIHsKCQlkc3QgPSBiZGF0YTsJLyogc3RhcnQgb2YgYnVmZmVyICovCgkJc3JjICs9IG1heGxlbjsJLyogbmV3IHBvc2l0aW9uICovCgkJbWVtY3B5KGRzdCwgc3JjLCBjb3VudCk7Cgl9CgliY3MtPnR4X2NudCAtPSBiY3MtPnR4X3NrYi0+bGVuOwoJaWYgKHRlc3RfYml0KEZMR19MTElfTDFXQUtFVVAsJmJjcy0+c3QtPmxsaS5mbGFnKSAmJgoJCShQQUNLRVRfTk9BQ0sgIT0gYmNzLT50eF9za2ItPnBrdF90eXBlKSkgewoJCXVfbG9uZwlmbGFnczsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNzLT5hY2xvY2ssIGZsYWdzKTsKCQliY3MtPmFja2NudCArPSBiY3MtPnR4X3NrYi0+bGVuOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjcy0+YWNsb2NrLCBmbGFncyk7CgkJc2NoZWR1bGVfZXZlbnQoYmNzLCBCX0FDS1BFTkRJTkcpOwoJfQoKCWJ6LT56YVtuZXdfZjFdLnoxID0gbmV3X3oxOwkvKiBmb3IgbmV4dCBidWZmZXIgKi8KCWJ6LT5mMSA9IG5ld19mMTsJLyogbmV4dCBmcmFtZSAqLwoKCWRldl9rZnJlZV9za2JfYW55KGJjcy0+dHhfc2tiKTsKCWJjcy0+dHhfc2tiID0gTlVMTDsKCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7CglyZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBELWNoYW5uZWwgbDEgc3RhdGUgY2FsbCBmb3IgbGVhc2VkIE5ULW1vZGUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmRjaF9udF9sMmwxKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgcHIsIHZvaWQgKmFyZykKewoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICopIHN0LT5sMS5oYXJkd2FyZTsKCglzd2l0Y2ggKHByKSB7CgkJY2FzZSAoUEhfREFUQSB8IFJFUVVFU1QpOgoJCWNhc2UgKFBIX1BVTEwgfCBSRVFVRVNUKToKCQljYXNlIChQSF9QVUxMIHwgSU5ESUNBVElPTik6CgkJCXN0LT5sMS5sMWh3KHN0LCBwciwgYXJnKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfQUNUSVZBVEUgfCBSRVFVRVNUKToKCQkJc3QtPmwxLmwxbDIoc3QsIFBIX0FDVElWQVRFIHwgQ09ORklSTSwgTlVMTCk7CgkJCWJyZWFrOwoJCWNhc2UgKFBIX1RFU1RMT09QIHwgUkVRVUVTVCk6CgkJCWlmICgxICYgKGxvbmcpIGFyZykKCQkJCWRlYnVnbDEoY3MsICJQSF9URVNUX0xPT1AgQjEiKTsKCQkJaWYgKDIgJiAobG9uZykgYXJnKQoJCQkJZGVidWdsMShjcywgIlBIX1RFU1RfTE9PUCBCMiIpOwoJCQlpZiAoISgzICYgKGxvbmcpIGFyZykpCgkJCQlkZWJ1Z2wxKGNzLCAiUEhfVEVTVF9MT09QIERJU0FCTEVEIik7CgkJCXN0LT5sMS5sMWh3KHN0LCBIV19URVNUTE9PUCB8IFJFUVVFU1QsIGFyZyk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWlmIChjcy0+ZGVidWcpCgkJCQlkZWJ1Z2wxKGNzLCAiZGNoX250X2wybDEgbXNnICUwNFggdW5oYW5kbGVkIiwgcHIpOwoJCQlicmVhazsKCX0KfQoKCgovKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHNldC9yZXNldCBlY2hvIG1vZGUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CmhmY3BjaV9hdXhjbWQoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpc2RuX2N0cmwgKiBpYykKewoJdV9sb25nCWZsYWdzOwoJaW50CWkgPSAqKHVuc2lnbmVkIGludCAqKSBpYy0+cGFybS5udW07CgoJaWYgKChpYy0+YXJnID09IDk4KSAmJgoJICAgICghKGNzLT5ody5oZmNwY2kuaW50X20xICYgKEhGQ1BDSV9JTlRTX0IyVFJBTlMgKyBIRkNQQ0lfSU5UU19CMlJFQyArIEhGQ1BDSV9JTlRTX0IxVFJBTlMgKyBIRkNQQ0lfSU5UU19CMVJFQykpKSkgewoJICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DTEtERUwsIENMS0RFTF9OVCk7IC8qIFNULUJpdCBkZWxheSBmb3IgTlQtTW9kZSAqLwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgSEZDUENJX0xPQURfU1RBVEUgfCAwKTsJLyogSEZDIFNUIEcwICovCgkJdWRlbGF5KDEwKTsKCQljcy0+aHcuaGZjcGNpLnNjdHJsIHw9IFNDVFJMX01PREVfTlQ7CgkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU0NUUkwsIGNzLT5ody5oZmNwY2kuc2N0cmwpOwkvKiBzZXQgTlQtbW9kZSAqLwoJCXVkZWxheSgxMCk7CgkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCBIRkNQQ0lfTE9BRF9TVEFURSB8IDEpOwkvKiBIRkMgU1QgRzEgKi8KCQl1ZGVsYXkoMTApOwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgMSB8IEhGQ1BDSV9BQ1RJVkFURSB8IEhGQ1BDSV9ET19BQ1RJT04pOwoJCWNzLT5kYy5oZmNwY2kucGhfc3RhdGUgPSAxOwoJCWNzLT5ody5oZmNwY2kubnRfbW9kZSA9IDE7CgkJY3MtPmh3LmhmY3BjaS5udF90aW1lciA9IDA7CgkJY3MtPnN0bGlzdC0+bDIubDJsMSA9IGRjaF9udF9sMmwxOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJZGVidWdsMShjcywgIk5UIG1vZGUgYWN0aXZhdGVkIik7CgkJcmV0dXJuICgwKTsKCX0KCWlmICgoY3MtPmNoYW5saW1pdCA+IDEpIHx8IChjcy0+aHcuaGZjcGNpLmJzd2FwcGVkKSB8fAoJICAgIChjcy0+aHcuaGZjcGNpLm50X21vZGUpIHx8IChpYy0+YXJnICE9IDEyKSkKCQlyZXR1cm4gKC1FSU5WQUwpOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJaWYgKGkpIHsKCQljcy0+bG9nZWNobyA9IDE7CgkJY3MtPmh3LmhmY3BjaS50cm0gfD0gMHgyMDsJLyogZW5hYmxlIGVjaG8gY2hhbiAqLwoJCWNzLT5ody5oZmNwY2kuaW50X20xIHw9IEhGQ1BDSV9JTlRTX0IyUkVDOwoJCWNzLT5ody5oZmNwY2kuZmlmb19lbiB8PSBIRkNQQ0lfRklGT0VOX0IyUlg7Cgl9IGVsc2UgewoJCWNzLT5sb2dlY2hvID0gMDsKCQljcy0+aHcuaGZjcGNpLnRybSAmPSB+MHgyMDsJLyogZGlzYWJsZSBlY2hvIGNoYW4gKi8KCQljcy0+aHcuaGZjcGNpLmludF9tMSAmPSB+SEZDUENJX0lOVFNfQjJSRUM7CgkJY3MtPmh3LmhmY3BjaS5maWZvX2VuICY9IH5IRkNQQ0lfRklGT0VOX0IyUlg7Cgl9Cgljcy0+aHcuaGZjcGNpLnNjdHJsX3IgJj0gflNDVFJMX0IyX0VOQTsKCWNzLT5ody5oZmNwY2kuc2N0cmwgJj0gflNDVFJMX0IyX0VOQTsKCWNzLT5ody5oZmNwY2kuY29ubiB8PSAweDEwOwkvKiBCMi1JT00gLT4gQjItU1QgKi8KCWNzLT5ody5oZmNwY2kuY3RtdCAmPSB+MjsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0NUTVQsIGNzLT5ody5oZmNwY2kuY3RtdCk7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TQ1RSTF9SLCBjcy0+aHcuaGZjcGNpLnNjdHJsX3IpOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU0NUUkwsIGNzLT5ody5oZmNwY2kuc2N0cmwpOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ09OTkVDVCwgY3MtPmh3LmhmY3BjaS5jb25uKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1RSTSwgY3MtPmh3LmhmY3BjaS50cm0pOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMSwgY3MtPmh3LmhmY3BjaS5pbnRfbTEpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCXJldHVybiAoMCk7Cn0JCQkJLyogaGZjcGNpX2F1eGNtZCAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBFLWNoYW5uZWwgcmVjZWl2ZSByb3V0aW5lICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKcmVjZWl2ZV9lbXNnKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJaW50IHJjbnQ7CglpbnQgcmVjZWl2ZSwgY291bnQgPSA1OwoJYnpmaWZvX3R5cGUgKmJ6OwoJdV9jaGFyICpiZGF0YTsKCXpfdHlwZSAqenA7Cgl1X2NoYXIgKnB0ciwgKnB0cjEsIG5ld19mMjsKCWludCB0b3RhbCwgbWF4bGVuLCBuZXdfejI7Cgl1X2NoYXIgZV9idWZmZXJbMjU2XTsKCglieiA9ICYoKGZpZm9fYXJlYSAqKSAoY3MtPmh3LmhmY3BjaS5maWZvcykpLT5iX2NoYW5zLnJ4YnpfYjI7CgliZGF0YSA9ICgoZmlmb19hcmVhICopIChjcy0+aHcuaGZjcGNpLmZpZm9zKSktPmJfY2hhbnMucnhkYXRfYjI7CiAgICAgIEJlZ2luOgoJY291bnQtLTsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQlkZWJ1Z2wxKGNzLCAiZWNob19yZWNfZGF0YSBibG9ja2VkIik7CgkJcmV0dXJuOwoJfQoJaWYgKGJ6LT5mMSAhPSBiei0+ZjIpIHsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2kgZV9yZWMgZjEoJWQpIGYyKCVkKSIsCgkJCQliei0+ZjEsIGJ6LT5mMik7CgkJenAgPSAmYnotPnphW2J6LT5mMl07CgoJCXJjbnQgPSB6cC0+ejEgLSB6cC0+ejI7CgkJaWYgKHJjbnQgPCAwKQoJCQlyY250ICs9IEJfRklGT19TSVpFOwoJCXJjbnQrKzsKCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCWRlYnVnbDEoY3MsICJoZmNwY2kgZV9yZWMgejEoJXgpIHoyKCV4KSBjbnQoJWQpIiwKCQkJCXpwLT56MSwgenAtPnoyLCByY250KTsKCQluZXdfejIgPSB6cC0+ejIgKyByY250OwkJLyogbmV3IHBvc2l0aW9uIGluIGZpZm8gKi8KCQlpZiAobmV3X3oyID49IChCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCkpCgkJCW5ld196MiAtPSBCX0ZJRk9fU0laRTsJLyogYnVmZmVyIHdyYXAgKi8KCQluZXdfZjIgPSAoYnotPmYyICsgMSkgJiBNQVhfQl9GUkFNRVM7CgkJaWYgKChyY250ID4gMjU2ICsgMykgfHwgKGNvdW50IDwgNCkgfHwKCQkgICAgKCooYmRhdGEgKyAoenAtPnoxIC0gQl9TVUJfVkFMKSkpKSB7CgkJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfV0FSTikKCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZW1wdHlfZWNoYW46IGluY29taW5nIHBhY2tldCBpbnZhbGlkIGxlbmd0aCAlZCBvciBjcmMiLCByY250KTsKCQkJYnotPnphW25ld19mMl0uejIgPSBuZXdfejI7CgkJCWJ6LT5mMiA9IG5ld19mMjsJLyogbmV4dCBidWZmZXIgKi8KCQl9IGVsc2UgewoJCQl0b3RhbCA9IHJjbnQ7CgkJCXJjbnQgLT0gMzsKCQkJcHRyID0gZV9idWZmZXI7CgoJCQlpZiAoenAtPnoyIDw9IEJfRklGT19TSVpFICsgQl9TVUJfVkFMKQoJCQkJbWF4bGVuID0gcmNudDsJLyogY29tcGxldGUgdHJhbnNmZXIgKi8KCQkJZWxzZQoJCQkJbWF4bGVuID0gQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwgLSB6cC0+ejI7CS8qIG1heGltdW0gKi8KCgkJCXB0cjEgPSBiZGF0YSArICh6cC0+ejIgLSBCX1NVQl9WQUwpOwkvKiBzdGFydCBvZiBkYXRhICovCgkJCW1lbWNweShwdHIsIHB0cjEsIG1heGxlbik7CS8qIGNvcHkgZGF0YSAqLwoJCQlyY250IC09IG1heGxlbjsKCgkJCWlmIChyY250KSB7CS8qIHJlc3QgcmVtYWluaW5nICovCgkJCQlwdHIgKz0gbWF4bGVuOwoJCQkJcHRyMSA9IGJkYXRhOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KCQkJCW1lbWNweShwdHIsIHB0cjEsIHJjbnQpOwkvKiByZXN0ICovCgkJCX0KCQkJYnotPnphW25ld19mMl0uejIgPSBuZXdfejI7CgkJCWJ6LT5mMiA9IG5ld19mMjsJLyogbmV4dCBidWZmZXIgKi8KCQkJaWYgKGNzLT5kZWJ1ZyAmIERFQl9ETE9HX0hFWCkgewoJCQkJcHRyID0gY3MtPmRsb2c7CgkJCQlpZiAoKHRvdGFsIC0gMykgPCBNQVhfRExPR19TUEFDRSAvIDMgLSAxMCkgewoJCQkJCSpwdHIrKyA9ICdFJzsKCQkJCQkqcHRyKysgPSAnQyc7CgkJCQkJKnB0cisrID0gJ0gnOwoJCQkJCSpwdHIrKyA9ICdPJzsKCQkJCQkqcHRyKysgPSAnOic7CgkJCQkJcHRyICs9IFF1aWNrSGV4KHB0ciwgZV9idWZmZXIsIHRvdGFsIC0gMyk7CgkJCQkJcHRyLS07CgkJCQkJKnB0cisrID0gJ1xuJzsKCQkJCQkqcHRyID0gMDsKCQkJCQlIaVNheF9wdXRzdGF0dXMoY3MsIE5VTEwsIGNzLT5kbG9nKTsKCQkJCX0gZWxzZQoJCQkJCUhpU2F4X3B1dHN0YXR1cyhjcywgIkxvZ0VjaG86ICIsICJ3YXJuaW5nIEZyYW1lIHRvbyBiaWcgKCVkKSIsIHRvdGFsIC0gMyk7CgkJCX0KCQl9CgoJCXJjbnQgPSBiei0+ZjEgLSBiei0+ZjI7CgkJaWYgKHJjbnQgPCAwKQoJCQlyY250ICs9IE1BWF9CX0ZSQU1FUyArIDE7CgkJaWYgKHJjbnQgPiAxKQoJCQlyZWNlaXZlID0gMTsKCQllbHNlCgkJCXJlY2VpdmUgPSAwOwoJfSBlbHNlCgkJcmVjZWl2ZSA9IDA7Cgl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKTsKCWlmIChjb3VudCAmJiByZWNlaXZlKQoJCWdvdG8gQmVnaW47CglyZXR1cm47Cn0JCQkJLyogcmVjZWl2ZV9lbXNnICovCgovKioqKioqKioqKioqKioqKioqKioqLwovKiBJbnRlcnJ1cHQgaGFuZGxlciAqLwovKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaXJxcmV0dXJuX3QKaGZjcGNpX2ludGVycnVwdChpbnQgaW50bm8sIHZvaWQgKmRldl9pZCkKewoJdV9sb25nIGZsYWdzOwoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gZGV2X2lkOwoJdV9jaGFyIGV4dmFsOwoJc3RydWN0IEJDU3RhdGUgKmJjczsKCWludCBjb3VudCA9IDE1OwoJdV9jaGFyIHZhbCwgc3RhdDsKCglpZiAoIShjcy0+aHcuaGZjcGNpLmludF9tMiAmIDB4MDgpKSB7CgkJZGVidWdsMShjcywgIkhGQy1QQ0k6IGludF9tMiAleCBub3QgaW5pdGlhbGlzZWQiLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CgkJcmV0dXJuIElSUV9OT05FOwkvKiBub3QgaW5pdGlhbGlzZWQgKi8KCX0KCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJaWYgKEhGQ1BDSV9BTllJTlQgJiAoc3RhdCA9IFJlYWRfaGZjKGNzLCBIRkNQQ0lfU1RBVFVTKSkpIHsKCQl2YWwgPSBSZWFkX2hmYyhjcywgSEZDUENJX0lOVF9TMSk7CgkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCQlkZWJ1Z2wxKGNzLCAiSEZDLVBDSTogc3RhdCglMDJ4KSBzMSglMDJ4KSIsIHN0YXQsIHZhbCk7Cgl9IGVsc2UgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIElSUV9OT05FOwoJfQoJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQoJCWRlYnVnbDEoY3MsICJIRkMtUENJIGlycSAleCAlcyIsIHZhbCwKCQkJdGVzdF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSA/CgkJCSJsb2NrZWQiIDogInVubG9ja2VkIik7Cgl2YWwgJj0gY3MtPmh3LmhmY3BjaS5pbnRfbTE7CglpZiAodmFsICYgMHg0MCkgewkvKiBzdGF0ZSBtYWNoaW5lIGlycSAqLwoJCWV4dmFsID0gUmVhZF9oZmMoY3MsIEhGQ1BDSV9TVEFURVMpICYgMHhmOwoJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKCQkJZGVidWdsMShjcywgInBoX3N0YXRlIGNoZyAlZC0+JWQiLCBjcy0+ZGMuaGZjcGNpLnBoX3N0YXRlLAoJCQkJZXh2YWwpOwoJCWNzLT5kYy5oZmNwY2kucGhfc3RhdGUgPSBleHZhbDsKCQlzY2hlZF9ldmVudF9EX3BjaShjcywgRF9MMVNUQVRFQ0hBTkdFKTsKCQl2YWwgJj0gfjB4NDA7Cgl9CglpZiAodmFsICYgMHg4MCkgewkvKiB0aW1lciBpcnEgKi8KCQlpZiAoY3MtPmh3LmhmY3BjaS5udF9tb2RlKSB7CgkJCWlmICgoLS1jcy0+aHcuaGZjcGNpLm50X3RpbWVyKSA8IDApCgkJCQlzY2hlZF9ldmVudF9EX3BjaShjcywgRF9MMVNUQVRFQ0hBTkdFKTsKCQl9CgkJdmFsICY9IH4weDgwOwoJCVdyaXRlX2hmYyhjcywgSEZDUENJX0NUTVQsIGNzLT5ody5oZmNwY2kuY3RtdCB8IEhGQ1BDSV9DTFRJTUVSKTsKCX0KCXdoaWxlICh2YWwpIHsKCQlpZiAodGVzdF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQljcy0+aHcuaGZjcGNpLmludF9zMSB8PSB2YWw7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCXJldHVybiBJUlFfSEFORExFRDsKCQl9CgkJaWYgKGNzLT5ody5oZmNwY2kuaW50X3MxICYgMHgxOCkgewoJCQlleHZhbCA9IHZhbDsKCQkJdmFsID0gY3MtPmh3LmhmY3BjaS5pbnRfczE7CgkJCWNzLT5ody5oZmNwY2kuaW50X3MxID0gZXh2YWw7CgkJfQoJCWlmICh2YWwgJiAweDA4KSB7CgkJCWlmICghKGJjcyA9IFNlbF9CQ1MoY3MsIGNzLT5ody5oZmNwY2kuYnN3YXBwZWQgPyAxIDogMCkpKSB7CgkJCQlpZiAoY3MtPmRlYnVnKQoJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2kgc3B1cmlvdXMgMHgwOCBJUlEiKTsKCQkJfSBlbHNlCgkJCQltYWluX3JlY19oZmNwY2koYmNzKTsKCQl9CgkJaWYgKHZhbCAmIDB4MTApIHsKCQkJaWYgKGNzLT5sb2dlY2hvKQoJCQkJcmVjZWl2ZV9lbXNnKGNzKTsKCQkJZWxzZSBpZiAoIShiY3MgPSBTZWxfQkNTKGNzLCAxKSkpIHsKCQkJCWlmIChjcy0+ZGVidWcpCgkJCQkJZGVidWdsMShjcywgImhmY3BjaSBzcHVyaW91cyAweDEwIElSUSIpOwoJCQl9IGVsc2UKCQkJCW1haW5fcmVjX2hmY3BjaShiY3MpOwoJCX0KCQlpZiAodmFsICYgMHgwMSkgewoJCQlpZiAoIShiY3MgPSBTZWxfQkNTKGNzLCBjcy0+aHcuaGZjcGNpLmJzd2FwcGVkID8gMSA6IDApKSkgewoJCQkJaWYgKGNzLT5kZWJ1ZykKCQkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpIHNwdXJpb3VzIDB4MDEgSVJRIik7CgkJCX0gZWxzZSB7CgkJCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQkJCQloZmNwY2lfZmlsbF9maWZvKGJjcyk7CgkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCX0gZWxzZQoJCQkJCQlkZWJ1Z2wxKGNzLCAiZmlsbF9kYXRhICVkIGJsb2NrZWQiLCBiY3MtPmNoYW5uZWwpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoKGJjcy0+dHhfc2tiID0gc2tiX2RlcXVldWUoJmJjcy0+c3F1ZXVlKSkpIHsKCQkJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQkJCQkJCWhmY3BjaV9maWxsX2ZpZm8oYmNzKTsKCQkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCWRlYnVnbDEoY3MsICJmaWxsX2RhdGEgJWQgYmxvY2tlZCIsIGJjcy0+Y2hhbm5lbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGZjcGNpX3NjaGVkX2V2ZW50KGJjcywgQl9YTVRCVUZSRUFEWSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWlmICh2YWwgJiAweDAyKSB7CgkJCWlmICghKGJjcyA9IFNlbF9CQ1MoY3MsIDEpKSkgewoJCQkJaWYgKGNzLT5kZWJ1ZykKCQkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpIHNwdXJpb3VzIDB4MDIgSVJRIik7CgkJCX0gZWxzZSB7CgkJCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQkJCQloZmNwY2lfZmlsbF9maWZvKGJjcyk7CgkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCX0gZWxzZQoJCQkJCQlkZWJ1Z2wxKGNzLCAiZmlsbF9kYXRhICVkIGJsb2NrZWQiLCBiY3MtPmNoYW5uZWwpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoKGJjcy0+dHhfc2tiID0gc2tiX2RlcXVldWUoJmJjcy0+c3F1ZXVlKSkpIHsKCQkJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQkJCQkJCWhmY3BjaV9maWxsX2ZpZm8oYmNzKTsKCQkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCWRlYnVnbDEoY3MsICJmaWxsX2RhdGEgJWQgYmxvY2tlZCIsIGJjcy0+Y2hhbm5lbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGZjcGNpX3NjaGVkX2V2ZW50KGJjcywgQl9YTVRCVUZSRUFEWSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWlmICh2YWwgJiAweDIwKSB7CS8qIHJlY2VpdmUgZGZyYW1lICovCgkJCXJlY2VpdmVfZG1zZyhjcyk7CgkJfQoJCWlmICh2YWwgJiAweDA0KSB7CS8qIGRmcmFtZSB0cmFuc21pdHRlZCAqLwoJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMR19EQlVTWV9USU1FUiwgJmNzLT5IV19GbGFncykpCgkJCQlkZWxfdGltZXIoJmNzLT5kYnVzeXRpbWVyKTsKCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfREJVU1ksICZjcy0+SFdfRmxhZ3MpKQoJCQkJc2NoZWRfZXZlbnRfRF9wY2koY3MsIERfQ0xFQVJCVVNZKTsKCQkJaWYgKGNzLT50eF9za2IpIHsKCQkJCWlmIChjcy0+dHhfc2tiLT5sZW4pIHsKCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKSkgewoJCQkJCQloZmNwY2lfZmlsbF9kZmlmbyhjcyk7CgkJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9kZmlmbyBpcnEgYmxvY2tlZCIpOwoJCQkJCX0KCQkJCQlnb3RvIGFmdGVyWFBSOwoJCQkJfSBlbHNlIHsKCQkJCQlkZXZfa2ZyZWVfc2tiX2lycShjcy0+dHhfc2tiKTsKCQkJCQljcy0+dHhfY250ID0gMDsKCQkJCQljcy0+dHhfc2tiID0gTlVMTDsKCQkJCX0KCQkJfQoJCQlpZiAoKGNzLT50eF9za2IgPSBza2JfZGVxdWV1ZSgmY3MtPnNxKSkpIHsKCQkJCWNzLT50eF9jbnQgPSAwOwoJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncykpIHsKCQkJCQloZmNwY2lfZmlsbF9kZmlmbyhjcyk7CgkJCQkJdGVzdF9hbmRfY2xlYXJfYml0KEZMR19MT0NLX0FUT01JQywgJmNzLT5IV19GbGFncyk7CgkJCQl9IGVsc2UgewoJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfZmlsbF9kZmlmbyBpcnEgYmxvY2tlZCIpOwoJCQkJfQoJCQl9IGVsc2UKCQkJCXNjaGVkX2V2ZW50X0RfcGNpKGNzLCBEX1hNVEJVRlJFQURZKTsKCQl9CgkgICAgICBhZnRlclhQUjoKCQlpZiAoY3MtPmh3LmhmY3BjaS5pbnRfczEgJiYgY291bnQtLSkgewoJCQl2YWwgPSBjcy0+aHcuaGZjcGNpLmludF9zMTsKCQkJY3MtPmh3LmhmY3BjaS5pbnRfczEgPSAwOwoJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJCQlkZWJ1Z2wxKGNzLCAiSEZDLVBDSSBpcnEgJXggbG9vcCAlZCIsIHZhbCwgMTUgLSBjb3VudCk7CgkJfSBlbHNlCgkJCXZhbCA9IDA7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHRpbWVyIGNhbGxiYWNrIGZvciBELWNoYW4gYnVzeSByZXNvbHV0aW9uLiBDdXJyZW50bHkgbm8gZnVuY3Rpb24gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfZGJ1c3lfdGltZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBMYXllciAxIEQtY2hhbm5lbCBoYXJkd2FyZSBhY2Nlc3MgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCkhGQ1BDSV9sMWh3KHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgcHIsIHZvaWQgKmFyZykKewoJdV9sb25nIGZsYWdzOwoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICopIHN0LT5sMS5oYXJkd2FyZTsKCXN0cnVjdCBza19idWZmICpza2IgPSBhcmc7CgoJc3dpdGNoIChwcikgewoJCWNhc2UgKFBIX0RBVEEgfCBSRVFVRVNUKToKCQkJaWYgKGNzLT5kZWJ1ZyAmIERFQl9ETE9HX0hFWCkKCQkJCUxvZ0ZyYW1lKGNzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKCQkJaWYgKGNzLT5kZWJ1ZyAmIERFQl9ETE9HX1ZFUkJPU0UpCgkJCQlkbG9nZnJhbWUoY3MsIHNrYiwgMCk7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlpZiAoY3MtPnR4X3NrYikgewoJCQkJc2tiX3F1ZXVlX3RhaWwoJmNzLT5zcSwgc2tiKTsKI2lmZGVmIEwyRlJBTUVfREVCVUcJCS8qIHBzYSAqLwoJCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9MQVBEKQoJCQkJCUxvZ2wyRnJhbWUoY3MsIHNrYiwgIlBIX0RBVEEgUXVldWVkIiwgMCk7CiNlbmRpZgoJCQl9IGVsc2UgewoJCQkJY3MtPnR4X3NrYiA9IHNrYjsKCQkJCWNzLT50eF9jbnQgPSAwOwojaWZkZWYgTDJGUkFNRV9ERUJVRwkJLyogcHNhICovCgkJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX0xBUEQpCgkJCQkJTG9nbDJGcmFtZShjcywgc2tiLCAiUEhfREFUQSIsIDApOwojZW5kaWYKCQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpKSB7CgkJCQkJaGZjcGNpX2ZpbGxfZGZpZm8oY3MpOwoJCQkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJCQkJfSBlbHNlCgkJCQkJZGVidWdsMShjcywgImhmY3BjaV9maWxsX2RmaWZvIGJsb2NrZWQiKTsKCgkJCX0KCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfUFVMTCB8IElORElDQVRJT04pOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJaWYgKGNzLT50eF9za2IpIHsKCQkJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfV0FSTikKCQkJCQlkZWJ1Z2wxKGNzLCAiIGwybDEgdHhfc2tiIGV4aXN0IHRoaXMgc2hvdWxkbid0IGhhcHBlbiIpOwoJCQkJc2tiX3F1ZXVlX3RhaWwoJmNzLT5zcSwgc2tiKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoY3MtPmRlYnVnICYgREVCX0RMT0dfSEVYKQoJCQkJTG9nRnJhbWUoY3MsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwoJCQlpZiAoY3MtPmRlYnVnICYgREVCX0RMT0dfVkVSQk9TRSkKCQkJCWRsb2dmcmFtZShjcywgc2tiLCAwKTsKCQkJY3MtPnR4X3NrYiA9IHNrYjsKCQkJY3MtPnR4X2NudCA9IDA7CiNpZmRlZiBMMkZSQU1FX0RFQlVHCQkvKiBwc2EgKi8KCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9MQVBEKQoJCQkJTG9nbDJGcmFtZShjcywgc2tiLCAiUEhfREFUQV9QVUxMRUQiLCAwKTsKI2VuZGlmCgkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpKSB7CgkJCQloZmNwY2lfZmlsbF9kZmlmbyhjcyk7CgkJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0xPQ0tfQVRPTUlDLCAmY3MtPkhXX0ZsYWdzKTsKCQkJfSBlbHNlCgkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2ZpbGxfZGZpZm8gYmxvY2tlZCIpOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChQSF9QVUxMIHwgUkVRVUVTVCk6CiNpZmRlZiBMMkZSQU1FX0RFQlVHCQkvKiBwc2EgKi8KCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9MQVBEKQoJCQkJZGVidWdsMShjcywgIi0+IFBIX1JFUVVFU1RfUFVMTCIpOwojZW5kaWYKCQkJaWYgKCFjcy0+dHhfc2tiKSB7CgkJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0wxX1BVTExfUkVRLCAmc3QtPmwxLkZsYWdzKTsKCQkJCXN0LT5sMS5sMWwyKHN0LCBQSF9QVUxMIHwgQ09ORklSTSwgTlVMTCk7CgkJCX0gZWxzZQoJCQkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTDFfUFVMTF9SRVEsICZzdC0+bDEuRmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChIV19SRVNFVCB8IFJFUVVFU1QpOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCBIRkNQQ0lfTE9BRF9TVEFURSB8IDMpOwkvKiBIRkMgU1QgMyAqLwoJCQl1ZGVsYXkoNik7CgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgMyk7CS8qIEhGQyBTVCAyICovCgkJCWNzLT5ody5oZmNwY2kubXN0X20gfD0gSEZDUENJX01BU1RFUjsKCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfTVNUX01PREUsIGNzLT5ody5oZmNwY2kubXN0X20pOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIEhGQ1BDSV9BQ1RJVkFURSB8IEhGQ1BDSV9ET19BQ1RJT04pOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlsMV9tc2coY3MsIEhXX1BPV0VSVVAgfCBDT05GSVJNLCBOVUxMKTsKCQkJYnJlYWs7CgkJY2FzZSAoSFdfRU5BQkxFIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIEhGQ1BDSV9ET19BQ1RJT04pOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIChIV19ERUFDVElWQVRFIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQljcy0+aHcuaGZjcGNpLm1zdF9tICY9IH5IRkNQQ0lfTUFTVEVSOwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9NU1RfTU9ERSwgY3MtPmh3LmhmY3BjaS5tc3RfbSk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgKEhXX0lORk8zIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQljcy0+aHcuaGZjcGNpLm1zdF9tIHw9IEhGQ1BDSV9NQVNURVI7CgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX01TVF9NT0RFLCBjcy0+aHcuaGZjcGNpLm1zdF9tKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAoSFdfVEVTVExPT1AgfCBSRVFVRVNUKToKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCXN3aXRjaCAoKGxvbmcpIGFyZykgewoJCQkJY2FzZSAoMSk6CgkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjFfU1NMLCAweDgwKTsJLyogdHggc2xvdCAqLwoJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX0IxX1JTTCwgMHg4MCk7CS8qIHJ4IHNsb3QgKi8KCQkJCQljcy0+aHcuaGZjcGNpLmNvbm4gPSAoY3MtPmh3LmhmY3BjaS5jb25uICYgfjcpIHwgMTsKCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DT05ORUNULCBjcy0+aHcuaGZjcGNpLmNvbm4pOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgKDIpOgoJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX0IyX1NTTCwgMHg4MSk7CS8qIHR4IHNsb3QgKi8KCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9CMl9SU0wsIDB4ODEpOwkvKiByeCBzbG90ICovCgkJCQkJY3MtPmh3LmhmY3BjaS5jb25uID0gKGNzLT5ody5oZmNwY2kuY29ubiAmIH4weDM4KSB8IDB4MDg7CgkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ09OTkVDVCwgY3MtPmh3LmhmY3BjaS5jb25uKTsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCQkJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9XQVJOKQoJCQkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2wxaHcgbG9vcCBpbnZhbGlkICU0bHgiLCAobG9uZykgYXJnKTsKCQkJCQlyZXR1cm47CgkJCX0KCQkJY3MtPmh3LmhmY3BjaS50cm0gfD0gMHg4MDsJLyogZW5hYmxlIElPTS1sb29wICovCgkJCVdyaXRlX2hmYyhjcywgSEZDUENJX1RSTSwgY3MtPmh3LmhmY3BjaS50cm0pOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpZiAoY3MtPmRlYnVnICYgTDFfREVCX1dBUk4pCgkJCQlkZWJ1Z2wxKGNzLCAiaGZjcGNpX2wxaHcgdW5rbm93biBwciAlNHgiLCBwcik7CgkJCWJyZWFrOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGNhbGxlZCBkdXJpbmcgaW5pdCBzZXR0aW5nIGwxIHN0YWNrIHBvaW50ZXIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApzZXRzdGFja19oZmNwY2koc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKewoJc3QtPmwxLmwxaHcgPSBIRkNQQ0lfbDFodzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBzZW5kIEItY2hhbm5lbCBkYXRhIGlmIG5vdCBibG9ja2VkICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKaGZjcGNpX3NlbmRfZGF0YShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQp7CglzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSBiY3MtPmNzOwoKCWlmICghdGVzdF9hbmRfc2V0X2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpKSB7CgkJaGZjcGNpX2ZpbGxfZmlmbyhiY3MpOwoJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTE9DS19BVE9NSUMsICZjcy0+SFdfRmxhZ3MpOwoJfSBlbHNlCgkJZGVidWdsMShjcywgInNlbmRfZGF0YSAlZCBibG9ja2VkIiwgYmNzLT5jaGFubmVsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogYWN0aXZhdGUvZGVhY3RpdmF0ZSBoYXJkd2FyZSBmb3Igc2VsZWN0ZWQgY2hhbm5lbHMgYW5kIG1vZGUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKbW9kZV9oZmNwY2koc3RydWN0IEJDU3RhdGUgKmJjcywgaW50IG1vZGUsIGludCBiYykKewoJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gYmNzLT5jczsKCWludCBmaWZvMjsKCglpZiAoY3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCgkJZGVidWdsMShjcywgIkhGQ1BDSSBiY2hhbm5lbCBtb2RlICVkIGJjaGFuICVkLyVkIiwKCQkJbW9kZSwgYmMsIGJjcy0+Y2hhbm5lbCk7CgliY3MtPm1vZGUgPSBtb2RlOwoJYmNzLT5jaGFubmVsID0gYmM7CglmaWZvMiA9IGJjOwoJaWYgKGNzLT5jaGFubGltaXQgPiAxKSB7CgkJY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCA9IDA7CS8qIEIxIGFuZCBCMiBub3JtYWwgbW9kZSAqLwoJCWNzLT5ody5oZmNwY2kuc2N0cmxfZSAmPSB+MHg4MDsKCX0gZWxzZSB7CgkJaWYgKGJjKSB7CgkJCWlmIChtb2RlICE9IEwxX01PREVfTlVMTCkgewoJCQkJY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCA9IDE7CS8qIEIxIGFuZCBCMiBleGNoYW5nZWQgKi8KCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfZSB8PSAweDgwOwoJCQl9IGVsc2UgewoJCQkJY3MtPmh3LmhmY3BjaS5ic3dhcHBlZCA9IDA7CS8qIEIxIGFuZCBCMiBub3JtYWwgbW9kZSAqLwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybF9lICY9IH4weDgwOwoJCQl9CgkJCWZpZm8yID0gMDsKCQl9IGVsc2UgewoJCQljcy0+aHcuaGZjcGNpLmJzd2FwcGVkID0gMDsJLyogQjEgYW5kIEIyIG5vcm1hbCBtb2RlICovCgkJCWNzLT5ody5oZmNwY2kuc2N0cmxfZSAmPSB+MHg4MDsKCQl9Cgl9Cglzd2l0Y2ggKG1vZGUpIHsKCQljYXNlIChMMV9NT0RFX05VTEwpOgoJCQlpZiAoYmMpIHsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmwgJj0gflNDVFJMX0IyX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciAmPSB+U0NUUkxfQjJfRU5BOwoJCQl9IGVsc2UgewoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybCAmPSB+U0NUUkxfQjFfRU5BOwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybF9yICY9IH5TQ1RSTF9CMV9FTkE7CgkJCX0KCQkJaWYgKGZpZm8yKSB7CgkJCQljcy0+aHcuaGZjcGNpLmZpZm9fZW4gJj0gfkhGQ1BDSV9GSUZPRU5fQjI7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSAmPSB+KEhGQ1BDSV9JTlRTX0IyVFJBTlMgKyBIRkNQQ0lfSU5UU19CMlJFQyk7CgkJCX0gZWxzZSB7CgkJCQljcy0+aHcuaGZjcGNpLmZpZm9fZW4gJj0gfkhGQ1BDSV9GSUZPRU5fQjE7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSAmPSB+KEhGQ1BDSV9JTlRTX0IxVFJBTlMgKyBIRkNQQ0lfSU5UU19CMVJFQyk7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAoTDFfTU9ERV9UUkFOUyk6CgkJICAgICAgICBoZmNwY2lfY2xlYXJfZmlmb19yeChjcywgZmlmbzIpOwoJCSAgICAgICAgaGZjcGNpX2NsZWFyX2ZpZm9fdHgoY3MsIGZpZm8yKTsKCQkJaWYgKGJjKSB7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsIHw9IFNDVFJMX0IyX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciB8PSBTQ1RSTF9CMl9FTkE7CgkJCX0gZWxzZSB7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsIHw9IFNDVFJMX0IxX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmxfciB8PSBTQ1RSTF9CMV9FTkE7CgkJCX0KCQkJaWYgKGZpZm8yKSB7CgkJCQljcy0+aHcuaGZjcGNpLmZpZm9fZW4gfD0gSEZDUENJX0ZJRk9FTl9CMjsKCQkJCWNzLT5ody5oZmNwY2kuaW50X20xIHw9IChIRkNQQ0lfSU5UU19CMlRSQU5TICsgSEZDUENJX0lOVFNfQjJSRUMpOwoJCQkJY3MtPmh3LmhmY3BjaS5jdG10IHw9IDI7CgkJCQljcy0+aHcuaGZjcGNpLmNvbm4gJj0gfjB4MTg7CgkJCX0gZWxzZSB7CgkJCQljcy0+aHcuaGZjcGNpLmZpZm9fZW4gfD0gSEZDUENJX0ZJRk9FTl9CMTsKCQkJCWNzLT5ody5oZmNwY2kuaW50X20xIHw9IChIRkNQQ0lfSU5UU19CMVRSQU5TICsgSEZDUENJX0lOVFNfQjFSRUMpOwoJCQkJY3MtPmh3LmhmY3BjaS5jdG10IHw9IDE7CgkJCQljcy0+aHcuaGZjcGNpLmNvbm4gJj0gfjB4MDM7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAoTDFfTU9ERV9IRExDKToKCQkgICAgICAgIGhmY3BjaV9jbGVhcl9maWZvX3J4KGNzLCBmaWZvMik7CgkJICAgICAgICBoZmNwY2lfY2xlYXJfZmlmb190eChjcywgZmlmbzIpOwoJCQlpZiAoYmMpIHsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmwgfD0gU0NUUkxfQjJfRU5BOwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybF9yIHw9IFNDVFJMX0IyX0VOQTsKCQkJfSBlbHNlIHsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmwgfD0gU0NUUkxfQjFfRU5BOwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybF9yIHw9IFNDVFJMX0IxX0VOQTsKCQkJfQoJCQlpZiAoZmlmbzIpIHsKCQkJICAgICAgICBjcy0+aHcuaGZjcGNpLmxhc3RfYmZpZm9fY250WzFdID0gMDsgIAoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjI7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSB8PSAoSEZDUENJX0lOVFNfQjJUUkFOUyArIEhGQ1BDSV9JTlRTX0IyUkVDKTsKCQkJCWNzLT5ody5oZmNwY2kuY3RtdCAmPSB+MjsKCQkJCWNzLT5ody5oZmNwY2kuY29ubiAmPSB+MHgxODsKCQkJfSBlbHNlIHsKCQkJICAgICAgICBjcy0+aHcuaGZjcGNpLmxhc3RfYmZpZm9fY250WzBdID0gMDsgIAoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjE7CgkJCQljcy0+aHcuaGZjcGNpLmludF9tMSB8PSAoSEZDUENJX0lOVFNfQjFUUkFOUyArIEhGQ1BDSV9JTlRTX0IxUkVDKTsKCQkJCWNzLT5ody5oZmNwY2kuY3RtdCAmPSB+MTsKCQkJCWNzLT5ody5oZmNwY2kuY29ubiAmPSB+MHgwMzsKCQkJfQoJCQlicmVhazsKCQljYXNlIChMMV9NT0RFX0VYVFJOKToKCQkJaWYgKGJjKSB7CgkJCQljcy0+aHcuaGZjcGNpLmNvbm4gfD0gMHgxMDsKCQkJCWNzLT5ody5oZmNwY2kuc2N0cmwgfD0gU0NUUkxfQjJfRU5BOwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybF9yIHw9IFNDVFJMX0IyX0VOQTsKCQkJCWNzLT5ody5oZmNwY2kuZmlmb19lbiAmPSB+SEZDUENJX0ZJRk9FTl9CMjsKCQkJCWNzLT5ody5oZmNwY2kuaW50X20xICY9IH4oSEZDUENJX0lOVFNfQjJUUkFOUyArIEhGQ1BDSV9JTlRTX0IyUkVDKTsKCQkJfSBlbHNlIHsKCQkJCWNzLT5ody5oZmNwY2kuY29ubiB8PSAweDAyOwoJCQkJY3MtPmh3LmhmY3BjaS5zY3RybCB8PSBTQ1RSTF9CMV9FTkE7CgkJCQljcy0+aHcuaGZjcGNpLnNjdHJsX3IgfD0gU0NUUkxfQjFfRU5BOwoJCQkJY3MtPmh3LmhmY3BjaS5maWZvX2VuICY9IH5IRkNQQ0lfRklGT0VOX0IxOwoJCQkJY3MtPmh3LmhmY3BjaS5pbnRfbTEgJj0gfihIRkNQQ0lfSU5UU19CMVRSQU5TICsgSEZDUENJX0lOVFNfQjFSRUMpOwoJCQl9CgkJCWJyZWFrOwoJfQoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU0NUUkxfRSwgY3MtPmh3LmhmY3BjaS5zY3RybF9lKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX0lOVF9NMSwgY3MtPmh3LmhmY3BjaS5pbnRfbTEpOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfRklGT19FTiwgY3MtPmh3LmhmY3BjaS5maWZvX2VuKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMLCBjcy0+aHcuaGZjcGNpLnNjdHJsKTsKCVdyaXRlX2hmYyhjcywgSEZDUENJX1NDVFJMX1IsIGNzLT5ody5oZmNwY2kuc2N0cmxfcik7CglXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DVE1ULCBjcy0+aHcuaGZjcGNpLmN0bXQpOwoJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ09OTkVDVCwgY3MtPmh3LmhmY3BjaS5jb25uKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogTGF5ZXIyIC0+IExheWVyIDEgVHJhbnNmZXIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKaGZjcGNpX2wybDEoc3RydWN0IFBTdGFjayAqc3QsIGludCBwciwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgQkNTdGF0ZQkqYmNzID0gc3QtPmwxLmJjczsKCXVfbG9uZwkJZmxhZ3M7CglzdHJ1Y3Qgc2tfYnVmZgkqc2tiID0gYXJnOwoKCXN3aXRjaCAocHIpIHsKCQljYXNlIChQSF9EQVRBIHwgUkVRVUVTVCk6CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCWlmIChiY3MtPnR4X3NrYikgewoJCQkJc2tiX3F1ZXVlX3RhaWwoJmJjcy0+c3F1ZXVlLCBza2IpOwoJCQl9IGVsc2UgewoJCQkJYmNzLT50eF9za2IgPSBza2I7Ci8vCQkJCXRlc3RfYW5kX3NldF9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpOwogCQkJCWJjcy0+Y3MtPkJDX1NlbmRfRGF0YShiY3MpOwoJCQl9CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfUFVMTCB8IElORElDQVRJT04pOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNzLT5jcy0+bG9jaywgZmxhZ3MpOwoJCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmY19sMmwxOiB0aGlzIHNob3VsZG4ndCBoYXBwZW5cbiIpOwoJCQkJYnJlYWs7CgkJCX0KLy8JCQl0ZXN0X2FuZF9zZXRfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKTsKCQkJYmNzLT50eF9za2IgPSBza2I7CgkJCWJjcy0+Y3MtPkJDX1NlbmRfRGF0YShiY3MpOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgKFBIX1BVTEwgfCBSRVFVRVNUKToKCQkJaWYgKCFiY3MtPnR4X3NrYikgewoJCQkJdGVzdF9hbmRfY2xlYXJfYml0KEZMR19MMV9QVUxMX1JFUSwgJnN0LT5sMS5GbGFncyk7CgkJCQlzdC0+bDEubDFsMihzdCwgUEhfUFVMTCB8IENPTkZJUk0sIE5VTEwpOwoJCQl9IGVsc2UKCQkJCXRlc3RfYW5kX3NldF9iaXQoRkxHX0wxX1BVTExfUkVRLCAmc3QtPmwxLkZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfQUNUSVZBVEUgfCBSRVFVRVNUKToKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQkJdGVzdF9hbmRfc2V0X2JpdChCQ19GTEdfQUNUSVYsICZiY3MtPkZsYWcpOwoJCQltb2RlX2hmY3BjaShiY3MsIHN0LT5sMS5tb2RlLCBzdC0+bDEuYmMpOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJCWwxX21zZ19iKHN0LCBwciwgYXJnKTsKCQkJYnJlYWs7CgkJY2FzZSAoUEhfREVBQ1RJVkFURSB8IFJFUVVFU1QpOgoJCQlsMV9tc2dfYihzdCwgcHIsIGFyZyk7CgkJCWJyZWFrOwoJCWNhc2UgKFBIX0RFQUNUSVZBVEUgfCBDT05GSVJNKToKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQkJdGVzdF9hbmRfY2xlYXJfYml0KEJDX0ZMR19BQ1RJViwgJmJjcy0+RmxhZyk7CgkJCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7CgkJCW1vZGVfaGZjcGNpKGJjcywgMCwgc3QtPmwxLmJjKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNzLT5jcy0+bG9jaywgZmxhZ3MpOwoJCQlzdC0+bDEubDFsMihzdCwgUEhfREVBQ1RJVkFURSB8IENPTkZJUk0sIE5VTEwpOwoJCQlicmVhazsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogZGVhY3RpdmF0ZSBCLWNoYW5uZWwgYWNjZXNzIGFuZCBxdWV1ZXMgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY2xvc2VfaGZjcGNpKHN0cnVjdCBCQ1N0YXRlICpiY3MpCnsKCW1vZGVfaGZjcGNpKGJjcywgMCwgYmNzLT5jaGFubmVsKTsKCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0lOSVQsICZiY3MtPkZsYWcpKSB7CgkJc2tiX3F1ZXVlX3B1cmdlKCZiY3MtPnJxdWV1ZSk7CgkJc2tiX3F1ZXVlX3B1cmdlKCZiY3MtPnNxdWV1ZSk7CgkJaWYgKGJjcy0+dHhfc2tiKSB7CgkJCWRldl9rZnJlZV9za2JfYW55KGJjcy0+dHhfc2tiKTsKCQkJYmNzLT50eF9za2IgPSBOVUxMOwoJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpOwoJCX0KCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGluaXQgQi1jaGFubmVsIHF1ZXVlcyBhbmQgY29udHJvbCAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApvcGVuX2hmY3BjaXN0YXRlKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgc3RydWN0IEJDU3RhdGUgKmJjcykKewoJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJDX0ZMR19JTklULCAmYmNzLT5GbGFnKSkgewoJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmJjcy0+cnF1ZXVlKTsKCQlza2JfcXVldWVfaGVhZF9pbml0KCZiY3MtPnNxdWV1ZSk7Cgl9CgliY3MtPnR4X3NrYiA9IE5VTEw7Cgl0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpOwoJYmNzLT5ldmVudCA9IDA7CgliY3MtPnR4X2NudCA9IDA7CglyZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBpbml0cyB0aGUgc3RhY2sgZm9yIEItY2hhbm5lbCAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CnNldHN0YWNrXzJiKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQp7CgliY3MtPmNoYW5uZWwgPSBzdC0+bDEuYmM7CglpZiAob3Blbl9oZmNwY2lzdGF0ZShzdC0+bDEuaGFyZHdhcmUsIGJjcykpCgkJcmV0dXJuICgtMSk7CglzdC0+bDEuYmNzID0gYmNzOwoJc3QtPmwyLmwybDEgPSBoZmNwY2lfbDJsMTsKCXNldHN0YWNrX21hbmFnZXIoc3QpOwoJYmNzLT5zdCA9IHN0OwoJc2V0c3RhY2tfbDFfQihzdCk7CglyZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBoYW5kbGUgTDEgc3RhdGUgY2hhbmdlcyAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApoZmNwY2lfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQp7CglzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPQoJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSwgdHF1ZXVlKTsKCXVfbG9uZwlmbGFnczsKLy8gICAgICBzdHJ1Y3QgUFN0YWNrICpzdHB0cjsKCglpZiAoIWNzKQoJCXJldHVybjsKCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRF9MMVNUQVRFQ0hBTkdFLCAmY3MtPmV2ZW50KSkgewoJCWlmICghY3MtPmh3LmhmY3BjaS5udF9tb2RlKQoJCQlzd2l0Y2ggKGNzLT5kYy5oZmNwY2kucGhfc3RhdGUpIHsKCQkJCWNhc2UgKDApOgoJCQkJCWwxX21zZyhjcywgSFdfUkVTRVQgfCBJTkRJQ0FUSU9OLCBOVUxMKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgKDMpOgoJCQkJCWwxX21zZyhjcywgSFdfREVBQ1RJVkFURSB8IElORElDQVRJT04sIE5VTEwpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAoOCk6CgkJCQkJbDFfbXNnKGNzLCBIV19SU1lOQyB8IElORElDQVRJT04sIE5VTEwpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAoNik6CgkJCQkJbDFfbXNnKGNzLCBIV19JTkZPMiB8IElORElDQVRJT04sIE5VTEwpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAoNyk6CgkJCQkJbDFfbXNnKGNzLCBIV19JTkZPNF9QOCB8IElORElDQVRJT04sIE5VTEwpOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQl9IGVsc2UgewoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJc3dpdGNoIChjcy0+ZGMuaGZjcGNpLnBoX3N0YXRlKSB7CgkJCQljYXNlICgyKToKCQkJCQlpZiAoY3MtPmh3LmhmY3BjaS5udF90aW1lciA8IDApIHsKCQkJCQkJY3MtPmh3LmhmY3BjaS5udF90aW1lciA9IDA7CgkJCQkJCWNzLT5ody5oZmNwY2kuaW50X20xICY9IH5IRkNQQ0lfSU5UU19USU1FUjsKCQkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00xLCBjcy0+aHcuaGZjcGNpLmludF9tMSk7CgkJCQkJCS8qIENsZWFyIGFscmVhZHkgcGVuZGluZyBpbnRzICovCgkJCQkJCWlmIChSZWFkX2hmYyhjcywgSEZDUENJX0lOVF9TMSkpOwoJCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9TVEFURVMsIDQgfCBIRkNQQ0lfTE9BRF9TVEFURSk7CgkJCQkJCXVkZWxheSgxMCk7CgkJCQkJCVdyaXRlX2hmYyhjcywgSEZDUENJX1NUQVRFUywgNCk7CgkJCQkJCWNzLT5kYy5oZmNwY2kucGhfc3RhdGUgPSA0OwoJCQkJCX0gZWxzZSB7CgkJCQkJCWNzLT5ody5oZmNwY2kuaW50X20xIHw9IEhGQ1BDSV9JTlRTX1RJTUVSOwoJCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9JTlRfTTEsIGNzLT5ody5oZmNwY2kuaW50X20xKTsKCQkJCQkJY3MtPmh3LmhmY3BjaS5jdG10ICY9IH5IRkNQQ0lfQVVUT19USU1FUjsKCQkJCQkJY3MtPmh3LmhmY3BjaS5jdG10IHw9IEhGQ1BDSV9USU0zXzEyNTsKCQkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQ1RNVCwgY3MtPmh3LmhmY3BjaS5jdG10IHwgSEZDUENJX0NMVElNRVIpOwoJCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9DVE1ULCBjcy0+aHcuaGZjcGNpLmN0bXQgfCBIRkNQQ0lfQ0xUSU1FUik7CgkJCQkJCWNzLT5ody5oZmNwY2kubnRfdGltZXIgPSBOVF9UMV9DT1VOVDsKCQkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfU1RBVEVTLCAyIHwgSEZDUENJX05UX0cyX0czKTsJLyogYWxsb3cgRzIgLT4gRzMgdHJhbnNpdGlvbiAqLwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgKDEpOgoJCQkJY2FzZSAoMyk6CgkJCQljYXNlICg0KToKCQkJCQljcy0+aHcuaGZjcGNpLm50X3RpbWVyID0gMDsKCQkJCQljcy0+aHcuaGZjcGNpLmludF9tMSAmPSB+SEZDUENJX0lOVFNfVElNRVI7CgkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00xLCBjcy0+aHcuaGZjcGNpLmludF9tMSk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQl9CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJfQoJfQoJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEX1JDVkJVRlJFQURZLCAmY3MtPmV2ZW50KSkKCQlEQ2hhbm5lbF9wcm9jX3Jjdihjcyk7CglpZiAodGVzdF9hbmRfY2xlYXJfYml0KERfWE1UQlVGUkVBRFksICZjcy0+ZXZlbnQpKQoJCURDaGFubmVsX3Byb2NfeG10KGNzKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogY2FsbGVkIGZvciBjYXJkIGluaXQgbWVzc2FnZSAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmluaXRoZmNwY2koc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7Cgljcy0+YmNzWzBdLkJDX1NldFN0YWNrID0gc2V0c3RhY2tfMmI7Cgljcy0+YmNzWzFdLkJDX1NldFN0YWNrID0gc2V0c3RhY2tfMmI7Cgljcy0+YmNzWzBdLkJDX0Nsb3NlID0gY2xvc2VfaGZjcGNpOwoJY3MtPmJjc1sxXS5CQ19DbG9zZSA9IGNsb3NlX2hmY3BjaTsKCWNzLT5kYnVzeXRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgaGZjcGNpX2RidXN5X3RpbWVyOwoJY3MtPmRidXN5dGltZXIuZGF0YSA9IChsb25nKSBjczsKCWluaXRfdGltZXIoJmNzLT5kYnVzeXRpbWVyKTsKCW1vZGVfaGZjcGNpKGNzLT5iY3MsIDAsIDApOwoJbW9kZV9oZmNwY2koY3MtPmJjcyArIDEsIDAsIDEpOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBoYW5kbGUgY2FyZCBtZXNzYWdlcyBmcm9tIGNvbnRyb2wgbGF5ZXIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKaGZjcGNpX2NhcmRfbXNnKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IG10LCB2b2lkICphcmcpCnsKCXVfbG9uZyBmbGFnczsKCglpZiAoY3MtPmRlYnVnICYgTDFfREVCX0lTQUMpCgkJZGVidWdsMShjcywgIkhGQ1BDSTogY2FyZF9tc2cgJXgiLCBtdCk7Cglzd2l0Y2ggKG10KSB7CgkJY2FzZSBDQVJEX1JFU0VUOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJcmVzZXRfaGZjcGNpKGNzKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJcmV0dXJuICgwKTsKCQljYXNlIENBUkRfUkVMRUFTRToKCQkJcmVsZWFzZV9pb19oZmNwY2koY3MpOwoJCQlyZXR1cm4gKDApOwoJCWNhc2UgQ0FSRF9JTklUOgoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKCQkJaW5pdGhmY3BjaShjcyk7CgkJCXJlc2V0X2hmY3BjaShjcyk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCW1zbGVlcCg4MCk7CQkJCS8qIFRpbWVvdXQgODBtcyAqLwoJCQkvKiBub3cgc3dpdGNoIHRpbWVyIGludGVycnVwdCBvZmYgKi8KCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCWNzLT5ody5oZmNwY2kuaW50X20xICY9IH5IRkNQQ0lfSU5UU19USU1FUjsKCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00xLCBjcy0+aHcuaGZjcGNpLmludF9tMSk7CgkJCS8qIHJlaW5pdCBtb2RlIHJlZyAqLwoJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9NU1RfTU9ERSwgY3MtPmh3LmhmY3BjaS5tc3RfbSk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJCXJldHVybiAoMCk7CgkJY2FzZSBDQVJEX1RFU1Q6CgkJCXJldHVybiAoMCk7Cgl9CglyZXR1cm4gKDApOwp9CgoKLyogdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGFzIGNhcmQgaW5kZXggd2hlbiBtb3JlIHRoYW4gb25lIGNhcmRzIGFyZSBwcmVzZW50ICovCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqZGV2X2hmY3BjaSBfX2RldmluaXRkYXRhID0gTlVMTDsKCiNlbmRpZgkJCQkvKiBDT05GSUdfUENJICovCgppbnQgX19kZXZpbml0CnNldHVwX2hmY3BjaShzdHJ1Y3QgSXNkbkNhcmQgKmNhcmQpCnsKCXVfbG9uZyBmbGFnczsKCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGNhcmQtPmNzOwoJY2hhciB0bXBbNjRdOwoJaW50IGk7CglzdHJ1Y3QgcGNpX2RldiAqdG1wX2hmY3BjaSA9IE5VTEw7CgojaWZkZWYgX19CSUdfRU5ESUFOCiNlcnJvciAibm90IHJ1bm5pbmcgb24gYmlnIGVuZGlhbiBtYWNoaW5lcyBub3ciCiNlbmRpZgoJc3RyY3B5KHRtcCwgaGZjcGNpX3JldmlzaW9uKTsKCXByaW50ayhLRVJOX0lORk8gIkhpU2F4OiBIRkMtUENJIGRyaXZlciBSZXYuICVzXG4iLCBIaVNheF9nZXRyZXYodG1wKSk7CiNpZmRlZiBDT05GSUdfUENJCgljcy0+aHcuaGZjcGNpLmludF9zMSA9IDA7Cgljcy0+ZGMuaGZjcGNpLnBoX3N0YXRlID0gMDsKCWNzLT5ody5oZmNwY2kuZmlmbyA9IDI1NTsKCWlmIChjcy0+dHlwID09IElTRE5fQ1RZUEVfSEZDX1BDSSkgewoJCWkgPSAwOwoJCXdoaWxlIChpZF9saXN0W2ldLnZlbmRvcl9pZCkgewoJCQl0bXBfaGZjcGNpID0gcGNpX2ZpbmRfZGV2aWNlKGlkX2xpc3RbaV0udmVuZG9yX2lkLAoJCQkJCQkgICAgIGlkX2xpc3RbaV0uZGV2aWNlX2lkLAoJCQkJCQkgICAgIGRldl9oZmNwY2kpOwoJCQlpKys7CgkJCWlmICh0bXBfaGZjcGNpKSB7CgkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UodG1wX2hmY3BjaSkpCgkJCQkJY29udGludWU7CgkJCQlwY2lfc2V0X21hc3Rlcih0bXBfaGZjcGNpKTsKCQkJCWlmICgoY2FyZC0+cGFyYVswXSkgJiYgKGNhcmQtPnBhcmFbMF0gIT0gKHRtcF9oZmNwY2ktPnJlc291cmNlWyAwXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSykpKQoJCQkJCWNvbnRpbnVlOwoJCQkJZWxzZQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlpZiAodG1wX2hmY3BjaSkgewoJCQlpLS07CgkJCWRldl9oZmNwY2kgPSB0bXBfaGZjcGNpOwkvKiBvbGQgZGV2aWNlICovCgkJCWNzLT5ody5oZmNwY2kuZGV2ID0gZGV2X2hmY3BjaTsKCQkJY3MtPmlycSA9IGRldl9oZmNwY2ktPmlycTsKCQkJaWYgKCFjcy0+aXJxKSB7CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJOiBObyBJUlEgZm9yIFBDSSBjYXJkIGZvdW5kXG4iKTsKCQkJCXJldHVybiAoMCk7CgkJCX0KCQkJY3MtPmh3LmhmY3BjaS5wY2lfaW8gPSAoY2hhciAqKSh1bnNpZ25lZCBsb25nKWRldl9oZmNwY2ktPnJlc291cmNlWzFdLnN0YXJ0OwoJCQlwcmludGsoS0VSTl9JTkZPICJIaVNheDogSEZDLVBDSSBjYXJkIG1hbnVmYWN0dXJlcjogJXMgY2FyZCBuYW1lOiAlc1xuIiwgaWRfbGlzdFtpXS52ZW5kb3JfbmFtZSwgaWRfbGlzdFtpXS5jYXJkX25hbWUpOwoJCX0gZWxzZSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhGQy1QQ0k6IE5vIFBDSSBjYXJkIGZvdW5kXG4iKTsKCQkJcmV0dXJuICgwKTsKCQl9CgkJaWYgKCFjcy0+aHcuaGZjcGNpLnBjaV9pbykgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJOiBObyBJTy1NZW0gZm9yIFBDSSBjYXJkIGZvdW5kXG4iKTsKCQkJcmV0dXJuICgwKTsKCQl9CgkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBGSUZPUyAqLwoJCS8qIEJlY2F1c2UgdGhlIEhGQy1QQ0kgbmVlZHMgYSAzMksgcGh5c2ljYWwgYWxpZ25tZW50LCB3ZSAqLwoJCS8qIG5lZWQgdG8gYWxsb2NhdGUgdGhlIGRvdWJsZSBtZW0gYW5kIGFsaWduIHRoZSBhZGRyZXNzICovCgkJaWYgKCEoY3MtPmh3LmhmY3BjaS5zaGFyZV9zdGFydCA9IGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpKSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJOiBFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgRklGTyFcbiIpOwoJCQlyZXR1cm4gMDsKCQl9CgkJY3MtPmh3LmhmY3BjaS5maWZvcyA9ICh2b2lkICopCgkJICAgICgoKHVsb25nKSBjcy0+aHcuaGZjcGNpLnNoYXJlX3N0YXJ0KSAmIH4weDdGRkYpICsgMHg4MDAwOwoJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY3MtPmh3LmhmY3BjaS5kZXYsIDB4ODAsICh1X2ludCkgdmlydF90b19idXMoY3MtPmh3LmhmY3BjaS5maWZvcykpOwoJCWNzLT5ody5oZmNwY2kucGNpX2lvID0gaW9yZW1hcCgodWxvbmcpIGNzLT5ody5oZmNwY2kucGNpX2lvLCAyNTYpOwoJCXByaW50ayhLRVJOX0lORk8KCQkgICAgICAgIkhGQy1QQ0k6IGRlZmluZWQgYXQgbWVtICVwIGZpZm8gJXAoJSN4KSBJUlEgJWQgSFogJWRcbiIsCgkJICAgICAgIGNzLT5ody5oZmNwY2kucGNpX2lvLAoJCSAgICAgICBjcy0+aHcuaGZjcGNpLmZpZm9zLAoJCSAgICAgICAodV9pbnQpIHZpcnRfdG9fYnVzKGNzLT5ody5oZmNwY2kuZmlmb3MpLAoJCSAgICAgICBjcy0+aXJxLCBIWik7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNzLT5ody5oZmNwY2kuZGV2LCBQQ0lfQ09NTUFORCwgUENJX0VOQV9NRU1JTyk7CS8qIGVuYWJsZSBtZW1vcnkgbWFwcGVkIHBvcnRzLCBkaXNhYmxlIGJ1c21hc3RlciAqLwoJCWNzLT5ody5oZmNwY2kuaW50X20yID0gMDsJLyogZGlzYWJsZSBhbGxlIGludGVycnVwdHMgKi8KCQljcy0+aHcuaGZjcGNpLmludF9tMSA9IDA7CgkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00xLCBjcy0+aHcuaGZjcGNpLmludF9tMSk7CgkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00yLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CgkJLyogQXQgdGhpcyBwb2ludCB0aGUgbmVlZGVkIFBDSSBjb25maWcgaXMgZG9uZSAqLwoJCS8qIGZpZm9zIGFyZSBzdGlsbCBub3QgZW5hYmxlZCAqLwoJCUlOSVRfV09SSygmY3MtPnRxdWV1ZSwgIGhmY3BjaV9iaCk7CgkJY3MtPnNldHN0YWNrX2QgPSBzZXRzdGFja19oZmNwY2k7CgkJY3MtPkJDX1NlbmRfRGF0YSA9ICZoZmNwY2lfc2VuZF9kYXRhOwoJCWNzLT5yZWFkaXNhYyA9IE5VTEw7CgkJY3MtPndyaXRlaXNhYyA9IE5VTEw7CgkJY3MtPnJlYWRpc2FjZmlmbyA9IE5VTEw7CgkJY3MtPndyaXRlaXNhY2ZpZm8gPSBOVUxMOwoJCWNzLT5CQ19SZWFkX1JlZyA9IE5VTEw7CgkJY3MtPkJDX1dyaXRlX1JlZyA9IE5VTEw7CgkJY3MtPmlycV9mdW5jID0gJmhmY3BjaV9pbnRlcnJ1cHQ7CgkJY3MtPmlycV9mbGFncyB8PSBJUlFGX1NIQVJFRDsKCQljcy0+aHcuaGZjcGNpLnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgaGZjcGNpX1RpbWVyOwoJCWNzLT5ody5oZmNwY2kudGltZXIuZGF0YSA9IChsb25nKSBjczsKCQlpbml0X3RpbWVyKCZjcy0+aHcuaGZjcGNpLnRpbWVyKTsKCQljcy0+Y2FyZG1zZyA9ICZoZmNwY2lfY2FyZF9tc2c7CgkJY3MtPmF1eGNtZCA9ICZoZmNwY2lfYXV4Y21kOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuICgxKTsKCX0gZWxzZQoJCXJldHVybiAoMCk7CS8qIG5vIHZhbGlkIGNhcmQgdHlwZSAqLwojZWxzZQoJcHJpbnRrKEtFUk5fV0FSTklORyAiSEZDLVBDSTogTk9fUENJX0JJT1NcbiIpOwoJcmV0dXJuICgwKTsKI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KfQo=